summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorOliver Bolte <obo@openoffice.org>2009-03-06 09:33:41 +0000
committerOliver Bolte <obo@openoffice.org>2009-03-06 09:33:41 +0000
commit659af2052b0471ff4507f1742a4f0c0681d66e8e (patch)
treed047328a27e779c050e18e63766fed55f759bdd1 /vcl
parent3315021862137d58fd8d57c035d397474a9df644 (diff)
CWS-TOOLING: integrate CWS movepsprint
2009-02-27 10:42:24 +0100 pl r268559 : #i99633# remove X11 build for mac 2009-02-26 16:38:01 +0100 pl r268535 : #i97898# move psprint to vcl: no more linking psprint 2009-02-26 16:36:35 +0100 pl r268534 : #i97898# move psprint to vcl: tentative os2 changes 2009-02-26 16:20:36 +0100 pl r268532 : #i97898# move psprint to vcl: make compile again, round 5 2009-02-26 15:53:12 +0100 pl r268530 : #i97898# psprint removed 2009-02-26 13:43:40 +0100 pl r268513 : #i97898# use proper X display in PrintFontManager::initialize 2009-02-26 12:39:05 +0100 pl r268496 : #i99633# remove unsused header 2009-02-25 19:12:54 +0100 pl r268467 : #i99633# get rid of special casing for the now discontinued Mac X11 port 2009-02-25 18:25:37 +0100 pl r268466 : #i97898# move psprint to vcl: make compile again, round 4 2009-02-25 17:38:55 +0100 pl r268458 : #i97898# move psprint to vcl: make compile again, round 3 2009-02-25 16:55:15 +0100 pl r268452 : #i97898# move psprint to vcl: remove psp lib from install set 2009-02-25 16:50:25 +0100 pl r268451 : #i97898# move psprint to vcl: make compile again, round 2 2009-02-25 16:10:50 +0100 pl r268448 : #i97898# move psprint to vcl: make compile again, round 1 2009-02-25 14:38:12 +0100 pl r268440 : #i97898# move psprint to vcl: remove references to psprint in solenv 2009-02-25 14:22:22 +0100 pl r268437 : #i97898# move psprint to vcl, first step: move in svn
Diffstat (limited to 'vcl')
-rw-r--r--vcl/aqua/source/gdi/salgdi.cxx20
-rw-r--r--vcl/inc/cupsmgr.hxx111
-rw-r--r--vcl/inc/list.h103
-rw-r--r--vcl/inc/sft.h641
-rw-r--r--vcl/inc/vcl/fontcache.hxx102
-rw-r--r--vcl/inc/vcl/fontmanager.hxx748
-rw-r--r--vcl/inc/vcl/helper.hxx68
-rw-r--r--vcl/inc/vcl/jobdata.hxx86
-rw-r--r--vcl/inc/vcl/ppdparser.hxx333
-rw-r--r--vcl/inc/vcl/printergfx.hxx444
-rw-r--r--vcl/inc/vcl/printerinfomanager.hxx242
-rw-r--r--vcl/inc/vcl/printerjob.hxx152
-rw-r--r--vcl/inc/vcl/salinst.hxx19
-rw-r--r--vcl/inc/vcl/strhelper.hxx86
-rw-r--r--vcl/os2/source/gdi/salgdi3.cxx4
-rw-r--r--vcl/prj/build.lst8
-rw-r--r--vcl/prj/d.lst7
-rw-r--r--vcl/source/app/salvtables.cxx5
-rw-r--r--vcl/source/fontsubset/crc32.c89
-rw-r--r--vcl/source/fontsubset/crc32.h (renamed from vcl/unx/inc/macosxint.hxx)32
-rw-r--r--vcl/source/fontsubset/gsub.cxx357
-rw-r--r--vcl/source/fontsubset/gsub.h50
-rw-r--r--vcl/source/fontsubset/list.c546
-rw-r--r--vcl/source/fontsubset/makefile.mk53
-rw-r--r--vcl/source/fontsubset/sft.c3334
-rw-r--r--vcl/source/fontsubset/ttcr.c1669
-rw-r--r--vcl/source/fontsubset/ttcr.h280
-rw-r--r--vcl/source/fontsubset/u2big5.inc1757
-rw-r--r--vcl/source/fontsubset/u2johab.inc2175
-rw-r--r--vcl/source/fontsubset/u2prc.inc3037
-rw-r--r--vcl/source/fontsubset/u2shiftjis.inc968
-rw-r--r--vcl/source/fontsubset/u2wansung.inc1072
-rw-r--r--vcl/source/fontsubset/xlat.c187
-rw-r--r--vcl/source/fontsubset/xlat.h68
-rw-r--r--vcl/source/gdi/font.cxx20
-rw-r--r--vcl/source/glyphs/gcach_ftyp.cxx32
-rw-r--r--vcl/source/helper/makefile.mk1
-rw-r--r--vcl/source/helper/strhelper.cxx445
-rw-r--r--vcl/unx/gtk/window/gtkframe.cxx26
-rw-r--r--vcl/unx/headless/svpprn.cxx69
-rw-r--r--vcl/unx/headless/svpprn.hxx8
-rw-r--r--vcl/unx/headless/svppspgraphics.cxx30
-rw-r--r--vcl/unx/headless/svppspgraphics.hxx8
-rw-r--r--vcl/unx/inc/dtint.hxx3
-rw-r--r--vcl/unx/inc/prex.h2
-rw-r--r--vcl/unx/inc/pspgraphics.h14
-rw-r--r--vcl/unx/inc/saldata.hxx2
-rw-r--r--vcl/unx/inc/saldisp.hxx3
-rw-r--r--vcl/unx/inc/salinst.h3
-rw-r--r--vcl/unx/inc/salprn.h8
-rw-r--r--vcl/unx/inc/salunx.h2
-rw-r--r--vcl/unx/inc/xsalprn.h192
-rw-r--r--vcl/unx/source/app/i18n_ic.cxx4
-rw-r--r--vcl/unx/source/app/i18n_im.cxx9
-rw-r--r--vcl/unx/source/app/i18n_wrp.cxx13
-rw-r--r--vcl/unx/source/app/keysymnames.cxx11
-rw-r--r--vcl/unx/source/app/makefile.mk1
-rw-r--r--vcl/unx/source/app/saldisp.cxx28
-rw-r--r--vcl/unx/source/app/salinst.cxx153
-rw-r--r--vcl/unx/source/app/wmadaptor.cxx6
-rw-r--r--vcl/unx/source/fontmanager/adobeenc.tab1090
-rwxr-xr-xvcl/unx/source/fontmanager/afm_hash.cpp245
-rwxr-xr-xvcl/unx/source/fontmanager/afm_keyword_list58
-rw-r--r--vcl/unx/source/fontmanager/fontcache.cxx821
-rw-r--r--vcl/unx/source/fontmanager/fontconfig.cxx1078
-rw-r--r--vcl/unx/source/fontmanager/fontmanager.cxx4008
-rw-r--r--vcl/unx/source/fontmanager/helper.cxx407
-rw-r--r--vcl/unx/source/fontmanager/makefile.mk76
-rw-r--r--vcl/unx/source/fontmanager/parseAFM.cxx1569
-rw-r--r--vcl/unx/source/fontmanager/parseAFM.hxx344
-rw-r--r--vcl/unx/source/gdi/dtint.cxx6
-rw-r--r--vcl/unx/source/gdi/gcach_xpeer.cxx3
-rw-r--r--vcl/unx/source/gdi/macosxint.cxx250
-rw-r--r--vcl/unx/source/gdi/macosxrc.txt33
-rw-r--r--vcl/unx/source/gdi/makefile.mk8
-rw-r--r--vcl/unx/source/gdi/pspgraphics.cxx24
-rw-r--r--vcl/unx/source/gdi/salgdi.cxx41
-rw-r--r--vcl/unx/source/gdi/salgdi2.cxx28
-rw-r--r--vcl/unx/source/gdi/salgdi3.cxx68
-rw-r--r--vcl/unx/source/gdi/salprnpsp.cxx87
-rw-r--r--vcl/unx/source/gdi/xprintext.cxx656
-rw-r--r--vcl/unx/source/gdi/xrender_peer.cxx4
-rw-r--r--vcl/unx/source/printer/cupsmgr.cxx1140
-rw-r--r--vcl/unx/source/printer/jobdata.cxx207
-rw-r--r--vcl/unx/source/printer/makefile.mk74
-rw-r--r--vcl/unx/source/printer/ppdparser.cxx1876
-rw-r--r--vcl/unx/source/printer/printerinfomanager.cxx1472
-rw-r--r--vcl/unx/source/printergfx/bitmap_gfx.cxx735
-rw-r--r--vcl/unx/source/printergfx/common_gfx.cxx1310
-rw-r--r--vcl/unx/source/printergfx/glyphset.cxx908
-rw-r--r--vcl/unx/source/printergfx/glyphset.hxx138
-rw-r--r--vcl/unx/source/printergfx/makefile.mk69
-rw-r--r--vcl/unx/source/printergfx/printerjob.cxx1197
-rw-r--r--vcl/unx/source/printergfx/psheader.ps372
-rw-r--r--vcl/unx/source/printergfx/psputil.cxx271
-rw-r--r--vcl/unx/source/printergfx/psputil.hxx81
-rw-r--r--vcl/unx/source/printergfx/text_gfx.cxx865
-rw-r--r--vcl/unx/source/window/salframe.cxx120
-rw-r--r--vcl/util/linksvp/makefile.mk1
-rw-r--r--vcl/util/makefile.mk36
-rw-r--r--vcl/win/source/gdi/salgdi3.cxx72
-rwxr-xr-xvcl/win/source/gdi/winlayout.cxx27
102 files changed, 40088 insertions, 1733 deletions
diff --git a/vcl/aqua/source/gdi/salgdi.cxx b/vcl/aqua/source/gdi/salgdi.cxx
index 962fa1302ae4..c39dc26f370f 100644
--- a/vcl/aqua/source/gdi/salgdi.cxx
+++ b/vcl/aqua/source/gdi/salgdi.cxx
@@ -36,20 +36,22 @@
#include "salbmp.h"
#include "salframe.h"
#include "salcolorutils.hxx"
+#include "list.h"
+#include "sft.h"
+#include "salatsuifontutils.hxx"
+
#include "vcl/impfont.hxx"
-#include "psprint/list.h"
-#include "psprint/sft.h"
+#include "vcl/sysdata.hxx"
+#include "vcl/sallayout.hxx"
+#include "vcl/svapp.hxx"
+
#include "osl/file.hxx"
-#include "vos/mutex.hxx"
#include "osl/process.h"
-#include "rtl/bootstrap.h"
-#include "rtl/strbuf.hxx"
-#include "vcl/sysdata.hxx"
+#include "vos/mutex.hxx"
-#include "vcl/sallayout.hxx"
-#include "salatsuifontutils.hxx"
-#include "vcl/svapp.hxx"
+#include "rtl/bootstrap.h"
+#include "rtl/strbuf.hxx"
#include "basegfx/range/b2drectangle.hxx"
#include "basegfx/polygon/b2dpolygon.hxx"
diff --git a/vcl/inc/cupsmgr.hxx b/vcl/inc/cupsmgr.hxx
new file mode 100644
index 000000000000..9caec2d30031
--- /dev/null
+++ b/vcl/inc/cupsmgr.hxx
@@ -0,0 +1,111 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: cupsmgr.hxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_CUPSMGR_HXX_
+#define _PSPRINT_CUPSMGR_HXX_
+
+#include "vcl/printerinfomanager.hxx"
+#include "osl/module.h"
+#include "osl/thread.h"
+#include "osl/mutex.hxx"
+
+namespace psp
+{
+
+class CUPSWrapper;
+class PPDParser;
+
+struct FPtrHash
+{
+ size_t operator()(const FILE* pPtr) const
+ { return (size_t)pPtr; }
+};
+
+class CUPSManager : public PrinterInfoManager
+{
+ CUPSWrapper* m_pCUPSWrapper;
+ std::hash_map< FILE*, rtl::OString, FPtrHash > m_aSpoolFiles;
+ int m_nDests;
+ void* m_pDests;
+ bool m_bNewDests;
+ std::hash_map< rtl::OUString, int, rtl::OUStringHash > m_aCUPSDestMap;
+
+ std::hash_map< rtl::OUString, PPDContext, rtl::OUStringHash > m_aDefaultContexts;
+
+ rtl::OString m_aUser;
+ // this is a security risk, but the CUPS API demands
+ // to deliver a pointer to a static buffer containing
+ // the password, so this cannot be helped
+ rtl::OString m_aPassword;
+
+ osl::Mutex m_aCUPSMutex;
+ oslThread m_aDestThread;
+
+ CUPSManager( CUPSWrapper* );
+ virtual ~CUPSManager();
+
+ virtual void initialize();
+
+ void getOptionsFromDocumentSetup( const JobData& rJob, int& rNumOptions, void** rOptions ) const;
+ void runDests();
+public:
+ // public for stub
+ static void runDestThread(void* pMgr);
+
+ static CUPSManager* tryLoadCUPS();
+
+ const PPDParser* createCUPSParser( const rtl::OUString& rPrinter );
+ // wraps cupsGetPPD, so unlink after use !
+
+ const char* authenticateUser( const char* );
+
+ virtual FILE* startSpool( const rtl::OUString& rPrinterName, bool bQuickCommand );
+ virtual int endSpool( const rtl::OUString& rPrinterName, const rtl::OUString& rJobTitle, FILE* pFile, const JobData& rDocumentJobData );
+ virtual void setupJobContextData( JobData& rData );
+
+ // changes the info about a named printer
+ virtual void changePrinterInfo( const ::rtl::OUString& rPrinter, const PrinterInfo& rNewInfo );
+
+ // check if the printer configuration has changed
+ virtual bool checkPrintersChanged( bool bWait );
+
+ // members for administration (->padmin)
+ // disable for CUPS
+ virtual bool addPrinter( const rtl::OUString& rPrinterName, const ::rtl::OUString& rDriverName );
+ virtual bool removePrinter( const rtl::OUString& rPrinterName, bool bCheckOnly = false );
+ virtual bool writePrinterConfig();
+ virtual bool setDefaultPrinter( const rtl::OUString& rPrinterName );
+
+ virtual bool addOrRemovePossible() const;
+};
+
+} // namespace psp
+
+#endif
diff --git a/vcl/inc/list.h b/vcl/inc/list.h
new file mode 100644
index 000000000000..b86521a1f666
--- /dev/null
+++ b/vcl/inc/list.h
@@ -0,0 +1,103 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: list.h,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* $Id: list.h,v 1.4 2008-06-25 14:20:01 kz Exp $ */
+
+/*[]---------------------------------------------------[]*/
+/*| |*/
+/*| Implementation of the list data type |*/
+/*| |*/
+/*| |*/
+/*| Author: Alexander Gelfenbain |*/
+/*[]---------------------------------------------------[]*/
+
+#ifndef __CLIST_H
+#define __CLIST_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*
+ * List of void * pointers
+ */
+
+ typedef struct _list *list;
+
+/*- constructors and a destructor */
+ list listNewEmpty(void);
+#ifdef TEST
+ list listNewCopy(list);
+#endif
+ void listDispose(list);
+ void listSetElementDtor(list, void (*f)(void *)); /*- this function will be executed when the element is removed via listRemove() or listClear() */
+
+/*- queries */
+ void * listCurrent(list);
+ int listCount(list);
+ int listIsEmpty(list);
+#ifdef TEST
+ int listAtFirst(list);
+ int listAtLast(list);
+ int listPosition(list); /* Expensive! */
+#endif
+/*- search */
+ int listFind(list, void *); /* Returns true/false */
+
+/*- positioning functions */
+/*- return the number of elements by which the current position in the list changes */
+ int listNext(list);
+ int listSkipForward(list, int n);
+ int listToFirst(list);
+ int listToLast(list);
+ int listPositionAt(list, int n); /* Expensive! */
+
+/*- adding and removing elements */
+ list listAppend(list, void *);
+#ifdef TEST
+ list listPrepend(list, void *);
+ list listInsertAfter(list, void *);
+ list listInsertBefore(list, void *);
+#endif
+ list listRemove(list); /* removes the current element */
+ list listClear(list); /* removes all elements */
+
+#ifdef TEST
+/*- forall */
+ void listForAll(list, void (*f)(void *));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __CLIST_H */
diff --git a/vcl/inc/sft.h b/vcl/inc/sft.h
new file mode 100644
index 000000000000..efda0903afc5
--- /dev/null
+++ b/vcl/inc/sft.h
@@ -0,0 +1,641 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: sft.h,v $
+ * $Revision: 1.21 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* $Id: sft.h,v 1.21 2008-06-25 14:20:49 kz Exp $ */
+
+/**
+
+ *
+ * @file sft.h
+ * @brief Sun Font Tools
+ * @author Alexander Gelfenbain
+ */
+
+/*
+ * If NO_MAPPERS is defined, MapChar() and MapString() and consequently GetTTSimpleCharMetrics()
+ * don't get compiled in. This is done to avoid including a large chunk of code (TranslateXY() from
+ * xlat.c in the projects that don't require it.
+ *
+ * If NO_TYPE3 is defined CreateT3FromTTGlyphs() does not get compiled in.
+ * If NO_TYPE42 is defined Type42-related code is excluded
+ * If NO_TTCR is defined TrueType creation related code is excluded\
+ * If NO_LIST is defined list.h and piblic functions that use it don't get compiled
+ */
+
+/*
+ * Generated fonts contain an XUID entry in the form of:
+ *
+ * 103 0 T C1 N C2 C3
+ *
+ * 103 - Sun's Adobe assigned XUID number. Contact person: Alexander Gelfenbain <gelf@eng.sun.com>
+ *
+ * T - font type. 0: Type 3, 1: Type 42
+ * C1 - CRC-32 of the entire source TrueType font
+ * N - number of glyphs in the subset
+ * C2 - CRC-32 of the array of glyph IDs used to generate the subset
+ * C3 - CRC-32 of the array of encoding numbers used to generate the subset
+ *
+ */
+
+
+#ifndef __SUBFONT_H
+#define __SUBFONT_H
+
+#ifdef UNX
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+#include <stdio.h>
+
+#include <sal/types.h>
+
+#ifndef NO_LIST
+#include "list.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*@{*/
+#ifndef __cplusplus
+#define false 0 /**< standard false value */
+#define true 1 /**< standard true value */
+#endif
+/*@}*/
+
+/*@{*/
+ typedef sal_Int16 F2Dot14; /**< fixed: 2.14 */
+ typedef sal_Int32 F16Dot16; /**< fixed: 16.16 */
+/*@}*/
+
+ typedef struct {
+ sal_uInt16 s;
+ sal_uInt16 d;
+ } sal_uInt16pair;
+
+/** Return value of OpenTTFont() and CreateT3FromTTGlyphs() */
+ enum SFErrCodes {
+ SF_OK, /**< no error */
+ SF_BADFILE, /**< file not found */
+ SF_FILEIO, /**< file I/O error */
+ SF_MEMORY, /**< memory allocation error */
+ SF_GLYPHNUM, /**< incorrect number of glyphs */
+ SF_BADARG, /**< incorrect arguments */
+ SF_TTFORMAT, /**< incorrect TrueType font format */
+ SF_TABLEFORMAT, /**< incorrect format of a TrueType table */
+ SF_FONTNO /**< incorrect logical font number of a TTC font */
+ };
+
+#ifndef FW_THIN /* WIN32 compilation would conflict */
+/** Value of the weight member of the TTGlobalFontInfo struct */
+ enum WeightClass {
+ FW_THIN = 100, /**< Thin */
+ FW_EXTRALIGHT = 200, /**< Extra-light (Ultra-light) */
+ FW_LIGHT = 300, /**< Light */
+ FW_NORMAL = 400, /**< Normal (Regular) */
+ FW_MEDIUM = 500, /**< Medium */
+ FW_SEMIBOLD = 600, /**< Semi-bold (Demi-bold) */
+ FW_BOLD = 700, /**< Bold */
+ FW_EXTRABOLD = 800, /**< Extra-bold (Ultra-bold) */
+ FW_BLACK = 900 /**< Black (Heavy) */
+ };
+
+/** Value of the width member of the TTGlobalFontInfo struct */
+#ifndef OS2
+ enum WidthClass {
+ FWIDTH_ULTRA_CONDENSED = 1, /**< 50% of normal */
+ FWIDTH_EXTRA_CONDENSED = 2, /**< 62.5% of normal */
+ FWIDTH_CONDENSED = 3, /**< 75% of normal */
+ FWIDTH_SEMI_CONDENSED = 4, /**< 87.5% of normal */
+ FWIDTH_NORMAL = 5, /**< Medium, 100% */
+ FWIDTH_SEMI_EXPANDED = 6, /**< 112.5% of normal */
+ FWIDTH_EXPANDED = 7, /**< 125% of normal */
+ FWIDTH_EXTRA_EXPANDED = 8, /**< 150% of normal */
+ FWIDTH_ULTRA_EXPANDED = 9 /**< 200% of normal */
+ };
+#endif // OS2
+#endif /* FW_THIN */
+
+/** Type of the 'kern' table, stored in _TrueTypeFont::kerntype */
+ enum KernType {
+ KT_NONE = 0, /**< no kern table */
+ KT_APPLE_NEW = 1, /**< new Apple kern table */
+ KT_MICROSOFT = 2 /**< Microsoft table */
+ };
+
+/* Composite glyph flags definition */
+ enum CompositeFlags {
+ ARG_1_AND_2_ARE_WORDS = 1,
+ ARGS_ARE_XY_VALUES = 1<<1,
+ ROUND_XY_TO_GRID = 1<<2,
+ WE_HAVE_A_SCALE = 1<<3,
+ MORE_COMPONENTS = 1<<5,
+ WE_HAVE_AN_X_AND_Y_SCALE = 1<<6,
+ WE_HAVE_A_TWO_BY_TWO = 1<<7,
+ WE_HAVE_INSTRUCTIONS = 1<<8,
+ USE_MY_METRICS = 1<<9,
+ OVERLAP_COMPOUND = 1<<10
+ };
+
+#ifndef NO_TTCR
+/** Flags for TrueType generation */
+ enum TTCreationFlags {
+ TTCF_AutoName = 1, /**< Automatically generate a compact 'name' table.
+ If this flag is not set, name table is generated
+ either from an array of NameRecord structs passed as
+ arguments or if the array is NULL, 'name' table
+ of the generated TrueType file will be a copy
+ of the name table of the original file.
+ If this flag is set the array of NameRecord structs
+ is ignored and a very compact 'name' table is automatically
+ generated. */
+
+ TTCF_IncludeOS2 = 2 /** If this flag is set OS/2 table from the original font will be
+ copied to the subset */
+ };
+#endif
+
+
+
+
+/** Structure used by GetTTSimpleGlyphMetrics() and GetTTSimpleCharMetrics() functions */
+ typedef struct {
+ sal_uInt16 adv; /**< advance width or height */
+ sal_Int16 sb; /**< left or top sidebearing */
+ } TTSimpleGlyphMetrics;
+
+
+
+/** Structure used by the TrueType Creator and GetRawGlyphData() */
+
+ typedef struct {
+ sal_uInt32 glyphID; /**< glyph ID */
+ sal_uInt16 nbytes; /**< number of bytes in glyph data */
+ sal_uInt8 *ptr; /**< pointer to glyph data */
+ sal_uInt16 aw; /**< advance width */
+ sal_Int16 lsb; /**< left sidebearing */
+ sal_uInt16 compflag; /**< 0- if non-composite, 1- otherwise */
+ sal_uInt16 npoints; /**< number of points */
+ sal_uInt16 ncontours; /**< number of contours */
+ /* */
+ sal_uInt32 newID; /**< used internally by the TTCR */
+ } GlyphData;
+
+/** Structure used by the TrueType Creator and CreateTTFromTTGlyphs() */
+ typedef struct {
+ sal_uInt16 platformID; /**< Platform ID */
+ sal_uInt16 encodingID; /**< Platform-specific encoding ID */
+ sal_uInt16 languageID; /**< Language ID */
+ sal_uInt16 nameID; /**< Name ID */
+ sal_uInt16 slen; /**< String length in bytes */
+ sal_uInt8 *sptr; /**< Pointer to string data (not zero-terminated!) */
+ } NameRecord;
+
+
+
+/** Return value of GetTTGlobalFontInfo() */
+
+ typedef struct {
+ char *family; /**< family name */
+ sal_uInt16 *ufamily; /**< family name UCS2 */
+ char *subfamily; /**< subfamily name */
+ sal_uInt16 *usubfamily; /**< subfamily name UCS2 */
+ char *psname; /**< PostScript name */
+ sal_uInt16 macStyle; /**< macstyle bits from 'HEAD' table */
+ int weight; /**< value of WeightClass or 0 if can't be determined */
+ int width; /**< value of WidthClass or 0 if can't be determined */
+ int pitch; /**< 0: proportianal font, otherwise: monospaced */
+ int italicAngle; /**< in counter-clockwise degrees * 65536 */
+ int xMin; /**< global bounding box: xMin */
+ int yMin; /**< global bounding box: yMin */
+ int xMax; /**< global bounding box: xMax */
+ int yMax; /**< global bounding box: yMax */
+ int ascender; /**< typographic ascent. */
+ int descender; /**< typographic descent. */
+ int linegap; /**< typographic line gap.\ Negative values are treated as
+ zero in Win 3.1, System 6 and System 7. */
+ int vascent; /**< typographic ascent for vertical writing mode */
+ int vdescent; /**< typographic descent for vertical writing mode */
+ int typoAscender; /**< OS/2 portable typographic ascender */
+ int typoDescender; /**< OS/2 portable typographic descender */
+ int typoLineGap; /**< OS/2 portable typographc line gap */
+ int winAscent; /**< ascender metric for Windows */
+ int winDescent; /**< descender metric for Windows */
+ int symbolEncoded; /**< 1: MS symbol encoded 0: not symbol encoded */
+ int rangeFlag; /**< if set to 1 Unicode Range flags are applicable */
+ sal_uInt32 ur1; /**< bits 0 - 31 of Unicode Range flags */
+ sal_uInt32 ur2; /**< bits 32 - 63 of Unicode Range flags */
+ sal_uInt32 ur3; /**< bits 64 - 95 of Unicode Range flags */
+ sal_uInt32 ur4; /**< bits 96 - 127 of Unicode Range flags */
+ sal_uInt8 panose[10]; /**< PANOSE classification number */
+ sal_uInt16 typeFlags; /**< type flags (copyright information) */
+ } TTGlobalFontInfo;
+
+/** Structure used by KernGlyphs() */
+ typedef struct {
+ int x; /**< positive: right, negative: left */
+ int y; /**< positive: up, negative: down */
+ } KernData;
+
+
+/** ControlPoint structure used by GetTTGlyphPoints() */
+ typedef struct {
+ sal_uInt32 flags; /**< 00000000 00000000 e0000000 bbbbbbbb */
+ /**< b - byte flags from the glyf array */
+ /**< e == 0 - regular point */
+ /**< e == 1 - end contour */
+ sal_Int16 x; /**< X coordinate in EmSquare units */
+ sal_Int16 y; /**< Y coordinate in EmSquare units */
+ } ControlPoint;
+
+ typedef struct _TrueTypeFont TrueTypeFont;
+
+/**
+ * @defgroup sft Sun Font Tools Exported Functions
+ */
+
+
+/**
+ * Get the number of fonts contained in a TrueType collection
+ * @param fname - file name
+ * @return number of fonts or zero, if file is not a TTC file.
+ * @ingroup sft
+ */
+ int CountTTCFonts(const char* fname);
+
+
+/**
+ * TrueTypeFont constructor.
+ * The font file has to be provided as a memory buffer and length
+ * @param facenum - logical font number within a TTC file. This value is ignored
+ * for TrueType fonts
+ * @return value of SFErrCodes enum
+ * @ingroup sft
+ */
+ int OpenTTFontBuffer(void* pBuffer, sal_uInt32 nLen, sal_uInt32 facenum, TrueTypeFont** ttf); /*FOLD01*/
+#if !defined(WIN32) && !defined(OS2)
+/**
+ * TrueTypeFont constructor.
+ * Reads the font file and allocates the memory for the structure.
+ * on WIN32 the font has to be provided as a memory buffer and length
+ * @param facenum - logical font number within a TTC file. This value is ignored
+ * for TrueType fonts
+ * @return value of SFErrCodes enum
+ * @ingroup sft
+ */
+ int OpenTTFontFile(const char *fname, sal_uInt32 facenum, TrueTypeFont** ttf);
+#endif
+
+/**
+ * TrueTypeFont destructor. Deallocates the memory.
+ * @ingroup sft
+ */
+ void CloseTTFont(TrueTypeFont *);
+
+/**
+ * Extracts TrueType control points, and stores them in an allocated array pointed to
+ * by *pointArray. This function returns the number of extracted points.
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param glyphID Glyph ID
+ * @param pointArray Return value - address of the pointer to the first element of the array
+ * of points allocated by the function
+ * @return Returns the number of points in *pointArray or -1 if glyphID is
+ * invalid.
+ * @ingroup sft
+ *
+ */
+ int GetTTGlyphPoints(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray);
+
+/**
+ * Extracts raw glyph data from the 'glyf' table and returns it in an allocated
+ * GlyphData structure.
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param glyphID Glyph ID
+ *
+ * @return pointer to an allocated GlyphData structure or NULL if
+ * glyphID is not present in the font
+ * @ingroup sft
+ *
+ */
+ GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID);
+
+#ifndef NO_LIST
+/**
+ * For a specified glyph adds all component glyphs IDs to the list and
+ * return their number. If the glyph is a single glyph it has one component
+ * glyph (which is added to the list) and the function returns 1.
+ * For a composite glyphs it returns the number of component glyphs
+ * and adds all of them to the list.
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param glyphID Glyph ID
+ * @param glyphlist list of glyphs
+ *
+ * @return number of component glyphs
+ * @ingroup sft
+ *
+ */
+ int GetTTGlyphComponents(TrueTypeFont *ttf, sal_uInt32 glyphID, list glyphlist);
+#endif
+
+/**
+ * Extracts all Name Records from the font and stores them in an allocated
+ * array of NameRecord structs
+ *
+ * @param ttf pointer to the TrueTypeFont struct
+ * @param nr pointer to the array of NameRecord structs
+ *
+ * @return number of NameRecord structs
+ * @ingroup sft
+ */
+
+ int GetTTNameRecords(TrueTypeFont *ttf, NameRecord **nr);
+
+/**
+ * Deallocates previously allocated array of NameRecords.
+ *
+ * @param nr array of NameRecord structs
+ * @param n number of elements in the array
+ *
+ * @ingroup sft
+ */
+ void DisposeNameRecords(NameRecord* nr, int n);
+
+
+#ifndef NO_TYPE3
+/**
+ * Generates a new PostScript Type 3 font and dumps it to <b>outf</b> file.
+ * This functions subsititues glyph 0 for all glyphIDs that are not found in the font.
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param outf the resulting font is written to this stream
+ * @param fname font name for the new font. If it is NULL the PostScript name of the
+ * original font will be used
+ * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf
+ * @param encoding array of encoding values. encoding[i] specifies the position of the glyph
+ * glyphArray[i] in the encoding vector of the resulting Type3 font
+ * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding
+ * @param wmode writing mode for the output file: 0 - horizontal, 1 - vertical
+ * @return return the value of SFErrCodes enum
+ * @see SFErrCodes
+ * @ingroup sft
+ *
+ */
+ int CreateT3FromTTGlyphs(TrueTypeFont *ttf, FILE *outf, const char *fname, sal_uInt16 *glyphArray, sal_uInt8 *encoding, int nGlyphs, int wmode);
+#endif
+
+#ifndef NO_TTCR
+/**
+ * Generates a new TrueType font and dumps it to <b>outf</b> file.
+ * This functions subsititues glyph 0 for all glyphIDs that are not found in the font.
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param fname file name for the output TrueType font file
+ * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf. The first
+ * element of this array has to be glyph 0 (default glyph)
+ * @param encoding array of encoding values. encoding[i] specifies character code for
+ * the glyphID glyphArray[i]. Character code 0 usually points to a default
+ * glyph (glyphID 0)
+ * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding
+ * @param nNameRecs number of NameRecords for the font, if 0 the name table from the
+ * original font will be used
+ * @param nr array of NameRecords
+ * @param flags or'ed TTCreationFlags
+ * @return return the value of SFErrCodes enum
+ * @see SFErrCodes
+ * @ingroup sft
+ *
+ */
+ int CreateTTFromTTGlyphs(TrueTypeFont *ttf,
+ const char *fname,
+ sal_uInt16 *glyphArray,
+ sal_uInt8 *encoding,
+ int nGlyphs,
+ int nNameRecs,
+ NameRecord *nr,
+ sal_uInt32 flags);
+#endif
+
+#ifndef NO_TYPE42
+/**
+ * Generates a new PostScript Type42 font and dumps it to <b>outf</b> file.
+ * This functions subsititues glyph 0 for all glyphIDs that are not found in the font.
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param outf output stream for a resulting font
+ * @param psname PostScript name of the resulting font
+ * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf. The first
+ * element of this array has to be glyph 0 (default glyph)
+ * @param encoding array of encoding values. encoding[i] specifies character code for
+ * the glyphID glyphArray[i]. Character code 0 usually points to a default
+ * glyph (glyphID 0)
+ * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding
+ * @return SF_OK - no errors
+ * SF_GLYPHNUM - too many glyphs (> 255)
+ * SF_TTFORMAT - corrupted TrueType fonts
+ *
+ * @see SFErrCodes
+ * @ingroup sft
+ *
+ */
+ int CreateT42FromTTGlyphs(TrueTypeFont *ttf,
+ FILE *outf,
+ const char *psname,
+ sal_uInt16 *glyphArray,
+ sal_uInt8 *encoding,
+ int nGlyphs);
+#endif
+
+
+/**
+ * Queries glyph metrics. Allocates an array of TTSimpleGlyphMetrics structs and returns it.
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf
+ * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding
+ * @param mode writing mode: 0 - horizontal, 1 - vertical
+ * @ingroup sft
+ *
+ */
+ TTSimpleGlyphMetrics *GetTTSimpleGlyphMetrics(TrueTypeFont *ttf, sal_uInt16 *glyphArray, int nGlyphs, int mode);
+
+#ifndef NO_MAPPERS
+/**
+ * Queries glyph metrics. Allocates an array of TTSimpleGlyphMetrics structs and returns it.
+ * This function behaves just like GetTTSimpleGlyphMetrics() but it takes a range of Unicode
+ * characters instead of an array of glyphs.
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param firstChar Unicode value of the first character in the range
+ * @param nChars number of Unicode characters in the range
+ * @param mode writing mode: 0 - horizontal, 1 - vertical
+ *
+ * @see GetTTSimpleGlyphMetrics
+ * @ingroup sft
+ *
+ */
+ TTSimpleGlyphMetrics *GetTTSimpleCharMetrics(TrueTypeFont *ttf, sal_uInt16 firstChar, int nChars, int mode);
+
+/**
+ * Maps a Unicode (UCS-2) string to a glyph array. Returns the number of glyphs in the array,
+ * which for TrueType fonts is always the same as the number of input characters.
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param str pointer to a UCS-2 string
+ * @param nchars number of characters in <b>str</b>
+ * @param glyphArray pointer to the glyph array where glyph IDs are to be recorded.
+ *
+ * @return MapString() returns -1 if the TrueType font has no usable 'cmap' tables.
+ * Otherwise it returns the number of characters processed: <b>nChars</b>
+ *
+ * glyphIDs of TrueType fonts are 2 byte positive numbers. glyphID of 0 denotes a missing
+ * glyph and traditionally defaults to an empty square.
+ * glyphArray should be at least sizeof(sal_uInt16) * nchars bytes long. If glyphArray is NULL
+ * MapString() replaces the UCS-2 characters in str with glyphIDs.
+ * @ingroup sft
+ */
+ int MapString(TrueTypeFont *ttf, sal_uInt16 *str, int nchars, sal_uInt16 *glyphArray, int bvertical);
+
+/**
+ * Maps a Unicode (UCS-2) character to a glyph ID and returns it. Missing glyph has
+ * a glyphID of 0 so this function can be used to test if a character is encoded in the font.
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ * @param ch Unicode (UCS-2) character
+ * @return glyph ID, if the character is missing in the font, the return value is 0.
+ * @ingroup sft
+ */
+ sal_uInt16 MapChar(TrueTypeFont *ttf, sal_uInt16 ch, int bvertical);
+
+/**
+ * Returns 0 when the font does not substitute vertical glyphs
+ *
+ * @param ttf pointer to the TrueTypeFont structure
+ */
+ int DoesVerticalSubstitution( TrueTypeFont *ttf, int bvertical);
+
+#endif
+
+/**
+ * Returns global font information about the TrueType font.
+ * @see TTGlobalFontInfo
+ *
+ * @param ttf pointer to a TrueTypeFont structure
+ * @param info pointer to a TTGlobalFontInfo structure
+ * @ingroup sft
+ *
+ */
+ void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info);
+
+#ifdef TEST5
+/**
+ * Returns kerning information for an array of glyphs.
+ * Kerning is not cumulative.
+ * kern[i] contains kerning information for a pair of glyphs at positions i and i+1
+ *
+ * @param ttf pointer to a TrueTypeFont structure
+ * @param glyphs array of source glyphs
+ * @param nglyphs number of glyphs in the array
+ * @param wmode writing mode: 0 - horizontal, 1 - vertical
+ * @param kern array of KernData structures. It should contain nglyphs-1 elements
+ * @see KernData
+ * @ingroup sft
+ *
+ */
+ void KernGlyphs(TrueTypeFont *ttf, sal_uInt16 *glyphs, int nglyphs, int wmode, KernData *kern);
+#endif
+
+/**
+ * Returns nonzero if font is a symbol encoded font
+ */
+ int CheckSymbolEncoding(TrueTypeFont* ttf);
+
+/**
+ * returns the number of glyphs in a font
+ */
+ int GetTTGlyphCount( TrueTypeFont* ttf );
+
+/*- private definitions */ /*FOLD00*/
+
+ struct _TrueTypeFont {
+ sal_uInt32 tag;
+
+ char *fname;
+ sal_Int32 fsize;
+ sal_uInt8 *ptr;
+
+ char *psname;
+ char *family;
+ sal_uInt16 *ufamily;
+ char *subfamily;
+ sal_uInt16 *usubfamily;
+
+ sal_uInt32 ntables;
+ sal_uInt32 *goffsets;
+ sal_uInt32 nglyphs;
+ sal_uInt32 unitsPerEm;
+ sal_uInt32 numberOfHMetrics;
+ sal_uInt32 numOfLongVerMetrics; /* if this number is not 0, font has vertical metrics information */
+ sal_uInt8 *cmap;
+ int cmapType;
+ sal_uInt32 (*mapper)(const sal_uInt8 *, sal_uInt32); /* character to glyphID translation function */
+ void **tables; /* array of pointers to tables */
+ sal_uInt32 *tlens; /* array of table lengths */
+ int kerntype; /* Defined in the KernType enum */
+ sal_uInt32 nkern; /* number of kern subtables */
+ sal_uInt8 **kerntables; /* array of pointers to kern subtables */
+ void *pGSubstitution; /* info provided by GSUB for UseGSUB() */
+ };
+
+#ifdef __cplusplus
+}
+#endif
+
+/* indexes into _TrueTypeFont::tables[] and _TrueTypeFont::tlens[] */
+#define O_maxp 0 /* 'maxp' */
+#define O_glyf 1 /* 'glyf' */
+#define O_head 2 /* 'head' */
+#define O_loca 3 /* 'loca' */
+#define O_name 4 /* 'name' */
+#define O_hhea 5 /* 'hhea' */
+#define O_hmtx 6 /* 'hmtx' */
+#define O_cmap 7 /* 'cmap' */
+#define O_vhea 8 /* 'vhea' */
+#define O_vmtx 9 /* 'vmtx' */
+#define O_OS2 10 /* 'OS/2' */
+#define O_post 11 /* 'post' */
+#define O_kern 12 /* 'kern' */
+#define O_cvt 13 /* 'cvt_' - only used in TT->TT generation */
+#define O_prep 14 /* 'prep' - only used in TT->TT generation */
+#define O_fpgm 15 /* 'fpgm' - only used in TT->TT generation */
+#define O_gsub 16 /* 'GSUB' */
+#define NUM_TAGS 17
+
+#endif /* __SUBFONT_H */
diff --git a/vcl/inc/vcl/fontcache.hxx b/vcl/inc/vcl/fontcache.hxx
new file mode 100644
index 000000000000..acc2e1c10092
--- /dev/null
+++ b/vcl/inc/vcl/fontcache.hxx
@@ -0,0 +1,102 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: fontcache.hxx,v $
+ * $Revision: 1.9 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_FONTCACHE_HXX
+#define _PSPRINT_FONTCACHE_HXX
+
+#include "vcl/dllapi.h"
+#include "vcl/fontmanager.hxx"
+
+#include "tools/string.hxx"
+
+#include <hash_map>
+
+namespace psp
+{
+
+class VCL_DLLPUBLIC FontCache
+{
+ struct FontDir;
+ friend class FontDir;
+ struct FontFile;
+ friend class FontFile;
+
+ typedef std::list< PrintFontManager::PrintFont* > FontCacheEntry;
+ struct FontFile
+ {
+ FontCacheEntry m_aEntry;
+ };
+
+ typedef std::hash_map< ::rtl::OString, FontFile, ::rtl::OStringHash > FontDirMap;
+ struct FontDir
+ {
+ sal_Int64 m_nTimestamp;
+ bool m_bNoFiles;
+ bool m_bUserOverrideOnly;
+ FontDirMap m_aEntries;
+
+ FontDir() : m_nTimestamp(0), m_bNoFiles(false), m_bUserOverrideOnly( false ) {}
+ };
+
+ typedef std::hash_map< int, FontDir > FontCacheData;
+ FontCacheData m_aCache;
+ String m_aCacheFile;
+ bool m_bDoFlush;
+
+ void read();
+ void clearCache();
+
+ void copyPrintFont( const PrintFontManager::PrintFont* pFrom, PrintFontManager::PrintFont* pTo ) const;
+ bool equalsPrintFont( const PrintFontManager::PrintFont* pLeft, PrintFontManager::PrintFont* pRight ) const;
+ PrintFontManager::PrintFont* clonePrintFont( const PrintFontManager::PrintFont* pFont ) const;
+
+ void createCacheDir( int nDirID );
+public:
+ FontCache();
+ ~FontCache();
+
+ bool getFontCacheFile( int nDirID, const rtl::OString& rFile, std::list< PrintFontManager::PrintFont* >& rNewFonts ) const;
+ void updateFontCacheEntry( const PrintFontManager::PrintFont*, bool bFlush );
+ void markEmptyDir( int nDirID, bool bNoFiles = true );
+
+ // returns false for non cached directory
+ // a cached but empty directory will return true but not append anything
+ bool listDirectory( const rtl::OString& rDir, std::list< PrintFontManager::PrintFont* >& rNewFonts ) const;
+ // returns true for directoris that contain only user overridden fonts
+ bool scanAdditionalFiles( const rtl::OString& rDir );
+
+ void flush();
+
+ void updateDirTimestamp( int nDirID );
+};
+
+} // namespace psp
+
+#endif // _PSPRINT_FONTCACHE_HXX
diff --git a/vcl/inc/vcl/fontmanager.hxx b/vcl/inc/vcl/fontmanager.hxx
new file mode 100644
index 000000000000..bdfd30d12f7f
--- /dev/null
+++ b/vcl/inc/vcl/fontmanager.hxx
@@ -0,0 +1,748 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: fontmanager.hxx,v $
+ * $Revision: 1.36 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_FONTMANAGER_HXX_
+#define _PSPRINT_FONTMANAGER_HXX_
+
+#include <hash_map>
+#include <map>
+#include <list>
+#include <set>
+
+#include "vcl/dllapi.h"
+#include "vcl/helper.hxx"
+
+#include "com/sun/star/lang/Locale.hpp"
+
+#define ATOM_FAMILYNAME 2
+#define ATOM_PSNAME 3
+
+/*
+ * some words on metrics: every length returned by PrintFontManager and
+ * friends are PostScript afm style, that is they are 1/1000 font height
+ */
+
+// forward declarations
+namespace utl { class MultiAtomProvider; } // see unotools/atom.hxx
+
+namespace psp {
+class PPDParser; // see ppdparser.hxx
+
+namespace italic
+{
+enum type {
+ Upright = 0,
+ Oblique = 1,
+ Italic = 2,
+ Unknown = 3
+};
+}
+
+namespace width
+{
+enum type {
+ Unknown = 0,
+ UltraCondensed = 1,
+ ExtraCondensed = 2,
+ Condensed = 3,
+ SemiCondensed = 4,
+ Normal = 5,
+ SemiExpanded = 6,
+ Expanded = 7,
+ ExtraExpanded = 8,
+ UltraExpanded = 9
+};
+}
+
+namespace pitch
+{
+enum type {
+ Unknown = 0,
+ Fixed = 1,
+ Variable = 2
+};
+}
+
+namespace weight
+{
+enum type {
+ Unknown = 0,
+ Thin = 1,
+ UltraLight = 2,
+ Light = 3,
+ SemiLight = 4,
+ Normal = 5,
+ Medium = 6,
+ SemiBold = 7,
+ Bold = 8,
+ UltraBold = 9,
+ Black = 10
+};
+}
+
+namespace family
+{
+enum type {
+ Unknown = 0,
+ Decorative = 1,
+ Modern = 2,
+ Roman = 3,
+ Script = 4,
+ Swiss = 5,
+ System = 6
+};
+}
+
+namespace fonttype
+{
+enum type {
+ Unknown = 0,
+ Type1 = 1,
+ TrueType = 2,
+ Builtin = 3
+};
+}
+
+namespace fcstatus
+{
+enum type {
+ istrue,
+ isunset,
+ isfalse
+};
+}
+
+/*
+ * the difference between FastPrintFontInfo and PrintFontInfo
+ * is that the information in FastPrintFontInfo can usually
+ * be gathered without openening either the font file or
+ * an afm metric file. they are gathered from fonts.dir alone.
+ * if only FastPrintFontInfo is gathered and PrintFontInfo
+ * on demand and for less fonts, then performance in startup
+ * increases considerably
+ */
+
+struct FastPrintFontInfo
+{
+ fontID m_nID; // FontID
+ fonttype::type m_eType;
+
+ // font attributes
+ rtl::OUString m_aFamilyName;
+ rtl::OUString m_aStyleName;
+ std::list< rtl::OUString > m_aAliases;
+ family::type m_eFamilyStyle;
+ italic::type m_eItalic;
+ width::type m_eWidth;
+ weight::type m_eWeight;
+ pitch::type m_ePitch;
+ rtl_TextEncoding m_aEncoding;
+ fcstatus::type m_eEmbeddedbitmap;
+ fcstatus::type m_eAntialias;
+
+ FastPrintFontInfo() :
+ m_nID( 0 ),
+ m_eType( fonttype::Unknown ),
+ m_eFamilyStyle( family::Unknown ),
+ m_eItalic( italic::Unknown ),
+ m_eWidth( width::Unknown ),
+ m_eWeight( weight::Unknown ),
+ m_ePitch( pitch::Unknown ),
+ m_aEncoding( RTL_TEXTENCODING_DONTKNOW ),
+ m_eEmbeddedbitmap( fcstatus::isunset ),
+ m_eAntialias( fcstatus::isunset )
+ {}
+};
+
+struct PrintFontInfo : public FastPrintFontInfo
+{
+ int m_nAscend;
+ int m_nDescend;
+ int m_nLeading;
+ int m_nWidth;
+
+ PrintFontInfo() :
+ FastPrintFontInfo(),
+ m_nAscend( 0 ),
+ m_nDescend( 0 ),
+ m_nLeading( 0 ),
+ m_nWidth( 0 )
+ {}
+};
+
+// the values are per thousand of the font size
+// note: width, height contain advances, not bounding box
+struct CharacterMetric
+{
+ short int width, height;
+
+ CharacterMetric() : width( 0 ), height( 0 ) {}
+ bool operator==( const CharacterMetric& rOther ) const
+ { return rOther.width == width && rOther.height == height; }
+ bool operator!=( const CharacterMetric& rOther ) const
+ { return rOther.width != width || rOther.height != height; }
+};
+
+struct KernPair
+{
+ sal_Unicode first, second;
+ short int kern_x, kern_y;
+
+ KernPair() : first( 0 ), second( 0 ), kern_x( 0 ), kern_y( 0 ) {}
+};
+
+class FontCache;
+
+// a class to manage printable fonts
+// aims are type1 and truetype fonts
+
+class FontCache;
+
+class VCL_DLLPUBLIC PrintFontManager
+{
+ struct PrintFont;
+ struct TrueTypeFontFile;
+ struct Type1FontFile;
+ struct BuiltinFont;
+ friend struct PrintFont;
+ friend struct TrueTypeFontFile;
+ friend struct Type1FontFile;
+ friend struct BuiltinFont;
+ friend class FontCache;
+
+ struct PrintFontMetrics
+ {
+ // character metrics are stored by the following keys:
+ // lower two bytes contain a sal_Unicode (a UCS2 character)
+ // upper byte contains: 0 for horizontal metric
+ // 1 for vertical metric
+ // highest byte: 0 for now
+ std::hash_map< int, CharacterMetric > m_aMetrics;
+ // contains the unicode blocks for which metrics were queried
+ // this implies that metrics should be queried in terms of
+ // unicode blocks. here a unicode block is identified
+ // by the upper byte of the UCS2 encoding.
+ // note that the corresponding bit should be set even
+ // if the font does not support a single character of that page
+ // this map shows, which pages were queried already
+ // if (like in AFM metrics) all metrics are queried in
+ // a single pass, then all bits should be set
+ char m_aPages[32];
+
+ bool m_bKernPairsQueried;
+ std::list< KernPair > m_aXKernPairs;
+ std::list< KernPair > m_aYKernPairs;
+ std::hash_map< sal_Unicode, bool > m_bVerticalSubstitutions;
+
+ PrintFontMetrics() : m_bKernPairsQueried( false ) {}
+
+ bool isEmpty() const { return m_aMetrics.empty(); }
+ };
+
+ struct PrintFont
+ {
+ fonttype::type m_eType;
+
+ // font attributes
+ int m_nFamilyName; // atom
+ std::list< int > m_aAliases;
+ int m_nPSName; // atom
+ rtl::OUString m_aStyleName;
+ italic::type m_eItalic;
+ width::type m_eWidth;
+ weight::type m_eWeight;
+ pitch::type m_ePitch;
+ rtl_TextEncoding m_aEncoding;
+ bool m_bFontEncodingOnly; // set if font should be only accessed by builtin encoding
+ CharacterMetric m_aGlobalMetricX;
+ CharacterMetric m_aGlobalMetricY;
+ PrintFontMetrics* m_pMetrics;
+ int m_nAscend;
+ int m_nDescend;
+ int m_nLeading;
+ int m_nXMin; // font bounding box
+ int m_nYMin;
+ int m_nXMax;
+ int m_nYMax;
+ bool m_bHaveVerticalSubstitutedGlyphs;
+ bool m_bUserOverride;
+
+ fcstatus::type m_eEmbeddedbitmap;
+ fcstatus::type m_eAntialias;
+
+ std::map< sal_Unicode, sal_Int32 > m_aEncodingVector;
+ std::map< sal_Unicode, rtl::OString > m_aNonEncoded;
+
+ PrintFont( fonttype::type eType );
+ virtual ~PrintFont();
+ virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider ) = 0;
+
+ bool readAfmMetrics( const rtl::OString& rFileName, utl::MultiAtomProvider* pProvider, bool bFillEncodingvector, bool bOnlyGlobalAttributes );
+ };
+
+ struct Type1FontFile : public PrintFont
+ {
+ int m_nDirectory; // atom containing system dependent path
+ rtl::OString m_aFontFile; // relative to directory
+ rtl::OString m_aMetricFile; // dito
+ rtl::OString m_aXLFD; // mainly for administration, contains the XLFD from fonts.dir
+
+ /* note: m_aFontFile and Metric file are not atoms
+ because they should be fairly unique */
+
+ Type1FontFile() : PrintFont( fonttype::Type1 ), m_nDirectory( 0 ) {}
+ virtual ~Type1FontFile();
+ virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider );
+ };
+
+ struct TrueTypeFontFile : public PrintFont
+ {
+ int m_nDirectory; // atom containing system dependent path
+ rtl::OString m_aFontFile; // relative to directory
+ rtl::OString m_aXLFD; // mainly for administration, contains the XLFD from fonts.dir
+ int m_nCollectionEntry; // -1 for regular fonts, 0 to ... for fonts stemming from collections
+ unsigned int m_nTypeFlags; // from TrueType file; only known use is for copyright flags
+
+ TrueTypeFontFile() : PrintFont( fonttype::TrueType ), m_nDirectory( 0 ), m_nCollectionEntry(-1), m_nTypeFlags( 0x80000000 ) {}
+ virtual ~TrueTypeFontFile();
+ virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider );
+ };
+
+ struct BuiltinFont : public PrintFont
+ {
+ int m_nDirectory; // atom containing system dependent path
+ rtl::OString m_aMetricFile;
+
+ BuiltinFont() : PrintFont( fonttype::Builtin ) {}
+ virtual ~BuiltinFont();
+ virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider );
+ };
+
+ struct XLFDEntry
+ {
+ static const int MaskFoundry = 1;
+ static const int MaskFamily = 2;
+ static const int MaskAddStyle = 4;
+ static const int MaskItalic = 8;
+ static const int MaskWeight = 16;
+ static const int MaskWidth = 32;
+ static const int MaskPitch = 64;
+ static const int MaskEncoding = 128;
+
+ int nMask; // contains a bit set for every valid member
+
+ rtl::OString aFoundry;
+ rtl::OString aFamily;
+ rtl::OString aAddStyle;
+ italic::type eItalic;
+ weight::type eWeight;
+ width::type eWidth;
+ pitch::type ePitch;
+ rtl_TextEncoding aEncoding;
+
+ XLFDEntry() { nMask = 0; }
+
+ bool operator<(const XLFDEntry& rRight) const;
+ bool operator==(const XLFDEntry& rRight) const;
+ };
+
+ static rtl::OString s_aEmptyOString;
+
+ fontID m_nNextFontID;
+ std::hash_map< fontID, PrintFont* > m_aFonts;
+ std::hash_map< int, family::type > m_aFamilyTypes;
+ std::list< rtl::OUString > m_aPrinterDrivers;
+ std::list< rtl::OString > m_aFontDirectories;
+ std::list< int > m_aPrivateFontDirectories;
+ std::map< struct XLFDEntry, std::list< struct XLFDEntry > >
+ m_aXLFD_Aliases;
+ utl::MultiAtomProvider* m_pAtoms;
+ // for speeding up findFontFileID
+ std::hash_map< rtl::OString, std::set< fontID >, rtl::OStringHash >
+ m_aFontFileToFontID;
+
+ std::hash_map< rtl::OString, int, rtl::OStringHash >
+ m_aDirToAtom;
+ std::hash_map< int, rtl::OString > m_aAtomToDir;
+ int m_nNextDirAtom;
+
+ std::hash_multimap< rtl::OString, sal_Unicode, rtl::OStringHash >
+ m_aAdobenameToUnicode;
+ std::hash_multimap< sal_Unicode, rtl::OString >
+ m_aUnicodeToAdobename;
+ std::hash_multimap< sal_Unicode, sal_uInt8 > m_aUnicodeToAdobecode;
+ std::hash_multimap< sal_uInt8, sal_Unicode > m_aAdobecodeToUnicode;
+
+ mutable FontCache* m_pFontCache;
+ bool m_bFontconfigSuccess;
+
+ mutable std::vector< fontID > m_aOverrideFonts;
+
+ rtl::OString getAfmFile( PrintFont* pFont ) const;
+ rtl::OString getFontFile( PrintFont* pFont ) const;
+
+ void getFontAttributesFromXLFD( PrintFont* pFont, const std::list< rtl::OString >& rXLFDs ) const;
+
+ bool analyzeFontFile( int nDirID, const rtl::OString& rFileName, const std::list< rtl::OString >& rXLFDs, std::list< PrintFont* >& rNewFonts ) const;
+ rtl::OUString convertTrueTypeName( void* pNameRecord ) const; // actually a NameRecord* formt font subsetting code
+ void analyzeTrueTypeFamilyName( void* pTTFont, std::list< rtl::OUString >& rnames ) const; // actually a TrueTypeFont* from font subsetting code
+ bool analyzeTrueTypeFile( PrintFont* pFont ) const;
+ // finds the FIRST id for this font file; there may be more
+ // for TrueType collections
+ fontID findFontFileID( int nDirID, const rtl::OString& rFile ) const;
+ fontID findFontBuiltinID( int nPSNameAtom ) const;
+
+ family::type matchFamilyName( const rtl::OUString& rFamily ) const;
+
+ PrintFont* getFont( fontID nID ) const
+ {
+ std::hash_map< fontID, PrintFont* >::const_iterator it;
+ it = m_aFonts.find( nID );
+ return it == m_aFonts.end() ? NULL : it->second;
+ }
+ rtl::OString getXLFD( PrintFont* pFont ) const;
+ void fillPrintFontInfo( PrintFont* pFont, FastPrintFontInfo& rInfo ) const;
+ void fillPrintFontInfo( PrintFont* pFont, PrintFontInfo& rInfo ) const;
+
+ const rtl::OString& getDirectory( int nAtom ) const;
+ int getDirectoryAtom( const rtl::OString& rDirectory, bool bCreate = false );
+
+ /* try to initialize fonts from libfontconfig
+
+ called from <code>initialize()</code>
+
+ @returns
+ true if at least one font was added by libfontconfig
+ false else (e.g. no libfontconfig found)
+ */
+ bool initFontconfig();
+ int countFontconfigFonts();
+ /* deinitialize fontconfig
+ */
+ void deinitFontconfig();
+
+ /* register an application specific font directory for libfontconfig
+
+ since fontconfig is asked for font substitutes before OOo will check for font availability
+ and fontconfig will happily substitute fonts it doesn't know (e.g. "Arial Narrow" -> "DejaVu Sans Book"!)
+ it becomes necessary to tell the library about all the hidden font treasures
+
+ @returns
+ true if libfontconfig accepted the directory
+ false else (e.g. no libfontconfig found)
+ */
+ bool addFontconfigDir(const rtl::OString& rDirectory);
+
+ static bool parseXLFD( const rtl::OString& rXLFD, XLFDEntry& rEntry );
+ void parseXLFD_appendAliases( const std::list< rtl::OString >& rXLFDs, std::list< XLFDEntry >& rEntries ) const;
+ void initFontsAlias();
+
+ bool readOverrideMetrics();
+
+ PrintFontManager();
+ ~PrintFontManager();
+public:
+ static PrintFontManager& get(); // one instance only
+
+ int addFontFile( const rtl::OString& rFileName, int nFaceNum );
+
+ void initialize();
+
+ // returns the number of managed fonts
+ int getFontCount() const { return m_aFonts.size(); }
+
+ // caution: the getFontList* methods can change the font list on demand
+ // depending on the pParser argument. That is getFontCount() may
+ // return a larger value after getFontList()
+
+ // returns the ids of all managed fonts. on pParser != NULL
+ // all fonttype::Builtin type fonts are not listed
+ // which do not occur in the PPD of pParser
+ void getFontList( std::list< fontID >& rFontIDs, const PPDParser* pParser = NULL, bool bUseOverrideMetrics = false );
+ // get the font list and detailed font info. see getFontList for pParser
+ void getFontListWithInfo( std::list< PrintFontInfo >& rFonts, const PPDParser* pParser = NULL, bool bUseOverrideMetrics = false );
+ // get the font list and fast font info. see getFontList for pParser
+ void getFontListWithFastInfo( std::list< FastPrintFontInfo >& rFonts, const PPDParser* pParser = NULL, bool bUseOverrideMetrics = false );
+
+ // get font info for a specific font
+ bool getFontInfo( fontID nFontID, PrintFontInfo& rInfo ) const;
+ // get fast font info for a specific font
+ bool getFontFastInfo( fontID nFontID, FastPrintFontInfo& rInfo ) const;
+
+ // routines to get font info in small pieces
+
+ // get a specific fonts family name
+ const rtl::OUString& getFontFamily( fontID nFontID ) const;
+ // get a specific fonts PSName name
+ const rtl::OUString& getPSName( fontID nFontID ) const;
+
+ // get a specific fonts style family
+ family::type getFontFamilyType( fontID nFontID ) const;
+
+ // get a specific fonts family name aliases
+ void getFontFamilyAliases( fontID nFontID ) const;
+
+ // get a specific fonts type
+ fonttype::type getFontType( fontID nFontID ) const
+ {
+ PrintFont* pFont = getFont( nFontID );
+ return pFont ? pFont->m_eType : fonttype::Unknown;
+ }
+
+ // get a specific fonts italic type
+ italic::type getFontItalic( fontID nFontID ) const
+ {
+ PrintFont* pFont = getFont( nFontID );
+ return pFont ? pFont->m_eItalic : italic::Unknown;
+ }
+
+ // get a specific fonts width type
+ width::type getFontWidth( fontID nFontID ) const
+ {
+ PrintFont* pFont = getFont( nFontID );
+ return pFont ? pFont->m_eWidth : width::Unknown;
+ }
+
+ // get a specific fonts weight type
+ weight::type getFontWeight( fontID nFontID ) const
+ {
+ PrintFont* pFont = getFont( nFontID );
+ return pFont ? pFont->m_eWeight : weight::Unknown;
+ }
+
+ // get a specific fonts pitch type
+ pitch::type getFontPitch( fontID nFontID ) const
+ {
+ PrintFont* pFont = getFont( nFontID );
+ return pFont ? pFont->m_ePitch : pitch::Unknown;
+ }
+
+ // get a specific fonts encoding
+ rtl_TextEncoding getFontEncoding( fontID nFontID ) const
+ {
+ PrintFont* pFont = getFont( nFontID );
+ return pFont ? pFont->m_aEncoding : RTL_TEXTENCODING_DONTKNOW;
+ }
+
+ // should i only use font's builtin encoding ?
+ bool getUseOnlyFontEncoding( fontID nFontID ) const
+ {
+ PrintFont* pFont = getFont( nFontID );
+ return pFont ? pFont->m_bFontEncodingOnly : false;
+ }
+
+ // get a specific fonts system dependent filename
+ rtl::OString getFontFileSysPath( fontID nFontID ) const
+ {
+ return getFontFile( getFont( nFontID ) );
+ }
+
+ // get the ttc face number
+ int getFontFaceNumber( fontID nFontID ) const;
+
+ // get a specific fonts global metrics
+ const CharacterMetric& getGlobalFontMetric( fontID nFontID, bool bHorizontal ) const;
+
+ // get a specific fonts ascend
+ int getFontAscend( fontID nFontID ) const;
+
+ // get a specific fonts descent
+ int getFontDescend( fontID nFontID ) const;
+
+ // get a specific fonts leading
+ int getFontLeading( fontID nFontID ) const;
+
+ // get a fonts glyph bounding box
+ bool getFontBoundingBox( fontID nFont, int& xMin, int& yMin, int& xMax, int& yMax );
+
+ // info whether there are vertical substitutions
+ bool hasVerticalSubstitutions( fontID nFontID ) const;
+
+ // info whether an array of glyphs has vertical substitutions
+ void hasVerticalSubstitutions( fontID nFontID, const sal_Unicode* pCharacters,
+ int nCharacters, bool* pHasSubst ) const;
+
+ // get the XLFD for a font that originated from the X fontpath
+ // note: this may not be the original line that was in the fonts.dir
+ // returns a string for every font, but only TrueType and Type1
+ // fonts originated from the X font path, so check for the font type
+ rtl::OUString getFontXLFD( fontID nFontID ) const;
+
+ // get a specific fonts metrics
+
+ // get metrics for a sal_Unicode range
+ // the user is responsible to allocate pArray large enough
+ bool getMetrics( fontID nFontID, sal_Unicode minCharacter, sal_Unicode maxCharacter, CharacterMetric* pArray, bool bVertical = false ) const;
+ // get metrics for an array of sal_Unicode characters
+ // the user is responsible to allocate pArray large enough
+ bool getMetrics( fontID nFontID, const sal_Unicode* pString, int nLen, CharacterMetric* pArray, bool bVertical = false ) const;
+
+ // get encoding vector of font, currently only for Type1 and Builtin fonts
+ // returns NULL if encoding vector is empty or font is neither type1 or
+ // builtin; if ppNonEncoded is set and non encoded type1 glyphs exist
+ // then *ppNonEncoded is set to the mapping for nonencoded glyphs.
+ // the encoding vector contains -1 for non encoded glyphs
+ const std::map< sal_Unicode, sal_Int32 >* getEncodingMap( fontID nFontID, const std::map< sal_Unicode, rtl::OString >** ppNonEncoded ) const;
+
+ // to get font substitution transparently use the
+ // getKernPairs method of PrinterGfx
+ const std::list< KernPair >& getKernPairs( fontID nFontID, bool bVertical = false ) const;
+
+ // evaluates copyright flags for TrueType fonts
+ // type1 fonts do not have such a feature, so return for them is true
+ // returns true for builtin fonts (surprise!)
+ bool isFontDownloadingAllowed( fontID nFont ) const;
+
+ // helper for type 1 fonts
+ std::list< rtl::OString > getAdobeNameFromUnicode( sal_Unicode aChar ) const;
+
+ std::pair< std::hash_multimap< sal_Unicode, sal_uInt8 >::const_iterator,
+ std::hash_multimap< sal_Unicode, sal_uInt8 >::const_iterator >
+ getAdobeCodeFromUnicode( sal_Unicode aChar ) const
+ {
+ return m_aUnicodeToAdobecode.equal_range( aChar );
+ }
+ std::list< sal_Unicode > getUnicodeFromAdobeName( const rtl::OString& rName ) const;
+ std::pair< std::hash_multimap< sal_uInt8, sal_Unicode >::const_iterator,
+ std::hash_multimap< sal_uInt8, sal_Unicode >::const_iterator >
+ getUnicodeFromAdobeCode( sal_uInt8 aChar ) const
+ {
+ return m_aAdobecodeToUnicode.equal_range( aChar );
+ }
+
+ // creates a new font subset of an existing TrueType font
+ // returns true in case of success, else false
+ // nFont: the font to be subsetted
+ // rOutFile: the file to put the new subset into;
+ // must be a valid osl file URL
+ // pGlyphIDs: input array of glyph ids for new font
+ // pNewEncoding: the corresponding encoding in the new font
+ // pWidths: output array of widths of requested glyphs
+ // nGlyphs: number of glyphs in arrays
+ // pCapHeight:: capital height of the produced font
+ // pXMin, pYMin, pXMax, pYMax: outgoing font bounding box
+ bool createFontSubset( fontID nFont,
+ const rtl::OUString& rOutFile,
+ sal_Int32* pGlyphIDs,
+ sal_uInt8* pNewEncoding,
+ sal_Int32* pWidths,
+ int nGlyphs,
+ bool bVertical = false
+ );
+ void getGlyphWidths( fontID nFont,
+ bool bVertical,
+ std::vector< sal_Int32 >& rWidths,
+ std::map< sal_Unicode, sal_uInt32 >& rUnicodeEnc );
+
+
+ // font administration functions
+
+ // for importFonts to provide the user feedback
+ class ImportFontCallback
+ {
+ public:
+ enum FailCondition { NoWritableDirectory, NoAfmMetric, AfmCopyFailed, FontCopyFailed };
+ virtual void importFontsFailed( FailCondition eReason ) = 0;
+ virtual void progress( const rtl::OUString& rFile ) = 0;
+ virtual bool queryOverwriteFile( const rtl::OUString& rFile ) = 0;
+ virtual void importFontFailed( const rtl::OUString& rFile, FailCondition ) = 0;
+ virtual bool isCanceled() = 0;
+ };
+
+ // checks wether font import would fail due to no writeable directory
+ bool checkImportPossible() const;
+ // expects system paths not UNC paths
+ // returns the number of fonts successfully imported
+ int importFonts( const std::list< rtl::OString >& rFiles, bool bLinkOnly = false, ImportFontCallback* pCallback = NULL );
+
+ // check wether changeFontProperties would fail due to not writable fonts.dir
+ bool checkChangeFontPropertiesPossible( fontID nFont ) const;
+ // change fonts.dir entry for font
+ bool changeFontProperties( fontID nFont, const rtl::OUString& rXLFD );
+
+ // get properties of a not imported font file
+ bool getImportableFontProperties( const rtl::OString& rFile, std::list< FastPrintFontInfo >& rFontProps );
+
+ // get fonts that come from the same font file
+ bool getFileDuplicates( fontID nFont, std::list< fontID >& rFonts ) const;
+ // remove font files
+ bool removeFonts( const std::list< fontID >& rFonts );
+
+ bool isPrivateFontFile( fontID ) const;
+
+ // returns false if there were not any
+ bool getAlternativeFamilyNames( fontID nFont, std::list< rtl::OUString >& rNames ) const;
+
+ /* system dependendent font matching
+
+ <p>
+ <code>matchFont</code> matches a pattern of font characteristics
+ and returns the closest match if possibe. If a match was found
+ the <code>FastPrintFontInfo</code> passed in as parameter
+ will be update to the found matching font.
+ </p>
+ <p>
+ implementation note: currently the function is only implemented
+ for fontconfig.
+ </p>
+
+ @param rInfo
+ out of the FastPrintFontInfo structure the following
+ fields will be used for the match:
+ <ul>
+ <li>family name</li>
+ <li>italic</li>
+ <li>width</li>
+ <li>weight</li>
+ <li>pitch</li>
+ </ul>
+
+ @param rLocale
+ if <code>rLocal</code> contains non empty strings the corresponding
+ locale will be used for font matching also; e.g. "Sans" can result
+ in different fonts in e.g. english and japanese
+
+ @returns
+ true if a match was found
+ false else
+ */
+ bool matchFont( FastPrintFontInfo& rInfo, const com::sun::star::lang::Locale& rLocale );
+
+ rtl::OUString Substitute( const rtl::OUString& rFontName, rtl::OUString& rMissingCodes,
+ const rtl::OString& rLangAttrib, italic::type eItalic, weight::type eWeight,
+ width::type eWidth, pitch::type ePitch) const;
+ bool hasFontconfig() const { return m_bFontconfigSuccess; }
+
+ int FreeTypeCharIndex( void *pFace, sal_uInt32 aChar );
+};
+
+} // namespace
+
+#endif // _PSPRINT_FONTMANAGER_HXX_
diff --git a/vcl/inc/vcl/helper.hxx b/vcl/inc/vcl/helper.hxx
new file mode 100644
index 000000000000..04576e30b516
--- /dev/null
+++ b/vcl/inc/vcl/helper.hxx
@@ -0,0 +1,68 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: helper.hxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_HELPER_HXX_
+#define _PSPRINT_HELPER_HXX_
+
+#include <list>
+
+#include "vcl/dllapi.h"
+
+#include "rtl/ustring.hxx"
+
+
+// forwards
+namespace osl { class File; }
+
+namespace psp {
+typedef int fontID;
+
+void VCL_DLLPUBLIC getPrinterPathList( std::list< rtl::OUString >& rPathList, const char* pSubDir );
+
+// note: gcc 3.4.1 warns about visibility if we retunr a const rtl::OUString& here
+// seems to be a bug in gcc, now we return an object instead of a reference
+rtl::OUString VCL_DLLPUBLIC getFontPath();
+
+bool VCL_DLLPUBLIC convertPfbToPfa( osl::File& rInFile, osl::File& rOutFile );
+
+// normalized path (equivalent to realpath)
+void VCL_DLLPUBLIC normPath( rtl::OString& rPath );
+
+// splits rOrgPath into dirname and basename
+// rOrgPath will be subject to normPath
+void VCL_DLLPUBLIC splitPath( rtl::OString& rOrgPath, rtl::OString& rDir, rtl::OString& rBase );
+
+enum whichOfficePath { NetPath, UserPath, ConfigPath };
+// note: gcc 3.4.1 warns about visibility if we retunr a const rtl::OUString& here
+// seems to be a bug in gcc, now we return an object instead of a reference
+rtl::OUString VCL_DLLPUBLIC getOfficePath( enum whichOfficePath ePath );
+} // namespace
+
+#endif // _PSPRINT_HELPER_HXX_
diff --git a/vcl/inc/vcl/jobdata.hxx b/vcl/inc/vcl/jobdata.hxx
new file mode 100644
index 000000000000..4451c566b5bf
--- /dev/null
+++ b/vcl/inc/vcl/jobdata.hxx
@@ -0,0 +1,86 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: jobdata.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_JOBDATA_HXX_
+#define _PSPRINT_JOBDATA_HXX_
+
+#include "vcl/ppdparser.hxx"
+
+namespace psp {
+
+namespace orientation {
+enum type {
+ Portrait,
+ Landscape
+};
+}
+
+struct JobData
+{
+ int m_nCopies;
+ int m_nLeftMarginAdjust;
+ int m_nRightMarginAdjust;
+ int m_nTopMarginAdjust;
+ int m_nBottomMarginAdjust;
+ // user overrides for PPD
+ int m_nColorDepth;
+ int m_nPSLevel; // 0: no override, else languaglevel to use
+ int m_nColorDevice; // 0: no override, -1 grey scale, +1 color
+ orientation::type m_eOrientation;
+ ::rtl::OUString m_aPrinterName;
+ const PPDParser* m_pParser;
+ PPDContext m_aContext;
+
+ JobData() :
+ m_nCopies( 1 ),
+ m_nLeftMarginAdjust( 0 ),
+ m_nRightMarginAdjust( 0 ),
+ m_nTopMarginAdjust( 0 ),
+ m_nBottomMarginAdjust( 0 ),
+ m_nColorDepth( 24 ),
+ m_nPSLevel( 0 ),
+ m_nColorDevice( 0 ),
+ m_eOrientation( orientation::Portrait ),
+ m_pParser( NULL ) {}
+
+ JobData& operator=(const psp::JobData& rRight);
+
+ JobData( const JobData& rData ) { *this = rData; }
+
+ // creates a new buffer using new
+ // it is up to the user to delete it again
+ bool getStreamBuffer( void*& pData, int& bytes );
+ static bool constructFromStreamBuffer( void* pData, int bytes, JobData& rJobData );
+};
+
+} // namespace
+
+
+#endif // PSPRINT_JOBDATA_HXX
diff --git a/vcl/inc/vcl/ppdparser.hxx b/vcl/inc/vcl/ppdparser.hxx
new file mode 100644
index 000000000000..5fa47d412f26
--- /dev/null
+++ b/vcl/inc/vcl/ppdparser.hxx
@@ -0,0 +1,333 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ppdparser.hxx,v $
+ * $Revision: 1.12.10.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _PSPRINT_PPDPARSER_HXX_
+#define _PSPRINT_PPDPARSER_HXX_
+
+#include <list>
+#include <vector>
+#include <hash_map>
+
+#include "tools/string.hxx"
+#include "tools/stream.hxx"
+
+#define PRINTER_PPDDIR "driver"
+
+namespace psp {
+
+class PPDParser;
+
+enum PPDValueType { eInvocation, eQuoted, eSymbol, eString, eNo };
+
+struct PPDValue
+{
+ PPDValueType m_eType;
+ String m_aOption;
+ String m_aOptionTranslation;
+ String m_aValue;
+ String m_aValueTranslation;
+};
+
+// ----------------------------------------------------------------------
+
+/*
+ * PPDKey - a container for the available options (=values) of a PPD keyword
+ */
+
+class PPDKey
+{
+ friend class PPDParser;
+
+ typedef ::std::hash_map< ::rtl::OUString, PPDValue, ::rtl::OUStringHash > hash_type;
+ typedef ::std::vector< PPDValue* > value_type;
+
+ String m_aKey;
+ hash_type m_aValues;
+ value_type m_aOrderedValues;
+ const PPDValue* m_pDefaultValue;
+ bool m_bQueryValue;
+ PPDValue m_aQueryValue;
+
+public:
+ enum UIType { PickOne, PickMany, Boolean };
+ enum SetupType { ExitServer, Prolog, DocumentSetup, PageSetup, JCLSetup, AnySetup };
+private:
+
+ bool m_bUIOption;
+ String m_aUITranslation;
+ UIType m_eUIType;
+ int m_nOrderDependency;
+ SetupType m_eSetupType;
+
+ void eraseValue( const String& rOption );
+public:
+ PPDKey( const String& rKey );
+ ~PPDKey();
+
+ PPDValue* insertValue( const String& rOption );
+ int countValues() const
+ { return m_aValues.size(); }
+ // neither getValue will return the query option
+ const PPDValue* getValue( int n ) const;
+ const PPDValue* getValue( const String& rOption ) const;
+ const PPDValue* getValueCaseInsensitive( const String& rOption ) const;
+ const PPDValue* getDefaultValue() const { return m_pDefaultValue; }
+ const PPDValue* getQueryValue() const { return m_bQueryValue ? &m_aQueryValue : NULL; }
+
+ const String& getKey() const { return m_aKey; }
+ bool isUIKey() const { return m_bUIOption; }
+ const String& getUITranslation() const { return m_aUITranslation; }
+ UIType getUIType() const { return m_eUIType; }
+ SetupType getSetupType() const { return m_eSetupType; }
+ int getOrderDependency() const { return m_nOrderDependency; }
+};
+
+// define a hash for PPDKey
+struct PPDKeyhash
+{
+ size_t operator()( const PPDKey * pKey) const
+ { return (size_t)pKey; }
+};
+
+// ----------------------------------------------------------------------
+
+/*
+ * PPDParser - parses a PPD file and contains all available keys from it
+ */
+
+class PPDContext;
+class CUPSManager;
+
+class PPDParser
+{
+ friend class PPDContext;
+ friend class CUPSManager;
+
+ typedef ::std::hash_map< ::rtl::OUString, PPDKey*, ::rtl::OUStringHash > hash_type;
+ typedef ::std::vector< PPDKey* > value_type;
+
+ void insertKey( const String& rKey, PPDKey* pKey );
+public:
+ struct PPDConstraint
+ {
+ const PPDKey* m_pKey1;
+ const PPDValue* m_pOption1;
+ const PPDKey* m_pKey2;
+ const PPDValue* m_pOption2;
+
+ PPDConstraint() : m_pKey1( NULL ), m_pOption1( NULL ), m_pKey2( NULL ), m_pOption2( NULL ) {}
+ };
+private:
+
+ static ::std::list< PPDParser* > aAllParsers;
+ static ::std::hash_map< rtl::OUString, rtl::OUString, rtl::OUStringHash >*
+ pAllPPDFiles;
+
+ hash_type m_aKeys;
+ value_type m_aOrderedKeys;
+ ::std::list< PPDConstraint > m_aConstraints;
+
+ // some identifying fields
+ String m_aPrinterName;
+ String m_aNickName;
+ // the full path of the PPD file
+ String m_aFile;
+ // some basic attributes
+ bool m_bColorDevice;
+ bool m_bType42Capable;
+ ULONG m_nLanguageLevel;
+ rtl_TextEncoding m_aFileEncoding;
+
+
+ // shortcuts to important keys and their default values
+ // imageable area
+ const PPDValue* m_pDefaultImageableArea;
+ const PPDKey* m_pImageableAreas;
+ // paper dimensions
+ const PPDValue* m_pDefaultPaperDimension;
+ const PPDKey* m_pPaperDimensions;
+ // paper trays
+ const PPDValue* m_pDefaultInputSlot;
+ const PPDKey* m_pInputSlots;
+ // resolutions
+ const PPDValue* m_pDefaultResolution;
+ const PPDKey* m_pResolutions;
+ // duplex commands
+ const PPDValue* m_pDefaultDuplexType;
+ const PPDKey* m_pDuplexTypes;
+
+ // fonts
+ const PPDKey* m_pFontList;
+
+ PPDParser( const String& rFile );
+ ~PPDParser();
+
+ void parseOrderDependency( const ByteString& rLine );
+ void parseOpenUI( const ByteString& rLine );
+ void parseConstraint( const ByteString& rLine );
+ void parse( std::list< ByteString >& rLines );
+
+ String handleTranslation( const ByteString& rString );
+
+ static void scanPPDDir( const String& rDir );
+ static void initPPDFiles();
+ static String getPPDFile( const String& rFile );
+public:
+ static const PPDParser* getParser( const String& rFile );
+ static String getPPDPrinterName( const String& rFile );
+ static void freeAll();
+ static void getKnownPPDDrivers( std::list< rtl::OUString >& o_rDrivers );
+
+ const String& getFilename() const { return m_aFile; }
+
+ const PPDKey* getKey( int n ) const;
+ const PPDKey* getKey( const String& rKey ) const;
+ int getKeys() const { return m_aKeys.size(); }
+ bool hasKey( const PPDKey* ) const;
+
+ const ::std::list< PPDConstraint >& getConstraints() const { return m_aConstraints; }
+
+ const String& getPrinterName() const
+ { return m_aPrinterName.Len() ? m_aPrinterName : m_aNickName; }
+ const String& getNickName() const
+ { return m_aNickName.Len() ? m_aNickName : m_aPrinterName; }
+
+ bool isColorDevice() const { return m_bColorDevice; }
+ bool isType42Capable() const { return m_bType42Capable; }
+ ULONG getLanguageLevel() const { return m_nLanguageLevel; }
+
+ const String& getDefaultPaperDimension() const;
+ void getDefaultPaperDimension( int& rWidth, int& rHeight ) const
+ { getPaperDimension( getDefaultPaperDimension(), rWidth, rHeight ); }
+ bool getPaperDimension( const String& rPaperName,
+ int& rWidth, int& rHeight ) const;
+ // width and height in pt
+ // returns false if paper not found
+ int getPaperDimensions() const
+ { return m_pPaperDimensions ? m_pPaperDimensions->countValues() : 0; }
+ const String& getPaperDimension( int ) const;
+ const String& getPaperDimensionCommand( int ) const;
+ const String& getPaperDimensionCommand( const String & ) const;
+
+ // match the best paper for width and height
+ const String& matchPaper( int nWidth, int nHeight ) const;
+
+ bool getMargins( const String& rPaperName,
+ int &rLeft, int& rRight,
+ int &rUpper, int& rLower ) const;
+ // values in pt
+ // returns true if paper found
+
+ // values int pt
+
+ const String& getDefaultInputSlot() const;
+ int getInputSlots() const
+ { return m_pInputSlots ? m_pInputSlots->countValues() : 0; }
+ const String& getSlot( int ) const;
+ const String& getSlotCommand( int ) const;
+ const String& getSlotCommand( const String& ) const;
+
+ void getDefaultResolution( int& rXRes, int& rYRes ) const;
+ int getResolutions() const;
+ void getResolution( int, int& rXRes, int& rYRes ) const;
+ const String& getResolutionCommand( int nXRes, int nYRes ) const;
+ // values in dpi
+ void getResolutionFromString( const String&, int&, int& ) const;
+ // helper function
+
+ const String& getDefaultDuplexType() const;
+ int getDuplexTypes() const
+ { return m_pDuplexTypes ? m_pDuplexTypes->countValues() : 0; }
+ const String& getDuplex( int ) const;
+ const String& getDuplexCommand( int ) const;
+ const String& getDuplexCommand( const String& ) const;
+
+ int getFonts() const
+ { return m_pFontList ? m_pFontList->countValues() : 0; }
+ void getFontAttributes( int,
+ String& rEncoding,
+ String& rCharset ) const;
+ void getFontAttributes( const String&,
+ String& rEncoding,
+ String& rCharset ) const;
+ const String& getFont( int ) const;
+};
+
+// ----------------------------------------------------------------------
+
+/*
+ * PPDContext - a class to manage user definable states based on the
+ * contents of a PPDParser.
+ */
+
+class PPDContext
+{
+ typedef ::std::hash_map< const PPDKey*, const PPDValue*, PPDKeyhash > hash_type;
+ hash_type m_aCurrentValues;
+ const PPDParser* m_pParser;
+
+ // returns false: check failed, new value is constrained
+ // true: check succeded, new value can be set
+ bool checkConstraints( const PPDKey*, const PPDValue*, bool bDoReset );
+ bool resetValue( const PPDKey*, bool bDefaultable = false );
+public:
+ PPDContext( const PPDParser* pParser = NULL );
+ PPDContext( const PPDContext& rContext ) { operator=( rContext ); }
+ PPDContext& operator=( const PPDContext& rContext );
+ ~PPDContext();
+
+ void setParser( const PPDParser* );
+ const PPDParser* getParser() const { return m_pParser; }
+
+ const PPDValue* getValue( const PPDKey* ) const;
+ const PPDValue* setValue( const PPDKey*, const PPDValue*, bool bDontCareForConstraints = false );
+
+ int countValuesModified() const { return m_aCurrentValues.size(); }
+ const PPDKey* getModifiedKey( int n ) const;
+
+ // public wrapper for the private method
+ bool checkConstraints( const PPDKey*, const PPDValue* );
+
+ void getUnconstrainedValues( const PPDKey*, ::std::list< const PPDValue* >& rValues );
+
+ // for printer setup
+ void* getStreamableBuffer( ULONG& rBytes ) const;
+ void rebuildFromStreamBuffer( void* pBuffer, ULONG nBytes );
+
+ // convenience
+ int getRenderResolution() const;
+
+ // width, height in points, paper will contain the name of the selected
+ // paper after the call
+ void getPageSize( String& rPaper, int& rWidth, int& rHeight ) const;
+};
+
+} // namespace
+
+#endif // _PSPRINT_PPDPARSER_HXX_
diff --git a/vcl/inc/vcl/printergfx.hxx b/vcl/inc/vcl/printergfx.hxx
new file mode 100644
index 000000000000..3bb242c802dd
--- /dev/null
+++ b/vcl/inc/vcl/printergfx.hxx
@@ -0,0 +1,444 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: printergfx.hxx,v $
+ * $Revision: 1.19.18.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_PRINTERGFX_HXX_
+#define _PSPRINT_PRINTERGFX_HXX_
+
+#include "vcl/helper.hxx"
+#include "osl/file.hxx"
+#include "tools/gen.hxx"
+
+#include <list>
+#include <hash_map>
+
+namespace psp {
+
+// forwards
+class JobData;
+
+/*
+ * lightweight container to handle RGB values
+ */
+
+class PrinterColor
+{
+public:
+
+ enum ColorSpace { eInvalid, eRGB };
+
+private:
+
+ sal_uInt8 mnRed;
+ sal_uInt8 mnGreen;
+ sal_uInt8 mnBlue;
+ ColorSpace meColorspace;
+
+public:
+
+ PrinterColor () :
+ meColorspace(eInvalid)
+ {}
+ PrinterColor (sal_uInt16 nRed, sal_uInt16 nGreen,
+ sal_uInt16 nBlue) :
+ mnRed (nRed),
+ mnGreen (nGreen),
+ mnBlue (nBlue),
+ meColorspace (eRGB)
+ {}
+ PrinterColor (sal_uInt32 nRGB) :
+ mnRed ((nRGB & 0x00ff0000) >> 16),
+ mnGreen ((nRGB & 0x0000ff00) >> 8),
+ mnBlue ((nRGB & 0x000000ff) ),
+ meColorspace (eRGB)
+ {}
+ ~PrinterColor ()
+ {}
+
+ sal_Bool Is () const
+ { return meColorspace != eInvalid; }
+
+ ColorSpace GetColorSpace () const
+ { return meColorspace; }
+ sal_uInt16 GetRed () const
+ { return mnRed; }
+ sal_uInt16 GetGreen () const
+ { return mnGreen; }
+ sal_uInt16 GetBlue () const
+ { return mnBlue; }
+ sal_Bool operator== (const PrinterColor& aColor) const
+ {
+ return aColor.Is() && this->Is()
+ && mnRed == aColor.mnRed
+ && mnGreen == aColor.mnGreen
+ && mnBlue == aColor.mnBlue;
+ }
+ sal_Bool operator!= (const PrinterColor& aColor) const
+ { return ! (aColor==*this); }
+ PrinterColor& operator= (const PrinterColor& aColor)
+ {
+ meColorspace = aColor.meColorspace;
+ mnRed = aColor.mnRed;
+ mnGreen = aColor.mnGreen;
+ mnBlue = aColor.mnBlue;
+
+ return *this;
+ }
+
+ PrinterColor& operator= (sal_uInt32 nRGB)
+ {
+ meColorspace = eRGB;
+ mnBlue = (nRGB & 0x000000ff);
+ mnGreen = (nRGB & 0x0000ff00) >> 8;
+ mnRed = (nRGB & 0x00ff0000) >> 16;
+
+ return *this;
+ }
+};
+
+/*
+ * forward declarations
+ */
+
+class Font3;
+class GlyphSet;
+class PrinterJob;
+class PrintFontManager;
+class KernPair;
+struct CharacterMetric;
+
+/*
+ * Bitmap Interface, this has to be filled with your actual bitmap implementation
+ * sample implementations can be found in:
+ * psprint/workben/cui/pspdem.cxx
+ * vcl/unx/source/gdi/salgdi2.cxx
+ */
+
+class PrinterBmp
+{
+public:
+
+ virtual ~PrinterBmp () = 0;
+ virtual sal_uInt32 GetPaletteColor (sal_uInt32 nIdx) const = 0;
+ virtual sal_uInt32 GetPaletteEntryCount () const = 0;
+ virtual sal_uInt32 GetPixelRGB (sal_uInt32 nRow, sal_uInt32 nColumn) const = 0;
+ virtual sal_uInt8 GetPixelGray (sal_uInt32 nRow, sal_uInt32 nColumn) const = 0;
+ virtual sal_uInt8 GetPixelIdx (sal_uInt32 nRow, sal_uInt32 nColumn) const = 0;
+ virtual sal_uInt32 GetWidth () const = 0;
+ virtual sal_uInt32 GetHeight () const = 0;
+ virtual sal_uInt32 GetDepth () const = 0;
+};
+
+typedef enum {
+ InvalidType = 0,
+ TrueColorImage,
+ MonochromeImage,
+ PaletteImage,
+ GrayScaleImage
+} ImageType;
+
+/*
+ * printer raster operations
+ */
+
+struct GraphicsStatus
+{
+ rtl::OString maFont;
+ rtl_TextEncoding maEncoding;
+ bool mbArtItalic;
+ bool mbArtBold;
+ sal_Int32 mnTextHeight;
+ sal_Int32 mnTextWidth;
+ PrinterColor maColor;
+ double mfLineWidth;
+
+ GraphicsStatus();
+};
+
+class Font3;
+
+class PrinterGfx
+{
+private:
+
+ /* common settings */
+
+ double mfScaleX;
+ double mfScaleY;
+
+ sal_uInt32 mnDpi;
+ sal_uInt16 mnDepth;
+
+ sal_uInt16 mnPSLevel;
+ sal_Bool mbColor;
+ sal_Bool mbUploadPS42Fonts;
+
+ osl::File* mpPageHeader;
+ osl::File* mpPageBody;
+
+ void TranslateCoordinates (sal_Int32 &rXOut, sal_Int32 &rYOut,
+ sal_Int32 nXIn, sal_Int32 nYIn )
+ { rXOut = nXIn; rYOut = nYIn; }
+ void TranslateCoordinates (Point& rOut, const Point& rIn)
+ { rOut = rIn; }
+
+ /* text/font related data, for a type1 font it has to be checked
+ whether this font has already been downloaded. A TrueType font
+ will be converted into one or more Type3 fonts, containing glyphs
+ in no particular order. In addition to the existence of the
+ glyph in one of the subfonts, the mapping from unicode to the
+ glyph has to be remembered */
+
+ std::list< sal_Int32 > maPS1Font;
+ std::list< GlyphSet > maPS3Font;
+
+ sal_Int32 mnFontID;
+ sal_Int32 mnFallbackID;
+ sal_Int32 mnTextAngle;
+ bool mbTextVertical;
+ PrintFontManager& mrFontMgr;
+
+ /* bitmap drawing implementation */
+
+ sal_Bool mbCompressBmp;
+
+ void DrawPS1GrayImage (const PrinterBmp& rBitmap, const Rectangle& rArea);
+ void writePS2ImageHeader (const Rectangle& rArea, psp::ImageType nType);
+ void writePS2Colorspace (const PrinterBmp& rBitmap, psp::ImageType nType);
+ void DrawPS2GrayImage (const PrinterBmp& rBitmap, const Rectangle& rArea);
+ void DrawPS2PaletteImage (const PrinterBmp& rBitmap, const Rectangle& rArea);
+ void DrawPS2TrueColorImage (const PrinterBmp& rBitmap, const Rectangle& rArea);
+ void DrawPS2MonoImage (const PrinterBmp& rBitmap, const Rectangle& rArea);
+
+ /* clip region */
+
+ std::list< Rectangle > maClipRegion;
+ sal_Bool JoinVerticalClipRectangles( std::list< Rectangle >::iterator& it,
+ Point& aOldPoint, sal_Int32& nColumn );
+
+ /* color settings */
+ PrinterColor maFillColor;
+ PrinterColor maTextColor;
+ PrinterColor maLineColor;
+
+ /* graphics state */
+ GraphicsStatus maVirtualStatus;
+ std::list< GraphicsStatus > maGraphicsStack;
+ GraphicsStatus& currentState() { return maGraphicsStack.front(); }
+
+ /* font / font substitution */
+ friend class Font3;
+ const ::std::hash_map< fontID, fontID >* mpFontSubstitutes;
+ int getCharWidth (sal_Bool b_vert, sal_Unicode n_char,
+ CharacterMetric *p_bbox);
+ fontID getCharMetric (const Font3 &rFont, sal_Unicode n_char,
+ CharacterMetric *p_bbox);
+ fontID getFontSubstitute () const;
+ fontID getFallbackID () const { return mnFallbackID; }
+
+ bool mbStrictSO52Compatibility;
+public:
+ /* grahics status update */
+ void PSSetColor ();
+ void PSSetLineWidth ();
+ void PSSetFont ();
+
+ /* graphics status functions */
+ void PSSetColor (const PrinterColor& rColor)
+ { maVirtualStatus.maColor = rColor; }
+
+ void PSUploadPS1Font (sal_Int32 nFontID);
+ void PSSetFont (const rtl::OString& rName,
+ rtl_TextEncoding nEncoding = RTL_TEXTENCODING_DONTKNOW)
+ { maVirtualStatus.maFont = rName; maVirtualStatus.maEncoding = nEncoding; }
+
+ /* graphics status stack */
+ void PSGSave ();
+ void PSGRestore ();
+
+
+ /* PS helpers */
+ enum pspath_t { moveto = 0, lineto = 1 };
+ void PSBinLineTo (const Point& rCurrent, Point& rOld,
+ sal_Int32& nColumn);
+ void PSBinMoveTo (const Point& rCurrent, Point& rOld,
+ sal_Int32& nColumn);
+ void PSBinStartPath ();
+ void PSBinEndPath ();
+ void PSBinCurrentPath (sal_uInt32 nPoints, const Point* pPath);
+ void PSBinPath (const Point& rCurrent, Point& rOld,
+ pspath_t eType, sal_Int32& nColumn);
+
+ void PSRotate (sal_Int32 nAngle);
+ void PSTranslate (const Point& rPoint);
+ void PSMoveTo (const Point& rPoint);
+ void PSRMoveTo (sal_Int32 nDx, sal_Int32 nDy = 0);
+ void PSScale (double fScaleX, double fScaleY);
+ void PSLineTo(const Point& rPoint );
+ void PSPointOp (const Point& rPoint, const sal_Char* pOperator);
+ void PSHexString (const sal_uChar* pString, sal_Int16 nLen);
+ void PSDeltaArray (const sal_Int32 *pArray, sal_Int16 nEntries);
+ void PSShowText (const sal_uChar* pString,
+ sal_Int16 nGlyphs, sal_Int16 nBytes,
+ const sal_Int32* pDeltaArray = NULL);
+ void PSComment (const sal_Char* pComment );
+ void LicenseWarning (const Point& rPoint, const sal_Unicode* pStr,
+ sal_Int16 nLen, const sal_Int32* pDeltaArray);
+
+ void OnEndPage ();
+ void OnEndJob ();
+ void writeResources( osl::File* pFile, std::list< rtl::OString >& rSuppliedFonts, std::list< rtl::OString >& rNeededFonts );
+ PrintFontManager& GetFontMgr () { return mrFontMgr; }
+
+ void drawVerticalizedText (const Point& rPoint,
+ const sal_Unicode* pStr,
+ sal_Int16 nLen,
+ const sal_Int32* pDeltaArray );
+ void drawText (const Point& rPoint,
+ const sal_Unicode* pStr, sal_Int16 nLen,
+ const sal_Int32* pDeltaArray = NULL);
+
+ void drawGlyphs( const Point& rPoint,
+ sal_uInt32* pGlyphIds,
+ sal_Unicode* pUnicodes,
+ sal_Int16 nLen,
+ sal_Int32* pDeltaArray );
+public:
+ PrinterGfx();
+ ~PrinterGfx();
+ sal_Bool Init (PrinterJob &rPrinterSpec);
+ sal_Bool Init (const JobData& rData);
+ void Clear();
+
+ // query depth and size
+ void GetResolution (sal_Int32 &rDpiX, sal_Int32 &rDpiY) const;
+ sal_uInt16 GetBitCount ();
+
+ // clip region
+ void ResetClipRegion ();
+ void BeginSetClipRegion (sal_uInt32);
+ sal_Bool UnionClipRegion (sal_Int32 nX, sal_Int32 nY,
+ sal_Int32 nDX, sal_Int32 nDY);
+ void EndSetClipRegion ();
+
+ // set xy color
+ void SetLineColor (const PrinterColor& rLineColor = PrinterColor())
+ { maLineColor = rLineColor; }
+ void SetFillColor (const PrinterColor& rFillColor = PrinterColor())
+ { maFillColor = rFillColor; }
+
+ // drawing primitives
+ void DrawPixel (const Point& rPoint, const PrinterColor& rPixelColor);
+ void DrawPixel (const Point& rPoint)
+ { DrawPixel (rPoint, maLineColor); }
+ void DrawLine (const Point& rFrom, const Point& rTo);
+ void DrawRect (const Rectangle& rRectangle);
+ void DrawPolyLine (sal_uInt32 nPoints, const Point* pPath );
+ void DrawPolygon (sal_uInt32 nPoints, const Point* pPath);
+ void DrawPolyPolygon (sal_uInt32 nPoly,
+ const sal_uInt32 *pPolygonSize,
+ const Point** pPolygonList);
+ void DrawPolyLineBezier (sal_uInt32 nPoints,
+ const Point* pPath,
+ const BYTE* pFlgAry );
+ void DrawPolygonBezier (sal_uInt32 nPoints,
+ const Point* pPath,
+ const BYTE* pFlgAry);
+ void DrawPolyPolygonBezier (sal_uInt32 nPoly,
+ const sal_uInt32* pPoints,
+ const Point* const* pPtAry,
+ const BYTE* const* pFlgAry);
+
+ // eps
+ sal_Bool DrawEPS ( const Rectangle& rBoundingBox, void* pPtr, sal_uInt32 nSize);
+
+ // image drawing
+ void DrawBitmap (const Rectangle& rDest, const Rectangle& rSrc,
+ const PrinterBmp& rBitmap);
+ void DrawBitmap (const Rectangle& rDest, const Rectangle& rSrc,
+ const PrinterBmp& rBitmap,
+ const PrinterBmp& rTransBitmap);
+ void DrawMask (const Rectangle& rDest, const Rectangle& rSrc,
+ const PrinterBmp &rBitmap, PrinterColor& rMaskColor);
+
+ // font and text handling
+ sal_uInt16 SetFont (
+ sal_Int32 nFontID,
+ sal_Int32 nPointHeight,
+ sal_Int32 nPointWidth,
+ sal_Int32 nAngle,
+ bool bVertical,
+ bool bArtItalic,
+ bool bArtBold
+ );
+ sal_uInt16 SetFallbackFont ( sal_Int32 nFontID );
+ sal_Int32 GetFontAngle () const
+ { return mnTextAngle; }
+ sal_Int32 GetFontID () const
+ { return mnFontID; }
+ bool GetFontVertical() const
+ { return mbTextVertical; }
+ sal_Int32 GetFontHeight () const
+ { return maVirtualStatus.mnTextHeight; }
+ sal_Int32 GetFontWidth () const
+ { return maVirtualStatus.mnTextWidth; }
+ bool GetArtificialItalic() const
+ { return maVirtualStatus.mbArtItalic; }
+ bool GetArtificialBold() const
+ { return maVirtualStatus.mbArtBold; }
+ void DrawText (const Point& rPoint,
+ const sal_Unicode* pStr, sal_Int16 nLen,
+ const sal_Int32* pDeltaArray = NULL);
+ void SetTextColor (PrinterColor& rTextColor)
+ { maTextColor = rTextColor; }
+ sal_Int32 GetCharWidth (sal_uInt16 nFrom, sal_uInt16 nTo,
+ long *pWidthArray);
+ const ::std::list< KernPair >& getKernPairs( bool bVertical = false ) const;
+ // advanced font handling
+ sal_Bool GetGlyphBoundRect (sal_Unicode c, Rectangle& rOutRect);
+ sal_uInt32 GetGlyphOutline (sal_Unicode c,
+ sal_uInt16 **ppPolySizes, Point **ppPoints,
+ sal_uInt8 **ppFlags);
+
+ // for CTL
+ void DrawGlyphs( const Point& rPoint,
+ sal_uInt32* pGlyphIds,
+ sal_Unicode* pUnicodes,
+ sal_Int16 nLen,
+ sal_Int32* pDeltaArray );
+
+ bool getStrictSO52Compatibility() const;
+ void setStrictSO52Compatibility( bool );
+};
+
+} /* namespace psp */
+
+
+#endif /* _PSPRINT_PRINTERGFX_HXX_ */
+
diff --git a/vcl/inc/vcl/printerinfomanager.hxx b/vcl/inc/vcl/printerinfomanager.hxx
new file mode 100644
index 000000000000..810ad428c9db
--- /dev/null
+++ b/vcl/inc/vcl/printerinfomanager.hxx
@@ -0,0 +1,242 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: printerinfomanager.hxx,v $
+ * $Revision: 1.20 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_PRINTERINFOMANAGER_HXX_
+#define _PSPRINT_PRINTERINFOMANAGER_HXX_
+
+#include <hash_map>
+#include <list>
+
+#include "vcl/dllapi.h"
+#include "vcl/helper.hxx"
+#include "vcl/jobdata.hxx"
+#include "vcl/helper.hxx"
+#include "osl/file.hxx"
+
+#include <cstdio>
+
+namespace psp
+{
+
+class SystemQueueInfo;
+
+struct PrinterInfo : JobData
+{
+ // basename of PPD
+ rtl::OUString m_aDriverName;
+ // can be the queue
+ rtl::OUString m_aLocation;
+ // a user defined comment
+ rtl::OUString m_aComment;
+ // a command line to pipe a PS-file to
+ rtl::OUString m_aCommand;
+ // a command line to pipe a PS-file to in case of direct print
+ rtl::OUString m_aQuickCommand;
+ // a list of special features separated by ',' not used by psprint
+ // but assigned from the outside (currently for "fax","pdf=","autoqueue","external_dialog")
+ rtl::OUString m_aFeatures;
+ // a mapping of fonts to other fonts.
+ // this provides a method for the user
+ // to replace arbitrary fonts by printer builtin fonts
+ // currently this is only a mapping between font names
+ // assuming that only adbobe standard encoding fonts are
+ // built into the printer. in future it may be necessary
+ // to map to a font name and UCS2 vector which should be mapped
+ // this vector is currently implicitly given by the adobe
+ // standard encoding
+ bool m_bPerformFontSubstitution;
+ std::hash_map< rtl::OUString, rtl::OUString, rtl::OUStringHash >
+ m_aFontSubstitutes;
+ std::hash_map< fontID, fontID >
+ m_aFontSubstitutions;
+
+ PrinterInfo() :
+ JobData(),
+ m_bPerformFontSubstitution( false )
+ {}
+};
+
+class VCL_DLLPUBLIC PrinterInfoManager
+{
+public:
+ enum Type { Default = 0, CUPS = 1 };
+
+ struct SystemPrintQueue
+ {
+ rtl::OUString m_aQueue;
+ rtl::OUString m_aLocation;
+ rtl::OUString m_aComment;
+ };
+protected:
+ // needed for checkPrintersChanged: files (not necessarily existant)
+ // and their last known modification time
+ struct WatchFile
+ {
+ // the file in question
+ rtl::OUString m_aFilePath;
+ // the last know modification time or 0, if file did not exist
+ TimeValue m_aModified;
+ };
+
+ // internal data to describe a printer
+ struct Printer
+ {
+ // configuration file containing this printer
+ // empty means a freshly added printer that has to be saved yet
+ rtl::OUString m_aFile;
+ // details other config files that have this printer
+ // in case of removal all have to be removed
+ std::list< rtl::OUString > m_aAlternateFiles;
+ // group in m_aFile containing the printer
+ // this must be unique over all configuration files
+ // it usually should be the printer name
+ rtl::OString m_aGroup;
+ // whether changes need to be saved
+ bool m_bModified;
+ // the corresponding info and job data
+ PrinterInfo m_aInfo;
+ };
+
+ std::hash_map< rtl::OUString, Printer, rtl::OUStringHash > m_aPrinters;
+ PrinterInfo m_aGlobalDefaults;
+ std::list< WatchFile > m_aWatchFiles;
+ rtl::OUString m_aDefaultPrinter;
+ rtl::OUString m_aSystemPrintCommand;
+
+ std::list< SystemPrintQueue > m_aSystemPrintQueues;
+
+ SystemQueueInfo* m_pQueueInfo;
+
+ Type m_eType;
+ bool m_bUseIncludeFeature;
+ rtl::OUString m_aSystemDefaultPaper;
+
+ bool m_bDisableCUPS;
+
+ PrinterInfoManager( Type eType = Default );
+ virtual ~PrinterInfoManager();
+
+ virtual void initialize();
+
+ // fill in font substitutions
+ // the resulting hash_map maps from source to target font ids
+ void fillFontSubstitutions( PrinterInfo& rInfo ) const;
+
+ // fill default paper if not configured in config file
+ // default paper is e.g. locale dependent
+ // if a paper is already set it will not be overwritten
+ void setDefaultPaper( PPDContext& rInfo ) const;
+
+ void initSystemDefaultPaper();
+public:
+
+ // there can only be one
+ static PrinterInfoManager& get();
+
+ // get PrinterInfoManager type
+ Type getType() const { return m_eType; }
+
+ // lists the names of all known printers
+ void listPrinters( std::list< rtl::OUString >& rList ) const;
+
+ // gets the number of known printers
+ int countPrinters() const { return m_aPrinters.size(); }
+
+ // gets info about a named printer
+ const PrinterInfo& getPrinterInfo( const rtl::OUString& rPrinter ) const;
+
+ // gets the name of the default printer
+ const rtl::OUString& getDefaultPrinter() const { return m_aDefaultPrinter; }
+
+ virtual void setupJobContextData( JobData& rData );
+
+ // changes the info about a named printer
+ virtual void changePrinterInfo( const rtl::OUString& rPrinter, const PrinterInfo& rNewInfo );
+
+ // check if the printer configuration has changed
+ // if bwait is true, then this method waits for eventual asynchronous
+ // printer discovery to finish
+ virtual bool checkPrintersChanged( bool bWait );
+
+ // members for administration (->padmin)
+
+ // add a named printer
+ // addPrinter fails if a printer with the same name already exists
+ // or the driver does not exist
+ virtual bool addPrinter( const rtl::OUString& rPrinterName, const rtl::OUString& rDriverName );
+
+ // remove a named printer
+ // this fails if the config file belonging to this printer
+ // is not writeable
+ // if bCheckOnly is true, the printer is not really removed;
+ // this is for checking if the removal would fail
+ virtual bool removePrinter( const rtl::OUString& rPrinterName, bool bCheckOnly = false );
+
+ // save the changes to all printers. this fails if there
+ // is no writable config file at all
+ virtual bool writePrinterConfig();
+
+ // set a new default printer
+ // fails if the specified printer does not exist
+ virtual bool setDefaultPrinter( const rtl::OUString& rPrinterName );
+
+ // primarily used internally but also by padmin
+ // returns the printer queue names
+ virtual const std::list< SystemPrintQueue >& getSystemPrintQueues();
+
+ // similar but returnse whole commandlines
+ virtual void getSystemPrintCommands( std::list< rtl::OUString >& rCommands );
+
+ // abstract print command
+ // returns a stdio FILE* that a postscript file may be written to
+ // this may either be a regular file or the result of popen()
+ virtual FILE* startSpool( const rtl::OUString& rPrinterName, bool bQuickCommand );
+ // close the FILE* returned by startSpool and does the actual spooling
+ // returns a numerical job id
+ virtual int endSpool( const rtl::OUString& rPrinterName, const rtl::OUString& rJobTitle, FILE* pFile, const JobData& rDocumentJobData );
+
+ // for spadmin: whether adding or removing a printer is possible
+ virtual bool addOrRemovePossible() const;
+
+ bool getUseIncludeFeature() const { return m_bUseIncludeFeature; }
+
+ // check whether a printer's feature string contains a subfeature
+ bool checkFeatureToken( const rtl::OUString& rPrinterName, const char* pToken ) const;
+
+ // set m_bDisableCUPS and update printer config
+ void setCUPSDisabled( bool );
+
+ // gets m_bDisableCUPS, initialized from printer config
+ bool isCUPSDisabled() const;
+};
+
+} // namespace
+
+#endif // _PSPRINT_PRINTERINFOMANAGER_HXX_
diff --git a/vcl/inc/vcl/printerjob.hxx b/vcl/inc/vcl/printerjob.hxx
new file mode 100644
index 000000000000..9880700d4008
--- /dev/null
+++ b/vcl/inc/vcl/printerjob.hxx
@@ -0,0 +1,152 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: printerjob.hxx,v $
+ * $Revision: 1.12 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSPRINT_PRINTERJOB_HXX_
+#define _PSPRINT_PRINTERJOB_HXX_
+
+#include "vcl/jobdata.hxx"
+#include "osl/file.hxx"
+#include "rtl/string.hxx"
+
+#include <list>
+
+namespace psp {
+
+// forward declarations
+class PrinterGfx;
+
+
+class PrinterJob
+{
+private: // private data
+
+ rtl::OUString maSpoolDirName;
+ rtl::OUString maFileName; // empty: spool to command, else spool to named file
+ rtl::OUString maJobTitle;
+ int mnFileMode;
+
+ osl::File* mpJobHeader;
+ osl::File* mpJobTrailer;
+
+ std::list< osl::File* > maPageList;
+ std::list< osl::File* > maHeaderList;
+
+ JobData m_aDocumentJobData;
+ JobData m_aLastJobData;
+ PrinterGfx* m_pGraphics;
+
+ sal_uInt32 mnResolution;
+
+ sal_uInt32 mnWidthPt;
+ sal_uInt32 mnHeightPt;
+ sal_uInt32 mnMaxWidthPt;
+ sal_uInt32 mnMaxHeightPt;
+
+ int mnLandscapes;
+ int mnPortraits;
+
+ sal_uInt32 mnLMarginPt;
+ sal_uInt32 mnRMarginPt;
+ sal_uInt32 mnTMarginPt;
+ sal_uInt32 mnBMarginPt;
+
+ double mfXScale;
+ double mfYScale;
+
+ sal_Int32 mnErrorCode;
+ bool m_bQuickJob;
+
+private: // private methods
+
+ osl::File* CreateSpoolFile (const rtl::OUString& rName,
+ const rtl::OUString& rExtension);
+ void InitPaperSize (const JobData& rJobSetup);
+
+ bool writeFeatureList( osl::File* pFile, const JobData&, bool bDocumentSetup );
+ bool writeSetup( osl::File* pFile, const JobData& );
+ bool writePageSetup( osl::File* pFile, const JobData& );
+ void writeJobPatch( osl::File* File, const JobData& );
+ bool writeProlog (osl::File* pFile, const JobData& );
+
+public: // for usage in PrinterGfx
+
+ sal_uInt32 GetResolution () const { return mnResolution; }
+ void GetScale (double &rXScale, double &rYScale) const;
+ sal_uInt16 GetDepth () const;
+ sal_uInt16 GetPostscriptLevel (const JobData *pJobData = NULL) const;
+ sal_Bool IsColorPrinter () const;
+
+ osl::File* GetDocumentHeader ();
+ osl::File* GetDocumentTrailer ();
+ osl::File* GetCurrentPageHeader ();
+ osl::File* GetCurrentPageBody ();
+
+ const ::rtl::OUString& GetPrinterName() const { return m_aLastJobData.m_aPrinterName; }
+
+public:
+ PrinterJob ();
+ ~PrinterJob ();
+
+ /* rFileName: if length is greater than 0 save resulting PostScript
+ * to named file.
+ * nMode: only meaningful when saving to file: if nonzero, try
+ * to impose the mode on the resulting file's inode; for nonexistant
+ * files use open, for existant files try a chmod
+ * rJobName: text to appear in the %%Title comment
+ * rAppName: text to appear in the %%Creator comment
+ * rSetupData: JobData that apply to this job
+ * pGraphics: the graphics used to print this job;
+ * this graphics must live until End/AbortJob has returned
+ * bIsQuickJob: the job was started as "direct print" meaning
+ * the quick command for spooling should be used instead
+ * of the normal command
+ */
+ sal_Bool StartJob (const rtl::OUString& rFileName,
+ int nMode,
+ const rtl::OUString& rJobName,
+ const rtl::OUString& rAppName,
+ const JobData& rSetupData,
+ PrinterGfx* pGraphics,
+ bool bIsQuickJob
+ );
+ sal_Bool EndJob ();
+
+ sal_Bool AbortJob ();
+
+ sal_Bool StartPage (const JobData& rJobSetup);
+ sal_Bool EndPage ();
+
+ sal_uInt32 GetErrorCode ();
+};
+
+} /* namespace psp */
+
+#endif /* _PSPRINT_PRINTERJOB_HXX_ */
+
diff --git a/vcl/inc/vcl/salinst.hxx b/vcl/inc/vcl/salinst.hxx
index cf88b7813ec8..221c9e370ea6 100644
--- a/vcl/inc/vcl/salinst.hxx
+++ b/vcl/inc/vcl/salinst.hxx
@@ -31,14 +31,14 @@
#ifndef _SV_SALINST_HXX
#define _SV_SALINST_HXX
-#ifdef __cplusplus
+#include "vcl/sv.h"
+#include "vcl/dllapi.h"
-#include <tools/string.hxx>
-#endif // __cplusplus
-#include <vcl/sv.h>
-#include <vcl/dllapi.h>
+#include "tools/string.hxx"
-#ifdef __cplusplus
+#include "rtl/string.hxx"
+
+#include <list>
struct SystemParentData;
struct SalPrinterQueueInfo;
@@ -171,6 +171,11 @@ public:
enum ConnectionIdentifierType { AsciiCString, Blob };
virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ) = 0;
+
+ // this is a vehicle for PrintFontManager to bridge the gap between vcl and libvclplug_*
+ // this is only necessary because PrintFontManager is an exported vcl API and therefore
+ // needs to be in libvcl while libvclplug_* do not contain exported C++ API
+ virtual void FillFontPathList( std::list< rtl::OString >& o_rFontPaths );
};
// called from SVMain
@@ -185,8 +190,6 @@ void SalAbort( const XubString& rErrorText );
VCL_DLLPUBLIC const ::rtl::OUString& SalGetDesktopEnvironment();
-#endif // __cplusplus
-
// -----------
// - SalData -
// -----------
diff --git a/vcl/inc/vcl/strhelper.hxx b/vcl/inc/vcl/strhelper.hxx
new file mode 100644
index 000000000000..b3548a07680b
--- /dev/null
+++ b/vcl/inc/vcl/strhelper.hxx
@@ -0,0 +1,86 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: strhelper.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _PSPRINT_STRHELPER_HXX_
+#define _PSPRINT_STRHELPER_HXX_
+
+#include "vcl/dllapi.h"
+
+#include <tools/string.hxx>
+#include <rtl/math.hxx>
+
+#include <cstring>
+
+namespace psp {
+
+String VCL_DLLPUBLIC GetCommandLineToken( int, const String& );
+ByteString VCL_DLLPUBLIC GetCommandLineToken( int, const ByteString& );
+// gets one token of a unix command line style string
+// doublequote, singlequote and singleleftquote protect their respective
+// contents
+
+int VCL_DLLPUBLIC GetCommandLineTokenCount( const String& );
+int VCL_DLLPUBLIC GetCommandLineTokenCount( const ByteString& );
+// returns number of tokens (zero if empty or whitespace only)
+
+String VCL_DLLPUBLIC WhitespaceToSpace( const String&, BOOL bProtect = TRUE );
+ByteString VCL_DLLPUBLIC WhitespaceToSpace( const ByteString&, BOOL bProtect = TRUE );
+// returns a string with multiple adjacent occurences of whitespace
+// converted to a single space. if bProtect is TRUE (nonzero), then
+// doublequote, singlequote and singleleftquote protect their respective
+// contents
+
+
+// parses the first double in the string; decimal is '.' only
+inline double VCL_DLLPUBLIC StringToDouble( const String& rStr )
+{
+ rtl_math_ConversionStatus eStatus;
+ return rtl::math::stringToDouble( rStr, sal_Unicode('.'), sal_Unicode(0), &eStatus, NULL);
+}
+
+inline double VCL_DLLPUBLIC StringToDouble( const ByteString& rStr )
+{
+ rtl_math_ConversionStatus eStatus;
+ return rtl::math::stringToDouble( rtl::OStringToOUString( rStr, osl_getThreadTextEncoding() ), sal_Unicode('.'), sal_Unicode(0), &eStatus, NULL);
+}
+
+// fills a character buffer with the string representation of a double
+// the buffer has to be long enough (e.g. 128 bytes)
+// returns the string len
+inline int VCL_DLLPUBLIC getValueOfDouble( char* pBuffer, double f, int nPrecision = 0)
+{
+ rtl::OString aStr( rtl::math::doubleToString( f, rtl_math_StringFormat_G, nPrecision, '.', true ) );
+ int nLen = aStr.getLength();
+ std::strncpy( pBuffer, aStr.getStr(), nLen+1 ); // copy string including terminating zero
+ return nLen;
+}
+
+} // namespace
+
+#endif // _PSPRINT_STRHELPER_HXX_
diff --git a/vcl/os2/source/gdi/salgdi3.cxx b/vcl/os2/source/gdi/salgdi3.cxx
index e6a5788b401c..15034168269e 100644
--- a/vcl/os2/source/gdi/salgdi3.cxx
+++ b/vcl/os2/source/gdi/salgdi3.cxx
@@ -75,8 +75,8 @@
#endif
#ifndef __SUBFONT_H
-#include <psprint/list.h>
-#include <psprint/sft.h>
+#include <list.h>
+#include <sft.h>
#endif
#ifdef GCP_KERN_HACK
diff --git a/vcl/prj/build.lst b/vcl/prj/build.lst
index eeda7e620d9d..ac93ae71bdd2 100644
--- a/vcl/prj/build.lst
+++ b/vcl/prj/build.lst
@@ -1,4 +1,4 @@
-vc vcl : apple_remote BOOST:boost psprint rsc sot ucbhelper unotools ICU:icu i18npool i18nutil unoil ridljar X11_EXTENSIONS:x11_extensions offuh basegfx basebmp tools transex3 icc NULL
+vc vcl : apple_remote BOOST:boost rsc sot ucbhelper unotools ICU:icu i18npool i18nutil unoil ridljar X11_EXTENSIONS:x11_extensions offuh basegfx basebmp tools transex3 icc NULL
vc vcl usr1 - all vc_mkout NULL
vc vcl\inc nmake - all vc_inc NULL
vc vcl\source\glyphs nmake - all vc_glyphs vc_inc NULL
@@ -8,6 +8,7 @@ vc vcl\source\window nmake - all vc_win vc_inc NULL
vc vcl\source\control nmake - all vc_ctrl vc_inc NULL
vc vcl\source\src nmake - all vc_src vc_inc NULL
vc vcl\source\helper nmake - all vc_hlp vc_inc NULL
+vc vcl\source\fontsubset nmake - all vc_fts vc_inc NULL
vc vcl\source\salmain nmake - all vc_salmain vc_inc NULL
vc vcl\os2\source\app nmake - p vc__appp vc_inc NULL
vc vcl\os2\source\gdi nmake - p vc__gdip vc_inc NULL
@@ -20,7 +21,10 @@ vc vcl\win\source\window nmake - w vc__winw vc_inc NULL
vc vcl\win\source\src nmake - w vc__srcw vc_inc NULL
vc vcl\unx\source\plugadapt nmake - u vc__plug vc_inc NULL
vc vcl\unx\source\app nmake - u vc__appu vc_inc NULL
+vc vcl\unx\source\fontmanager nmake - u vc__ftmu vc_inc NULL
vc vcl\unx\source\gdi nmake - u vc__gdiu vc_inc NULL
+vc vcl\unx\source\printer nmake - u vc__prnu vc_inc NULL
+vc vcl\unx\source\printergfx nmake - u vc__prgu vc_inc NULL
vc vcl\unx\source\window nmake - u vc__winu vc_inc NULL
vc vcl\unx\gtk\a11y nmake - u vc__gtky vc_inc NULL
vc vcl\unx\gtk\app nmake - u vc__gtka vc_inc NULL
@@ -37,6 +41,6 @@ vc vcl\mac\source\app nmake - m vc__appm vc_inc NULL
vc vcl\mac\source\gdi nmake - m vc__gdim vc_inc NULL
vc vcl\mac\source\window nmake - m vc__winm vc_inc NULL
vc vcl\mac\source\src nmake - m vc__srcm vc_inc NULL
-vc vcl\util nmake - all vc_util vc__plug.u vc__aquy.u vc__appa.u vc__appm.m vc__appu.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__hl.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_components NULL
+vc vcl\util nmake - all vc_util vc__plug.u vc__aquy.u vc__appa.u vc__appm.m vc__appu.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL
vc vcl\util\linksvp nmake - u vc_lsvp vc_util NULL
vc vcl\workben nmake - all vc_wrkb vc_util vc_salmain NULL
diff --git a/vcl/prj/d.lst b/vcl/prj/d.lst
index c7a5f7117642..0ddc61170547 100644
--- a/vcl/prj/d.lst
+++ b/vcl/prj/d.lst
@@ -146,5 +146,10 @@ mkdir: %_DEST%\inc%_EXT%\vcl\plug\vcl
..\inc\vcl\pngwrite.hxx %_DEST%\inc%_EXT%\vcl\pngwrite.hxx
..\inc\vcl\smartid.hxx %_DEST%\inc%_EXT%\vcl\smartid.hxx
..\inc\vcl\configsettings.hxx %_DEST%\inc%_EXT%\vcl\configsettings.hxx
+..\inc\vcl\fontmanager.hxx %_DEST%\inc%_EXT%\vcl\fontmanager.hxx
+..\inc\vcl\printerinfomanager.hxx %_DEST%\inc%_EXT%\vcl\printerinfomanager.hxx
+..\inc\vcl\jobdata.hxx %_DEST%\inc%_EXT%\vcl\jobdata.hxx
+..\inc\vcl\ppdparser.hxx %_DEST%\inc%_EXT%\vcl\ppdparser.hxx
+..\inc\vcl\helper.hxx %_DEST%\inc%_EXT%\vcl\helper.hxx
+..\inc\vcl\strhelper.hxx %_DEST%\inc%_EXT%\vcl\strhelper.hxx
-..\%__SRC%\misc\macosxrc.txt %_DEST%\bin%_EXT%\macosxrc.txt
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 36b35ee25833..9d398aef10cd 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -65,6 +65,11 @@ SalInstance::~SalInstance()
{
}
+void SalInstance::FillFontPathList( std::list< rtl::OString >& )
+{
+ // do nothing
+}
+
SalTimer::~SalTimer()
{
}
diff --git a/vcl/source/fontsubset/crc32.c b/vcl/source/fontsubset/crc32.c
new file mode 100644
index 000000000000..386b873a011c
--- /dev/null
+++ b/vcl/source/fontsubset/crc32.c
@@ -0,0 +1,89 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: crc32.c,v $
+ * $Revision: 1.3 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* $Id: crc32.c,v 1.3 2008-04-11 10:13:50 rt Exp $ */
+
+/**
+ *
+ * @file crc32.c
+ * @brief CRC-32 calculation function
+ * @author Alexander Gelfenbain
+ */
+
+#include "sft.h"
+#include "crc32.h"
+
+static uint32 crcTable[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
+};
+
+uint32 crc32(const void *ptr, size_t len)
+{
+ uint32 crc = 0xFFFFFFFF;
+ const byte *bp = (const byte *) ptr;
+ size_t i;
+
+ for (i=0; i<len; i++) {
+ crc = crcTable[(crc ^ bp[i]) & 0xFF] ^ (crc >> 8);
+ }
+
+ return crc ^ 0xFFFFFFFF;
+}
diff --git a/vcl/unx/inc/macosxint.hxx b/vcl/source/fontsubset/crc32.h
index 86b5f34840df..fa9ef71a1432 100644
--- a/vcl/unx/inc/macosxint.hxx
+++ b/vcl/source/fontsubset/crc32.h
@@ -6,8 +6,8 @@
*
* OpenOffice.org - a multi-platform office productivity suite
*
- * $RCSfile: macosxint.hxx,v $
- * $Revision: 1.3 $
+ * $RCSfile: crc32.h,v $
+ * $Revision: 1.4 $
*
* This file is part of OpenOffice.org.
*
@@ -27,22 +27,20 @@
* for a copy of the LGPLv3 License.
*
************************************************************************/
-#ifndef _SV_MACOSXINT_HXX
-#define _SV_MACOSXINT_HXX
-#include <dtint.hxx>
-#include <tools/list.hxx>
+/* $Id: crc32.h,v 1.4 2008-04-11 10:14:08 rt Exp $ */
-class MACOSXIntegrator : public DtIntegrator
-{
- friend DtIntegrator* DtIntegrator::CreateDtIntegrator();
-private:
- MACOSXIntegrator();
-
-public:
- virtual ~MACOSXIntegrator();
-
- virtual void GetSystemLook( AllSettings& rSettings );
-};
+/**
+ *
+ * @file crc32.h
+ * @brief CRC-32 calculation function
+ * @author Alexander Gelfenbain
+ */
+#ifdef __cplusplus
+extern "C"{
+#endif
+ sal_Int32 crc32(const void *ptr, sal_Int32 len);
+#ifdef __cplusplus
+}
#endif
diff --git a/vcl/source/fontsubset/gsub.cxx b/vcl/source/fontsubset/gsub.cxx
new file mode 100644
index 000000000000..e73ccccc12a4
--- /dev/null
+++ b/vcl/source/fontsubset/gsub.cxx
@@ -0,0 +1,357 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: gsub.cxx,v $
+ * $Revision: 1.12.18.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_vcl.hxx"
+
+#include "sft.h"
+#undef true
+#undef false
+
+#include "gsub.h"
+
+#include <vector>
+#include <map>
+#include <algorithm>
+
+typedef sal_uInt32 ULONG;
+typedef sal_uInt16 USHORT;
+typedef sal_uInt8 FT_Byte;
+
+typedef std::map<USHORT,USHORT> GlyphSubstitution;
+
+
+inline long NEXT_Long( const unsigned char* &p )
+{
+ long nVal = (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3];
+ p += 4;
+ return nVal;
+}
+
+inline USHORT NEXT_UShort( const unsigned char* &p )
+{
+ USHORT nVal = (p[0]<<8) + p[1];
+ p += 2;
+ return nVal;
+}
+
+#define MKTAG(s) ((((((s[0]<<8)+s[1])<<8)+s[2])<<8)+s[3])
+
+int ReadGSUB( struct _TrueTypeFont* pTTFile,
+ int nRequestedScript, int nRequestedLangsys )
+{
+ const FT_Byte* pGsubBase = (FT_Byte*)pTTFile->tables[ O_gsub ];
+ if( !pGsubBase )
+ return -1;
+
+ // #129682# check offsets inside GSUB table
+ const FT_Byte* pGsubLimit = pGsubBase + pTTFile->tlens[ O_gsub ];
+
+ // parse GSUB header
+ const FT_Byte* pGsubHeader = pGsubBase;
+ const ULONG nVersion = NEXT_Long( pGsubHeader );
+ const USHORT nOfsScriptList = NEXT_UShort( pGsubHeader );
+ const USHORT nOfsFeatureTable = NEXT_UShort( pGsubHeader );
+ const USHORT nOfsLookupList = NEXT_UShort( pGsubHeader );
+
+ // sanity check the GSUB header
+ if( nVersion != 0x00010000 )
+ if( nVersion != 0x00001000 ) // workaround for SunBatang etc.
+ return -1; // unknown format or broken
+
+ typedef std::vector<ULONG> ReqFeatureTagList;
+ ReqFeatureTagList aReqFeatureTagList;
+
+ aReqFeatureTagList.push_back( MKTAG("vert") );
+
+ typedef std::vector<USHORT> UshortList;
+ UshortList aFeatureIndexList;
+ UshortList aFeatureOffsetList;
+
+ // parse Script Table
+ const FT_Byte* pScriptHeader = pGsubBase + nOfsScriptList;
+ const USHORT nCntScript = NEXT_UShort( pScriptHeader );
+ if( pGsubLimit < pScriptHeader + 6 * nCntScript )
+ return false;
+ for( USHORT nScriptIndex = 0; nScriptIndex < nCntScript; ++nScriptIndex )
+ {
+ const ULONG nTag = NEXT_Long( pScriptHeader ); // e.g. hani/arab/kana/hang
+ const USHORT nOfsScriptTable= NEXT_UShort( pScriptHeader );
+ if( (nTag != (USHORT)nRequestedScript) && (nRequestedScript != 0) )
+ continue;
+
+ const FT_Byte* pScriptTable = pGsubBase + nOfsScriptList + nOfsScriptTable;
+ if( pGsubLimit < pScriptTable + 4 )
+ return false;
+ const USHORT nDefaultLangsysOfs = NEXT_UShort( pScriptTable );
+ const USHORT nCntLangSystem = NEXT_UShort( pScriptTable );
+ USHORT nLangsysOffset = 0;
+ if( pGsubLimit < pScriptTable + 6 * nCntLangSystem )
+ return false;
+ for( USHORT nLangsysIndex = 0; nLangsysIndex < nCntLangSystem; ++nLangsysIndex )
+ {
+ const ULONG nInnerTag = NEXT_Long( pScriptTable ); // e.g. KOR/ZHS/ZHT/JAN
+ const USHORT nOffset= NEXT_UShort( pScriptTable );
+ if( (nInnerTag != (USHORT)nRequestedLangsys) && (nRequestedLangsys != 0) )
+ continue;
+ nLangsysOffset = nOffset;
+ break;
+ }
+
+ if( (nDefaultLangsysOfs != 0) && (nDefaultLangsysOfs != nLangsysOffset) )
+ {
+ const FT_Byte* pLangSys = pGsubBase + nOfsScriptList + nOfsScriptTable + nDefaultLangsysOfs;
+ if( pGsubLimit < pLangSys + 6 )
+ return false;
+ /*const USHORT nLookupOrder =*/ NEXT_UShort( pLangSys );
+ const USHORT nReqFeatureIdx = NEXT_UShort( pLangSys );
+ const USHORT nCntFeature = NEXT_UShort( pLangSys );
+ if( pGsubLimit < pLangSys + 2 * nCntFeature )
+ return false;
+ aFeatureIndexList.push_back( nReqFeatureIdx );
+ for( USHORT i = 0; i < nCntFeature; ++i )
+ {
+ const USHORT nFeatureIndex = NEXT_UShort( pLangSys );
+ aFeatureIndexList.push_back( nFeatureIndex );
+ }
+ }
+
+ if( nLangsysOffset != 0 )
+ {
+ const FT_Byte* pLangSys = pGsubBase + nOfsScriptList + nOfsScriptTable + nLangsysOffset;
+ if( pGsubLimit < pLangSys + 6 )
+ return false;
+ /*const USHORT nLookupOrder =*/ NEXT_UShort( pLangSys );
+ const USHORT nReqFeatureIdx = NEXT_UShort( pLangSys );
+ const USHORT nCntFeature = NEXT_UShort( pLangSys );
+ if( pGsubLimit < pLangSys + 2 * nCntFeature )
+ return false;
+ aFeatureIndexList.push_back( nReqFeatureIdx );
+ for( USHORT i = 0; i < nCntFeature; ++i )
+ {
+ const USHORT nFeatureIndex = NEXT_UShort( pLangSys );
+ aFeatureIndexList.push_back( nFeatureIndex );
+ }
+ }
+ }
+
+ if( !aFeatureIndexList.size() )
+ return true;
+
+ UshortList aLookupIndexList;
+ UshortList aLookupOffsetList;
+
+ // parse Feature Table
+ const FT_Byte* pFeatureHeader = pGsubBase + nOfsFeatureTable;
+ if( pGsubLimit < pFeatureHeader + 2 )
+ return false;
+ const USHORT nCntFeature = NEXT_UShort( pFeatureHeader );
+ if( pGsubLimit < pFeatureHeader + 6 * nCntFeature )
+ return false;
+ for( USHORT nFeatureIndex = 0; nFeatureIndex < nCntFeature; ++nFeatureIndex )
+ {
+ const ULONG nTag = NEXT_Long( pFeatureHeader ); // e.g. locl/vert/trad/smpl/liga/fina/...
+ const USHORT nOffset= NEXT_UShort( pFeatureHeader );
+
+ // ignore unneeded feature lookups
+ if( aFeatureIndexList[0] != nFeatureIndex ) // do not ignore the required feature
+ {
+ const int nRequested = std::count( aFeatureIndexList.begin(), aFeatureIndexList.end(), nFeatureIndex);
+ if( !nRequested ) // ignore features that are not requested
+ continue;
+ const int nAvailable = std::count( aReqFeatureTagList.begin(), aReqFeatureTagList.end(), nTag);
+ if( !nAvailable ) // some fonts don't provide features they request!
+ continue;
+ }
+
+ const FT_Byte* pFeatureTable = pGsubBase + nOfsFeatureTable + nOffset;
+ if( pGsubLimit < pFeatureTable + 2 )
+ return false;
+ const USHORT nCntLookups = NEXT_UShort( pFeatureTable );
+ if( pGsubLimit < pFeatureTable + 2 * nCntLookups )
+ return false;
+ for( USHORT i = 0; i < nCntLookups; ++i )
+ {
+ const USHORT nLookupIndex = NEXT_UShort( pFeatureTable );
+ aLookupIndexList.push_back( nLookupIndex );
+ }
+ if( nCntLookups == 0 ) //### hack needed by Mincho/Gothic/Mingliu/Simsun/...
+ aLookupIndexList.push_back( 0 );
+ }
+
+ // parse Lookup List
+ const FT_Byte* pLookupHeader = pGsubBase + nOfsLookupList;
+ if( pGsubLimit < pLookupHeader + 2 )
+ return false;
+ const USHORT nCntLookupTable = NEXT_UShort( pLookupHeader );
+ if( pGsubLimit < pLookupHeader + 2 * nCntLookupTable )
+ return false;
+ for( USHORT nLookupIdx = 0; nLookupIdx < nCntLookupTable; ++nLookupIdx )
+ {
+ const USHORT nOffset = NEXT_UShort( pLookupHeader );
+ if( std::count( aLookupIndexList.begin(), aLookupIndexList.end(), nLookupIdx ) )
+ aLookupOffsetList.push_back( nOffset );
+ }
+
+ UshortList::const_iterator it = aLookupOffsetList.begin();
+ for(; it != aLookupOffsetList.end(); ++it )
+ {
+ const USHORT nOfsLookupTable = *it;
+ const FT_Byte* pLookupTable = pGsubBase + nOfsLookupList + nOfsLookupTable;
+ if( pGsubLimit < pLookupTable + 6 )
+ return false;
+ const USHORT eLookupType = NEXT_UShort( pLookupTable );
+ /*const USHORT eLookupFlag =*/ NEXT_UShort( pLookupTable );
+ const USHORT nCntLookupSubtable = NEXT_UShort( pLookupTable );
+
+ // TODO: switch( eLookupType )
+ if( eLookupType != 1 ) // TODO: once we go beyond SingleSubst
+ continue;
+
+ if( pGsubLimit < pLookupTable + 2 * nCntLookupSubtable )
+ return false;
+ for( USHORT nSubTableIdx = 0; nSubTableIdx < nCntLookupSubtable; ++nSubTableIdx )
+ {
+ const USHORT nOfsSubLookupTable = NEXT_UShort( pLookupTable );
+ const FT_Byte* pSubLookup = pGsubBase + nOfsLookupList + nOfsLookupTable + nOfsSubLookupTable;
+ if( pGsubLimit < pSubLookup + 6 )
+ return false;
+ const USHORT nFmtSubstitution = NEXT_UShort( pSubLookup );
+ const USHORT nOfsCoverage = NEXT_UShort( pSubLookup );
+
+ typedef std::pair<USHORT,USHORT> GlyphSubst;
+ typedef std::vector<GlyphSubst> SubstVector;
+ SubstVector aSubstVector;
+
+ const FT_Byte* pCoverage = pGsubBase
+ + nOfsLookupList + nOfsLookupTable + nOfsSubLookupTable + nOfsCoverage;
+ if( pGsubLimit < pCoverage + 4 )
+ return false;
+ const USHORT nFmtCoverage = NEXT_UShort( pCoverage );
+ switch( nFmtCoverage )
+ {
+ case 1: // Coverage Format 1
+ {
+ const USHORT nCntGlyph = NEXT_UShort( pCoverage );
+ if( pGsubLimit < pCoverage + 2 * nCntGlyph )
+ // TODO? nCntGlyph = (pGsubLimit - pCoverage) / 2;
+ return false;
+ aSubstVector.reserve( nCntGlyph );
+ for( USHORT i = 0; i < nCntGlyph; ++i )
+ {
+ const USHORT nGlyphId = NEXT_UShort( pCoverage );
+ aSubstVector.push_back( GlyphSubst( nGlyphId, 0 ) );
+ }
+ }
+ break;
+
+ case 2: // Coverage Format 2
+ {
+ const USHORT nCntRange = NEXT_UShort( pCoverage );
+ if( pGsubLimit < pCoverage + 6 * nCntRange )
+ // TODO? nCntGlyph = (pGsubLimit - pCoverage) / 6;
+ return false;
+ for( int i = nCntRange; --i >= 0; )
+ {
+ const USHORT nGlyph0 = NEXT_UShort( pCoverage );
+ const USHORT nGlyph1 = NEXT_UShort( pCoverage );
+ const USHORT nCovIdx = NEXT_UShort( pCoverage );
+ for( USHORT j = nGlyph0; j <= nGlyph1; ++j )
+ aSubstVector.push_back( GlyphSubst( j + nCovIdx, 0 ) );
+ }
+ }
+ break;
+ }
+
+ SubstVector::iterator subst_it( aSubstVector.begin() );
+
+ switch( nFmtSubstitution )
+ {
+ case 1: // Single Substitution Format 1
+ {
+ const USHORT nDeltaGlyphId = NEXT_UShort( pSubLookup );
+
+ for(; subst_it != aSubstVector.end(); ++subst_it )
+ (*subst_it).second = (*subst_it).first + nDeltaGlyphId;
+ }
+ break;
+
+ case 2: // Single Substitution Format 2
+ {
+ const USHORT nCntGlyph = NEXT_UShort( pSubLookup );
+ for( int i = nCntGlyph; (subst_it != aSubstVector.end()) && (--i>=0); ++subst_it )
+ {
+ if( pGsubLimit < pSubLookup + 2 )
+ return false;
+ const USHORT nGlyphId = NEXT_UShort( pSubLookup );
+ (*subst_it).second = nGlyphId;
+ }
+ }
+ break;
+ }
+
+ // now apply the glyph substitutions that have been collected in this subtable
+ if( aSubstVector.size() > 0 )
+ {
+ GlyphSubstitution* pGSubstitution = new GlyphSubstitution;
+ pTTFile->pGSubstitution = (void*)pGSubstitution;
+ for( subst_it = aSubstVector.begin(); subst_it != aSubstVector.end(); ++subst_it )
+ (*pGSubstitution)[ (*subst_it).first ] = (*subst_it).second;
+ }
+ }
+ }
+ return true;
+}
+
+void ReleaseGSUB(struct _TrueTypeFont* pTTFile)
+{
+ GlyphSubstitution* pGlyphSubstitution = (GlyphSubstitution*)pTTFile->pGSubstitution;
+ if( pGlyphSubstitution )
+ delete pGlyphSubstitution;
+}
+
+int UseGSUB( struct _TrueTypeFont* pTTFile, int nGlyph, int /*wmode*/ )
+{
+ GlyphSubstitution* pGlyphSubstitution = (GlyphSubstitution*)pTTFile->pGSubstitution;
+ if( pGlyphSubstitution != 0 )
+ {
+ GlyphSubstitution::const_iterator it( pGlyphSubstitution->find( sal::static_int_cast<USHORT>(nGlyph) ) );
+ if( it != pGlyphSubstitution->end() )
+ nGlyph = (*it).second;
+ }
+
+ return nGlyph;
+}
+
+int HasVerticalGSUB( struct _TrueTypeFont* pTTFile )
+{
+ GlyphSubstitution* pGlyphSubstitution = (GlyphSubstitution*)pTTFile->pGSubstitution;
+ return pGlyphSubstitution ? +1 : 0;
+}
diff --git a/vcl/source/fontsubset/gsub.h b/vcl/source/fontsubset/gsub.h
new file mode 100644
index 000000000000..c64b2abb7e00
--- /dev/null
+++ b/vcl/source/fontsubset/gsub.h
@@ -0,0 +1,50 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: gsub.h,v $
+ * $Revision: 1.6.18.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PSP_GSUB_H
+#define _PSP_GSUB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int HasVerticalGSUB( struct _TrueTypeFont* pTTFile );
+
+int UseGSUB( struct _TrueTypeFont* pTTFile, int nGlyph, int wmode );
+
+int ReadGSUB( struct _TrueTypeFont* pTTFile, int nRequestedScript, int nRequestedLangsys );
+
+void ReleaseGSUB( struct _TrueTypeFont* pTTFile );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PSP_GSUB_H */
diff --git a/vcl/source/fontsubset/list.c b/vcl/source/fontsubset/list.c
new file mode 100644
index 000000000000..83ebe8595a46
--- /dev/null
+++ b/vcl/source/fontsubset/list.c
@@ -0,0 +1,546 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: list.c,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* $Id: list.c,v 1.8 2008-06-25 14:19:44 kz Exp $ */
+
+/*[]---------------------------------------------------[]*/
+/*| |*/
+/*| list.c - bidirectional list class |*/
+/*| |*/
+/*| |*/
+/*| Author: Alexander Gelfenbain |*/
+/*[]---------------------------------------------------[]*/
+
+#include <stdlib.h>
+
+#if OSL_DEBUG_LEVEL == 0
+# ifndef NDEBUG
+# define NDEBUG
+# endif
+#endif
+
+#include <assert.h>
+
+#ifdef MALLOC_TRACE
+#include <stdio.h>
+#include </usr/local/include/malloc.h>
+#endif
+/* #define TEST */
+#include "list.h"
+
+/*- private data types */
+typedef struct _lnode {
+ struct _lnode *next;
+ struct _lnode *prev;
+
+ void *value;
+
+} lnode;
+
+struct _list {
+ lnode *head, *tail, *cptr;
+ size_t aCount;
+ void (*eDtor)(void *);
+};
+
+/*- private methods */
+
+static lnode *newNode(void *el)
+{
+ lnode *ptr = malloc(sizeof(lnode));
+ assert(ptr != 0);
+
+ ptr->value = el;
+
+ return ptr;
+}
+
+static lnode *appendPrim(list this, void *el)
+{
+ lnode *ptr = newNode(el);
+ lnode **flink, *blink;
+
+ if (this->tail != 0) {
+ flink = &(this->tail->next);
+ blink = this->tail;
+ } else {
+ flink = &this->head;
+ blink = 0;
+ this->cptr = ptr; /*- list was empty - set current to this element */
+ }
+
+ *flink = ptr;
+ this->tail = ptr;
+
+ ptr->prev = blink;
+ ptr->next = 0;
+
+ this->aCount++;
+ return ptr;
+}
+#ifdef TEST
+static lnode *prependPrim(list this, void *el)
+{
+ lnode *ptr = newNode(el);
+ lnode *flink, **blink;
+
+ if (this->head != 0) {
+ blink = &(this->head->prev);
+ flink = this->head;
+ } else {
+ blink = &this->tail;
+ flink = 0;
+ this->cptr = ptr; /*- list was empty - set current to this element */
+ }
+
+ *blink = ptr;
+ this->head = ptr;
+
+ ptr->next = flink;
+ ptr->prev = 0;
+
+ this->aCount++;
+ return ptr;
+}
+#endif
+
+/*- public methods */
+list listNewEmpty(void) /*- default ctor */
+{
+ list this = malloc(sizeof(struct _list));
+ assert(this != 0);
+
+ this->aCount = 0;
+ this->eDtor = 0;
+ this->head = this->tail = this->cptr = 0;
+
+ return this;
+}
+
+#ifdef TEST
+list listNewCopy(list l) /*- copy ctor */
+{
+ lnode *ptr, *c;
+ list this;
+ assert(l != 0);
+
+ this = malloc(sizeof(struct _list));
+ assert(this != 0);
+
+ ptr = l->head;
+
+ this->aCount = 0;
+ this->eDtor = 0;
+ this->head = this->tail = this->cptr = 0;
+
+ while (ptr) {
+ c = appendPrim(this, ptr->value);
+ if (ptr == l->cptr) this->cptr = c;
+ ptr = ptr->next;
+ }
+
+ return this;
+}
+#endif
+
+void listDispose(list this) /*- dtor */
+{
+ assert(this != 0);
+ listClear(this);
+ free(this);
+}
+
+void listSetElementDtor(list this, void (*f)(void *))
+{
+ assert(this != 0);
+ this->eDtor = f;
+}
+
+/* calling this function on an empty list is a run-time error */
+void *listCurrent(list this)
+{
+ assert(this != 0);
+ assert(this->cptr != 0);
+ return this->cptr->value;
+}
+
+int listCount(list this)
+{
+ assert(this != 0);
+ return this->aCount;
+}
+
+int listIsEmpty(list this)
+{
+ assert(this != 0);
+ return this->aCount == 0;
+}
+
+
+#ifdef TEST
+int listAtFirst(list this)
+{
+ assert(this != 0);
+ return this->cptr == this->head;
+}
+
+int listAtLast(list this)
+{
+ assert(this != 0);
+ return this->cptr == this->tail;
+}
+
+int listPosition(list this)
+{
+ int res = 0;
+ lnode *ptr;
+ assert(this != 0);
+
+ ptr = this->head;
+
+ while (ptr != this->cptr) {
+ ptr = ptr->next;
+ res++;
+ }
+
+ return res;
+}
+#endif
+int listFind(list this, void *el)
+{
+ lnode *ptr;
+ assert(this != 0);
+
+ ptr = this->head;
+
+ while (ptr) {
+ if (ptr->value == el) {
+ this->cptr = ptr;
+ return 1;
+ }
+ ptr = ptr->next;
+ }
+
+ return 0;
+}
+
+int listNext(list this)
+{
+ return listSkipForward(this, 1);
+}
+
+int listSkipForward(list this, int n)
+{
+ int m = 0;
+ assert(this != 0);
+
+ if (this->cptr == 0) return 0;
+
+ while (n != 0) {
+ if (this->cptr->next == 0) break;
+ this->cptr = this->cptr->next;
+ n--;
+ m++;
+ }
+ return m;
+}
+
+int listToFirst(list this)
+{
+ assert(this != 0);
+
+ if (this->cptr != this->head) {
+ this->cptr = this->head;
+ return 1;
+ }
+ return 0;
+}
+
+int listToLast(list this)
+{
+ assert(this != 0);
+
+ if (this->cptr != this->tail) {
+ this->cptr = this->tail;
+ return 1;
+ }
+ return 0;
+}
+
+int listPositionAt(list this, int n) /*- returns the actual position number */
+{
+ int m = 0;
+ assert(this != 0);
+
+ this->cptr = this->head;
+ while (n != 0) {
+ if (this->cptr->next == 0) break;
+ this->cptr = this->cptr->next;
+ n--;
+ m++;
+ }
+ return m;
+}
+
+list listAppend(list this, void *el)
+{
+ assert(this != 0);
+
+ appendPrim(this, el);
+ return this;
+}
+#ifdef TEST
+list listPrepend(list this, void *el)
+{
+ assert(this != 0);
+
+ prependPrim(this, el);
+ return this;
+}
+
+list listInsertAfter(list this, void *el)
+{
+ lnode *ptr;
+ assert(this != 0);
+
+ if (this->cptr == 0) return listAppend(this, el);
+
+ ptr = newNode(el);
+
+ ptr->prev = this->cptr;
+ ptr->next = this->cptr->next;
+ this->cptr->next = ptr;
+
+ if (ptr->next != 0) {
+ ptr->next->prev = ptr;
+ } else {
+ this->tail = ptr;
+ }
+ this->aCount++;
+ return this;
+}
+
+list listInsertBefore(list this, void *el)
+{
+ lnode *ptr;
+ assert(this != 0);
+
+ if (this->cptr == 0) return listAppend(this, el);
+
+ ptr = newNode(el);
+
+ ptr->prev = this->cptr->prev;
+ ptr->next = this->cptr;
+ this->cptr->prev = ptr;
+
+ if (ptr->prev != 0) {
+ ptr->prev->next = ptr;
+ } else {
+ this->head = ptr;
+ }
+ this->aCount++;
+ return this;
+}
+#endif
+list listRemove(list this)
+{
+ lnode *ptr = 0;
+ if (this->cptr == 0) return this;
+
+ if (this->cptr->next != 0) {
+ ptr = this->cptr->next;
+ this->cptr->next->prev = this->cptr->prev;
+ } else {
+ this->tail = this->cptr->prev;
+ }
+
+ if (this->cptr->prev != 0) {
+ if (ptr == 0) ptr = this->cptr->prev;
+ this->cptr->prev->next = this->cptr->next;
+ } else {
+ this->head = this->cptr->next;
+ }
+
+ if (this->eDtor) this->eDtor(this->cptr->value); /* call the dtor callback */
+
+ free(this->cptr);
+ this->aCount--;
+ this->cptr = ptr;
+ return this;
+}
+
+list listClear(list this)
+{
+ lnode *node = this->head, *ptr;
+
+ while (node) {
+ ptr = node->next;
+ if (this->eDtor) this->eDtor(node->value); /* call the dtor callback */
+ free(node);
+ this->aCount--;
+ node = ptr;
+ }
+
+ this->head = this->tail = this->cptr = 0;
+ assert(this->aCount == 0);
+ return this;
+}
+
+#ifdef TEST
+
+void listForAll(list this, void (*f)(void *))
+{
+ lnode *ptr = this->head;
+ while (ptr) {
+ f(ptr->value);
+ ptr = ptr->next;
+ }
+}
+
+
+#include <stdio.h>
+
+void printlist(list l)
+{
+ int saved;
+ assert(l != 0);
+ saved = listPosition(l);
+
+ printf("[ ");
+
+ if (!listIsEmpty(l)) {
+ listToFirst(l);
+ do {
+ printf("%d ", (int) listCurrent(l));
+ } while (listNext(l));
+ }
+
+ printf("]\n");
+
+ listPositionAt(l, saved);
+}
+
+void printstringlist(list l)
+{
+ int saved;
+ assert(l != 0);
+ saved = listPosition(l);
+
+ printf("[ ");
+
+ if (!listIsEmpty(l)) {
+ listToFirst(l);
+ do {
+ printf("'%s' ", (char *) listCurrent(l));
+ } while (listNext(l));
+ }
+
+ printf("]\n");
+
+ listPositionAt(l, saved);
+}
+
+void printstat(list l)
+{
+ printf("count: %d, position: %d, isEmpty: %d, atFirst: %d, atLast: %d.\n",
+ listCount(l), listPosition(l), listIsEmpty(l), listAtFirst(l), listAtLast(l));
+}
+
+void allfunc(void *e)
+{
+ printf("%d ", e);
+}
+
+void edtor(void *ptr)
+{
+ printf("element dtor: 0x%08x\n", ptr);
+ free(ptr);
+}
+
+int main()
+{
+ list l1, l2;
+ char *ptr;
+ int i;
+
+#ifdef MALLOC_TRACE
+ mal_leaktrace(1);
+ mal_debug(2);
+#endif
+
+ l1 = listNewEmpty();
+ printstat(l1);
+
+ listAppend(l1, 1);
+ printstat(l1);
+
+ listAppend(l1, 2);
+ printstat(l1);
+
+ listAppend(l1, 3);
+ printstat(l1);
+
+ printlist(l1);
+
+ listToFirst(l1);
+ listInsertBefore(l1, -5);
+ printlist(l1);
+
+ l2 = listNewCopy(l1);
+ printlist(l2);
+
+ listForAll(l2, allfunc);
+ printf("\n");
+
+ listClear(l1);
+ listSetElementDtor(l1, edtor);
+
+ for(i=0; i<10; i++) {
+ ptr = malloc(20);
+ snprintf(ptr, 20, "element # %d", i);
+ listAppend(l1, ptr);
+ }
+
+ printstringlist(l1);
+
+
+ listDispose(l1);
+ listDispose(l2);
+
+#ifdef MALLOC_TRACE
+ mal_dumpleaktrace(stdout);
+#endif
+
+
+ return 0;
+}
+#endif
+
+
diff --git a/vcl/source/fontsubset/makefile.mk b/vcl/source/fontsubset/makefile.mk
new file mode 100644
index 000000000000..b1d2552752a8
--- /dev/null
+++ b/vcl/source/fontsubset/makefile.mk
@@ -0,0 +1,53 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.6 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=vcl
+TARGET=fontsubset
+
+# --- Settings -----------------------------------------------------
+ENABLE_EXCEPTIONS=true
+
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+
+SLOFILES=\
+ $(SLO)$/list.obj \
+ $(SLO)$/sft.obj \
+ $(SLO)$/xlat.obj \
+ $(SLO)$/ttcr.obj \
+ $(SLO)$/gsub.obj
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/vcl/source/fontsubset/sft.c b/vcl/source/fontsubset/sft.c
new file mode 100644
index 000000000000..be54a872fd7f
--- /dev/null
+++ b/vcl/source/fontsubset/sft.c
@@ -0,0 +1,3334 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: sft.c,v $
+ * $Revision: 1.47.4.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*
+ * Sun Font Tools
+ *
+ * Author: Alexander Gelfenbain
+ *
+ */
+
+#if OSL_DEBUG_LEVEL == 0
+# ifndef NDEBUG
+# define NDEBUG
+# endif
+#endif
+#include <assert.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#ifdef UNX
+#include <sys/mman.h>
+#include <sys/stat.h>
+#endif
+#include "sft.h"
+#include "gsub.h"
+#if ! (defined(NO_TTCR) && defined(NO_TYPE42))
+#include "ttcr.h"
+#endif
+#ifdef NO_LIST
+#include "list.h" /* list.h does not get included in the sft.h */
+#endif
+#ifndef NO_MAPPERS /* include MapChar() and MapString() */
+#include "xlat.h"
+#endif
+#ifndef NO_TYPE3 /* include CreateT3FromTTGlyphs() */
+#include <rtl/crc.h>
+#endif
+
+#include <osl/endian.h>
+
+#ifdef TEST7
+#include <ctype.h>
+#endif
+
+/*- module identification */
+
+const char *modname = "SunTypeTools-TT";
+const char *modver = "1.0";
+const char *modextra = "gelf";
+
+/*- private functions, constants and data types */ /*FOLD00*/
+
+enum PathSegmentType {
+ PS_NOOP = 0,
+ PS_MOVETO = 1,
+ PS_LINETO = 2,
+ PS_CURVETO = 3,
+ PS_CLOSEPATH = 4
+};
+
+typedef struct {
+ int type;
+ int x1, y1;
+ int x2, y2;
+ int x3, y3;
+} PSPathElement;
+
+/*- In horisontal writing mode right sidebearing is calculated using this formula
+ *- rsb = aw - (lsb + xMax - xMin) -*/
+typedef struct {
+ sal_Int16 xMin;
+ sal_Int16 yMin;
+ sal_Int16 xMax;
+ sal_Int16 yMax;
+ sal_uInt16 aw; /*- Advance Width (horisontal writing mode) */
+ sal_Int16 lsb; /*- Left sidebearing (horisontal writing mode) */
+ sal_uInt16 ah; /*- advance height (vertical writing mode) */
+ sal_Int16 tsb; /*- top sidebearing (vertical writing mode) */
+} TTGlyphMetrics;
+
+#define HFORMAT_LINELEN 64
+
+typedef struct {
+ FILE *o;
+ char buffer[HFORMAT_LINELEN];
+ int bufpos;
+ int total;
+} HexFmt;
+
+typedef struct {
+ sal_uInt32 nGlyphs; /* number of glyphs in the font + 1 */
+ sal_uInt32 *offs; /* array of nGlyphs offsets */
+} GlyphOffsets;
+
+/* private tags */
+static const sal_uInt32 TTFontClassTag = 0x74746663; /* 'ttfc' */
+
+static const sal_uInt32 T_true = 0x74727565; /* 'true' */
+static const sal_uInt32 T_ttcf = 0x74746366; /* 'ttcf' */
+
+/* standard TrueType table tags */
+#define T_maxp 0x6D617870
+#define T_glyf 0x676C7966
+#define T_head 0x68656164
+#define T_loca 0x6C6F6361
+#define T_name 0x6E616D65
+#define T_hhea 0x68686561
+#define T_hmtx 0x686D7478
+#define T_cmap 0x636D6170
+#define T_vhea 0x76686561
+#define T_vmtx 0x766D7478
+#define T_OS2 0x4F532F32
+#define T_post 0x706F7374
+#define T_kern 0x6B65726E
+#define T_cvt 0x63767420
+#define T_prep 0x70726570
+#define T_fpgm 0x6670676D
+#define T_gsub 0x47535542
+
+#define LAST_URANGE_BIT 69
+const char *ulcodes[LAST_URANGE_BIT+2] = {
+ /* 0 */ "Basic Latin",
+ /* 1 */ "Latin-1 Supplement",
+ /* 2 */ "Latin Extended-A",
+ /* 3 */ "Latin Extended-B",
+ /* 4 */ "IPA Extensions",
+ /* 5 */ "Spacing Modifier Letters",
+ /* 6 */ "Combining Diacritical Marks",
+ /* 7 */ "Basic Greek",
+ /* 8 */ "Greek Symbols And Coptic",
+ /* 9 */ "Cyrillic",
+ /* 10 */ "Armenian",
+ /* 11 */ "Basic Hebrew",
+ /* 12 */ "Hebrew Extended (A and B blocks combined)",
+ /* 13 */ "Basic Arabic",
+ /* 14 */ "Arabic Extended",
+ /* 15 */ "Devanagari",
+ /* 16 */ "Bengali",
+ /* 17 */ "Gurmukhi",
+ /* 18 */ "Gujarati",
+ /* 19 */ "Oriya",
+ /* 20 */ "Tamil",
+ /* 21 */ "Telugu",
+ /* 22 */ "Kannada",
+ /* 23 */ "Malayalam",
+ /* 24 */ "Thai",
+ /* 25 */ "Lao",
+ /* 26 */ "Basic Georgian",
+ /* 27 */ "Georgian Extended",
+ /* 28 */ "Hangul Jamo",
+ /* 29 */ "Latin Extended Additional",
+ /* 30 */ "Greek Extended",
+ /* 31 */ "General Punctuation",
+ /* 32 */ "Superscripts And Subscripts",
+ /* 33 */ "Currency Symbols",
+ /* 34 */ "Combining Diacritical Marks For Symbols",
+ /* 35 */ "Letterlike Symbols",
+ /* 36 */ "Number Forms",
+ /* 37 */ "Arrows",
+ /* 38 */ "Mathematical Operators",
+ /* 39 */ "Miscellaneous Technical",
+ /* 40 */ "Control Pictures",
+ /* 41 */ "Optical Character Recognition",
+ /* 42 */ "Enclosed Alphanumerics",
+ /* 43 */ "Box Drawing",
+ /* 44 */ "Block Elements",
+ /* 45 */ "Geometric Shapes",
+ /* 46 */ "Miscellaneous Symbols",
+ /* 47 */ "Dingbats",
+ /* 48 */ "CJK Symbols And Punctuation",
+ /* 49 */ "Hiragana",
+ /* 50 */ "Katakana",
+ /* 51 */ "Bopomofo",
+ /* 52 */ "Hangul Compatibility Jamo",
+ /* 53 */ "CJK Miscellaneous",
+ /* 54 */ "Enclosed CJK Letters And Months",
+ /* 55 */ "CJK Compatibility",
+ /* 56 */ "Hangul",
+ /* 57 */ "Reserved for Unicode SubRanges",
+ /* 58 */ "Reserved for Unicode SubRanges",
+ /* 59 */ "CJK Unified Ideographs",
+ /* 60 */ "Private Use Area",
+ /* 61 */ "CJK Compatibility Ideographs",
+ /* 62 */ "Alphabetic Presentation Forms",
+ /* 63 */ "Arabic Presentation Forms-A",
+ /* 64 */ "Combining Half Marks",
+ /* 65 */ "CJK Compatibility Forms",
+ /* 66 */ "Small Form Variants",
+ /* 67 */ "Arabic Presentation Forms-B",
+ /* 68 */ "Halfwidth And Fullwidth Forms",
+ /* 69 */ "Specials",
+ /*70-127*/ "Reserved for Unicode SubRanges"
+};
+
+
+
+/*- inline functions */ /*FOLD01*/
+#ifdef __GNUC__
+#define _inline static __inline__
+#else
+#define _inline static
+#endif
+
+_inline void *smalloc(size_t size)
+{
+ void *res = malloc(size);
+ assert(res != 0);
+ return res;
+}
+
+_inline void *scalloc(size_t n, size_t size)
+{
+ void *res = calloc(n, size);
+ assert(res != 0);
+ return res;
+}
+
+_inline sal_uInt32 mkTag(sal_uInt8 a, sal_uInt8 b, sal_uInt8 c, sal_uInt8 d) {
+ return (a << 24) | (b << 16) | (c << 8) | d;
+}
+
+/*- Data access macros for data stored in big-endian or little-endian format */
+_inline sal_Int16 GetInt16(const sal_uInt8 *ptr, size_t offset, int bigendian)
+{
+ sal_Int16 t;
+ assert(ptr != 0);
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 8 | (ptr+offset)[1];
+ } else {
+ t = (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+_inline sal_uInt16 GetUInt16(const sal_uInt8 *ptr, size_t offset, int bigendian)
+{
+ sal_uInt16 t;
+ assert(ptr != 0);
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 8 | (ptr+offset)[1];
+ } else {
+ t = (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+_inline sal_Int32 GetInt32(const sal_uInt8 *ptr, size_t offset, int bigendian)
+{
+ sal_Int32 t;
+ assert(ptr != 0);
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 24 | (ptr+offset)[1] << 16 |
+ (ptr+offset)[2] << 8 | (ptr+offset)[3];
+ } else {
+ t = (ptr+offset)[3] << 24 | (ptr+offset)[2] << 16 |
+ (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+_inline sal_uInt32 GetUInt32(const sal_uInt8 *ptr, size_t offset, int bigendian)
+{
+ sal_uInt32 t;
+ assert(ptr != 0);
+
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 24 | (ptr+offset)[1] << 16 |
+ (ptr+offset)[2] << 8 | (ptr+offset)[3];
+ } else {
+ t = (ptr+offset)[3] << 24 | (ptr+offset)[2] << 16 |
+ (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+_inline void PutInt16(sal_Int16 val, sal_uInt8 *ptr, size_t offset, int bigendian)
+{
+ assert(ptr != 0);
+
+ if (bigendian) {
+ ptr[offset] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset+1] = (sal_uInt8)(val & 0xFF);
+ } else {
+ ptr[offset+1] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset] = (sal_uInt8)(val & 0xFF);
+ }
+
+}
+
+#if defined(OSL_BIG_ENDIAN)
+#define Int16FromMOTA(a) (a)
+#define Int32FromMOTA(a) (a)
+#else
+static sal_uInt16 Int16FromMOTA(sal_uInt16 a) {
+ return (sal_uInt16) (((sal_uInt8)((a) >> 8)) | ((sal_uInt8)(a) << 8));
+}
+static sal_uInt32 Int32FromMOTA(sal_uInt32 a) {
+ return ((a>>24)&0xFF) | (((a>>8)&0xFF00) | ((a&0xFF00)<<8) | ((a&0xFF)<<24));
+}
+#endif
+
+_inline F16Dot16 fixedMul(F16Dot16 a, F16Dot16 b)
+{
+ unsigned int a1, b1;
+ unsigned int a2, b2;
+ F16Dot16 res;
+ int sign;
+
+ sign = (a & 0x80000000) ^ (b & 0x80000000);
+ if (a < 0) a = -a;
+ if (b < 0) b = -b;
+
+ a1 = a >> 16;
+ b1 = a & 0xFFFF;
+ a2 = b >> 16;
+ b2 = b & 0xFFFF;
+
+ res = a1 * a2;
+
+ /* if (res > 0x7FFF) assert(!"fixedMul: F16Dot16 overflow"); */
+
+ res <<= 16;
+ res += a1 * b2 + b1 * a2 + ((b1 * b2) >> 16);
+
+ return sign ? -res : res;
+}
+
+
+_inline F16Dot16 fixedDiv(F16Dot16 a, F16Dot16 b)
+{
+ unsigned int f, r;
+ F16Dot16 res;
+ int sign;
+
+ sign = (a & 0x80000000) ^ (b & 0x80000000);
+ if (a < 0) a = -a;
+ if (b < 0) b = -b;
+
+ f = a / b;
+ r = a % b;
+
+ /* if (f > 0x7FFFF) assert(!"fixedDiv: F16Dot16 overflow"); */
+
+ while (r > 0xFFFF) {
+ r >>= 1;
+ b >>= 1;
+ }
+
+ res = (f << 16) + (r << 16) / b;
+
+ return sign ? -res : res;
+}
+
+/*- returns a * b / c -*/
+/* XXX provide a real implementation that preserves accuracy */
+_inline F16Dot16 fixedMulDiv(F16Dot16 a, F16Dot16 b, F16Dot16 c)
+{
+ F16Dot16 res;
+
+ res = fixedMul(a, b);
+ return fixedDiv(res, c);
+}
+
+/*- Translate units from TT to PS (standard 1/1000) -*/
+_inline int XUnits(int unitsPerEm, int n)
+{
+ return (n * 1000) / unitsPerEm;
+}
+
+_inline const char *UnicodeRangeName(sal_uInt16 bit)
+{
+ if (bit > LAST_URANGE_BIT) bit = LAST_URANGE_BIT+1;
+
+ return ulcodes[bit];
+}
+
+_inline sal_uInt8 *getTable(TrueTypeFont *ttf, sal_uInt32 ord)
+{
+ return ttf->tables[ord];
+}
+
+_inline sal_uInt32 getTableSize(TrueTypeFont *ttf, sal_uInt32 ord)
+{
+ return ttf->tlens[ord];
+}
+
+#ifndef NO_TYPE42
+/* Hex Formatter functions */
+static char HexChars[] = "0123456789ABCDEF";
+
+static HexFmt *HexFmtNew(FILE *outf)
+{
+ HexFmt *res = smalloc(sizeof(HexFmt));
+ res->bufpos = res->total = 0;
+ res->o = outf;
+ return res;
+}
+
+static void HexFmtFlush(HexFmt *_this)
+{
+ if (_this->bufpos) {
+ fwrite(_this->buffer, 1, _this->bufpos, _this->o);
+ _this->bufpos = 0;
+ }
+}
+
+
+_inline void HexFmtOpenString(HexFmt *_this)
+{
+ fputs("<\n", _this->o);
+}
+
+_inline void HexFmtCloseString(HexFmt *_this)
+{
+ HexFmtFlush(_this);
+ fputs("00\n>\n", _this->o);
+}
+
+_inline void HexFmtDispose(HexFmt *_this)
+{
+ HexFmtFlush(_this);
+ free(_this);
+}
+
+static void HexFmtBlockWrite(HexFmt *_this, const void *ptr, sal_uInt32 size)
+{
+ sal_uInt8 Ch;
+ sal_uInt32 i;
+
+ if (_this->total + size > 65534) {
+ HexFmtFlush(_this);
+ HexFmtCloseString(_this);
+ _this->total = 0;
+ HexFmtOpenString(_this);
+ }
+ for (i=0; i<size; i++) {
+ Ch = ((sal_uInt8 *) ptr)[i];
+ _this->buffer[_this->bufpos++] = HexChars[Ch >> 4];
+ _this->buffer[_this->bufpos++] = HexChars[Ch & 0xF];
+ if (_this->bufpos == HFORMAT_LINELEN) {
+ HexFmtFlush(_this);
+ fputc('\n', _this->o);
+ }
+
+ }
+ _this->total += size;
+}
+#endif
+
+
+
+/* Outline Extraction functions */ /*FOLD01*/
+
+/* fills the aw and lsb entries of the TTGlyphMetrics structure from hmtx table -*/
+static void GetMetrics(TrueTypeFont *ttf, sal_uInt32 glyphID, TTGlyphMetrics *metrics)
+{
+ sal_uInt8 *table = getTable(ttf, O_hmtx);
+
+ metrics->aw = metrics->lsb = metrics->ah = metrics->tsb = 0;
+ if (!table || !ttf->numberOfHMetrics) return;
+
+ if (glyphID < ttf->numberOfHMetrics) {
+ metrics->aw = GetUInt16(table, 4 * glyphID, 1);
+ metrics->lsb = GetInt16(table, 4 * glyphID + 2, 1);
+ } else {
+ metrics->aw = GetUInt16(table, 4 * (ttf->numberOfHMetrics - 1), 1);
+ metrics->lsb = GetInt16(table + ttf->numberOfHMetrics * 4, (glyphID - ttf->numberOfHMetrics) * 2, 1);
+ }
+
+ table = getTable(ttf, O_vmtx);
+ if (!table || !ttf->numOfLongVerMetrics) return;
+
+ if (glyphID < ttf->numOfLongVerMetrics) {
+ metrics->ah = GetUInt16(table, 4 * glyphID, 1);
+ metrics->tsb = GetInt16(table, 4 * glyphID + 2, 1);
+ } else {
+ metrics->ah = GetUInt16(table, 4 * (ttf->numOfLongVerMetrics - 1), 1);
+ metrics->tsb = GetInt16(table + ttf->numOfLongVerMetrics * 4, (glyphID - ttf->numOfLongVerMetrics) * 2, 1);
+ }
+}
+
+static int GetTTGlyphOutline(TrueTypeFont *, sal_uInt32 , ControlPoint **, TTGlyphMetrics *, list );
+
+/* returns the number of control points, allocates the pointArray */
+static int GetSimpleTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics) /*FOLD02*/
+{
+ sal_uInt8 *table = getTable(ttf, O_glyf);
+ sal_uInt8 *ptr, *p, flag, n;
+ sal_Int16 numberOfContours;
+ sal_uInt16 t, instLen, lastPoint=0;
+ int i, j, z;
+ ControlPoint* pa;
+
+ *pointArray = 0;
+
+ /* printf("GetSimpleTTOutline(%d)\n", glyphID); */
+
+ if (glyphID >= ttf->nglyphs) return 0; /*- glyph is not present in the font */
+ ptr = table + ttf->goffsets[glyphID];
+ if ((numberOfContours = GetInt16(ptr, 0, 1)) <= 0) return 0; /*- glyph is not simple */
+
+ if (metrics) { /*- GetCompoundTTOutline() calls this function with NULL metrics -*/
+ metrics->xMin = GetInt16(ptr, 2, 1);
+ metrics->yMin = GetInt16(ptr, 4, 1);
+ metrics->xMax = GetInt16(ptr, 6, 1);
+ metrics->yMax = GetInt16(ptr, 8, 1);
+ GetMetrics(ttf, glyphID, metrics);
+ }
+
+ /* determine the last point and be extra safe about it. But probably this code is not needed */
+
+ for (i=0; i<numberOfContours; i++) {
+ if ((t = GetUInt16(ptr, 10+i*2, 1)) > lastPoint) lastPoint = t;
+ }
+
+ instLen = GetUInt16(ptr, 10 + numberOfContours*2, 1);
+ p = ptr + 10 + 2 * numberOfContours + 2 + instLen;
+ pa = calloc(lastPoint+1, sizeof(ControlPoint));
+
+ i = 0;
+ while (i <= lastPoint) {
+ pa[i++].flags = (sal_uInt32) (flag = *p++);
+ if (flag & 8) { /*- repeat flag */
+ n = *p++;
+ for (j=0; j<n; j++) {
+ if (i > lastPoint) { /*- if the font is really broken */
+ free(pa);
+ return 0;
+ }
+ pa[i++].flags = flag;
+ }
+ }
+ }
+
+ /*- Process the X coordinate */
+ z = 0;
+ for (i = 0; i <= lastPoint; i++) {
+ if (pa[i].flags & 0x02) {
+ if (pa[i].flags & 0x10) {
+ z += (int) (*p++);
+ } else {
+ z -= (int) (*p++);
+ }
+ } else if ( !(pa[i].flags & 0x10)) {
+ z += GetInt16(p, 0, 1);
+ p += 2;
+ }
+ pa[i].x = (sal_Int16)z;
+ }
+
+ /*- Process the Y coordinate */
+ z = 0;
+ for (i = 0; i <= lastPoint; i++) {
+ if (pa[i].flags & 0x04) {
+ if (pa[i].flags & 0x20) {
+ z += *p++;
+ } else {
+ z -= *p++;
+ }
+ } else if ( !(pa[i].flags & 0x20)) {
+ z += GetInt16(p, 0, 1);
+ p += 2;
+ }
+ pa[i].y = (sal_Int16)z;
+ }
+
+ for (i=0; i<numberOfContours; i++) {
+ pa[GetUInt16(ptr, 10 + i * 2, 1)].flags |= 0x00008000; /*- set the end contour flag */
+ }
+
+ *pointArray = pa;
+ return lastPoint + 1;
+}
+
+static int GetCompoundTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics, list glyphlist) /*FOLD02*/
+{
+ sal_uInt16 flags, index;
+ sal_Int16 e, f, numberOfContours;
+ sal_uInt8 *table = getTable(ttf, O_glyf);
+ sal_uInt8 *ptr;
+ list myPoints;
+ ControlPoint *nextComponent, *pa;
+ int i, np;
+ F16Dot16 a = 0x10000, b = 0, c = 0, d = 0x10000, m, n, abs1, abs2, abs3;
+
+ *pointArray = 0;
+ /* printf("GetCompoundTTOutline(%d)\n", glyphID); */
+
+ if (glyphID >= ttf->nglyphs) { /*- incorrect glyphID */
+ return 0;
+ }
+ ptr = table + ttf->goffsets[glyphID];
+ if ((numberOfContours = GetInt16(ptr, 0, 1)) != -1) { /*- glyph is not compound */
+ return 0;
+ }
+
+ myPoints = listNewEmpty();
+ listSetElementDtor(myPoints, free);
+
+ if (metrics) {
+ metrics->xMin = GetInt16(ptr, 2, 1);
+ metrics->yMin = GetInt16(ptr, 4, 1);
+ metrics->xMax = GetInt16(ptr, 6, 1);
+ metrics->yMax = GetInt16(ptr, 8, 1);
+ GetMetrics(ttf, glyphID, metrics);
+ }
+
+ ptr += 10;
+
+ do {
+ flags = GetUInt16(ptr, 0, 1);
+ /* printf("flags: 0x%X\n", flags); */
+ index = GetUInt16(ptr, 2, 1);
+ ptr += 4;
+
+ if (listFind(glyphlist, (void *) (sal_IntPtr) index)) {
+#if OSL_DEBUG_LEVEL > 1
+ fprintf(stderr, "Endless loop found in a compound glyph.\n");
+ fprintf(stderr, "%d -> ", index);
+ listToFirst(glyphlist);
+ fprintf(stderr," [");
+ do {
+ fprintf(stderr,"%d ", (int) listCurrent(glyphlist));
+ } while (listNext(glyphlist));
+ fprintf(stderr,"]\n");
+ /**/
+#endif
+ }
+
+ listAppend(glyphlist, (void *) (sal_IntPtr) index);
+
+#ifdef DEBUG2
+ fprintf(stderr,"glyphlist: += %d\n", index);
+#endif
+
+ if ((np = GetTTGlyphOutline(ttf, index, &nextComponent, 0, glyphlist)) == 0) {
+ /* XXX that probably indicates a corrupted font */
+#if OSL_DEBUG_LEVEL > 1
+ fprintf(stderr, "An empty compound!\n");
+ /* assert(!"An empty compound"); */
+#endif
+ }
+
+ listToLast(glyphlist);
+#ifdef DEBUG2
+ listToFirst(glyphlist);
+ fprintf(stderr,"%d [", listCount(glyphlist));
+ if (!listIsEmpty(glyphlist)) {
+ do {
+ fprintf(stderr,"%d ", (int) listCurrent(glyphlist));
+ } while (listNext(glyphlist));
+ }
+ fprintf(stderr, "]\n");
+ fprintf(stderr, "glyphlist: -= %d\n", (int) listCurrent(glyphlist));
+
+#endif
+ listRemove(glyphlist);
+
+ if (flags & USE_MY_METRICS) {
+ if (metrics) GetMetrics(ttf, index, metrics);
+ }
+
+ if (flags & ARG_1_AND_2_ARE_WORDS) {
+ e = GetInt16(ptr, 0, 1);
+ f = GetInt16(ptr, 2, 1);
+ /* printf("ARG_1_AND_2_ARE_WORDS: %d %d\n", e & 0xFFFF, f & 0xFFFF); */
+ ptr += 4;
+ } else {
+ if (flags & ARGS_ARE_XY_VALUES) { /* args are signed */
+ e = (sal_Int8) *ptr++;
+ f = (sal_Int8) *ptr++;
+ /* printf("ARGS_ARE_XY_VALUES: %d %d\n", e & 0xFF, f & 0xFF); */
+ } else { /* args are unsigned */
+ /* printf("!ARGS_ARE_XY_VALUES\n"); */
+ e = *ptr++;
+ f = *ptr++;
+ }
+
+ }
+
+ a = d = 0x10000;
+ b = c = 0;
+
+ if (flags & WE_HAVE_A_SCALE) {
+#ifdef DEBUG2
+ fprintf(stderr, "WE_HAVE_A_SCALE\n");
+#endif
+ a = GetInt16(ptr, 0, 1) << 2;
+ d = a;
+ ptr += 2;
+ } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+#ifdef DEBUG2
+ fprintf(stderr, "WE_HAVE_AN_X_AND_Y_SCALE\n");
+#endif
+ a = GetInt16(ptr, 0, 1) << 2;
+ d = GetInt16(ptr, 2, 1) << 2;
+ ptr += 4;
+ } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+#ifdef DEBUG2
+ fprintf(stderr, "WE_HAVE_A_TWO_BY_TWO\n");
+#endif
+ a = GetInt16(ptr, 0, 1) << 2;
+ b = GetInt16(ptr, 2, 1) << 2;
+ c = GetInt16(ptr, 4, 1) << 2;
+ d = GetInt16(ptr, 6, 1) << 2;
+ ptr += 8;
+ }
+
+ abs1 = (a < 0) ? -a : a;
+ abs2 = (b < 0) ? -b : b;
+ m = (abs1 > abs2) ? abs1 : abs2;
+ abs3 = abs1 - abs2;
+ if (abs3 < 0) abs3 = -abs3;
+ if (abs3 <= 33) m *= 2;
+
+ abs1 = (c < 0) ? -c : c;
+ abs2 = (d < 0) ? -d : d;
+ n = (abs1 > abs2) ? abs1 : abs2;
+ abs3 = abs1 - abs2;
+ if (abs3 < 0) abs3 = -abs3;
+ if (abs3 <= 33) n *= 2;
+
+ if (!ARGS_ARE_XY_VALUES) { /* match the points */
+ assert(!"ARGS_ARE_XY_VALUES is not implemented!!!\n");
+ }
+
+#ifdef DEBUG2
+ fprintf(stderr, "a: %f, b: %f, c: %f, d: %f, e: %f, f: %f, m: %f, n: %f\n",
+ ((double) a) / 65536,
+ ((double) b) / 65536,
+ ((double) c) / 65536,
+ ((double) d) / 65536,
+ ((double) e) / 65536,
+ ((double) f) / 65536,
+ ((double) m) / 65536,
+ ((double) n) / 65536);
+#endif
+
+ for (i=0; i<np; i++) {
+ F16Dot16 t;
+ ControlPoint *cp = malloc(sizeof(ControlPoint));
+ cp->flags = nextComponent[i].flags;
+ t = fixedMulDiv(a, nextComponent[i].x << 16, m) + fixedMulDiv(c, nextComponent[i].y << 16, m) + (e << 16);
+ cp->x = (sal_Int16)(fixedMul(t, m) >> 16);
+ t = fixedMulDiv(b, nextComponent[i].x << 16, n) + fixedMulDiv(d, nextComponent[i].y << 16, n) + (f << 16);
+ cp->y = (sal_Int16)(fixedMul(t, n) >> 16);
+
+#ifdef DEBUG2
+ fprintf(stderr, "( %d %d ) -> ( %d %d )\n", nextComponent[i].x, nextComponent[i].y, cp->x, cp->y);
+#endif
+
+ listAppend(myPoints, cp);
+ }
+
+ free(nextComponent);
+
+ } while (flags & MORE_COMPONENTS);
+
+
+
+ np = listCount(myPoints);
+
+ pa = calloc(np, sizeof(ControlPoint));
+ assert(pa != 0);
+ listToFirst(myPoints);
+ for (i=0; i<np; i++) {
+ memcpy(pa+i, listCurrent(myPoints), sizeof(ControlPoint));
+ listNext(myPoints);
+ }
+ listDispose(myPoints);
+
+ *pointArray = pa;
+ return np;
+}
+
+/* NOTE: GetTTGlyphOutline() returns -1 if the glyphID is incorrect,
+ * but Get{Simple|Compound}GlyphOutline returns 0 in such a case.
+ *
+ * NOTE: glyphlist is the stack of glyphs traversed while constructing
+ * a composite glyph. This is a safequard against endless recursion
+ * in corrupted fonts.
+ */
+static int GetTTGlyphOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics, list glyphlist)
+{
+ sal_uInt8 *ptr, *table = getTable(ttf, O_glyf);
+ sal_Int16 numberOfContours;
+ int length;
+ int res;
+ *pointArray = 0;
+
+ if (metrics) {
+ memset(metrics, 0, sizeof(TTGlyphMetrics)); /*- metrics is initialized to all zeroes */
+ }
+
+ if (glyphID >= ttf->nglyphs) return -1; /**/
+
+ ptr = table + ttf->goffsets[glyphID];
+ length = ttf->goffsets[glyphID+1] - ttf->goffsets[glyphID];
+
+ if (length == 0) { /*- empty glyphs still have hmtx and vmtx metrics values */
+ if (metrics) GetMetrics(ttf, glyphID, metrics);
+ return 0;
+ }
+
+ numberOfContours = GetInt16(ptr, 0, 1);
+
+ if (numberOfContours >= 0) {
+ res=GetSimpleTTOutline(ttf, glyphID, pointArray, metrics);
+ } else {
+ int glyphlistFlag = 0;
+ if (!glyphlist) {
+ glyphlistFlag = 1;
+ glyphlist = listNewEmpty();
+ listAppend(glyphlist, (void *) (sal_IntPtr) glyphID);
+ }
+ res = GetCompoundTTOutline(ttf, glyphID, pointArray, metrics, glyphlist);
+ if (glyphlistFlag) {
+ glyphlistFlag = 0;
+ listDispose(glyphlist);
+ glyphlist = 0;
+ }
+ }
+
+#ifdef DEBUG3
+ {
+ int i;
+ FILE *out = fopen("points.dat", "a");
+ assert(out != 0);
+ fprintf(out, "Glyph: %d\nPoints: %d\n", glyphID, res);
+ for (i=0; i<res; i++) {
+ fprintf(out, "%c ", ((*pointArray)[i].flags & 0x8000) ? 'X' : '.');
+ fprintf(out, "%c ", ((*pointArray)[i].flags & 1) ? '+' : '-');
+ fprintf(out, "%d %d\n", (*pointArray)[i].x, (*pointArray)[i].y);
+ }
+ fclose(out);
+ }
+#endif
+
+ return res;
+}
+
+#ifndef NO_TYPE3
+
+static PSPathElement *newPSPathElement(int t)
+{
+ PSPathElement *p = malloc(sizeof(PSPathElement));
+ assert(p != 0);
+
+ p->type = t;
+ return p;
+}
+
+/*- returns the number of items in the path -*/
+
+static int BSplineToPSPath(ControlPoint *srcA, int srcCount, PSPathElement **path)
+{
+ list pList = listNewEmpty();
+ int i = 0, pCount = 0;
+ PSPathElement *p;
+
+ int x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2, y2, curx, cury;
+ int lastOff = 0; /*- last point was off-contour */
+ int scflag = 1; /*- start contour flag */
+ int ecflag = 0; /*- end contour flag */
+ int cp = 0; /*- current point */
+ int StartContour = 0, EndContour = 1;
+
+ listSetElementDtor(pList, free);
+ *path = 0;
+
+ /* if (srcCount > 0) for(;;) */
+ while (srcCount > 0) { /*- srcCount does not get changed inside the loop. */
+ if (scflag) {
+ int l = cp;
+ StartContour = cp;
+ while (!(srcA[l].flags & 0x8000)) l++;
+ EndContour = l;
+ if (StartContour == EndContour) {
+ if (cp + 1 < srcCount) {
+ cp++;
+ continue;
+ } else {
+ break;
+ }
+ }
+ p = newPSPathElement(PS_MOVETO);
+ if (!(srcA[cp].flags & 1)) {
+ if (!(srcA[EndContour].flags & 1)) {
+ p->x1 = x0 = (srcA[cp].x + srcA[EndContour].x + 1) / 2;
+ p->y1 = y0 = (srcA[cp].y + srcA[EndContour].y + 1) / 2;
+ } else {
+ p->x1 = x0 = srcA[EndContour].x;
+ p->y1 = y0 = srcA[EndContour].y;
+ }
+ } else {
+ p->x1 = x0 = srcA[cp].x;
+ p->y1 = y0 = srcA[cp].y;
+ cp++;
+ }
+ listAppend(pList, p);
+ lastOff = 0;
+ scflag = 0;
+ }
+
+ curx = srcA[cp].x;
+ cury = srcA[cp].y;
+
+ if (srcA[cp].flags & 1) {
+ if (lastOff) {
+ p = newPSPathElement(PS_CURVETO);
+ p->x1 = x0 + (2 * (x1 - x0) + 1) / 3;
+ p->y1 = y0 + (2 * (y1 - y0) + 1) / 3;
+ p->x2 = x1 + (curx - x1 + 1) / 3;
+ p->y2 = y1 + (cury - y1 + 1) / 3;
+ p->x3 = curx;
+ p->y3 = cury;
+ listAppend(pList, p);
+ } else {
+ if (!(x0 == curx && y0 == cury)) { /* eliminate empty lines */
+ p = newPSPathElement(PS_LINETO);
+ p->x1 = curx;
+ p->y1 = cury;
+ listAppend(pList, p);
+ }
+ }
+
+ x0 = curx; y0 = cury; lastOff = 0;
+ } else {
+ if (lastOff) {
+ x2 = (x1 + curx + 1) / 2;
+ y2 = (y1 + cury + 1) / 2;
+ p = newPSPathElement(PS_CURVETO);
+ p->x1 = x0 + (2 * (x1 - x0) + 1) / 3;
+ p->y1 = y0 + (2 * (y1 - y0) + 1) / 3;
+ p->x2 = x1 + (x2 - x1 + 1) / 3;
+ p->y2 = y1 + (y2 - y1 + 1) / 3;
+ p->x3 = x2;
+ p->y3 = y2;
+ listAppend(pList, p);
+ x0 = x2; y0 = y2;
+ x1 = curx; y1 = cury;
+ } else {
+ x1 = curx; y1 = cury;
+ }
+ lastOff = true;
+ }
+
+ if (ecflag) {
+ listAppend(pList, newPSPathElement(PS_CLOSEPATH));
+ scflag = 1;
+ ecflag = 0;
+ cp = EndContour + 1;
+ if (cp >= srcCount) break;
+ continue;
+ }
+
+
+ if (cp == EndContour) {
+ cp = StartContour;
+ ecflag = true;
+ } else {
+ cp++;
+ }
+ }
+
+ if ((pCount = listCount(pList)) > 0) {
+ p = calloc(pCount, sizeof(PSPathElement));
+ assert(p != 0);
+ listToFirst(pList);
+ for (i=0; i<pCount; i++) {
+ memcpy(p + i, listCurrent(pList), sizeof(PSPathElement));
+ listNext(pList);
+ }
+ *path = p;
+ }
+ listDispose(pList);
+
+ return pCount;
+}
+
+#endif
+
+/*- Extracts a string from the name table and allocates memory for it -*/
+
+static char *nameExtract(sal_uInt8 *name, int nTableSize, int n, int dbFlag, sal_uInt16** ucs2result )
+{
+ int i;
+ char *res;
+ sal_uInt8 *ptr = name + GetUInt16(name, 4, 1) + GetUInt16(name + 6, 12 * n + 10, 1);
+ int len = GetUInt16(name+6, 12 * n + 8, 1);
+
+ // sanity check
+ if( ! len || ptr >= (name+nTableSize-len) )
+ {
+ if( ucs2result )
+ *ucs2result = NULL;
+ return NULL;
+ }
+
+ if( ucs2result )
+ *ucs2result = NULL;
+ if (dbFlag) {
+ res = malloc(1 + len/2);
+ assert(res != 0);
+ for (i = 0; i < len/2; i++) res[i] = *(ptr + i * 2 + 1);
+ res[len/2] = 0;
+ if( ucs2result )
+ {
+ *ucs2result = malloc( len+2 );
+ for (i = 0; i < len/2; i++ ) (*ucs2result)[i] = GetUInt16( ptr, 2*i, 1 );
+ (*ucs2result)[len/2] = 0;
+ }
+ } else {
+ res = malloc(1 + len);
+ assert(res != 0);
+ memcpy(res, ptr, len);
+ res[len] = 0;
+ }
+
+ return res;
+}
+
+static int findname(sal_uInt8 *name, sal_uInt16 n, sal_uInt16 platformID, sal_uInt16 encodingID, sal_uInt16 languageID, sal_uInt16 nameID)
+{
+ int l = 0, r = n-1, i;
+ sal_uInt32 t1, t2;
+ sal_uInt32 m1, m2;
+
+ if (n == 0) return -1;
+
+ m1 = (platformID << 16) | encodingID;
+ m2 = (languageID << 16) | nameID;
+
+ do {
+ i = (l + r) >> 1;
+ t1 = GetUInt32(name + 6, i * 12 + 0, 1);
+ t2 = GetUInt32(name + 6, i * 12 + 4, 1);
+
+ if (! ((m1 < t1) || ((m1 == t1) && (m2 < t2)))) l = i + 1;
+ if (! ((m1 > t1) || ((m1 == t1) && (m2 > t2)))) r = i - 1;
+ } while (l <= r);
+
+ if (l - r == 2) {
+ return l - 1;
+ }
+
+ return -1;
+}
+
+/* XXX marlett.ttf uses (3, 0, 1033) instead of (3, 1, 1033) and does not have any Apple tables.
+ * Fix: if (3, 1, 1033) is not found - need to check for (3, 0, 1033)
+ *
+ * /d/fonts/ttzh_tw/Big5/Hanyi/ma6b5p uses (1, 0, 19) for English strings, instead of (1, 0, 0)
+ * and does not have (3, 1, 1033)
+ * Fix: if (1, 0, 0) and (3, 1, 1033) are not found need to look for (1, 0, *) - that will
+ * require a change in algorithm
+ *
+ * /d/fonts/fdltest/Korean/h2drrm has unsorted names and a an unknown (to me) Mac LanguageID,
+ * but (1, 0, 1042) strings usable
+ * Fix: change algorithm, and use (1, 0, *) if both standard Mac and MS strings are not found
+ */
+
+static void GetNames(TrueTypeFont *t)
+{
+ sal_uInt8 *table = getTable(t, O_name);
+ int nTableSize = getTableSize(t, O_name);
+
+ sal_uInt16 n = GetUInt16(table, 2, 1);
+ int i, r;
+ sal_Bool bPSNameOK = sal_True;
+
+ /* #129743# simple sanity check for name table entry count */
+ if( nTableSize <= n * 12 + 6 )
+ n = 0;
+
+ /* PostScript name: preferred Microsoft */
+ t->psname = NULL;
+ if ((r = findname(table, n, 3, 1, 0x0409, 6)) != -1)
+ t->psname = nameExtract(table, nTableSize, r, 1, NULL);
+ if ( ! t->psname && (r = findname(table, n, 1, 0, 0, 6)) != -1)
+ t->psname = nameExtract(table, nTableSize, r, 0, NULL);
+ if ( ! t->psname && (r = findname(table, n, 3, 0, 0x0409, 6)) != -1)
+ {
+ // some symbol fonts like Marlett have a 3,0 name!
+ t->psname = nameExtract(table, nTableSize, r, 1, NULL);
+ }
+ if ( ! t->psname )
+ {
+ if ( t->fname )
+ {
+ char* pReverse = t->fname + strlen(t->fname);
+ /* take only last token of filename */
+ while(pReverse != t->fname && *pReverse != '/') pReverse--;
+ if(*pReverse == '/') pReverse++;
+ t->psname = strdup(pReverse);
+ assert(t->psname != 0);
+ for (i=strlen(t->psname) - 1; i > 0; i--)
+ {
+ /*- Remove the suffix -*/
+ if (t->psname[i] == '.' ) {
+ t->psname[i] = 0;
+ break;
+ }
+ }
+ }
+ else
+ t->psname = strdup( "Unknown" );
+ }
+
+ /* Font family and subfamily names: preferred Apple */
+ t->family = NULL;
+ if ((r = findname(table, n, 0, 0, 0, 1)) != -1)
+ t->family = nameExtract(table, nTableSize, r, 1, &t->ufamily);
+ if ( ! t->family && (r = findname(table, n, 3, 1, 0x0409, 1)) != -1)
+ t->family = nameExtract(table, nTableSize, r, 1, &t->ufamily);
+ if ( ! t->family && (r = findname(table, n, 1, 0, 0, 1)) != -1)
+ t->family = nameExtract(table, nTableSize, r, 0, NULL);
+ if ( ! t->family && (r = findname(table, n, 3, 1, 0x0411, 1)) != -1)
+ t->family = nameExtract(table, nTableSize, r, 1, &t->ufamily);
+ if ( ! t->family && (r = findname(table, n, 3, 0, 0x0409, 1)) != -1)
+ t->family = nameExtract(table, nTableSize, r, 1, &t->ufamily);
+ if ( ! t->family )
+ {
+ t->family = strdup(t->psname);
+ assert(t->family != 0);
+ }
+
+ t->subfamily = NULL;
+ t->usubfamily = NULL;
+ if ((r = findname(table, n, 1, 0, 0, 2)) != -1)
+ t->subfamily = nameExtract(table, nTableSize, r, 0, &t->usubfamily);
+ if ( ! t->subfamily && (r = findname(table, n, 3, 1, 0x0409, 2)) != -1)
+ t->subfamily = nameExtract(table, nTableSize, r, 1, &t->usubfamily);
+ if ( ! t->subfamily )
+ {
+ t->subfamily = strdup("");
+ }
+
+ /* #i60349# sanity check psname
+ * psname parctically has to be 7bit ascii and should not contains spaces
+ * there is a class of broken fonts which do not fullfill that at all, so let's try
+ * if the family name is 7bit ascii and take it instead if so
+ */
+ /* check psname */
+ for( i = 0; t->psname[i] != 0 && bPSNameOK; i++ )
+ if( t->psname[ i ] < 33 || (t->psname[ i ] & 0x80) )
+ bPSNameOK = sal_False;
+ if( bPSNameOK == sal_False )
+ {
+ sal_Bool bReplace = sal_True;
+ /* check if family is a suitable replacement */
+ if( t->ufamily && t->family )
+ {
+ for( i = 0; t->ufamily[ i ] != 0 && bReplace; i++ )
+ if( t->ufamily[ i ] < 33 || t->ufamily[ i ] > 127 )
+ bReplace = sal_False;
+ if( bReplace )
+ {
+ free( t->psname );
+ t->psname = strdup( t->family );
+ }
+ }
+ }
+}
+
+enum cmapType {
+ CMAP_NOT_USABLE = -1,
+ CMAP_MS_Symbol = 10,
+ CMAP_MS_Unicode = 11,
+ CMAP_MS_ShiftJIS = 12,
+ CMAP_MS_Big5 = 13,
+ CMAP_MS_PRC = 14,
+ CMAP_MS_Wansung = 15,
+ CMAP_MS_Johab = 16
+};
+
+#define MISSING_GLYPH_INDEX 0
+
+/*
+ * getGlyph[0246]() functions and freinds are implemented by:
+ * @author Manpreet Singh
+ * getGlyph12() function and friends by:
+ * @author HDU
+ */
+static sal_uInt32 getGlyph0(const sal_uInt8* cmap, sal_uInt32 c) {
+ if (c <= 255) {
+ return *(cmap + 6 + c);
+ } else {
+ return MISSING_GLYPH_INDEX;
+ }
+}
+
+typedef struct _subHeader2 {
+ sal_uInt16 firstCode;
+ sal_uInt16 entryCount;
+ sal_uInt16 idDelta;
+ sal_uInt16 idRangeOffset;
+} subHeader2;
+
+static sal_uInt32 getGlyph2(const sal_uInt8 *cmap, sal_uInt32 c) {
+ sal_uInt16 *CMAP2 = (sal_uInt16 *) cmap;
+ sal_uInt8 theHighByte;
+
+ sal_uInt8 theLowByte;
+ subHeader2* subHeader2s;
+ sal_uInt16* subHeader2Keys;
+ sal_uInt16 firstCode;
+ int k;
+ sal_uInt32 ToReturn;
+
+ theHighByte = (sal_uInt8)((c >> 8) & 0x00ff);
+ theLowByte = (sal_uInt8)(c & 0x00ff);
+ subHeader2Keys = CMAP2 + 3;
+ subHeader2s = (subHeader2 *)(subHeader2Keys + 256);
+ k = Int16FromMOTA(subHeader2Keys[theHighByte]) / 8;
+
+ if(k == 0) {
+ firstCode = Int16FromMOTA(subHeader2s[k].firstCode);
+ if(theLowByte >= firstCode && theLowByte < (firstCode + Int16FromMOTA(subHeader2s[k].entryCount))) {
+ return *((&(subHeader2s[0].idRangeOffset))
+ + (Int16FromMOTA(subHeader2s[0].idRangeOffset)/2) /* + offset */
+ + theLowByte /* + to_look */
+ - Int16FromMOTA(subHeader2s[0].firstCode)
+ );
+ } else {
+ return MISSING_GLYPH_INDEX;
+ }
+ } else if (k > 0) {
+ firstCode = Int16FromMOTA(subHeader2s[k].firstCode);
+ if(theLowByte >= firstCode && theLowByte < (firstCode + Int16FromMOTA(subHeader2s[k].entryCount))) {
+ ToReturn = *((&(subHeader2s[k].idRangeOffset))
+ + (Int16FromMOTA(subHeader2s[k].idRangeOffset)/2)
+ + theLowByte - firstCode);
+ if(ToReturn == 0) {
+ return MISSING_GLYPH_INDEX;
+ } else {
+ ToReturn += Int16FromMOTA(subHeader2s[k].idDelta);
+ return (ToReturn & 0xFFFF);
+ }
+ } else {
+ return MISSING_GLYPH_INDEX;
+ }
+ } else {
+ return MISSING_GLYPH_INDEX;
+ }
+}
+
+static sal_uInt32 getGlyph6(const sal_uInt8 *cmap, sal_uInt32 c) {
+ sal_uInt16 firstCode, lastCode, count;
+ sal_uInt16 *CMAP6 = (sal_uInt16 *) cmap;
+
+ firstCode = Int16FromMOTA(*(CMAP6 + 3));
+ count = Int16FromMOTA(*(CMAP6 + 4));
+ lastCode = firstCode + count - 1;
+ if (c < firstCode || c > lastCode) {
+ return MISSING_GLYPH_INDEX;
+ } else {
+ return *((CMAP6 + 5)/*glyphIdArray*/ + (c - firstCode));
+ }
+}
+
+static sal_uInt16 GEbinsearch(sal_uInt16 *ar, sal_uInt16 length, sal_uInt16 toSearch) {
+ signed int low, mid, high, lastfound = 0xffff;
+ sal_uInt16 res;
+ if(length == (sal_uInt16)0 || length == (sal_uInt16)0xFFFF) {
+ return (sal_uInt16)0xFFFF;
+ }
+ low = 0;
+ high = length - 1;
+ while(high >= low) {
+ mid = (high + low)/2;
+ res = Int16FromMOTA(*(ar+mid));
+ if(res >= toSearch) {
+ lastfound = mid;
+ high = --mid;
+ } else {
+ low = ++mid;
+ }
+ }
+ return (sal_uInt16)lastfound;
+}
+
+
+static sal_uInt32 getGlyph4(const sal_uInt8 *cmap, sal_uInt32 c) {
+ sal_uInt16 i;
+ int ToReturn;
+ sal_uInt16 segCount;
+ sal_uInt16 * startCode;
+ sal_uInt16 * endCode;
+ sal_uInt16 * idDelta;
+ /* sal_uInt16 * glyphIdArray; */
+ sal_uInt16 * idRangeOffset;
+ sal_uInt16 * glyphIndexArray;
+ sal_uInt16 *CMAP4 = (sal_uInt16 *) cmap;
+ /* sal_uInt16 GEbinsearch(sal_uInt16 *ar, sal_uInt16 length, sal_uInt16 toSearch); */
+
+ segCount = Int16FromMOTA(*(CMAP4 + 3))/2;
+ endCode = CMAP4 + 7;
+ i = GEbinsearch(endCode, segCount, (sal_uInt16)c);
+
+ if (i == (sal_uInt16) 0xFFFF) {
+ return MISSING_GLYPH_INDEX;
+ }
+ startCode = endCode + segCount + 1;
+
+ if(Int16FromMOTA(startCode[i]) > c) {
+ return MISSING_GLYPH_INDEX;
+ }
+ idDelta = startCode + segCount;
+ idRangeOffset = idDelta + segCount;
+ glyphIndexArray = idRangeOffset + segCount;
+
+ if(Int16FromMOTA(idRangeOffset[i]) != 0) {
+ c = Int16FromMOTA(*(&(idRangeOffset[i]) + (Int16FromMOTA(idRangeOffset[i])/2 + (c - Int16FromMOTA(startCode[i])))));
+ }
+
+ ToReturn = (Int16FromMOTA(idDelta[i]) + c) & 0xFFFF;
+ return ToReturn;
+}
+
+static sal_uInt32 getGlyph12(const sal_uInt8 *pCmap, sal_uInt32 cChar) {
+ const sal_uInt32* pCMAP12 = (const sal_uInt32*)pCmap;
+ int nLength = Int32FromMOTA( pCMAP12[1] );
+ int nGroups = Int32FromMOTA( pCMAP12[3] );
+ int nLower = 0;
+ int nUpper = nGroups;
+
+ if( nUpper > (nLength-16)/12 )
+ nUpper = (nLength-16)/12;
+
+ /* binary search in "segmented coverage" subtable */
+ while( nLower < nUpper ) {
+ int nIndex = (nLower + nUpper) / 2;
+ const sal_uInt32* pEntry = &pCMAP12[ 4 + 3*nIndex ];
+ sal_uInt32 cStart = Int32FromMOTA( pEntry[0] );
+ sal_uInt32 cLast = Int32FromMOTA( pEntry[1] );
+ if( cChar < cStart )
+ nUpper = nIndex;
+ else if( cChar > cLast )
+ nLower = nIndex + 1;
+ else { /* found matching entry! */
+ sal_uInt32 nGlyph = Int32FromMOTA( pEntry[2] );
+ nGlyph += cChar - cStart;
+ return nGlyph;
+ }
+ }
+
+ return MISSING_GLYPH_INDEX;
+}
+
+
+static void FindCmap(TrueTypeFont *ttf)
+{
+ sal_uInt8 *table = getTable(ttf, O_cmap);
+ sal_uInt32 table_size = getTableSize(ttf, O_cmap);
+ sal_uInt16 ncmaps = GetUInt16(table, 2, 1);
+ unsigned int i;
+ sal_uInt32 ThreeZero = 0; /* MS Symbol */
+ sal_uInt32 ThreeOne = 0; /* MS UCS-2 */
+ sal_uInt32 ThreeTwo = 0; /* MS ShiftJIS */
+ sal_uInt32 ThreeThree = 0; /* MS Big5 */
+ sal_uInt32 ThreeFour = 0; /* MS PRC */
+ sal_uInt32 ThreeFive = 0; /* MS Wansung */
+ sal_uInt32 ThreeSix = 0; /* MS Johab */
+
+ for (i = 0; i < ncmaps; i++) {
+ sal_uInt32 offset;
+ sal_uInt16 pID, eID;
+
+ /* sanity check, cmap entry must lie within table */
+ if( i*8+4 > table_size )
+ break;
+
+ pID = GetUInt16(table, 4 + i * 8, 1);
+ eID = GetUInt16(table, 6 + i * 8, 1);
+ offset = GetUInt32(table, 8 + i * 8, 1);
+
+ /* sanity check, cmap must lie within file */
+ if( (table - ttf->ptr) + offset > (sal_uInt32)ttf->fsize )
+ continue;
+
+ /* Unicode tables in Apple fonts */
+ if (pID == 0) {
+ ThreeOne = offset; break;
+ }
+
+ if (pID == 3) {
+ switch (eID) {
+ case 0: ThreeZero = offset; break;
+ case 10: // UCS-4
+ case 1: ThreeOne = offset; break;
+ case 2: ThreeTwo = offset; break;
+ case 3: ThreeThree = offset; break;
+ case 4: ThreeFour = offset; break;
+ case 5: ThreeFive = offset; break;
+ case 6: ThreeSix = offset; break;
+ }
+ }
+ }
+
+ if (ThreeOne) {
+ ttf->cmapType = CMAP_MS_Unicode;
+ ttf->cmap = table + ThreeOne;
+ } else if (ThreeTwo) {
+ ttf->cmapType = CMAP_MS_ShiftJIS;
+ ttf->cmap = table + ThreeTwo;
+ } else if (ThreeThree) {
+ ttf->cmapType = CMAP_MS_Big5;
+ ttf->cmap = table + ThreeThree;
+ } else if (ThreeFour) {
+ ttf->cmapType = CMAP_MS_PRC;
+ ttf->cmap = table + ThreeFour;
+ } else if (ThreeFive) {
+ ttf->cmapType = CMAP_MS_Wansung;
+ ttf->cmap = table + ThreeFive;
+ } else if (ThreeSix) {
+ ttf->cmapType = CMAP_MS_Johab;
+ ttf->cmap = table + ThreeSix;
+ } else if (ThreeZero) {
+ ttf->cmapType = CMAP_MS_Symbol;
+ ttf->cmap = table + ThreeZero;
+ } else {
+ ttf->cmapType = CMAP_NOT_USABLE;
+ ttf->cmap = 0;
+ }
+
+ if (ttf->cmapType != CMAP_NOT_USABLE) {
+ switch (GetUInt16(ttf->cmap, 0, 1)) {
+ case 0: ttf->mapper = getGlyph0; break;
+ case 2: ttf->mapper = getGlyph2; break;
+ case 4: ttf->mapper = getGlyph4; break;
+ case 6: ttf->mapper = getGlyph6; break;
+ case 12: ttf->mapper= getGlyph12; break;
+ default:
+#if OSL_DEBUG_LEVEL > 1
+ /*- if the cmap table is really broken */
+ printf("%s: %d is not a recognized cmap format.\n", ttf->fname, GetUInt16(ttf->cmap, 0, 1));
+#endif
+ ttf->cmapType = CMAP_NOT_USABLE;
+ ttf->cmap = 0;
+ ttf->mapper = 0;
+ }
+ }
+}
+
+static void GetKern(TrueTypeFont *ttf)
+{
+ sal_uInt8 *table = getTable(ttf, O_kern);
+ sal_uInt8 *ptr;
+ sal_uInt32 i;
+ /*
+ sal_uInt16 v1;
+ sal_uInt32 v2;
+ */
+
+ if (!table) goto badtable;
+
+ if (GetUInt16(table, 0, 1) == 0) { /* Traditional Microsoft style table with USHORT version and nTables fields */
+ ttf->nkern = GetUInt16(table, 2, 1);
+ ttf->kerntables = calloc(ttf->nkern, sizeof(sal_uInt8 *));
+ assert(ttf->kerntables != 0);
+ memset(ttf->kerntables, 0, ttf->nkern * sizeof(sal_uInt8 *));
+ ttf->kerntype = KT_MICROSOFT;
+ ptr = table + 4;
+ for (i=0; i < ttf->nkern; i++) {
+ ttf->kerntables[i] = ptr;
+ ptr += GetUInt16(ptr, 2, 1);
+ /* sanity check */
+ if( ptr > ttf->ptr+ttf->fsize )
+ {
+ free( ttf->kerntables );
+ goto badtable;
+ }
+ }
+ return;
+ }
+
+ if (GetUInt32(table, 0, 1) == 0x00010000) { /* MacOS style kern tables: fixed32 version and sal_uInt32 nTables fields */
+ ttf->nkern = GetUInt32(table, 4, 1);
+ ttf->kerntables = calloc(ttf->nkern, sizeof(sal_uInt8 *));
+ assert(ttf->kerntables != 0);
+ memset(ttf->kerntables, 0, ttf->nkern * sizeof(sal_uInt8 *));
+ ttf->kerntype = KT_APPLE_NEW;
+ ptr = table + 8;
+ for (i = 0; i < ttf->nkern; i++) {
+ ttf->kerntables[i] = ptr;
+ ptr += GetUInt32(ptr, 0, 1);
+ /* sanity check; there are some fonts that are broken in this regard */
+ if( ptr > ttf->ptr+ttf->fsize )
+ {
+ free( ttf->kerntables );
+ goto badtable;
+ }
+ }
+ return;
+ }
+
+ badtable:
+ ttf->kerntype = KT_NONE;
+ ttf->kerntables = 0;
+
+ return;
+}
+
+#ifdef TEST5
+/* KernGlyphsPrim?() functions expect the caller to ensure the validity of their arguments and
+ * that x and y elements of the kern array are initialized to zeroes
+ */
+static void KernGlyphsPrim1(TrueTypeFont *ttf, sal_uInt16 *glyphs, int nglyphs, int wmode, KernData *kern)
+{
+ (void)ttf; /* avoid warning */
+ (void)glyphs; /* avoid warning */
+ (void)nglyphs; /* avoid warning */
+ (void)wmode; /* avoid warning */
+ (void)nglyphs; /* avoid warning */
+ (void)kern; /* avoid warning */
+ fprintf(stderr, "MacOS kerning tables have not been implemented yet!\n");
+}
+
+static void KernGlyphsPrim2(TrueTypeFont *ttf, sal_uInt16 *glyphs, int nglyphs, int wmode, KernData *kern)
+{
+ sal_uInt32 i, j;
+ sal_uInt32 gpair;
+
+ if( ! nglyphs )
+ return;
+
+ for (i = 0; i < (sal_uInt32)nglyphs - 1; i++) {
+ gpair = (glyphs[i] << 16) | glyphs[i+1];
+#ifdef DEBUG2
+ /* All fonts with MS kern table that I've seen so far contain just one kern subtable.
+ * MS kern documentation is very poor and I doubt that font developers will be using
+ * several subtables. I expect them to be using OpenType tables instead.
+ * According to MS documention, format 2 subtables are not supported by Windows and OS/2.
+ */
+ if (ttf->nkern > 1) {
+ fprintf(stderr, "KernGlyphsPrim2: %d kern tables found.\n", ttf->nkern);
+ }
+#endif
+ for (j = 0; j < ttf->nkern; j++) {
+ sal_uInt16 coverage = GetUInt16(ttf->kerntables[j], 4, 1);
+ sal_uInt8 *ptr;
+ int npairs;
+ sal_uInt32 t;
+ int l, r, k;
+
+ if (! ((coverage & 1) ^ wmode)) continue;
+ if ((coverage & 0xFFFE) != 0) {
+#ifdef DEBUG2
+ fprintf(stderr, "KernGlyphsPrim2: coverage flags are not supported: %04X.\n", coverage);
+#endif
+ continue;
+ }
+ ptr = ttf->kerntables[j];
+ npairs = GetUInt16(ptr, 6, 1);
+ ptr += 14;
+ l = 0;
+ r = npairs;
+ do {
+ k = (l + r) >> 1;
+ t = GetUInt32(ptr, k * 6, 1);
+ if (gpair >= t) l = k + 1;
+ if (gpair <= t) r = k - 1;
+ } while (l <= r);
+ if (l - r == 2) {
+ if (!wmode) {
+ kern[i].x = XUnits(ttf->unitsPerEm, GetInt16(ptr, 4 + (l-1) * 6, 1));
+ } else {
+ kern[i].y = XUnits(ttf->unitsPerEm, GetInt16(ptr, 4 + (l-1) * 6, 1));
+ }
+ /* !wmode ? kern[i].x : kern[i].y = GetInt16(ptr, 4 + (l-1) * 6, 1); */
+ }
+ }
+ }
+}
+#endif
+
+/*- Public functions */ /*FOLD00*/
+
+int CountTTCFonts(const char* fname)
+{
+ int nFonts = 0;
+ sal_uInt8 buffer[12];
+ FILE* fd = fopen(fname, "rb");
+ if( fd ) {
+ if (fread(buffer, 1, 12, fd) == 12) {
+ if(GetUInt32(buffer, 0, 1) == T_ttcf )
+ nFonts = GetUInt32(buffer, 8, 1);
+ }
+ fclose(fd);
+ }
+ return nFonts;
+}
+
+static void allocTrueTypeFont( TrueTypeFont** ttf )
+{
+ *ttf = calloc(1,sizeof(TrueTypeFont));
+ if( *ttf != NULL )
+ {
+ (*ttf)->tag = 0;
+ (*ttf)->fname = 0;
+ (*ttf)->fsize = -1;
+ (*ttf)->ptr = 0;
+ (*ttf)->nglyphs = 0xFFFFFFFF;
+ (*ttf)->pGSubstitution = 0;
+ }
+}
+
+/* forward declariotn for the two entry points to use*/
+static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t );
+
+#if !defined(WIN32) && !defined(OS2)
+int OpenTTFontFile( const char* fname, sal_uInt32 facenum, TrueTypeFont** ttf )
+{
+ int ret, fd = -1;
+ struct stat st;
+
+ if (!fname || !*fname) return SF_BADFILE;
+
+ allocTrueTypeFont( ttf );
+ if( ! *ttf )
+ return SF_MEMORY;
+
+ (*ttf)->fname = strdup(fname);
+ if( ! (*ttf)->fname )
+ {
+ ret = SF_MEMORY;
+ goto cleanup;
+ }
+
+ fd = open(fname, O_RDONLY);
+
+ if (fd == -1) {
+ ret = SF_BADFILE;
+ goto cleanup;
+ }
+
+ if (fstat(fd, &st) == -1) {
+ ret = SF_FILEIO;
+ goto cleanup;
+ }
+
+ (*ttf)->fsize = st.st_size;
+
+ /* On Mac OS, most likely will happen if a Mac user renames a font file
+ * to be .ttf when its really a Mac resource-based font.
+ * Size will be 0, but fonts smaller than 4 bytes would be broken anyway.
+ */
+ if ((*ttf)->fsize == 0) {
+ ret = SF_BADFILE;
+ goto cleanup;
+ }
+
+
+ if (((*ttf)->ptr = (sal_uInt8 *) mmap(0, (*ttf)->fsize, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) {
+ ret = SF_MEMORY;
+ goto cleanup;
+ }
+ close(fd);
+
+ return doOpenTTFont( facenum, *ttf );
+
+cleanup:
+ if (fd != -1) close(fd);
+ /*- t and t->fname have been allocated! */
+ free((*ttf)->fname);
+ free(*ttf);
+ *ttf = NULL;
+ return ret;
+}
+#endif
+
+int OpenTTFontBuffer(void* pBuffer, sal_uInt32 nLen, sal_uInt32 facenum, TrueTypeFont** ttf)
+{
+ allocTrueTypeFont( ttf );
+ if( *ttf == NULL )
+ return SF_MEMORY;
+
+ (*ttf)->fname = NULL;
+ (*ttf)->fsize = nLen;
+ (*ttf)->ptr = pBuffer;
+
+ return doOpenTTFont( facenum, *ttf );
+}
+
+static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t )
+{
+ int i;
+ sal_uInt32 version;
+ sal_uInt8 *table, *offset;
+ sal_uInt32 length, tag;
+ sal_uInt32 tdoffset = 0; /* offset to TableDirectory in a TTC file. For TTF files is 0 */
+ int indexfmt, k;
+
+ version = GetInt32(t->ptr, 0, 1);
+
+ if ((version == 0x00010000) || (version == T_true)) {
+ tdoffset = 0;
+ } else if (version == T_ttcf) { /*- TrueType collection */
+ if (GetUInt32(t->ptr, 4, 1) != 0x00010000) {
+ CloseTTFont(t);
+ return SF_TTFORMAT;
+ }
+ if (facenum >= GetUInt32(t->ptr, 8, 1)) {
+ CloseTTFont(t);
+ return SF_FONTNO;
+ }
+ tdoffset = GetUInt32(t->ptr, 12 + 4 * facenum, 1);
+ } else {
+ CloseTTFont(t);
+ return SF_TTFORMAT;
+ }
+
+#ifdef DEBUG2
+ fprintf(stderr, "tdoffset: %d\n", tdoffset);
+#endif
+
+ /* magic number */
+ t->tag = TTFontClassTag;
+
+ t->ntables = GetUInt16(t->ptr + tdoffset, 4, 1);
+ if( t->ntables >= 128 )
+ return SF_TTFORMAT;
+
+ t->tables = calloc(NUM_TAGS, sizeof(void *));
+ assert(t->tables != 0);
+ t->tlens = calloc(NUM_TAGS, sizeof(sal_uInt32));
+ assert(t->tlens != 0);
+
+ memset(t->tables, 0, NUM_TAGS * sizeof(void *));
+ memset(t->tlens, 0, NUM_TAGS * sizeof(sal_uInt32));
+
+ /* parse the tables */
+ for (i=0; i<(int)t->ntables; i++) {
+ int nIndex;
+ tag = GetUInt32(t->ptr + tdoffset + 12, 16 * i, 1);
+ switch( tag ) {
+ case T_maxp: nIndex = O_maxp; break;
+ case T_glyf: nIndex = O_glyf; break;
+ case T_head: nIndex = O_head; break;
+ case T_loca: nIndex = O_loca; break;
+ case T_name: nIndex = O_name; break;
+ case T_hhea: nIndex = O_hhea; break;
+ case T_hmtx: nIndex = O_hmtx; break;
+ case T_cmap: nIndex = O_cmap; break;
+ case T_vhea: nIndex = O_vhea; break;
+ case T_vmtx: nIndex = O_vmtx; break;
+ case T_OS2 : nIndex = O_OS2; break;
+ case T_post: nIndex = O_post; break;
+ case T_kern: nIndex = O_kern; break;
+ case T_cvt : nIndex = O_cvt; break;
+ case T_prep: nIndex = O_prep; break;
+ case T_fpgm: nIndex = O_fpgm; break;
+ case T_gsub: nIndex = O_gsub; break;
+ default: nIndex = -1; break;
+ }
+ if( nIndex >= 0 ) {
+ offset = t->ptr + GetUInt32(t->ptr + tdoffset + 12, 16 * i + 8, 1);
+ length = GetUInt32(t->ptr + tdoffset + 12, 16 * i + 12, 1);
+ t->tables[nIndex] = offset;
+ t->tlens[nIndex] = length;
+ }
+ }
+
+ /* Fixup offsets when only a TTC extract was provided */
+ if( facenum == (sal_uInt32)~0 ) {
+ sal_uInt8 *pHead = t->tables[O_head], *p = NULL;
+ if( !pHead )
+ return SF_TTFORMAT;
+ /* limit Head candidate to TTC extract's limits */
+ if( pHead > t->ptr + (t->fsize - 54) )
+ pHead = t->ptr + (t->fsize - 54);
+ /* TODO: find better method than searching head table's magic */
+ for( p = pHead + 12; p > t->ptr; --p ) {
+ if( p[0]==0x5F && p[1]==0x0F && p[2]==0x3C && p[3]==0xF5 ) {
+ int nDelta = (pHead + 12) - p, j;
+ if( nDelta )
+ for( j=0; j<NUM_TAGS; ++j )
+ if( t->tables[j] )
+ *(char**)&t->tables[j] -= nDelta;
+ break;
+ }
+ }
+ if( p <= t->ptr )
+ return SF_TTFORMAT;
+ }
+
+ /* Check the table offsets after TTC correction */
+ for (i=0; i<NUM_TAGS; i++) {
+ /* sanity check: table must lay completely within the file
+ * at this point one could check the checksum of all contained
+ * tables, but this would be quite time intensive.
+ * Try to fix tables, so we can cope with minor problems.
+ */
+
+ if( (sal_uInt8*)t->tables[i] < t->ptr )
+ {
+ t->tlens[i] = 0;
+ t->tables[i] = NULL;
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "font file %s has bad table offset (tagnum=%d)\n", t->fname, i );
+#endif
+ }
+ else if( (sal_uInt8*)t->tables[i] + t->tlens[i] > t->ptr + t->fsize )
+ {
+ int nMaxLen = (t->ptr + t->fsize) - (sal_uInt8*)t->tables[i];
+ if( nMaxLen < 0 )
+ nMaxLen = 0;
+ t->tlens[i] = nMaxLen;
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "font file %s has too big table (tagnum=%d)\n", t->fname, i );
+#endif
+ }
+ }
+
+ /* At this point TrueTypeFont is constructed, now need to verify the font format
+ and read the basic font properties */
+
+ /* The following tables are absolutely required:
+ * maxp, head, glyf, loca, name, cmap
+ */
+
+ if (!(getTable(t, O_maxp) && getTable(t, O_head) && getTable(t, O_glyf) && getTable(t, O_loca) && getTable(t, O_name) && getTable(t, O_cmap) )) {
+ CloseTTFont(t);
+ return SF_TTFORMAT;
+ }
+
+ table = getTable(t, O_maxp);
+ t->nglyphs = GetUInt16(table, 4, 1);
+
+ table = getTable(t, O_head);
+ t->unitsPerEm = GetUInt16(table, 18, 1);
+ indexfmt = GetInt16(table, 50, 1);
+
+ if( ((indexfmt != 0) && (indexfmt != 1)) || (t->unitsPerEm <= 0) ) {
+ CloseTTFont(t);
+ return SF_TTFORMAT;
+ }
+
+ k = (getTableSize(t, O_loca) / (indexfmt ? 4 : 2)) - 1;
+ if (k < (int)t->nglyphs) t->nglyphs = k; /* Hack for broken Chinese fonts */
+
+ table = getTable(t, O_loca);
+
+ t->goffsets = (sal_uInt32 *) calloc(1+t->nglyphs, sizeof(sal_uInt32));
+ assert(t->goffsets != 0);
+
+ for (i = 0; i <= (int)t->nglyphs; i++) {
+ t->goffsets[i] = indexfmt ? GetUInt32(table, i << 2, 1) : (sal_uInt32)GetUInt16(table, i << 1, 1) << 1;
+ }
+
+ table = getTable(t, O_hhea);
+ t->numberOfHMetrics = (table != 0) ? GetUInt16(table, 34, 1) : 0;
+
+ table = getTable(t, O_vhea);
+ t->numOfLongVerMetrics = (table != 0) ? GetUInt16(table, 34, 1) : 0;
+
+ GetNames(t);
+ FindCmap(t);
+ GetKern(t);
+ ReadGSUB( t, 0, 0 );
+
+ return SF_OK;
+}
+
+void CloseTTFont(TrueTypeFont *ttf) /*FOLD01*/
+{
+ if (ttf->tag != TTFontClassTag) return;
+
+#if !defined(WIN32) && !defined(OS2)
+ if( ttf->fname )
+ munmap((char *) ttf->ptr, ttf->fsize);
+#endif
+ free(ttf->fname);
+ free(ttf->goffsets);
+ free(ttf->psname);
+ free(ttf->family);
+ if( ttf->ufamily )
+ free( ttf->ufamily );
+ free(ttf->subfamily);
+ if( ttf->usubfamily )
+ free( ttf->usubfamily );
+ free(ttf->tables);
+ free(ttf->tlens);
+ free(ttf->kerntables);
+
+ ReleaseGSUB(ttf);
+
+ free(ttf);
+ return;
+}
+
+int GetTTGlyphPoints(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray)
+{
+ return GetTTGlyphOutline(ttf, glyphID, pointArray, 0, 0);
+}
+
+#ifdef NO_LIST
+static
+#endif
+int GetTTGlyphComponents(TrueTypeFont *ttf, sal_uInt32 glyphID, list glyphlist)
+{
+ sal_uInt8 *ptr, *glyf = getTable(ttf, O_glyf);
+ int n = 1;
+
+ if (glyphID >= ttf->nglyphs) return 0;
+ ptr = glyf + ttf->goffsets[glyphID];
+
+ listAppend(glyphlist, (void *) (sal_IntPtr) glyphID);
+
+ if (GetInt16(ptr, 0, 1) == -1) {
+ sal_uInt16 flags, index;
+ ptr += 10;
+ do {
+ flags = GetUInt16(ptr, 0, 1);
+ index = GetUInt16(ptr, 2, 1);
+
+ ptr += 4;
+ n += GetTTGlyphComponents(ttf, index, glyphlist);
+
+ if (flags & ARG_1_AND_2_ARE_WORDS) {
+ ptr += 4;
+ } else {
+ ptr += 2;
+ }
+
+ if (flags & WE_HAVE_A_SCALE) {
+ ptr += 2;
+ } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+ ptr += 4;
+ } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+ ptr += 8;
+ }
+ } while (flags & MORE_COMPONENTS);
+ }
+
+ return n;
+}
+
+#ifndef NO_TYPE3
+int CreateT3FromTTGlyphs(TrueTypeFont *ttf, FILE *outf, const char *fname, /*FOLD00*/
+ sal_uInt16 *glyphArray, sal_uInt8 *encoding, int nGlyphs,
+ int wmode)
+{
+ ControlPoint *pa;
+ PSPathElement *path;
+ int i, j, r, n;
+ sal_uInt8 *table = getTable(ttf, O_head);
+ TTGlyphMetrics metrics;
+ int UPEm = ttf->unitsPerEm;
+
+ const char *h01 = "%%!PS-AdobeFont-%d.%d-%d.%d\n";
+ const char *h02 = "%% Creator: %s %s %s\n";
+ const char *h09 = "%% Original font name: %s\n";
+
+ const char *h10 =
+ "30 dict begin\n"
+ "/PaintType 0 def\n"
+ "/FontType 3 def\n"
+ "/StrokeWidth 0 def\n";
+
+ const char *h11 = "/FontName (%s) cvn def\n";
+
+ /*
+ const char *h12 = "%/UniqueID %d def\n";
+ */
+ const char *h13 = "/FontMatrix [.001 0 0 .001 0 0] def\n";
+ const char *h14 = "/FontBBox [%d %d %d %d] def\n";
+
+ const char *h15=
+ "/Encoding 256 array def\n"
+ " 0 1 255 {Encoding exch /.notdef put} for\n";
+
+ const char *h16 = " Encoding %d /glyph%d put\n";
+ const char *h17 = "/XUID [103 0 0 16#%08X %d 16#%08X 16#%08X] def\n";
+
+ const char *h30 = "/CharProcs %d dict def\n";
+ const char *h31 = " CharProcs begin\n";
+ const char *h32 = " /.notdef {} def\n";
+ const char *h33 = " /glyph%d {\n";
+ const char *h34 = " } bind def\n";
+ const char *h35 = " end\n";
+
+ const char *h40 =
+ "/BuildGlyph {\n"
+ " exch /CharProcs get exch\n"
+ " 2 copy known not\n"
+ " {pop /.notdef} if\n"
+ " get exec\n"
+ "} bind def\n"
+ "/BuildChar {\n"
+ " 1 index /Encoding get exch get\n"
+ " 1 index /BuildGlyph get exec\n"
+ "} bind def\n"
+ "currentdict end\n";
+
+ const char *h41 = "(%s) cvn exch definefont pop\n";
+
+
+ if (!((nGlyphs > 0) && (nGlyphs <= 256))) return SF_GLYPHNUM;
+ if (!glyphArray) return SF_BADARG;
+ if (!fname) fname = ttf->psname;
+
+ fprintf(outf, h01, GetInt16(table, 0, 1), GetUInt16(table, 2, 1), GetInt16(table, 4, 1), GetUInt16(table, 6, 1));
+ fprintf(outf, h02, modname, modver, modextra);
+ fprintf(outf, h09, ttf->psname);
+
+ fprintf(outf, h10);
+ fprintf(outf, h11, fname);
+/* fprintf(outf, h12, 4000000); */
+
+ /* XUID generation:
+ * 103 0 0 C1 C2 C3 C4
+ * C1 - CRC-32 of the entire source TrueType font
+ * C2 - number of glyphs in the subset
+ * C3 - CRC-32 of the glyph array
+ * C4 - CRC-32 of the encoding array
+ *
+ * All CRC-32 numbers are presented as hexadecimal numbers
+ */
+
+ fprintf(outf, h17, rtl_crc32(0, ttf->ptr, ttf->fsize), nGlyphs, rtl_crc32(0, glyphArray, nGlyphs * 2), rtl_crc32(0, encoding, nGlyphs));
+ fprintf(outf, h13);
+ fprintf(outf, h14, XUnits(UPEm, GetInt16(table, 36, 1)), XUnits(UPEm, GetInt16(table, 38, 1)), XUnits(UPEm, GetInt16(table, 40, 1)), XUnits(UPEm, GetInt16(table, 42, 1)));
+ fprintf(outf, h15);
+
+ for (i = 0; i < nGlyphs; i++) {
+ fprintf(outf, h16, encoding[i], i);
+ }
+
+ fprintf(outf, h30, nGlyphs+1);
+ fprintf(outf, h31);
+ fprintf(outf, h32);
+
+ for (i = 0; i < nGlyphs; i++) {
+ fprintf(outf, h33, i);
+ r = GetTTGlyphOutline(ttf, glyphArray[i] < ttf->nglyphs ? glyphArray[i] : 0, &pa, &metrics, 0);
+
+ if (r > 0) {
+ n = BSplineToPSPath(pa, r, &path);
+ } else {
+ n = 0; /* glyph might have zero contours but valid metrics ??? */
+ path = 0;
+ if (r < 0) { /* glyph is not present in the font - pa array was not allocated, so no need to free it */
+ continue;
+ }
+ }
+ fprintf(outf, "\t%d %d %d %d %d %d setcachedevice\n",
+ wmode == 0 ? XUnits(UPEm, metrics.aw) : 0,
+ wmode == 0 ? 0 : -XUnits(UPEm, metrics.ah),
+ XUnits(UPEm, metrics.xMin),
+ XUnits(UPEm, metrics.yMin),
+ XUnits(UPEm, metrics.xMax),
+ XUnits(UPEm, metrics.yMax));
+
+ for (j = 0; j < n; j++) {
+ switch (path[j].type) {
+ case PS_MOVETO:
+ fprintf(outf, "\t%d %d moveto\n", XUnits(UPEm, path[j].x1), XUnits(UPEm, path[j].y1));
+ break;
+
+ case PS_LINETO:
+ fprintf(outf, "\t%d %d lineto\n", XUnits(UPEm, path[j].x1), XUnits(UPEm, path[j].y1));
+ break;
+
+ case PS_CURVETO:
+ fprintf(outf, "\t%d %d %d %d %d %d curveto\n", XUnits(UPEm, path[j].x1), XUnits(UPEm, path[j].y1), XUnits(UPEm, path[j].x2), XUnits(UPEm, path[j].y2), XUnits(UPEm, path[j].x3), XUnits(UPEm, path[j].y3));
+ break;
+
+ case PS_CLOSEPATH:
+ fprintf(outf, "\tclosepath\n");
+ break;
+ }
+ }
+ if (n > 0) fprintf(outf, "\tfill\n"); /* if glyph is not a whitespace character */
+
+ fprintf(outf, h34);
+
+ free(pa);
+ free(path);
+ }
+ fprintf(outf, h35);
+
+ fprintf(outf, h40);
+ fprintf(outf, h41, fname);
+
+ return SF_OK;
+}
+#endif
+
+#ifndef NO_TTCR
+int CreateTTFromTTGlyphs(TrueTypeFont *ttf,
+ const char *fname,
+ sal_uInt16 *glyphArray,
+ sal_uInt8 *encoding,
+ int nGlyphs,
+ int nNameRecs,
+ NameRecord *nr,
+ sal_uInt32 flags)
+{
+ TrueTypeCreator *ttcr;
+ TrueTypeTable *head=0, *hhea=0, *maxp=0, *cvt=0, *prep=0, *glyf=0, *fpgm=0, *cmap=0, *name=0, *post = 0, *os2 = 0;
+ sal_uInt8 *p;
+ int i;
+ int res;
+ sal_uInt32 *gID;
+
+ TrueTypeCreatorNewEmpty(T_true, &ttcr);
+
+ /** name **/
+
+ if (flags & TTCF_AutoName) {
+ /* not implemented yet
+ NameRecord *names;
+ NameRecord newname;
+ int n = GetTTNameRecords(ttf, &names);
+ int n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0, n6 = 0;
+ sal_uInt8 *cp1;
+ sal_uInt8 suffix[32];
+ sal_uInt32 c1 = crc32(glyphArray, nGlyphs * 2);
+ sal_uInt32 c2 = crc32(encoding, nGlyphs);
+ int len;
+ snprintf(suffix, 31, "S%08X%08X-%d", c1, c2, nGlyphs);
+
+ name = TrueTypeTableNew_name(0, 0);
+ for (i = 0; i < n; i++) {
+ if (names[i].platformID == 1 && names[i].encodingID == 0 && names[i].languageID == 0 && names[i].nameID == 1) {
+
+ memcpy(newname, names+i, sizeof(NameRecord));
+ newname.slen = name[i].slen + strlen(suffix);
+ */
+ const sal_uInt8 ptr[] = {0,'T',0,'r',0,'u',0,'e',0,'T',0,'y',0,'p',0,'e',0,'S',0,'u',0,'b',0,'s',0,'e',0,'t'};
+ NameRecord n1 = {1, 0, 0, 6, 14, (sal_uInt8*)"TrueTypeSubset"};
+ NameRecord n2 = {3, 1, 1033, 6, 28, 0};
+ n2.sptr = (sal_uInt8 *) ptr;
+ name = TrueTypeTableNew_name(0, 0);
+ nameAdd(name, &n1);
+ nameAdd(name, &n2);
+ } else {
+ if (nNameRecs == 0) {
+ NameRecord *names;
+ int n = GetTTNameRecords(ttf, &names);
+ name = TrueTypeTableNew_name(n, names);
+ DisposeNameRecords(names, n);
+ } else {
+ name = TrueTypeTableNew_name(nNameRecs, nr);
+ }
+ }
+
+ /** maxp **/
+ maxp = TrueTypeTableNew_maxp(getTable(ttf, O_maxp), getTableSize(ttf, O_maxp));
+
+ /** hhea **/
+ p = getTable(ttf, O_hhea);
+ if (p) {
+ hhea = TrueTypeTableNew_hhea(GetUInt16(p, 4, 1), GetUInt16(p, 6, 1), GetUInt16(p, 8, 1), GetUInt16(p, 18, 1), GetUInt16(p, 20, 1));
+ } else {
+ hhea = TrueTypeTableNew_hhea(0, 0, 0, 0, 0);
+ }
+
+ /** head **/
+
+ p = getTable(ttf, O_head);
+ assert(p != 0);
+ head = TrueTypeTableNew_head(GetUInt32(p, 4, 1),
+ GetUInt16(p, 16, 1),
+ GetUInt16(p, 18, 1),
+ p+20,
+ GetUInt16(p, 44, 1),
+ GetUInt16(p, 46, 1),
+ GetInt16(p, 48, 1));
+
+
+ /** glyf **/
+
+ glyf = TrueTypeTableNew_glyf();
+ gID = scalloc(nGlyphs, sizeof(sal_uInt32));
+
+ for (i = 0; i < nGlyphs; i++) {
+ gID[i] = glyfAdd(glyf, GetTTRawGlyphData(ttf, glyphArray[i]), ttf);
+ }
+
+ /** cmap **/
+ cmap = TrueTypeTableNew_cmap();
+
+ for (i=0; i < nGlyphs; i++) {
+ cmapAdd(cmap, 0x010000, encoding[i], gID[i]);
+ }
+
+ /** cvt **/
+ if ((p = getTable(ttf, O_cvt)) != 0) {
+ cvt = TrueTypeTableNew(T_cvt, getTableSize(ttf, O_cvt), p);
+ }
+
+ /** prep **/
+ if ((p = getTable(ttf, O_prep)) != 0) {
+ prep = TrueTypeTableNew(T_prep, getTableSize(ttf, O_prep), p);
+ }
+
+ /** fpgm **/
+ if ((p = getTable(ttf, O_fpgm)) != 0) {
+ fpgm = TrueTypeTableNew(T_fpgm, getTableSize(ttf, O_fpgm), p);
+ }
+
+ /** post **/
+ if ((p = getTable(ttf, O_post)) != 0) {
+ post = TrueTypeTableNew_post(0x00030000,
+ GetUInt32(p, 4, 1),
+ GetUInt16(p, 8, 1),
+ GetUInt16(p, 10, 1),
+ GetUInt16(p, 12, 1));
+ } else {
+ post = TrueTypeTableNew_post(0x00030000, 0, 0, 0, 0);
+ }
+
+ if (flags & TTCF_IncludeOS2) {
+ if ((p = getTable(ttf, O_OS2)) != 0) {
+ os2 = TrueTypeTableNew(T_OS2, getTableSize(ttf, O_OS2), p);
+ }
+ }
+
+ AddTable(ttcr, name); AddTable(ttcr, maxp); AddTable(ttcr, hhea);
+ AddTable(ttcr, head); AddTable(ttcr, glyf); AddTable(ttcr, cmap);
+ AddTable(ttcr, cvt ); AddTable(ttcr, prep); AddTable(ttcr, fpgm);
+ AddTable(ttcr, post); AddTable(ttcr, os2);
+
+ if ((res = StreamToFile(ttcr, fname)) != SF_OK) {
+#if OSL_DEBUG_LEVEL > 1
+ fprintf(stderr, "StreamToFile: error code: %d.\n", res);
+#endif
+ }
+
+ TrueTypeCreatorDispose(ttcr);
+ free(gID);
+
+ return res;
+}
+#endif
+
+
+#ifndef NO_TYPE42
+static GlyphOffsets *GlyphOffsetsNew(sal_uInt8 *sfntP)
+{
+ GlyphOffsets *res = smalloc(sizeof(GlyphOffsets));
+ sal_uInt8 *loca = NULL;
+ sal_uInt16 i, numTables = GetUInt16(sfntP, 4, 1);
+ sal_uInt32 locaLen = 0;
+ sal_Int16 indexToLocFormat = 0;
+
+ for (i = 0; i < numTables; i++) {
+ sal_uInt32 tag = GetUInt32(sfntP + 12, 16 * i, 1);
+ sal_uInt32 off = GetUInt32(sfntP + 12, 16 * i + 8, 1);
+ sal_uInt32 len = GetUInt32(sfntP + 12, 16 * i + 12, 1);
+
+ if (tag == T_loca) {
+ loca = sfntP + off;
+ locaLen = len;
+ } else if (tag == T_head) {
+ indexToLocFormat = GetInt16(sfntP + off, 50, 1);
+ }
+ }
+
+ res->nGlyphs = locaLen / ((indexToLocFormat == 1) ? 4 : 2);
+ assert(res->nGlyphs != 0);
+ res->offs = scalloc(res->nGlyphs, sizeof(sal_uInt32));
+
+ for (i = 0; i < res->nGlyphs; i++) {
+ if (indexToLocFormat == 1) {
+ res->offs[i] = GetUInt32(loca, i * 4, 1);
+ } else {
+ res->offs[i] = GetUInt16(loca, i * 2, 1) << 1;
+ }
+ }
+ return res;
+}
+
+static void GlyphOffsetsDispose(GlyphOffsets *_this)
+{
+ if (_this) {
+ free(_this->offs);
+ free(_this);
+ }
+}
+
+static void DumpSfnts(FILE *outf, sal_uInt8 *sfntP)
+{
+ HexFmt *h = HexFmtNew(outf);
+ sal_uInt16 i, numTables = GetUInt16(sfntP, 4, 1);
+ sal_uInt32 j, *offs, *len;
+ GlyphOffsets *go = GlyphOffsetsNew(sfntP);
+ sal_uInt8 pad[] = {0,0,0,0}; /* zeroes */
+
+ assert(numTables <= 9); /* Type42 has 9 required tables */
+
+ offs = scalloc(numTables, sizeof(sal_uInt32));
+ len = scalloc(numTables, sizeof(sal_uInt32));
+
+ fputs("/sfnts [", outf);
+ HexFmtOpenString(h);
+ HexFmtBlockWrite(h, sfntP, 12); /* stream out the Offset Table */
+ HexFmtBlockWrite(h, sfntP+12, 16 * numTables); /* stream out the Table Directory */
+
+ for (i=0; i<numTables; i++) {
+ sal_uInt32 tag = GetUInt32(sfntP + 12, 16 * i, 1);
+ sal_uInt32 off = GetUInt32(sfntP + 12, 16 * i + 8, 1);
+ sal_uInt32 len = GetUInt32(sfntP + 12, 16 * i + 12, 1);
+
+ if (tag != T_glyf) {
+ HexFmtBlockWrite(h, sfntP + off, len);
+ } else {
+ sal_uInt8 *glyf = sfntP + off;
+ sal_uInt32 o, l;
+ for (j = 0; j < go->nGlyphs - 1; j++) {
+ o = go->offs[j];
+ l = go->offs[j + 1] - o;
+ HexFmtBlockWrite(h, glyf + o, l);
+ }
+ }
+ HexFmtBlockWrite(h, pad, (4 - (len & 3)) & 3);
+ }
+ HexFmtCloseString(h);
+ fputs("] def\n", outf);
+ GlyphOffsetsDispose(go);
+ HexFmtDispose(h);
+ free(offs);
+ free(len);
+}
+
+int CreateT42FromTTGlyphs(TrueTypeFont *ttf,
+ FILE *outf,
+ const char *psname,
+ sal_uInt16 *glyphArray,
+ sal_uInt8 *encoding,
+ int nGlyphs)
+{
+ TrueTypeCreator *ttcr;
+ TrueTypeTable *head=0, *hhea=0, *maxp=0, *cvt=0, *prep=0, *glyf=0, *fpgm=0;
+ sal_uInt8 *p;
+ int i;
+ int res;
+
+ sal_uInt32 ver, rev;
+ sal_uInt8 *headP;
+
+ sal_uInt8 *sfntP;
+ sal_uInt32 sfntLen;
+ int UPEm = ttf->unitsPerEm;
+
+ sal_uInt16 *gID;
+
+ if (nGlyphs >= 256) return SF_GLYPHNUM;
+
+ assert(psname != 0);
+
+ TrueTypeCreatorNewEmpty(T_true, &ttcr);
+
+ /* head */
+ headP = p = getTable(ttf, O_head);
+ assert(p != 0);
+ head = TrueTypeTableNew_head(GetUInt32(p, 4, 1), GetUInt16(p, 16, 1), GetUInt16(p, 18, 1), p+20, GetUInt16(p, 44, 1), GetUInt16(p, 46, 1), GetInt16(p, 48, 1));
+ ver = GetUInt32(p, 0, 1);
+ rev = GetUInt32(p, 4, 1);
+
+ /** hhea **/
+ p = getTable(ttf, O_hhea);
+ if (p) {
+ hhea = TrueTypeTableNew_hhea(GetUInt16(p, 4, 1), GetUInt16(p, 6, 1), GetUInt16(p, 8, 1), GetUInt16(p, 18, 1), GetUInt16(p, 20, 1));
+ } else {
+ hhea = TrueTypeTableNew_hhea(0, 0, 0, 0, 0);
+ }
+
+ /** maxp **/
+ maxp = TrueTypeTableNew_maxp(getTable(ttf, O_maxp), getTableSize(ttf, O_maxp));
+
+ /** cvt **/
+ if ((p = getTable(ttf, O_cvt)) != 0) {
+ cvt = TrueTypeTableNew(T_cvt, getTableSize(ttf, O_cvt), p);
+ }
+
+ /** prep **/
+ if ((p = getTable(ttf, O_prep)) != 0) {
+ prep = TrueTypeTableNew(T_prep, getTableSize(ttf, O_prep), p);
+ }
+
+ /** fpgm **/
+ if ((p = getTable(ttf, O_fpgm)) != 0) {
+ fpgm = TrueTypeTableNew(T_fpgm, getTableSize(ttf, O_fpgm), p);
+ }
+
+ /** glyf **/
+ glyf = TrueTypeTableNew_glyf();
+ gID = scalloc(nGlyphs, sizeof(sal_uInt32));
+
+ for (i = 0; i < nGlyphs; i++) {
+ gID[i] = (sal_uInt16)glyfAdd(glyf, GetTTRawGlyphData(ttf, glyphArray[i]), ttf);
+ }
+
+ AddTable(ttcr, head); AddTable(ttcr, hhea); AddTable(ttcr, maxp); AddTable(ttcr, cvt);
+ AddTable(ttcr, prep); AddTable(ttcr, glyf); AddTable(ttcr, fpgm);
+
+ if ((res = StreamToMemory(ttcr, &sfntP, &sfntLen)) != SF_OK) {
+ TrueTypeCreatorDispose(ttcr);
+ free(gID);
+ return res;
+ }
+
+ fprintf(outf, "%%!PS-TrueTypeFont-%d.%d-%d.%d\n", (int)(ver>>16), (int)(ver & 0xFFFF), (int)(rev>>16), (int)(rev & 0xFFFF));
+ fprintf(outf, "%%%%Creator: %s %s %s\n", modname, modver, modextra);
+ fprintf(outf, "%%- Font subset generated from a source font file: '%s'\n", ttf->fname);
+ fprintf(outf, "%%- Original font name: %s\n", ttf->psname);
+ fprintf(outf, "%%- Original font family: %s\n", ttf->family);
+ fprintf(outf, "%%- Original font sub-family: %s\n", ttf->subfamily);
+ fprintf(outf, "11 dict begin\n");
+ fprintf(outf, "/FontName (%s) cvn def\n", psname);
+ fprintf(outf, "/PaintType 0 def\n");
+ fprintf(outf, "/FontMatrix [1 0 0 1 0 0] def\n");
+ fprintf(outf, "/FontBBox [%d %d %d %d] def\n", XUnits(UPEm, GetInt16(headP, 36, 1)), XUnits(UPEm, GetInt16(headP, 38, 1)), XUnits(UPEm, GetInt16(headP, 40, 1)), XUnits(UPEm, GetInt16(headP, 42, 1)));
+ fprintf(outf, "/FontType 42 def\n");
+ fprintf(outf, "/Encoding 256 array def\n");
+ fprintf(outf, " 0 1 255 {Encoding exch /.notdef put} for\n");
+
+ for (i = 1; i<nGlyphs; i++) {
+ fprintf(outf, "Encoding %d /glyph%d put\n", encoding[i], gID[i]);
+ }
+ fprintf(outf, "/XUID [103 0 1 16#%08X %d 16#%08X 16#%08X] def\n", (unsigned int)rtl_crc32(0, ttf->ptr, ttf->fsize), (unsigned int)nGlyphs, (unsigned int)rtl_crc32(0, glyphArray, nGlyphs * 2), (unsigned int)rtl_crc32(0, encoding, nGlyphs));
+
+ DumpSfnts(outf, sfntP);
+
+ /* dump charstrings */
+ fprintf(outf, "/CharStrings %d dict dup begin\n", nGlyphs);
+ fprintf(outf, "/.notdef 0 def\n");
+ for (i = 1; i < (int)glyfCount(glyf); i++) {
+ fprintf(outf,"/glyph%d %d def\n", i, i);
+ }
+ fprintf(outf, "end readonly def\n");
+
+ fprintf(outf, "FontName currentdict end definefont pop\n");
+ TrueTypeCreatorDispose(ttcr);
+ free(gID);
+ free(sfntP);
+ return SF_OK;
+}
+#endif
+
+
+#ifndef NO_MAPPERS
+int MapString(TrueTypeFont *ttf, sal_uInt16 *str, int nchars, sal_uInt16 *glyphArray, int bvertical)
+{
+ int i;
+ sal_uInt16 *cp;
+
+ if (ttf->cmapType == CMAP_NOT_USABLE ) return -1;
+ if (!nchars) return 0;
+
+ if (glyphArray == 0) {
+ cp = str;
+ } else {
+ cp = glyphArray;
+ }
+
+ switch (ttf->cmapType) {
+ case CMAP_MS_Symbol:
+ if( ttf->mapper == getGlyph0 ) {
+ sal_uInt16 aChar;
+ for( i = 0; i < nchars; i++ ) {
+ aChar = str[i];
+ if( ( aChar & 0xf000 ) == 0xf000 )
+ aChar &= 0x00ff;
+ cp[i] = aChar;
+ }
+ }
+ else if( glyphArray )
+ memcpy(glyphArray, str, nchars * 2);
+ break;
+
+ case CMAP_MS_Unicode:
+ if (glyphArray != 0) {
+ memcpy(glyphArray, str, nchars * 2);
+ }
+ break;
+
+ case CMAP_MS_ShiftJIS: TranslateString12(str, cp, nchars); break;
+ case CMAP_MS_Big5: TranslateString13(str, cp, nchars); break;
+ case CMAP_MS_PRC: TranslateString14(str, cp, nchars); break;
+ case CMAP_MS_Wansung: TranslateString15(str, cp, nchars); break;
+ case CMAP_MS_Johab: TranslateString16(str, cp, nchars); break;
+ }
+
+ for (i = 0; i < nchars; i++) {
+ cp[i] = (sal_uInt16)ttf->mapper(ttf->cmap, cp[i]);
+ if (cp[i]!=0 && bvertical!=0)
+ cp[i] = (sal_uInt16)UseGSUB(ttf,cp[i],bvertical);
+ }
+ return nchars;
+}
+
+sal_uInt16 MapChar(TrueTypeFont *ttf, sal_uInt16 ch, int bvertical)
+{
+ switch (ttf->cmapType) {
+ case CMAP_MS_Symbol:
+
+ if( ttf->mapper == getGlyph0 && ( ch & 0xf000 ) == 0xf000 )
+ ch &= 0x00ff;
+ return (sal_uInt16)ttf->mapper(ttf->cmap, ch );
+
+ case CMAP_MS_Unicode: break;
+ case CMAP_MS_ShiftJIS: ch = TranslateChar12(ch); break;
+ case CMAP_MS_Big5: ch = TranslateChar13(ch); break;
+ case CMAP_MS_PRC: ch = TranslateChar14(ch); break;
+ case CMAP_MS_Wansung: ch = TranslateChar15(ch); break;
+ case CMAP_MS_Johab: ch = TranslateChar16(ch); break;
+ default: return 0;
+ }
+ ch = (sal_uInt16)ttf->mapper(ttf->cmap, ch);
+ if (ch!=0 && bvertical!=0)
+ ch = (sal_uInt16)UseGSUB(ttf,ch,bvertical);
+ return ch;
+}
+
+int DoesVerticalSubstitution( TrueTypeFont *ttf, int bvertical)
+{
+ int nRet = 0;
+ if( bvertical)
+ nRet = HasVerticalGSUB( ttf);
+ return nRet;
+}
+
+#endif
+
+int GetTTGlyphCount( TrueTypeFont* ttf )
+{
+ return ttf->nglyphs;
+}
+
+TTSimpleGlyphMetrics *GetTTSimpleGlyphMetrics(TrueTypeFont *ttf, sal_uInt16 *glyphArray, int nGlyphs, int mode)
+{
+ sal_uInt8* pTable;
+ TTSimpleGlyphMetrics *res;
+ int i;
+ sal_uInt16 glyphID;
+ sal_uInt32 n;
+ int UPEm = ttf->unitsPerEm;
+ int nTableSize;
+
+ if (mode == 0) {
+ n = ttf->numberOfHMetrics;
+ pTable = getTable( ttf, O_hmtx );
+ nTableSize = getTableSize( ttf, O_hmtx );
+ } else {
+ n = ttf->numOfLongVerMetrics;
+ pTable = getTable( ttf, O_vmtx );
+ nTableSize = getTableSize( ttf, O_vmtx );
+ }
+
+ if (!nGlyphs || !glyphArray) return 0; /* invalid parameters */
+ if (!n || !pTable) return 0; /* the font does not contain the requested metrics */
+
+ res = calloc(nGlyphs, sizeof(TTSimpleGlyphMetrics));
+ assert(res != 0);
+
+ for (i=0; i<nGlyphs; i++) {
+ int nAdvOffset, nLsbOffset;
+ glyphID = glyphArray[i];
+
+ if (glyphID < n) {
+ nAdvOffset = 4 * glyphID;
+ nLsbOffset = nAdvOffset + 2;
+ } else {
+ nAdvOffset = 4 * (n - 1);
+ if( glyphID < ttf->nglyphs )
+ nLsbOffset = 4 * n + 2 * (glyphID - n);
+ else /* font is broken -> use lsb of last hmetrics */
+ nLsbOffset = nAdvOffset + 2;
+ }
+
+ if( nAdvOffset >= nTableSize)
+ res[i].adv = 0; /* better than a crash for buggy fonts */
+ else
+ res[i].adv = SAL_INT_CAST(
+ sal_uInt16,
+ XUnits( UPEm, GetUInt16( pTable, nAdvOffset, 1) ) );
+
+ if( nLsbOffset >= nTableSize)
+ res[i].sb = 0; /* better than a crash for buggy fonts */
+ else
+ res[i].sb = SAL_INT_CAST(
+ sal_Int16,
+ XUnits( UPEm, GetInt16( pTable, nLsbOffset, 1) ) );
+ }
+
+ return res;
+}
+
+#ifndef NO_MAPPERS
+TTSimpleGlyphMetrics *GetTTSimpleCharMetrics(TrueTypeFont * ttf, sal_uInt16 firstChar, int nChars, int mode)
+{
+ TTSimpleGlyphMetrics *res = 0;
+ sal_uInt16 *str;
+ int i, n;
+
+ str = malloc(nChars * 2);
+ assert(str != 0);
+
+ for (i=0; i<nChars; i++) str[i] = (sal_uInt16)(firstChar + i);
+ if ((n = MapString(ttf, str, nChars, 0, mode)) != -1) {
+ res = GetTTSimpleGlyphMetrics(ttf, str, n, mode);
+ }
+
+ free(str);
+
+ return res;
+}
+#endif
+
+void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info)
+{
+ sal_uInt8 *table;
+ int UPEm = ttf->unitsPerEm;
+
+ memset(info, 0, sizeof(TTGlobalFontInfo));
+
+ info->family = ttf->family;
+ info->ufamily = ttf->ufamily;
+ info->subfamily = ttf->subfamily;
+ info->usubfamily = ttf->usubfamily;
+ info->psname = ttf->psname;
+ info->symbolEncoded = (ttf->cmapType == CMAP_MS_Symbol);
+
+ table = getTable(ttf, O_OS2);
+ if (table) {
+ info->weight = GetUInt16(table, 4, 1);
+ info->width = GetUInt16(table, 6, 1);
+
+ /* There are 3 different versions of OS/2 table: original (68 bytes long),
+ * Microsoft old (78 bytes long) and Microsoft new (86 bytes long,)
+ * Apple's documentation recommends looking at the table length.
+ */
+ if (getTableSize(ttf, O_OS2) > 68) {
+ info->typoAscender = XUnits(UPEm,GetInt16(table, 68, 1));
+ info->typoDescender = XUnits(UPEm, GetInt16(table, 70, 1));
+ info->typoLineGap = XUnits(UPEm, GetInt16(table, 72, 1));
+ info->winAscent = XUnits(UPEm, GetUInt16(table, 74, 1));
+ info->winDescent = XUnits(UPEm, GetUInt16(table, 76, 1));
+ /* sanity check; some fonts treat winDescent as signed
+ * violating the standard */
+ if( info->winDescent > 5*UPEm )
+ info->winDescent = XUnits(UPEm, GetInt16(table, 76,1));
+ }
+ if (ttf->cmapType == CMAP_MS_Unicode) {
+ info->rangeFlag = 1;
+ info->ur1 = GetUInt32(table, 42, 1);
+ info->ur2 = GetUInt32(table, 46, 1);
+ info->ur3 = GetUInt32(table, 50, 1);
+ info->ur4 = GetUInt32(table, 54, 1);
+ }
+ memcpy(info->panose, table + 32, 10);
+ info->typeFlags = GetUInt16( table, 8, 1 );
+ }
+
+ table = getTable(ttf, O_post);
+ if (table) {
+ info->pitch = GetUInt32(table, 12, 1);
+ info->italicAngle = GetInt32(table, 4, 1);
+ }
+
+ table = getTable(ttf, O_head); /* 'head' tables is always there */
+ info->xMin = XUnits(UPEm, GetInt16(table, 36, 1));
+ info->yMin = XUnits(UPEm, GetInt16(table, 38, 1));
+ info->xMax = XUnits(UPEm, GetInt16(table, 40, 1));
+ info->yMax = XUnits(UPEm, GetInt16(table, 42, 1));
+ info->macStyle = GetInt16(table, 44, 1);
+
+ table = getTable(ttf, O_hhea);
+ if (table) {
+ info->ascender = XUnits(UPEm, GetInt16(table, 4, 1));
+ info->descender = XUnits(UPEm, GetInt16(table, 6, 1));
+ info->linegap = XUnits(UPEm, GetInt16(table, 8, 1));
+ }
+
+ table = getTable(ttf, O_vhea);
+ if (table) {
+ info->vascent = XUnits(UPEm, GetInt16(table, 4, 1));
+ info->vdescent = XUnits(UPEm, GetInt16(table, 6, 1));
+ }
+}
+
+#ifdef TEST5
+void KernGlyphs(TrueTypeFont *ttf, sal_uInt16 *glyphs, int nglyphs, int wmode, KernData *kern)
+{
+ int i;
+
+ if (!nglyphs || !glyphs || !kern) return;
+
+ for (i = 0; i < nglyphs-1; i++) kern[i].x = kern[i].y = 0;
+
+ switch (ttf->kerntype) {
+ case KT_APPLE_NEW: KernGlyphsPrim1(ttf, glyphs, nglyphs, wmode, kern); return;
+ case KT_MICROSOFT: KernGlyphsPrim2(ttf, glyphs, nglyphs, wmode, kern); return;
+ default: return;
+ }
+}
+#endif
+
+GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID)
+{
+ sal_uInt8 *glyf = getTable(ttf, O_glyf);
+ sal_uInt8 *hmtx = getTable(ttf, O_hmtx);
+ sal_uInt32 length;
+ GlyphData *d;
+ ControlPoint *cp;
+ int i, n, m;
+
+ if( glyphID >= ttf->nglyphs )
+ return 0;
+
+ /* #127161# check the glyph offsets */
+ length = getTableSize( ttf, O_glyf );
+ if( length < ttf->goffsets[ glyphID+1 ] )
+ return 0;
+
+ length = ttf->goffsets[glyphID+1] - ttf->goffsets[glyphID];
+
+ d = malloc(sizeof(GlyphData)); assert(d != 0);
+
+ if (length > 0) {
+ sal_uInt8 *srcptr = glyf + ttf->goffsets[glyphID];
+ d->ptr = malloc((length + 1) & ~1); assert(d->ptr != 0);
+ memcpy( d->ptr, srcptr, length );
+ d->compflag = (GetInt16( srcptr, 0, 1 ) < 0);
+ } else {
+ d->ptr = 0;
+ d->compflag = 0;
+ }
+
+ d->glyphID = glyphID;
+ d->nbytes = (sal_uInt16)((length + 1) & ~1);
+
+ /* now calculate npoints and ncontours */
+ n = GetTTGlyphPoints(ttf, glyphID, &cp);
+ if (n != -1) {
+ m = 0;
+ for (i = 0; i < n; i++) {
+ if (cp[i].flags & 0x8000) m++;
+ }
+ d->npoints = (sal_uInt16)n;
+ d->ncontours = (sal_uInt16)m;
+ free(cp);
+ } else {
+ d->npoints = 0;
+ d->ncontours = 0;
+ }
+
+ /* get advance width and left sidebearing */
+ if (glyphID < ttf->numberOfHMetrics) {
+ d->aw = GetUInt16(hmtx, 4 * glyphID, 1);
+ d->lsb = GetInt16(hmtx, 4 * glyphID + 2, 1);
+ } else {
+ d->aw = GetUInt16(hmtx, 4 * (ttf->numberOfHMetrics - 1), 1);
+ d->lsb = GetInt16(hmtx + ttf->numberOfHMetrics * 4, (glyphID - ttf->numberOfHMetrics) * 2, 1);
+ }
+
+ return d;
+}
+
+int GetTTNameRecords(TrueTypeFont *ttf, NameRecord **nr)
+{
+ sal_uInt8 *table = getTable(ttf, O_name);
+ int nTableSize = getTableSize(ttf, O_name );
+ sal_uInt16 n = GetUInt16(table, 2, 1);
+ sal_uInt8* rec_string = NULL;
+ int nStrBase = GetUInt16(table, 4, 1);
+ NameRecord *rec;
+ int i;
+
+ *nr = 0;
+ if (n == 0) return 0;
+
+ rec = calloc(n, sizeof(NameRecord));
+
+ for (i = 0; i < n; i++) {
+ int nStrOffset = GetUInt16(table + 6, 10 + 12 * i, 1);
+ rec[i].platformID = GetUInt16(table + 6, 12 * i, 1);
+ rec[i].encodingID = GetUInt16(table + 6, 2 + 12 * i, 1);
+ rec[i].languageID = GetUInt16(table + 6, 4 + 12 * i, 1);
+ rec[i].nameID = GetUInt16(table + 6, 6 + 12 * i, 1);
+ rec[i].slen = GetUInt16(table + 6, 8 + 12 * i, 1);
+ if (rec[i].slen) {
+ if( nStrBase+nStrOffset+rec[i].slen >= nTableSize ) {
+ rec[i].sptr = 0;
+ rec[i].slen = 0;
+ continue;
+ }
+
+ rec_string = table + nStrBase + nStrOffset;
+ // sanity check
+ if( rec_string > (sal_uInt8*)ttf->ptr && rec_string < ((sal_uInt8*)ttf->ptr + ttf->fsize - rec[i].slen ) )
+ {
+ rec[i].sptr = (sal_uInt8 *) malloc(rec[i].slen); assert(rec[i].sptr != 0);
+ memcpy(rec[i].sptr, rec_string, rec[i].slen);
+ }
+ else
+ {
+#ifdef DEBUG
+ fprintf( stderr, "found invalid name record %d with name id %d for file %s\n",
+ i, rec[i].nameID, ttf->fname );
+#endif
+ rec[i].sptr = 0;
+ rec[i].slen = 0;
+ }
+ } else {
+ rec[i].sptr = 0;
+ }
+ // some fonts have 3.0 names => fix them to 3.1
+ if( (rec[i].platformID == 3) && (rec[i].encodingID == 0) )
+ rec[i].encodingID = 1;
+ }
+
+ *nr = rec;
+ return n;
+}
+
+void DisposeNameRecords(NameRecord* nr, int n)
+{
+ int i;
+ for (i = 0; i < n; i++) {
+ if (nr[i].sptr) free(nr[i].sptr);
+ }
+ free(nr);
+}
+
+
+
+
+#ifdef TEST1
+/* This example creates a subset of a TrueType font with two encoded characters */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ int r;
+
+ /* Array of Unicode source characters */
+ sal_uInt16 chars[2];
+
+ /* Encoding vector maps character encoding to the ordinal number
+ * of the glyph in the output file */
+ sal_uInt8 encoding[2];
+
+ /* This array is for glyph IDs that source characters map to */
+ sal_uInt16 g[2];
+
+
+ if (ac < 2) return 0;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+
+ /* We want to create the output file that only contains two Unicode characters:
+ * L'a' and L'A' */
+
+ chars[0] = L'a';
+ chars[1] = L'A';
+
+ /* Figure out what glyphs do these characters map in our font */
+ MapString(fnt, chars, 2, g);
+
+ /* Encode the characters. Value of encoding[i] is the number 0..255 which maps to glyph i of the
+ * newly generated font */
+ encoding[0] = chars[0];
+ encoding[1] = chars[1];
+
+
+ /* Generate a subset */
+ CreateT3FromTTGlyphs(fnt, stdout, 0, g, encoding, 2, 0);
+
+ /* Now call the dtor for the font */
+ CloseTTFont(fnt);
+ return 0;
+}
+#endif
+
+#ifdef TEST2
+/* This example extracts first 224 glyphs from a TT fonts and encodes them starting at 32 */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ int i, r;
+
+ /* Array of Unicode source characters */
+ sal_uInt16 glyphs[224];
+
+ /* Encoding vector maps character encoding to the ordinal number
+ * of the glyph in the output file */
+ sal_uInt8 encoding[224];
+
+
+
+ for (i=0; i<224; i++) {
+ glyphs[i] = i;
+ encoding[i] = 32 + i;
+ }
+
+ if (ac < 2) return 0;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+
+ /* Encode the characters. Value of encoding[i] is the number 0..255 which maps to glyph i of the
+ * newly generated font */
+
+ /* Generate a subset */
+ CreateT3FromTTGlyphs(fnt, stdout, 0, glyphs, encoding, 224, 0);
+
+ /* Now call the dtor for the font */
+ CloseTTFont(fnt);
+ return 0;
+}
+#endif
+
+#ifdef TEST3
+/* Glyph metrics example */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ int i, r;
+ sal_uInt16 glyphs[224];
+ TTSimpleGlyphMetrics *m;
+
+ for (i=0; i<224; i++) {
+ glyphs[i] = i;
+ }
+
+ if (ac < 2) return 0;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ if ((m = GetTTSimpleGlyphMetrics(fnt, glyphs, 224, 0)) == 0) {
+ printf("Requested metrics is not available\n");
+ } else {
+ for (i=0; i<224; i++) {
+ printf("%d. advWid: %5d, LSBear: %5d\n", i, m[i].adv, m[i].sb);
+ }
+ }
+
+ /* Now call the dtor for the font */
+ free(m);
+ CloseTTFont(fnt);
+ return 0;
+}
+#endif
+
+#ifdef TEST4
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ TTGlobalFontInfo info;
+ int i, r;
+
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ printf("Font file: %s\n", av[1]);
+
+#ifdef PRINT_KERN
+ switch (fnt->kerntype) {
+ case KT_MICROSOFT:
+ printf("\tkern: MICROSOFT, ntables: %d.", fnt->nkern);
+ if (fnt->nkern) {
+ printf(" [");
+ for (i=0; i<fnt->nkern; i++) {
+ printf("%04X ", GetUInt16(fnt->kerntables[i], 4, 1));
+ }
+ printf("]");
+ }
+ printf("\n");
+ break;
+
+ case KT_APPLE_NEW:
+ printf("\tkern: APPLE_NEW, ntables: %d.", fnt->nkern);
+ if (fnt->nkern) {
+ printf(" [");
+ for (i=0; i<fnt->nkern; i++) {
+ printf("%04X ", GetUInt16(fnt->kerntables[i], 4, 1));
+ }
+ printf("]");
+ }
+ printf("\n");
+ break;
+
+ case KT_NONE:
+ printf("\tkern: none.\n");
+ break;
+
+ default:
+ printf("\tkern: unrecoginzed.\n");
+ break;
+ }
+ printf("\n");
+#endif
+
+ GetTTGlobalFontInfo(fnt, &info);
+ printf("\tfamily name: `%s`\n", info.family);
+ printf("\tsubfamily name: `%s`\n", info.subfamily);
+ printf("\tpostscript name: `%s`\n", info.psname);
+ printf("\tweight: %d\n", info.weight);
+ printf("\twidth: %d\n", info.width);
+ printf("\tpitch: %d\n", info.pitch);
+ printf("\titalic angle: %d\n", info.italicAngle);
+ printf("\tbouding box: [%d %d %d %d]\n", info.xMin, info.yMin, info.xMax, info.yMax);
+ printf("\tascender: %d\n", info.ascender);
+ printf("\tdescender: %d\n", info.descender);
+ printf("\tlinegap: %d\n", info.linegap);
+ printf("\tvascent: %d\n", info.vascent);
+ printf("\tvdescent: %d\n", info.vdescent);
+ printf("\ttypoAscender: %d\n", info.typoAscender);
+ printf("\ttypoDescender: %d\n", info.typoDescender);
+ printf("\ttypoLineGap: %d\n", info.typoLineGap);
+ printf("\twinAscent: %d\n", info.winAscent);
+ printf("\twinDescent: %d\n", info.winDescent);
+ printf("\tUnicode ranges:\n");
+ for (i = 0; i < 32; i++) {
+ if ((info.ur1 >> i) & 1) {
+ printf("\t\t\t%s\n", UnicodeRangeName(i));
+ }
+ }
+ for (i = 0; i < 32; i++) {
+ if ((info.ur2 >> i) & 1) {
+ printf("\t\t\t%s\n", UnicodeRangeName(i+32));
+ }
+ }
+ for (i = 0; i < 32; i++) {
+ if ((info.ur3 >> i) & 1) {
+ printf("\t\t\t%s\n", UnicodeRangeName(i+64));
+ }
+ }
+ for (i = 0; i < 32; i++) {
+ if ((info.ur4 >> i) & 1) {
+ printf("\t\t\t%s\n", UnicodeRangeName(i+96));
+ }
+ }
+
+ CloseTTFont(fnt);
+ return 0;
+}
+#endif
+
+#ifdef TEST5
+/* Kerning example */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ sal_uInt16 g[224];
+ KernData d[223];
+ int r, i, k = 0;
+
+ g[k++] = 11;
+ g[k++] = 36;
+ g[k++] = 11;
+ g[k++] = 98;
+ g[k++] = 11;
+ g[k++] = 144;
+ g[k++] = 41;
+ g[k++] = 171;
+ g[k++] = 51;
+ g[k++] = 15;
+
+ if (ac < 2) return 0;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ KernGlyphs(fnt, g, k, 0, d);
+
+ for (i = 0; i < k-1; i++) {
+ printf("%3d %3d: [%3d %3d]\n", g[i], g[i+1], d[i].x, d[i].y);
+ }
+
+ CloseTTFont(fnt);
+ return 0;
+}
+#endif
+
+
+
+#ifdef TEST6
+/* This example extracts a single glyph from a font */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ int r, i;
+
+ sal_uInt16 glyphs[256];
+ sal_uInt8 encoding[256];
+
+ for (i=0; i<256; i++) {
+ glyphs[i] = 512 + i;
+ encoding[i] = i;
+ }
+
+#if 0
+ i=0;
+ glyphs[i++] = 2001;
+ glyphs[i++] = 2002;
+ glyphs[i++] = 2003;
+ glyphs[i++] = 2004;
+ glyphs[i++] = 2005;
+ glyphs[i++] = 2006;
+ glyphs[i++] = 2007;
+ glyphs[i++] = 2008;
+ glyphs[i++] = 2009;
+ glyphs[i++] = 2010;
+ glyphs[i++] = 2011;
+ glyphs[i++] = 2012;
+ glyphs[i++] = 2013;
+ glyphs[i++] = 2014;
+ glyphs[i++] = 2015;
+ glyphs[i++] = 2016;
+ glyphs[i++] = 2017;
+ glyphs[i++] = 2018;
+ glyphs[i++] = 2019;
+ glyphs[i++] = 2020;
+
+
+ r = 97;
+ i = 0;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+ encoding[i++] = r++;
+#endif
+
+ if (ac < 2) return 0;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ /* Generate a subset */
+ CreateT3FromTTGlyphs(fnt, stdout, 0, glyphs, encoding, 256, 0);
+
+ fprintf(stderr, "UnitsPerEm: %d.\n", fnt->unitsPerEm);
+
+ /* Now call the dtor for the font */
+ CloseTTFont(fnt);
+ return 0;
+}
+#endif
+
+#ifdef TEST7
+/* NameRecord extraction example */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ int r, i, j, n;
+ NameRecord *nr;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ if ((n = GetTTNameRecords(fnt, &nr)) == 0) {
+ fprintf(stderr, "No name records in the font.\n");
+ return 0;
+ }
+
+ printf("Number of name records: %d.\n", n);
+ for (i = 0; i < n; i++) {
+ printf("%d %d %04X %d [", nr[i].platformID, nr[i].encodingID, nr[i].languageID, nr[i].nameID);
+ for (j=0; j<nr[i].slen; j++) {
+ printf("%c", isprint(nr[i].sptr[j]) ? nr[i].sptr[j] : '.');
+ }
+ printf("]\n");
+ }
+
+
+ DisposeNameRecords(nr, n);
+ CloseTTFont(fnt);
+ return 0;
+}
+#endif
+
+#ifdef TEST8
+/* TrueType -> TrueType subsetting */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ sal_uInt16 glyphArray[] = { 0, 98, 99, 22, 24, 25, 26, 27, 28, 29, 30, 31, 1270, 1289, 34};
+ sal_uInt8 encoding[] = {32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46};
+ int r;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ CreateTTFromTTGlyphs(fnt, "subfont.ttf", glyphArray, encoding, 15, 0, 0, TTCF_AutoName | TTCF_IncludeOS2);
+
+
+ CloseTTFont(fnt);
+
+ return 0;
+}
+#endif
+
+#ifdef TEST9
+/* TrueType -> Type42 subsetting */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ /*
+ sal_uInt16 glyphArray[] = { 0, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34};
+ sal_uInt8 encoding[] = {32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46};
+ */
+ sal_uInt16 glyphArray[] = { 0, 6711, 6724, 11133, 11144, 14360, 26, 27, 28, 29, 30, 31, 1270, 1289, 34};
+ sal_uInt8 encoding[] = {32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46};
+ int r;
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ CreateT42FromTTGlyphs(fnt, stdout, "testfont", glyphArray, encoding, 15);
+
+ CloseTTFont(fnt);
+
+ return 0;
+}
+#endif
+
+#ifdef TEST10
+/* Component glyph test */
+int main(int ac, char **av)
+{
+ TrueTypeFont *fnt;
+ int r, i;
+ list glyphlist = listNewEmpty();
+
+
+ if ((r = OpenTTFont(av[1], 0, &fnt)) != SF_OK) {
+ fprintf(stderr, "Error %d opening font file: `%s`.\n", r, av[1]);
+ return 0;
+ }
+
+ for (i = 0; i < fnt->nglyphs; i++) {
+ r = GetTTGlyphComponents(fnt, i, glyphlist);
+ if (r > 1) {
+ printf("%d -> ", i);
+ listToFirst(glyphlist);
+ do {
+ printf("%d ", (int) listCurrent(glyphlist));
+ } while (listNext(glyphlist));
+ printf("\n");
+ } else {
+ printf("%d: single glyph.\n", i);
+ }
+ listClear(glyphlist);
+ }
+
+ CloseTTFont(fnt);
+ listDispose(glyphlist);
+
+ return 0;
+}
+#endif
+
+
diff --git a/vcl/source/fontsubset/ttcr.c b/vcl/source/fontsubset/ttcr.c
new file mode 100644
index 000000000000..e8c9d8cf74e0
--- /dev/null
+++ b/vcl/source/fontsubset/ttcr.c
@@ -0,0 +1,1669 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ttcr.c,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* $Id: ttcr.c,v 1.11 2008-04-11 10:16:51 rt Exp $ */
+
+/*
+ * TrueTypeCreator method implementation
+ *
+ * @author: Alexander Gelfenbain
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if OSL_DEBUG_LEVEL == 0
+# ifndef NDEBUG
+# define NDEBUG
+# endif
+#endif
+#include <assert.h>
+
+#include "ttcr.h"
+
+/* These must be #defined so that they can be used in initializers */
+#define T_maxp 0x6D617870
+#define T_glyf 0x676C7966
+#define T_head 0x68656164
+#define T_loca 0x6C6F6361
+#define T_name 0x6E616D65
+#define T_hhea 0x68686561
+#define T_hmtx 0x686D7478
+#define T_cmap 0x636D6170
+#define T_vhea 0x76686561
+#define T_vmtx 0x766D7478
+#define T_OS2 0x4F532F32
+#define T_post 0x706F7374
+#define T_kern 0x6B65726E
+#define T_cvt 0x63767420
+
+typedef struct {
+ sal_uInt32 tag;
+ sal_uInt32 length;
+ sal_uInt8 *data;
+} TableEntry;
+
+/*
+ * this is a duplicate code from sft.c but it is left here for performance reasons
+ */
+#ifdef __GNUC__
+#define _inline static __inline__
+#else
+#define _inline static
+#endif
+
+_inline sal_uInt32 mkTag(sal_uInt8 a, sal_uInt8 b, sal_uInt8 c, sal_uInt8 d) {
+ return (a << 24) | (b << 16) | (c << 8) | d;
+}
+
+/*- Data access macros for data stored in big-endian or little-endian format */
+_inline sal_Int16 GetInt16(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ sal_Int16 t;
+ assert(ptr != 0);
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 8 | (ptr+offset)[1];
+ } else {
+ t = (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+_inline sal_uInt16 GetUInt16(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ sal_uInt16 t;
+ assert(ptr != 0);
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 8 | (ptr+offset)[1];
+ } else {
+ t = (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+_inline sal_Int32 GetInt32(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ sal_Int32 t;
+ assert(ptr != 0);
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 24 | (ptr+offset)[1] << 16 |
+ (ptr+offset)[2] << 8 | (ptr+offset)[3];
+ } else {
+ t = (ptr+offset)[3] << 24 | (ptr+offset)[2] << 16 |
+ (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+_inline sal_uInt32 GetUInt32(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ sal_uInt32 t;
+ assert(ptr != 0);
+
+
+ if (bigendian) {
+ t = (ptr+offset)[0] << 24 | (ptr+offset)[1] << 16 |
+ (ptr+offset)[2] << 8 | (ptr+offset)[3];
+ } else {
+ t = (ptr+offset)[3] << 24 | (ptr+offset)[2] << 16 |
+ (ptr+offset)[1] << 8 | (ptr+offset)[0];
+ }
+
+ return t;
+}
+
+
+_inline void PutInt16(sal_Int16 val, sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ assert(ptr != 0);
+
+ if (bigendian) {
+ ptr[offset] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset+1] = (sal_uInt8)(val & 0xFF);
+ } else {
+ ptr[offset+1] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset] = (sal_uInt8)(val & 0xFF);
+ }
+
+}
+
+_inline void PutUInt16(sal_uInt16 val, sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ assert(ptr != 0);
+
+ if (bigendian) {
+ ptr[offset] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset+1] = (sal_uInt8)(val & 0xFF);
+ } else {
+ ptr[offset+1] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset] = (sal_uInt8)(val & 0xFF);
+ }
+
+}
+
+
+_inline void PutUInt32(sal_uInt32 val, sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ assert(ptr != 0);
+
+ if (bigendian) {
+ ptr[offset] = (sal_uInt8)((val >> 24) & 0xFF);
+ ptr[offset+1] = (sal_uInt8)((val >> 16) & 0xFF);
+ ptr[offset+2] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset+3] = (sal_uInt8)(val & 0xFF);
+ } else {
+ ptr[offset+3] = (sal_uInt8)((val >> 24) & 0xFF);
+ ptr[offset+2] = (sal_uInt8)((val >> 16) & 0xFF);
+ ptr[offset+1] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset] = (sal_uInt8)(val & 0xFF);
+ }
+
+}
+
+
+_inline void PutInt32(sal_Int32 val, sal_uInt8 *ptr, sal_uInt32 offset, int bigendian)
+{
+ assert(ptr != 0);
+
+ if (bigendian) {
+ ptr[offset] = (sal_uInt8)((val >> 24) & 0xFF);
+ ptr[offset+1] = (sal_uInt8)((val >> 16) & 0xFF);
+ ptr[offset+2] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset+3] = (sal_uInt8)(val & 0xFF);
+ } else {
+ ptr[offset+3] = (sal_uInt8)((val >> 24) & 0xFF);
+ ptr[offset+2] = (sal_uInt8)((val >> 16) & 0xFF);
+ ptr[offset+1] = (sal_uInt8)((val >> 8) & 0xFF);
+ ptr[offset] = (sal_uInt8)(val & 0xFF);
+ }
+
+}
+
+static int TableEntryCompareF(const void *l, const void *r)
+{
+ return ((const TableEntry *) l)->tag - ((const TableEntry *) r)->tag;
+}
+
+static int NameRecordCompareF(const void *l, const void *r)
+{
+ NameRecord *ll = (NameRecord *) l;
+ NameRecord *rr = (NameRecord *) r;
+
+ if (ll->platformID != rr->platformID) {
+ return ll->platformID - rr->platformID;
+ } else if (ll->encodingID != rr->encodingID) {
+ return ll->encodingID - rr->encodingID;
+ } else if (ll->languageID != rr->languageID) {
+ return ll->languageID - rr->languageID;
+ } else if (ll->nameID != rr->nameID) {
+ return ll->nameID - rr->nameID;
+ }
+ return 0;
+}
+
+
+static sal_uInt32 CheckSum(sal_uInt32 *ptr, sal_uInt32 length)
+{
+ sal_uInt32 sum = 0;
+ sal_uInt32 *endptr = ptr + ((length + 3) & (sal_uInt32) ~3) / 4;
+
+ while (ptr < endptr) sum += *ptr++;
+
+ return sum;
+}
+
+_inline void *smalloc(sal_uInt32 size)
+{
+ void *res = malloc(size);
+ assert(res != 0);
+ return res;
+}
+
+_inline void *scalloc(sal_uInt32 n, sal_uInt32 size)
+{
+ void *res = calloc(n, size);
+ assert(res != 0);
+ return res;
+}
+
+/*
+ * Public functions
+ */
+
+void TrueTypeCreatorNewEmpty(sal_uInt32 tag, TrueTypeCreator **_this)
+{
+ TrueTypeCreator *ptr = smalloc(sizeof(TrueTypeCreator));
+
+ ptr->tables = listNewEmpty();
+ listSetElementDtor(ptr->tables, (void(*)(void*))TrueTypeTableDispose);
+
+ ptr->tag = tag;
+
+ *_this = ptr;
+}
+
+void TrueTypeCreatorDispose(TrueTypeCreator *_this)
+{
+ listDispose(_this->tables);
+ free(_this);
+}
+
+int AddTable(TrueTypeCreator *_this, TrueTypeTable *table)
+{
+ if (table != 0) {
+ listAppend(_this->tables, table);
+ }
+ return SF_OK;
+}
+
+void RemoveTable(TrueTypeCreator *_this, sal_uInt32 tag)
+{
+ int done = 0;
+
+ if (listCount(_this->tables)) {
+ listToFirst(_this->tables);
+ do {
+ if (((TrueTypeTable *) listCurrent(_this->tables))->tag == tag) {
+ listRemove(_this->tables);
+ } else {
+ if (listNext(_this->tables)) {
+ done = 1;
+ }
+ }
+ } while (!done);
+ }
+}
+
+static void ProcessTables(TrueTypeCreator *);
+
+int StreamToMemory(TrueTypeCreator *_this, sal_uInt8 **ptr, sal_uInt32 *length)
+{
+ sal_uInt16 numTables, searchRange=1, entrySelector=0, rangeShift;
+ sal_uInt32 s, offset, checkSumAdjustment = 0;
+ sal_uInt32 *p;
+ sal_uInt8 *ttf;
+ int i=0, n;
+ TableEntry *te;
+ sal_uInt8 *head = NULL; /* saved pointer to the head table data for checkSumAdjustment calculation */
+
+ if ((n = listCount(_this->tables)) == 0) return SF_TTFORMAT;
+
+ ProcessTables(_this);
+
+ /* ProcessTables() adds 'loca' and 'hmtx' */
+
+ n = listCount(_this->tables);
+ numTables = (sal_uInt16) n;
+
+
+ te = scalloc(n, sizeof(TableEntry));
+
+ listToFirst(_this->tables);
+ for (i = 0; i < n; i++) {
+ GetRawData((TrueTypeTable *) listCurrent(_this->tables), &te[i].data, &te[i].length, &te[i].tag);
+ listNext(_this->tables);
+ }
+
+ qsort(te, n, sizeof(TableEntry), TableEntryCompareF);
+
+ do {
+ searchRange *= 2;
+ entrySelector++;
+ } while (searchRange <= numTables);
+
+ searchRange *= 8;
+ entrySelector--;
+ rangeShift = numTables * 16 - searchRange;
+
+ s = offset = 12 + 16 * n;
+
+ for (i = 0; i < n; i++) {
+ s += (te[i].length + 3) & (sal_uInt32) ~3;
+ /* if ((te[i].length & 3) != 0) s += (4 - (te[i].length & 3)) & 3; */
+ }
+
+ ttf = smalloc(s);
+
+ /* Offset Table */
+ PutUInt32(_this->tag, ttf, 0, 1);
+ PutUInt16(numTables, ttf, 4, 1);
+ PutUInt16(searchRange, ttf, 6, 1);
+ PutUInt16(entrySelector, ttf, 8, 1);
+ PutUInt16(rangeShift, ttf, 10, 1);
+
+ /* Table Directory */
+ for (i = 0; i < n; i++) {
+ PutUInt32(te[i].tag, ttf + 12, 16 * i, 1);
+ PutUInt32(CheckSum((sal_uInt32 *) te[i].data, te[i].length), ttf + 12, 16 * i + 4, 1);
+ PutUInt32(offset, ttf + 12, 16 * i + 8, 1);
+ PutUInt32(te[i].length, ttf + 12, 16 * i + 12, 1);
+
+ if (te[i].tag == T_head) {
+ head = ttf + offset;
+ }
+
+ memcpy(ttf+offset, te[i].data, (te[i].length + 3) & (sal_uInt32) ~3 );
+ offset += (te[i].length + 3) & (sal_uInt32) ~3;
+ /* if ((te[i].length & 3) != 0) offset += (4 - (te[i].length & 3)) & 3; */
+ }
+
+ free(te);
+
+ p = (sal_uInt32 *) ttf;
+ for (i = 0; i < (int)s / 4; i++) checkSumAdjustment += p[i];
+ PutUInt32(0xB1B0AFBA - checkSumAdjustment, head, 8, 1);
+
+ *ptr = ttf;
+ *length = s;
+
+ return SF_OK;
+}
+
+int StreamToFile(TrueTypeCreator *_this, const char* fname)
+{
+ sal_uInt8 *ptr;
+ sal_uInt32 length;
+ int r;
+ FILE* fd;
+
+ if ((r = StreamToMemory(_this, &ptr, &length)) != SF_OK) return r;
+ if (!fname) return SF_BADFILE;
+ if ((fd = fopen(fname, "wb")) == NULL) return SF_BADFILE;
+
+ if (fwrite(ptr, 1, length, fd) != length) {
+ r = SF_FILEIO;
+ } else {
+ r = SF_OK;
+ }
+
+ fclose(fd);
+ free(ptr);
+ return r;
+}
+
+
+
+/*
+ * TrueTypeTable private methods
+ */
+
+#define TABLESIZE_head 54
+#define TABLESIZE_hhea 36
+#define TABLESIZE_maxp 32
+
+
+
+/* Table data points to
+ * --------------------------------------------
+ * generic tdata_generic struct
+ * 'head' TABLESIZE_head bytes of memory
+ * 'hhea' TABLESIZE_hhea bytes of memory
+ * 'loca' tdata_loca struct
+ * 'maxp' TABLESIZE_maxp bytes of memory
+ * 'glyf' list of GlyphData structs (defined in sft.h)
+ * 'name' list of NameRecord structs (defined in sft.h)
+ * 'post' tdata_post struct
+ *
+ */
+
+
+#define CMAP_SUBTABLE_INIT 10
+#define CMAP_SUBTABLE_INCR 10
+#define CMAP_PAIR_INIT 500
+#define CMAP_PAIR_INCR 500
+
+typedef struct {
+ sal_uInt32 id; /* subtable ID (platform/encoding ID) */
+ sal_uInt32 n; /* number of used translation pairs */
+ sal_uInt32 m; /* number of allocated translation pairs */
+ sal_uInt32 *xc; /* character array */
+ sal_uInt32 *xg; /* glyph array */
+} CmapSubTable;
+
+typedef struct {
+ sal_uInt32 n; /* number of used CMAP sub-tables */
+ sal_uInt32 m; /* number of allocated CMAP sub-tables */
+ CmapSubTable *s; /* sotred array of sub-tables */
+} table_cmap;
+
+typedef struct {
+ sal_uInt32 tag;
+ sal_uInt32 nbytes;
+ sal_uInt8 *ptr;
+} tdata_generic;
+
+typedef struct {
+ sal_uInt32 nbytes; /* number of bytes in loca table */
+ sal_uInt8 *ptr; /* pointer to the data */
+} tdata_loca;
+
+typedef struct {
+ sal_uInt32 format;
+ sal_uInt32 italicAngle;
+ sal_Int16 underlinePosition;
+ sal_Int16 underlineThickness;
+ sal_uInt32 isFixedPitch;
+ void *ptr; /* format-specific pointer */
+} tdata_post;
+
+
+/* allocate memory for a TT table */
+static sal_uInt8 *ttmalloc(sal_uInt32 nbytes)
+{
+ sal_uInt32 n;
+ sal_uInt8 *res;
+
+ n = (nbytes + 3) & (sal_uInt32) ~3;
+ res = malloc(n);
+ assert(res != 0);
+ memset(res, 0, n);
+
+ return res;
+}
+
+static void FreeGlyphData(void *ptr)
+{
+ GlyphData *p = (GlyphData *) ptr;
+ if (p->ptr) free(p->ptr);
+ free(p);
+}
+
+static void TrueTypeTableDispose_generic(TrueTypeTable *_this)
+{
+ if (_this) {
+ if (_this->data) {
+ tdata_generic *pdata = (tdata_generic *) _this->data;
+ if (pdata->nbytes) free(pdata->ptr);
+ free(_this->data);
+ }
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_head(TrueTypeTable *_this)
+{
+ if (_this) {
+ if (_this->data) free(_this->data);
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_hhea(TrueTypeTable *_this)
+{
+ if (_this) {
+ if (_this->data) free(_this->data);
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_loca(TrueTypeTable *_this)
+{
+ if (_this) {
+ if (_this->data) {
+ tdata_loca *p = (tdata_loca *) _this->data;
+ if (p->ptr) free(p->ptr);
+ free(_this->data);
+ }
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_maxp(TrueTypeTable *_this)
+{
+ if (_this) {
+ if (_this->data) free(_this->data);
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_glyf(TrueTypeTable *_this)
+{
+ if (_this) {
+ if (_this->data) listDispose((list) _this->data);
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_cmap(TrueTypeTable *_this)
+{
+ table_cmap *t;
+ CmapSubTable *s;
+ sal_uInt32 i;
+
+ if (_this) {
+ t = (table_cmap *) _this->data;
+ if (t) {
+ s = t->s;
+ if (s) {
+ for (i = 0; i < t->m; i++) {
+ if (s[i].xc) free(s[i].xc);
+ if (s[i].xg) free(s[i].xg);
+ }
+ free(s);
+ }
+ free(t);
+ }
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_name(TrueTypeTable *_this)
+{
+ if (_this) {
+ if (_this->data) listDispose((list) _this->data);
+ free(_this);
+ }
+}
+
+static void TrueTypeTableDispose_post(TrueTypeTable *_this)
+{
+ if (_this) {
+ tdata_post *p = (tdata_post *) _this->data;
+ if (p) {
+ if (p->format == 0x00030000) {
+ /* do nothing */
+ } else {
+ fprintf(stderr, "Unsupported format of a 'post' table: %08X.\n", (int)p->format);
+ }
+ free(p);
+ }
+ free(_this);
+ }
+}
+
+/* destructor vtable */
+
+static struct {
+ sal_uInt32 tag;
+ void (*f)(TrueTypeTable *);
+} vtable1[] =
+{
+ {0, TrueTypeTableDispose_generic},
+ {T_head, TrueTypeTableDispose_head},
+ {T_hhea, TrueTypeTableDispose_hhea},
+ {T_loca, TrueTypeTableDispose_loca},
+ {T_maxp, TrueTypeTableDispose_maxp},
+ {T_glyf, TrueTypeTableDispose_glyf},
+ {T_cmap, TrueTypeTableDispose_cmap},
+ {T_name, TrueTypeTableDispose_name},
+ {T_post, TrueTypeTableDispose_post}
+
+};
+
+static int GetRawData_generic(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ assert(_this != 0);
+ assert(_this->data != 0);
+
+ *ptr = ((tdata_generic *) _this->data)->ptr;
+ *len = ((tdata_generic *) _this->data)->nbytes;
+ *tag = ((tdata_generic *) _this->data)->tag;
+
+ return TTCR_OK;
+}
+
+
+static int GetRawData_head(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ *len = TABLESIZE_head;
+ *ptr = (sal_uInt8 *) _this->data;
+ *tag = T_head;
+
+ return TTCR_OK;
+}
+
+static int GetRawData_hhea(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ *len = TABLESIZE_hhea;
+ *ptr = (sal_uInt8 *) _this->data;
+ *tag = T_hhea;
+
+ return TTCR_OK;
+}
+
+static int GetRawData_loca(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ tdata_loca *p;
+
+ assert(_this->data != 0);
+
+ p = (tdata_loca *) _this->data;
+
+ if (p->nbytes == 0) return TTCR_ZEROGLYPHS;
+
+ *ptr = p->ptr;
+ *len = p->nbytes;
+ *tag = T_loca;
+
+ return TTCR_OK;
+}
+
+static int GetRawData_maxp(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ *len = TABLESIZE_maxp;
+ *ptr = (sal_uInt8 *) _this->data;
+ *tag = T_maxp;
+
+ return TTCR_OK;
+}
+
+static int GetRawData_glyf(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ sal_uInt32 n, nbytes = 0;
+ list l = (list) _this->data;
+ /* sal_uInt16 curID = 0; */ /* to check if glyph IDs are sequential and start from zero */
+ sal_uInt8 *p;
+
+ *ptr = 0;
+ *len = 0;
+ *tag = 0;
+
+ if (listCount(l) == 0) return TTCR_ZEROGLYPHS;
+
+ listToFirst(l);
+ do {
+ /* if (((GlyphData *) listCurrent(l))->glyphID != curID++) return TTCR_GLYPHSEQ; */
+ nbytes += ((GlyphData *) listCurrent(l))->nbytes;
+ } while (listNext(l));
+
+ p = _this->rawdata = ttmalloc(nbytes);
+
+ listToFirst(l);
+ do {
+ n = ((GlyphData *) listCurrent(l))->nbytes;
+ if (n != 0) {
+ memcpy(p, ((GlyphData *) listCurrent(l))->ptr, n);
+ p += n;
+ }
+ } while (listNext(l));
+
+ *len = nbytes;
+ *ptr = _this->rawdata;
+ *tag = T_glyf;
+
+ return TTCR_OK;
+}
+
+/* cmap packers */
+static sal_uInt8 *PackCmapType0(CmapSubTable *s, sal_uInt32 *length)
+{
+ sal_uInt8 *ptr = smalloc(262);
+ sal_uInt8 *p = ptr + 6;
+ sal_uInt32 i, j;
+ sal_uInt16 g;
+
+ PutUInt16(0, ptr, 0, 1);
+ PutUInt16(262, ptr, 2, 1);
+ PutUInt16(0, ptr, 4, 1);
+
+ for (i = 0; i < 256; i++) {
+ g = 0;
+ for (j = 0; j < s->n; j++) {
+ if (s->xc[j] == i) {
+ g = (sal_uInt16) s->xg[j];
+ }
+ }
+ p[i] = (sal_uInt8) g;
+ }
+ *length = 262;
+ return ptr;
+}
+
+static sal_uInt8 *PackCmapType6(CmapSubTable *s, sal_uInt32 *length)
+{
+ sal_uInt8 *ptr = smalloc(s->n*2 + 10);
+ sal_uInt8 *p = ptr + 10;
+ sal_uInt32 i, j;
+ sal_uInt16 g;
+
+ PutUInt16(6, ptr, 0, 1);
+ PutUInt16((sal_uInt16)(s->n*2+10), ptr, 2, 1);
+ PutUInt16(0, ptr, 4, 1);
+ PutUInt16(0, ptr, 6, 1);
+ PutUInt16((sal_uInt16)(s->n), ptr, 8, 1 );
+
+ for (i = 0; i < s->n; i++) {
+ g = 0;
+ for (j = 0; j < s->n; j++) {
+ if (s->xc[j] == i) {
+ g = (sal_uInt16) s->xg[j];
+ }
+ }
+ PutUInt16( g, p, 2*i, 1 );
+ }
+ *length = s->n*2+10;
+ return ptr;
+}
+
+
+
+/* XXX it only handles Format 0 encoding tables */
+static sal_uInt8 *PackCmap(CmapSubTable *s, sal_uInt32 *length)
+{
+ if( s->xg[s->n-1] > 0xff )
+ return PackCmapType6(s, length);
+ else
+ return PackCmapType0(s, length);
+}
+
+static int GetRawData_cmap(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ table_cmap *t;
+ sal_uInt8 **subtables;
+ sal_uInt32 *sizes; /* of subtables */
+ sal_uInt32 i;
+ sal_uInt32 tlen = 0;
+ sal_uInt32 l;
+ sal_uInt32 cmapsize;
+ sal_uInt8 *cmap;
+ sal_uInt32 coffset;
+
+ assert(_this != 0);
+ t = (table_cmap *) _this->data;
+ assert(t != 0);
+ assert(t->n != 0);
+
+ subtables = scalloc(t->n, sizeof(sal_uInt8 *));
+ sizes = scalloc(t->n, sizeof(sal_uInt32));
+
+ for (i = 0; i < t->n; i++) {
+ subtables[i] = PackCmap(t->s+i, &l);
+ sizes[i] = l;
+ tlen += l;
+ }
+
+ cmapsize = tlen + 4 + 8 * t->n;
+ _this->rawdata = cmap = ttmalloc(cmapsize);
+
+ PutUInt16(0, cmap, 0, 1);
+ PutUInt16((sal_uInt16)t->n, cmap, 2, 1);
+ coffset = 4 + t->n * 8;
+
+ for (i = 0; i < t->n; i++) {
+ PutUInt16((sal_uInt16)(t->s[i].id >> 16), cmap + 4, i * 8, 1);
+ PutUInt16((sal_uInt16)(t->s[i].id & 0xFF), cmap + 4, 2 + i * 8, 1);
+ PutUInt32(coffset, cmap + 4, 4 + i * 8, 1);
+ memcpy(cmap + coffset, subtables[i], sizes[i]);
+ free(subtables[i]);
+ coffset += sizes[i];
+ }
+
+ free(subtables);
+ free(sizes);
+
+ *ptr = cmap;
+ *len = cmapsize;
+ *tag = T_cmap;
+
+ return TTCR_OK;
+}
+
+
+static int GetRawData_name(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ list l;
+ NameRecord *nr;
+ sal_Int16 i=0, n; /* number of Name Records */
+ sal_uInt8 *name;
+ sal_uInt16 nameLen;
+ int stringLen = 0;
+ sal_uInt8 *p1, *p2;
+
+ *ptr = 0;
+ *len = 0;
+ *tag = 0;
+
+ assert(_this != 0);
+ l = (list) _this->data;
+ assert(l != 0);
+
+ if ((n = (sal_Int16)listCount(l)) == 0) return TTCR_NONAMES;
+
+ nr = scalloc(n, sizeof(NameRecord));
+
+ listToFirst(l);
+
+ do {
+ memcpy(nr+i, listCurrent(l), sizeof(NameRecord));
+ stringLen += nr[i].slen;
+ i++;
+ } while (listNext(l));
+
+ if (stringLen > 65535) {
+ free(nr);
+ return TTCR_NAMETOOLONG;
+ }
+
+ qsort(nr, n, sizeof(NameRecord), NameRecordCompareF);
+
+ nameLen = (sal_uInt16)(stringLen + 12 * n + 6);
+ name = ttmalloc(nameLen);
+
+ PutUInt16(0, name, 0, 1);
+ PutUInt16(n, name, 2, 1);
+ PutUInt16((sal_uInt16)(6 + 12 * n), name, 4, 1);
+
+ p1 = name + 6;
+ p2 = p1 + 12 * n;
+
+ for (i = 0; i < n; i++) {
+ PutUInt16(nr[i].platformID, p1, 0, 1);
+ PutUInt16(nr[i].encodingID, p1, 2, 1);
+ PutUInt16(nr[i].languageID, p1, 4, 1);
+ PutUInt16(nr[i].nameID, p1, 6, 1);
+ PutUInt16(nr[i].slen, p1, 8, 1);
+ PutUInt16((sal_uInt16)(p2 - (name + 6 + 12 * n)), p1, 10, 1);
+ memcpy(p2, nr[i].sptr, nr[i].slen);
+ /* {int j; for(j=0; j<nr[i].slen; j++) printf("%c", nr[i].sptr[j]); printf("\n"); }; */
+ p2 += nr[i].slen;
+ p1 += 12;
+ }
+
+ free(nr);
+ _this->rawdata = name;
+
+ *ptr = name;
+ *len = nameLen;
+ *tag = T_name;
+
+ /*{int j; for(j=0; j<nameLen; j++) printf("%c", name[j]); }; */
+
+ return TTCR_OK;
+}
+
+static int GetRawData_post(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ tdata_post *p = (tdata_post *) _this->data;
+ sal_uInt8 *post = 0;
+ sal_uInt32 postLen = 0;
+ int ret;
+
+ if (_this->rawdata) free(_this->rawdata);
+
+ if (p->format == 0x00030000) {
+ postLen = 32;
+ post = ttmalloc(postLen);
+ PutUInt32(0x00030000, post, 0, 1);
+ PutUInt32(p->italicAngle, post, 4, 1);
+ PutUInt16(p->underlinePosition, post, 8, 1);
+ PutUInt16(p->underlineThickness, post, 10, 1);
+ PutUInt16((sal_uInt16)p->isFixedPitch, post, 12, 1);
+ ret = TTCR_OK;
+ } else {
+ fprintf(stderr, "Unrecognized format of a post table: %08X.\n", (int)p->format);
+ ret = TTCR_POSTFORMAT;
+ }
+
+ *ptr = _this->rawdata = post;
+ *len = postLen;
+ *tag = T_post;
+
+ return ret;
+}
+
+
+
+
+
+static struct {
+ sal_uInt32 tag;
+ int (*f)(TrueTypeTable *, sal_uInt8 **, sal_uInt32 *, sal_uInt32 *);
+} vtable2[] =
+{
+ {0, GetRawData_generic},
+ {T_head, GetRawData_head},
+ {T_hhea, GetRawData_hhea},
+ {T_loca, GetRawData_loca},
+ {T_maxp, GetRawData_maxp},
+ {T_glyf, GetRawData_glyf},
+ {T_cmap, GetRawData_cmap},
+ {T_name, GetRawData_name},
+ {T_post, GetRawData_post}
+
+
+};
+
+/*
+ * TrueTypeTable public methods
+ */
+
+/* Note: Type42 fonts only need these tables:
+ * head, hhea, loca, maxp, cvt, prep, glyf, hmtx, fpgm
+ *
+ * Microsoft required tables
+ * cmap, glyf, head, hhea, hmtx, loca, maxp, name, post, OS/2
+ *
+ * Apple required tables
+ * cmap, glyf, head, hhea, hmtx, loca, maxp, name, post
+ *
+ */
+
+TrueTypeTable *TrueTypeTableNew(sal_uInt32 tag,
+ sal_uInt32 nbytes,
+ sal_uInt8 *ptr)
+{
+ TrueTypeTable *table;
+ tdata_generic *pdata;
+
+ table = smalloc(sizeof(TrueTypeTable));
+ pdata = (tdata_generic *) smalloc(sizeof(tdata_generic));
+ pdata->nbytes = nbytes;
+ pdata->tag = tag;
+ if (nbytes) {
+ pdata->ptr = ttmalloc(nbytes);
+ memcpy(pdata->ptr, ptr, nbytes);
+ } else {
+ pdata->ptr = 0;
+ }
+
+ table->tag = 0;
+ table->data = pdata;
+ table->rawdata = 0;
+
+ return table;
+}
+
+TrueTypeTable *TrueTypeTableNew_head(sal_uInt32 fontRevision,
+ sal_uInt16 flags,
+ sal_uInt16 unitsPerEm,
+ sal_uInt8 *created,
+ sal_uInt16 macStyle,
+ sal_uInt16 lowestRecPPEM,
+ sal_Int16 fontDirectionHint)
+{
+ TrueTypeTable *table;
+ sal_uInt8 *ptr;
+
+ assert(created != 0);
+
+ table = smalloc(sizeof(TrueTypeTable));
+ ptr = ttmalloc(TABLESIZE_head);
+
+
+ PutUInt32(0x00010000, ptr, 0, 1); /* version */
+ PutUInt32(fontRevision, ptr, 4, 1);
+ PutUInt32(0x5F0F3CF5, ptr, 12, 1); /* magic number */
+ PutUInt16(flags, ptr, 16, 1);
+ PutUInt16(unitsPerEm, ptr, 18, 1);
+ memcpy(ptr+20, created, 8); /* Created Long Date */
+ memset(ptr+28, 0, 8); /* Modified Long Date */
+ PutUInt16(macStyle, ptr, 44, 1);
+ PutUInt16(lowestRecPPEM, ptr, 46, 1);
+ PutUInt16(fontDirectionHint, ptr, 48, 1);
+ PutUInt16(0, ptr, 52, 1); /* glyph data format: 0 */
+
+ table->data = (void *) ptr;
+ table->tag = T_head;
+ table->rawdata = 0;
+
+ return table;
+}
+
+TrueTypeTable *TrueTypeTableNew_hhea(sal_Int16 ascender,
+ sal_Int16 descender,
+ sal_Int16 linegap,
+ sal_Int16 caretSlopeRise,
+ sal_Int16 caretSlopeRun)
+{
+ TrueTypeTable *table;
+ sal_uInt8 *ptr;
+
+ table = smalloc(sizeof(TrueTypeTable));
+ ptr = ttmalloc(TABLESIZE_hhea);
+
+ PutUInt32(0x00010000, ptr, 0, 1); /* version */
+ PutUInt16(ascender, ptr, 4, 1);
+ PutUInt16(descender, ptr, 6, 1);
+ PutUInt16(linegap, ptr, 8, 1);
+ PutUInt16(caretSlopeRise, ptr, 18, 1);
+ PutUInt16(caretSlopeRun, ptr, 20, 1);
+ PutUInt16(0, ptr, 22, 1); /* reserved 1 */
+ PutUInt16(0, ptr, 24, 1); /* reserved 2 */
+ PutUInt16(0, ptr, 26, 1); /* reserved 3 */
+ PutUInt16(0, ptr, 28, 1); /* reserved 4 */
+ PutUInt16(0, ptr, 30, 1); /* reserved 5 */
+ PutUInt16(0, ptr, 32, 1); /* metricDataFormat */
+
+ table->data = (void *) ptr;
+ table->tag = T_hhea;
+ table->rawdata = 0;
+
+ return table;
+}
+
+TrueTypeTable *TrueTypeTableNew_loca(void)
+{
+ TrueTypeTable *table = smalloc(sizeof(TrueTypeTable));
+ table->data = smalloc(sizeof(tdata_loca));
+
+ ((tdata_loca *)table->data)->nbytes = 0;
+ ((tdata_loca *)table->data)->ptr = 0;
+
+ table->tag = T_loca;
+ table->rawdata = 0;
+
+ return table;
+}
+
+TrueTypeTable *TrueTypeTableNew_maxp(sal_uInt8 *maxp, int size)
+{
+ TrueTypeTable *table = smalloc(sizeof(TrueTypeTable));
+ table->data = ttmalloc(TABLESIZE_maxp);
+
+ if (maxp && size == TABLESIZE_maxp) {
+ memcpy(table->data, maxp, TABLESIZE_maxp);
+ }
+
+ table->tag = T_maxp;
+ table->rawdata = 0;
+
+ return table;
+}
+
+TrueTypeTable *TrueTypeTableNew_glyf(void)
+{
+ TrueTypeTable *table = smalloc(sizeof(TrueTypeTable));
+ list l = listNewEmpty();
+
+ assert(l != 0);
+
+ listSetElementDtor(l, FreeGlyphData);
+
+ table->data = l;
+ table->rawdata = 0;
+ table->tag = T_glyf;
+
+ return table;
+}
+
+TrueTypeTable *TrueTypeTableNew_cmap(void)
+{
+ TrueTypeTable *table = smalloc(sizeof(TrueTypeTable));
+ table_cmap *cmap = smalloc(sizeof(table_cmap));
+
+ cmap->n = 0;
+ cmap->m = CMAP_SUBTABLE_INIT;
+ cmap->s = (CmapSubTable *) scalloc(CMAP_SUBTABLE_INIT, sizeof(CmapSubTable));
+ memset(cmap->s, 0, sizeof(CmapSubTable) * CMAP_SUBTABLE_INIT);
+
+ table->data = (table_cmap *) cmap;
+
+ table->rawdata = 0;
+ table->tag = T_cmap;
+
+ return table;
+}
+
+static void DisposeNameRecord(void *ptr)
+{
+ if (ptr != 0) {
+ NameRecord *nr = (NameRecord *) ptr;
+ if (nr->sptr) free(nr->sptr);
+ free(ptr);
+ }
+}
+
+static NameRecord* NameRecordNewCopy(NameRecord *nr)
+{
+ NameRecord *p = smalloc(sizeof(NameRecord));
+
+ memcpy(p, nr, sizeof(NameRecord));
+
+ if (p->slen) {
+ p->sptr = smalloc(p->slen);
+ memcpy(p->sptr, nr->sptr, p->slen);
+ }
+
+ return p;
+}
+
+TrueTypeTable *TrueTypeTableNew_name(int n, NameRecord *nr)
+{
+ TrueTypeTable *table = smalloc(sizeof(TrueTypeTable));
+ list l = listNewEmpty();
+
+ assert(l != 0);
+
+ listSetElementDtor(l, DisposeNameRecord);
+
+ if (n != 0) {
+ int i;
+ for (i = 0; i < n; i++) {
+ listAppend(l, NameRecordNewCopy(nr+i));
+ }
+ }
+
+ table->data = l;
+ table->rawdata = 0;
+ table->tag = T_name;
+
+ return table;
+}
+
+TrueTypeTable *TrueTypeTableNew_post(sal_uInt32 format,
+ sal_uInt32 italicAngle,
+ sal_Int16 underlinePosition,
+ sal_Int16 underlineThickness,
+ sal_uInt32 isFixedPitch)
+{
+ TrueTypeTable *table;
+ tdata_post *post;
+
+ assert(format == 0x00030000); /* Only format 3.0 is supported at this time */
+ table = smalloc(sizeof(TrueTypeTable));
+ post = smalloc(sizeof(tdata_post));
+
+ post->format = format;
+ post->italicAngle = italicAngle;
+ post->underlinePosition = underlinePosition;
+ post->underlineThickness = underlineThickness;
+ post->isFixedPitch = isFixedPitch;
+ post->ptr = 0;
+
+ table->data = post;
+ table->rawdata = 0;
+ table->tag = T_post;
+
+ return table;
+}
+
+
+
+void TrueTypeTableDispose(TrueTypeTable *_this)
+{
+ /* XXX do a binary search */
+ unsigned int i;
+
+ assert(_this != 0);
+
+ if (_this->rawdata) free(_this->rawdata);
+
+ for(i=0; i < sizeof(vtable1)/sizeof(*vtable1); i++) {
+ if (_this->tag == vtable1[i].tag) {
+ vtable1[i].f(_this);
+ return;
+ }
+ }
+ assert(!"Unknown TrueType table.\n");
+}
+
+int GetRawData(TrueTypeTable *_this, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag)
+{
+ /* XXX do a binary search */
+ unsigned int i;
+
+ assert(_this != 0);
+ assert(ptr != 0);
+ assert(len != 0);
+ assert(tag != 0);
+
+ *ptr = 0; *len = 0; *tag = 0;
+
+ if (_this->rawdata) {
+ free(_this->rawdata);
+ _this->rawdata = 0;
+ }
+
+ for(i=0; i < sizeof(vtable2)/sizeof(*vtable2); i++) {
+ if (_this->tag == vtable2[i].tag) {
+ return vtable2[i].f(_this, ptr, len, tag);
+ }
+ }
+
+ assert(!"Unknwon TrueType table.\n");
+ return TTCR_UNKNOWN;
+}
+
+void cmapAdd(TrueTypeTable *table, sal_uInt32 id, sal_uInt32 c, sal_uInt32 g)
+{
+ sal_uInt32 i, found;
+ table_cmap *t;
+ CmapSubTable *s;
+
+ assert(table != 0);
+ assert(table->tag == T_cmap);
+ t = (table_cmap *) table->data; assert(t != 0);
+ s = t->s; assert(s != 0);
+
+ found = 0;
+
+ for (i = 0; i < t->n; i++) {
+ if (s[i].id == id) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found) {
+ if (t->n == t->m) {
+ CmapSubTable *tmp;
+ tmp = scalloc(t->m + CMAP_SUBTABLE_INCR, sizeof(CmapSubTable));
+ memset(tmp, 0, t->m + CMAP_SUBTABLE_INCR * sizeof(CmapSubTable));
+ memcpy(tmp, s, sizeof(CmapSubTable) * t->m);
+ t->m += CMAP_SUBTABLE_INCR;
+ free(s);
+ s = tmp;
+ t->s = s;
+ }
+
+ for (i = 0; i < t->n; i++) {
+ if (s[i].id > id) break;
+ }
+
+ if (i < t->n) {
+ memmove(s+i+1, s+i, t->n-i);
+ }
+
+ t->n++;
+
+ s[i].id = id;
+ s[i].n = 0;
+ s[i].m = CMAP_PAIR_INIT;
+ s[i].xc = scalloc(CMAP_PAIR_INIT, sizeof(sal_uInt32));
+ s[i].xg = scalloc(CMAP_PAIR_INIT, sizeof(sal_uInt32));
+ }
+
+ if (s[i].n == s[i].m) {
+ sal_uInt32 *tmp1 = scalloc(s[i].m + CMAP_PAIR_INCR, sizeof(sal_uInt32));
+ sal_uInt32 *tmp2 = scalloc(s[i].m + CMAP_PAIR_INCR, sizeof(sal_uInt32));
+ assert(tmp1 != 0);
+ assert(tmp2 != 0);
+ memcpy(tmp1, s[i].xc, sizeof(sal_uInt32) * s[i].m);
+ memcpy(tmp2, s[i].xg, sizeof(sal_uInt32) * s[i].m);
+ s[i].m += CMAP_PAIR_INCR;
+ free(s[i].xc);
+ free(s[i].xg);
+ s[i].xc = tmp1;
+ s[i].xg = tmp2;
+ }
+
+ s[i].xc[s[i].n] = c;
+ s[i].xg[s[i].n] = g;
+ s[i].n++;
+}
+
+sal_uInt32 glyfAdd(TrueTypeTable *table, GlyphData *glyphdata, TrueTypeFont *fnt)
+{
+ list l;
+ sal_uInt32 currentID;
+ int ret, n, ncomponents;
+ list glyphlist;
+ GlyphData *gd;
+
+ assert(table != 0);
+ assert(table->tag == T_glyf);
+
+ if (!glyphdata) return (sal_uInt32)~0;
+
+ glyphlist = listNewEmpty();
+
+ ncomponents = GetTTGlyphComponents(fnt, glyphdata->glyphID, glyphlist);
+
+ l = (list) table->data;
+ if (listCount(l) > 0) {
+ listToLast(l);
+ ret = n = ((GlyphData *) listCurrent(l))->newID + 1;
+ } else {
+ ret = n = 0;
+ }
+ glyphdata->newID = n++;
+ listAppend(l, glyphdata);
+
+ if (ncomponents > 1) {
+ listPositionAt(glyphlist, 1); /* glyphData->glyphID is always the first glyph on the list */
+ do {
+ int found = 0;
+ currentID = (sal_uIntPtr) listCurrent(glyphlist);
+ /* XXX expensive! should be rewritten with sorted arrays! */
+ listToFirst(l);
+ do {
+ if (((GlyphData *) listCurrent(l))->glyphID == currentID) {
+ found = 1;
+ break;
+ }
+ } while (listNext(l));
+
+ if (!found) {
+ gd = GetTTRawGlyphData(fnt, currentID);
+ gd->newID = n++;
+ listAppend(l, gd);
+ }
+ } while (listNext(glyphlist));
+ }
+
+ listDispose(glyphlist);
+ return ret;
+}
+
+sal_uInt32 glyfCount(const TrueTypeTable *table)
+{
+ assert(table != 0);
+ assert(table->tag == T_glyf);
+ return listCount((list) table->data);
+}
+
+
+void nameAdd(TrueTypeTable *table, NameRecord *nr)
+{
+ list l;
+
+ assert(table != 0);
+ assert(table->tag == T_name);
+
+ l = (list) table->data;
+
+ listAppend(l, NameRecordNewCopy(nr));
+}
+
+static TrueTypeTable *FindTable(TrueTypeCreator *tt, sal_uInt32 tag)
+{
+ if (listIsEmpty(tt->tables)) return 0;
+
+ listToFirst(tt->tables);
+
+ do {
+ if (((TrueTypeTable *) listCurrent(tt->tables))->tag == tag) {
+ return listCurrent(tt->tables);
+ }
+ } while (listNext(tt->tables));
+
+ return 0;
+}
+
+/* This function processes all the tables and synchronizes them before creating
+ * the output TrueType stream.
+ *
+ * *** It adds two TrueType tables to the font: 'loca' and 'hmtx' ***
+ *
+ * It does:
+ *
+ * - Re-numbers glyph IDs and creates 'glyf', 'loca', and 'hmtx' tables.
+ * - Calculates xMin, yMin, xMax, and yMax and stores values in 'head' table.
+ * - Stores indexToLocFormat in 'head'
+ * - updates 'maxp' table
+ * - Calculates advanceWidthMax, minLSB, minRSB, xMaxExtent and numberOfHMetrics
+ * in 'hhea' table
+ *
+ */
+static void ProcessTables(TrueTypeCreator *tt)
+{
+ TrueTypeTable *glyf, *loca, *head, *maxp, *hhea;
+ list glyphlist;
+ sal_uInt32 nGlyphs, locaLen = 0, glyfLen = 0;
+ sal_Int16 xMin = 0, yMin = 0, xMax = 0, yMax = 0;
+ sal_uInt32 i = 0;
+ sal_Int16 indexToLocFormat;
+ sal_uInt8 *glyfPtr, *locaPtr, *hmtxPtr, *hheaPtr;
+ sal_uInt32 hmtxSize;
+ sal_uInt8 *p1, *p2;
+ sal_uInt16 maxPoints = 0, maxContours = 0, maxCompositePoints = 0, maxCompositeContours = 0;
+ TTSimpleGlyphMetrics *met;
+ int nlsb = 0;
+ sal_uInt32 *gid; /* array of old glyphIDs */
+
+ glyf = FindTable(tt, T_glyf);
+ glyphlist = (list) glyf->data;
+ nGlyphs = listCount(glyphlist);
+ assert(nGlyphs != 0);
+ gid = scalloc(nGlyphs, sizeof(sal_uInt32));
+
+ RemoveTable(tt, T_loca);
+ RemoveTable(tt, T_hmtx);
+
+ /* XXX Need to make sure that composite glyphs do not break during glyph renumbering */
+
+ listToFirst(glyphlist);
+ do {
+ GlyphData *gd = (GlyphData *) listCurrent(glyphlist);
+ sal_Int16 z;
+ glyfLen += gd->nbytes;
+ /* XXX if (gd->nbytes & 1) glyfLen++; */
+
+
+ assert(gd->newID == i);
+ gid[i++] = gd->glyphID;
+ /* gd->glyphID = i++; */
+
+ /* printf("IDs: %d %d.\n", gd->glyphID, gd->newID); */
+
+ if (gd->nbytes != 0) {
+ z = GetInt16(gd->ptr, 2, 1);
+ if (z < xMin) xMin = z;
+
+ z = GetInt16(gd->ptr, 4, 1);
+ if (z < yMin) yMin = z;
+
+ z = GetInt16(gd->ptr, 6, 1);
+ if (z > xMax) xMax = z;
+
+ z = GetInt16(gd->ptr, 8, 1);
+ if (z > yMax) yMax = z;
+ }
+
+ if (gd->compflag == 0) { /* non-composite glyph */
+ if (gd->npoints > maxPoints) maxPoints = gd->npoints;
+ if (gd->ncontours > maxContours) maxContours = gd->ncontours;
+ } else { /* composite glyph */
+ if (gd->npoints > maxCompositePoints) maxCompositePoints = gd->npoints;
+ if (gd->ncontours > maxCompositeContours) maxCompositeContours = gd->ncontours;
+ }
+
+ } while (listNext(glyphlist));
+
+ indexToLocFormat = (glyfLen / 2 > 0xFFFF) ? 1 : 0;
+ locaLen = indexToLocFormat ? (nGlyphs + 1) << 2 : (nGlyphs + 1) << 1;
+
+ glyfPtr = ttmalloc(glyfLen);
+ locaPtr = ttmalloc(locaLen);
+ met = scalloc(nGlyphs, sizeof(TTSimpleGlyphMetrics));
+ i = 0;
+
+ listToFirst(glyphlist);
+ p1 = glyfPtr;
+ p2 = locaPtr;
+ do {
+ GlyphData *gd = (GlyphData *) listCurrent(glyphlist);
+
+ if (gd->compflag) { /* re-number all components */
+ sal_uInt16 flags, index;
+ sal_uInt8 *ptr = gd->ptr + 10;
+ do {
+ sal_uInt32 j;
+ flags = GetUInt16(ptr, 0, 1);
+ index = GetUInt16(ptr, 2, 1);
+ /* XXX use the sorted array of old to new glyphID mapping and do a binary search */
+ for (j = 0; j < nGlyphs; j++) {
+ if (gid[j] == index) {
+ break;
+ }
+ }
+ /* printf("X: %d -> %d.\n", index, j); */
+
+ PutUInt16((sal_uInt16) j, ptr, 2, 1);
+
+ ptr += 4;
+
+ if (flags & ARG_1_AND_2_ARE_WORDS) {
+ ptr += 4;
+ } else {
+ ptr += 2;
+ }
+
+ if (flags & WE_HAVE_A_SCALE) {
+ ptr += 2;
+ } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+ ptr += 4;
+ } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+ ptr += 8;
+ }
+ } while (flags & MORE_COMPONENTS);
+ }
+
+ if (gd->nbytes != 0) {
+ memcpy(p1, gd->ptr, gd->nbytes);
+ }
+ if (indexToLocFormat == 1) {
+ PutUInt32(p1 - glyfPtr, p2, 0, 1);
+ p2 += 4;
+ } else {
+ PutUInt16((sal_uInt16)((p1 - glyfPtr) >> 1), p2, 0, 1);
+ p2 += 2;
+ }
+ p1 += gd->nbytes;
+
+ /* fill the array of metrics */
+ met[i].adv = gd->aw;
+ met[i].sb = gd->lsb;
+ i++;
+ } while (listNext(glyphlist));
+
+ free(gid);
+
+ if (indexToLocFormat == 1) {
+ PutUInt32(p1 - glyfPtr, p2, 0, 1);
+ } else {
+ PutUInt16((sal_uInt16)((p1 - glyfPtr) >> 1), p2, 0, 1);
+ }
+
+ glyf->rawdata = glyfPtr;
+
+ loca = TrueTypeTableNew_loca(); assert(loca != 0);
+ ((tdata_loca *) loca->data)->ptr = locaPtr;
+ ((tdata_loca *) loca->data)->nbytes = locaLen;
+
+ AddTable(tt, loca);
+
+ head = FindTable(tt, T_head);
+ PutInt16(xMin, head->data, 36, 1);
+ PutInt16(yMin, head->data, 38, 1);
+ PutInt16(xMax, head->data, 40, 1);
+ PutInt16(yMax, head->data, 42, 1);
+ PutInt16(indexToLocFormat, head->data, 50, 1);
+
+ maxp = FindTable(tt, T_maxp);
+
+ PutUInt16((sal_uInt16)nGlyphs, maxp->data, 4, 1);
+ PutUInt16(maxPoints, maxp->data, 6, 1);
+ PutUInt16(maxContours, maxp->data, 8, 1);
+ PutUInt16(maxCompositePoints, maxp->data, 10, 1);
+ PutUInt16(maxCompositeContours, maxp->data, 12, 1);
+
+#if 0
+ /* XXX do not overwrite the existing data. Fix: re-calculate these numbers here */
+ PutUInt16(2, maxp->data, 14, 1); /* maxZones is always 2 */
+ PutUInt16(0, maxp->data, 16, 1); /* maxTwilightPoints */
+ PutUInt16(0, maxp->data, 18, 1); /* maxStorage */
+ PutUInt16(0, maxp->data, 20, 1); /* maxFunctionDefs */
+ PutUint16(0, maxp->data, 22, 1); /* maxInstructionDefs */
+ PutUint16(0, maxp->data, 24, 1); /* maxStackElements */
+ PutUint16(0, maxp->data, 26, 1); /* maxSizeOfInstructions */
+ PutUint16(0, maxp->data, 28, 1); /* maxComponentElements */
+ PutUint16(0, maxp->data, 30, 1); /* maxComponentDepth */
+#endif
+
+ /*
+ * Generate an htmx table and update hhea table
+ */
+ hhea = FindTable(tt, T_hhea); assert(hhea != 0);
+ hheaPtr = (sal_uInt8 *) hhea->data;
+ if (nGlyphs > 2) {
+ for (i = nGlyphs - 1; i > 0; i--) {
+ if (met[i].adv != met[i-1].adv) break;
+ }
+ nlsb = nGlyphs - 1 - i;
+ }
+ hmtxSize = (nGlyphs - nlsb) * 4 + nlsb * 2;
+ hmtxPtr = ttmalloc(hmtxSize);
+ p1 = hmtxPtr;
+
+ for (i = 0; i < nGlyphs; i++) {
+ if (i < nGlyphs - nlsb) {
+ PutUInt16(met[i].adv, p1, 0, 1);
+ PutUInt16(met[i].sb, p1, 2, 1);
+ p1 += 4;
+ } else {
+ PutUInt16(met[i].sb, p1, 0, 1);
+ p1 += 2;
+ }
+ }
+
+ AddTable(tt, TrueTypeTableNew(T_hmtx, hmtxSize, hmtxPtr));
+ PutUInt16((sal_uInt16)(nGlyphs - nlsb), hheaPtr, 34, 1);
+ free(hmtxPtr);
+ free(met);
+}
+
+#ifdef TEST_TTCR
+int main(void)
+{
+ TrueTypeCreator *ttcr;
+ sal_uInt8 *t1, *t2, *t3, *t4, *t5, *t6, *t7;
+
+ TrueTypeCreatorNewEmpty(mkTag('t','r','u','e'), &ttcr);
+
+ t1 = malloc(1000); memset(t1, 'a', 1000);
+ t2 = malloc(2000); memset(t2, 'b', 2000);
+ t3 = malloc(3000); memset(t3, 'c', 3000);
+ t4 = malloc(4000); memset(t4, 'd', 4000);
+ t5 = malloc(5000); memset(t5, 'e', 5000);
+ t6 = malloc(6000); memset(t6, 'f', 6000);
+ t7 = malloc(7000); memset(t7, 'g', 7000);
+
+ AddTable(ttcr, TrueTypeTableNew(0x6D617870, 1000, t1));
+ AddTable(ttcr, TrueTypeTableNew(0x4F532F32, 2000, t2));
+ AddTable(ttcr, TrueTypeTableNew(0x636D6170, 3000, t3));
+ AddTable(ttcr, TrueTypeTableNew(0x6C6F6361, 4000, t4));
+ AddTable(ttcr, TrueTypeTableNew(0x68686561, 5000, t5));
+ AddTable(ttcr, TrueTypeTableNew(0x676C7966, 6000, t6));
+ AddTable(ttcr, TrueTypeTableNew(0x6B65726E, 7000, t7));
+
+ free(t1);
+ free(t2);
+ free(t3);
+ free(t4);
+ free(t5);
+ free(t6);
+ free(t7);
+
+
+ StreamToFile(ttcr, "ttcrout.ttf");
+
+ TrueTypeCreatorDispose(ttcr);
+ return 0;
+}
+#endif
diff --git a/vcl/source/fontsubset/ttcr.h b/vcl/source/fontsubset/ttcr.h
new file mode 100644
index 000000000000..95aa1a6c9e99
--- /dev/null
+++ b/vcl/source/fontsubset/ttcr.h
@@ -0,0 +1,280 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ttcr.h,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* $Id: ttcr.h,v 1.4 2008-04-11 10:17:09 rt Exp $ */
+
+/**
+ *
+ * @file ttcr.h
+ * @brief TrueType font creator
+ * @author Alexander Gelfenbain
+ */
+
+#ifndef __TTCR_H
+#define __TTCR_H
+
+#include "sft.h"
+#include "list.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ typedef struct _TrueTypeCreator TrueTypeCreator;
+
+/* TrueType data types */
+ typedef struct {
+ sal_uInt16 aw;
+ sal_Int16 lsb;
+ } longHorMetrics;
+
+/* A generic base class for all TrueType tables */
+ typedef struct {
+ sal_uInt32 tag; /* table tag */
+ sal_uInt8 *rawdata; /* raw data allocated by GetRawData_*() */
+ void *data; /* table specific data */
+ } TrueTypeTable;
+
+/** Error codes for most functions */
+ enum TTCRErrCodes {
+ TTCR_OK = 0, /**< no error */
+ TTCR_ZEROGLYPHS = 1, /**< At least one glyph should be defined */
+ TTCR_UNKNOWN = 2, /**< Unknown TrueType table */
+ TTCR_GLYPHSEQ = 3, /**< Glyph IDs are not sequential in the glyf table */
+ TTCR_NONAMES = 4, /**< 'name' table does not contain any names */
+ TTCR_NAMETOOLONG = 5, /**< 'name' table is too long (string data > 64K) */
+ TTCR_POSTFORMAT = 6 /**< unsupported format of a 'post' table */
+ };
+
+/* ============================================================================
+ *
+ * TrueTypeCreator methods
+ *
+ * ============================================================================ */
+
+/**
+ * TrueTypeCreator constructor.
+ * Allocates all internal structures.
+ */
+ void TrueTypeCreatorNewEmpty(sal_uInt32 tag, TrueTypeCreator **_this);
+
+/**
+ * TrueTypeCreator destructor. It calls destructors for all TrueTypeTables added to it.
+ */
+ void TrueTypeCreatorDispose(TrueTypeCreator *_this);
+
+/**
+ * Adds a TrueType table to the TrueType creator.
+ * SF_TABLEFORMAT value.
+ * @return value of SFErrCodes type
+ */
+ int AddTable(TrueTypeCreator *_this, TrueTypeTable *table);
+
+/**
+ * Removes a TrueType table from the TrueType creator if it is stored there.
+ * It also calls a TrueTypeTable destructor.
+ * Note: all generic tables (with tag 0) will be removed if this function is
+ * called with the second argument of 0.
+ * @return value of SFErrCodes type
+ */
+ void RemoveTable(TrueTypeCreator *_this, sal_uInt32 tag);
+
+
+
+/**
+ * Writes a TrueType font generated by the TrueTypeCreator to a segment of
+ * memory that this method allocates. When it is not needed anymore the caller
+ * is supposed to call free() on it.
+ * @return value of SFErrCodes type
+ */
+ int StreamToMemory(TrueTypeCreator *_this, sal_uInt8 **ptr, sal_uInt32 *length);
+
+/**
+ * Writes a TrueType font generated by the TrueTypeCreator to a file
+ * @return value of SFErrCodes type
+ */
+ int StreamToFile(TrueTypeCreator *_this, const char* fname);
+
+
+/* ============================================================================
+ *
+ * TrueTypeTable methods
+ *
+ * ============================================================================ */
+
+/**
+ * Destructor for the TrueTypeTable object.
+ */
+ void TrueTypeTableDispose(TrueTypeTable *);
+
+/**
+ * This function converts the data of a TrueType table to a raw array of bytes.
+ * It may allocates the memory for it and returns the size of the raw data in bytes.
+ * If memory is allocated it does not need to be freed by the caller of this function,
+ * since the pointer to it is stored in the TrueTypeTable and it is freed by the destructor
+ * @return TTCRErrCode
+ *
+ */
+
+ int GetRawData(TrueTypeTable *, sal_uInt8 **ptr, sal_uInt32 *len, sal_uInt32 *tag);
+
+/**
+ *
+ * Creates a new raw TrueType table. The difference between this constructor and
+ * TrueTypeTableNew_tag constructors is that the latter create structured tables
+ * while this constructor just copies memory pointed to by ptr to its buffer
+ * and stores its length. This constructor is suitable for data that is not
+ * supposed to be processed in any way, just written to the resulting TTF file.
+ */
+ TrueTypeTable *TrueTypeTableNew(sal_uInt32 tag,
+ sal_uInt32 nbytes,
+ sal_uInt8 *ptr);
+
+/**
+ * Creates a new 'head' table for a TrueType font.
+ * Allocates memory for it. Since a lot of values in the 'head' table depend on the
+ * rest of the tables in the TrueType font this table should be the last one added
+ * to the font.
+ */
+ TrueTypeTable *TrueTypeTableNew_head(sal_uInt32 fontRevision,
+ sal_uInt16 flags,
+ sal_uInt16 unitsPerEm,
+ sal_uInt8 *created,
+ sal_uInt16 macStyle,
+ sal_uInt16 lowestRecPPEM,
+ sal_Int16 fontDirectionHint);
+
+/**
+ * Creates a new 'hhea' table for a TrueType font.
+ * Allocates memory for it and stores it in the hhea pointer.
+ */
+ TrueTypeTable *TrueTypeTableNew_hhea(sal_Int16 ascender,
+ sal_Int16 descender,
+ sal_Int16 linegap,
+ sal_Int16 caretSlopeRise,
+ sal_Int16 caretSlopeRun);
+
+/**
+ * Creates a new empty 'loca' table for a TrueType font.
+ *
+ * INTERNAL: gets called only from ProcessTables();
+ */
+ TrueTypeTable *TrueTypeTableNew_loca(void);
+
+/**
+ * Creates a new 'maxp' table based on an existing maxp table.
+ * If maxp is 0, a new empty maxp table is created
+ * size specifies the size of existing maxp table for
+ * error-checking purposes
+ */
+ TrueTypeTable *TrueTypeTableNew_maxp(sal_uInt8 *maxp, int size);
+
+/**
+ * Creates a new empty 'glyf' table.
+ */
+ TrueTypeTable *TrueTypeTableNew_glyf(void);
+
+/**
+ * Creates a new empty 'cmap' table.
+ */
+ TrueTypeTable *TrueTypeTableNew_cmap(void);
+
+/**
+ * Creates a new 'name' table. If n != 0 the table gets populated by
+ * the Name Records stored in the nr array. This function allocates
+ * memory for its own copy of NameRecords, so nr array has to
+ * be explicitly deallocated when it is not needed.
+ */
+ TrueTypeTable *TrueTypeTableNew_name(int n, NameRecord *nr);
+
+/**
+ * Creates a new 'post' table of one of the supported formats
+ */
+ TrueTypeTable *TrueTypeTableNew_post(sal_uInt32 format,
+ sal_uInt32 italicAngle,
+ sal_Int16 underlinePosition,
+ sal_Int16 underlineThickness,
+ sal_uInt32 isFixedPitch);
+
+
+/*------------------------------------------------------------------------------
+ *
+ * Table manipulation functions
+ *
+ *------------------------------------------------------------------------------*/
+
+
+/**
+ * Add a character/glyph pair to a cmap table
+ */
+ void cmapAdd(TrueTypeTable *, sal_uInt32 id, sal_uInt32 c, sal_uInt32 g);
+
+/**
+ * Add a glyph to a glyf table.
+ *
+ * @return glyphID of the glyph in the new font
+ *
+ * NOTE: This function does not duplicate GlyphData, so memory will be
+ * deallocated in the table destructor
+ */
+ sal_uInt32 glyfAdd(TrueTypeTable *, GlyphData *glyphdata, TrueTypeFont *fnt);
+
+/**
+ * Query the number of glyphs currently stored in the 'glyf' table
+ *
+ */
+ sal_uInt32 glyfCount(const TrueTypeTable *);
+
+/**
+ * Add a Name Record to a name table.
+ * NOTE: This function duplicates NameRecord, so the argument
+ * has to be deallocated by the caller (unlike glyfAdd)
+ */
+ void nameAdd(TrueTypeTable *, NameRecord *nr);
+
+
+
+/*
+ * Private Data Types
+ */
+
+ struct _TrueTypeCreator {
+ sal_uInt32 tag; /**< TrueType file tag */
+ list tables; /**< List of table tags and pointers */
+ };
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TTCR_H */
diff --git a/vcl/source/fontsubset/u2big5.inc b/vcl/source/fontsubset/u2big5.inc
new file mode 100644
index 000000000000..2883e9d99094
--- /dev/null
+++ b/vcl/source/fontsubset/u2big5.inc
@@ -0,0 +1,1757 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: u2big5.inc,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+sal_uInt16pair xlat_1_3[13798] = {
+ {0x0020, 0x0020},{0x0021, 0x0021},{0x0022, 0x0022},{0x0023, 0x0023},{0x0024, 0x0024},{0x0025, 0x0025},{0x0026, 0x0026},{0x0027, 0x0027},
+ {0x0028, 0x0028},{0x0029, 0x0029},{0x002A, 0x002A},{0x002B, 0x002B},{0x002C, 0x002C},{0x002D, 0x002D},{0x002E, 0x002E},{0x002F, 0x002F},
+ {0x0030, 0x0030},{0x0031, 0x0031},{0x0032, 0x0032},{0x0033, 0x0033},{0x0034, 0x0034},{0x0035, 0x0035},{0x0036, 0x0036},{0x0037, 0x0037},
+ {0x0038, 0x0038},{0x0039, 0x0039},{0x003A, 0x003A},{0x003B, 0x003B},{0x003C, 0x003C},{0x003D, 0x003D},{0x003E, 0x003E},{0x003F, 0x003F},
+ {0x0040, 0x0040},{0x0041, 0x0041},{0x0042, 0x0042},{0x0043, 0x0043},{0x0044, 0x0044},{0x0045, 0x0045},{0x0046, 0x0046},{0x0047, 0x0047},
+ {0x0048, 0x0048},{0x0049, 0x0049},{0x004A, 0x004A},{0x004B, 0x004B},{0x004C, 0x004C},{0x004D, 0x004D},{0x004E, 0x004E},{0x004F, 0x004F},
+ {0x0050, 0x0050},{0x0051, 0x0051},{0x0052, 0x0052},{0x0053, 0x0053},{0x0054, 0x0054},{0x0055, 0x0055},{0x0056, 0x0056},{0x0057, 0x0057},
+ {0x0058, 0x0058},{0x0059, 0x0059},{0x005A, 0x005A},{0x005B, 0x005B},{0x005C, 0x005C},{0x005D, 0x005D},{0x005E, 0x005E},{0x005F, 0x005F},
+ {0x0060, 0x0060},{0x0061, 0x0061},{0x0062, 0x0062},{0x0063, 0x0063},{0x0064, 0x0064},{0x0065, 0x0065},{0x0066, 0x0066},{0x0067, 0x0067},
+ {0x0068, 0x0068},{0x0069, 0x0069},{0x006A, 0x006A},{0x006B, 0x006B},{0x006C, 0x006C},{0x006D, 0x006D},{0x006E, 0x006E},{0x006F, 0x006F},
+ {0x0070, 0x0070},{0x0071, 0x0071},{0x0072, 0x0072},{0x0073, 0x0073},{0x0074, 0x0074},{0x0075, 0x0075},{0x0076, 0x0076},{0x0077, 0x0077},
+ {0x0078, 0x0078},{0x0079, 0x0079},{0x007A, 0x007A},{0x007B, 0x007B},{0x007C, 0x007C},{0x007D, 0x007D},{0x007E, 0x007E},{0x00A2, 0xA246},
+ {0x00A3, 0xA247},{0x00A5, 0xA244},{0x00A7, 0xA1B1},{0x00B0, 0xA258},{0x00B1, 0xA1D3},{0x00B7, 0xA150},{0x00D7, 0xA1D1},{0x00F7, 0xA1D2},
+ {0x02C7, 0xA3BE},{0x02C9, 0xA3BC},{0x02CA, 0xA3BD},{0x02CB, 0xA3BF},{0x02D9, 0xA3BB},{0x0391, 0xA344},{0x0392, 0xA345},{0x0393, 0xA346},
+ {0x0394, 0xA347},{0x0395, 0xA348},{0x0396, 0xA349},{0x0397, 0xA34A},{0x0398, 0xA34B},{0x0399, 0xA34C},{0x039A, 0xA34D},{0x039B, 0xA34E},
+ {0x039C, 0xA34F},{0x039D, 0xA350},{0x039E, 0xA351},{0x039F, 0xA352},{0x03A0, 0xA353},{0x03A1, 0xA354},{0x03A3, 0xA355},{0x03A4, 0xA356},
+ {0x03A5, 0xA357},{0x03A6, 0xA358},{0x03A7, 0xA359},{0x03A8, 0xA35A},{0x03A9, 0xA35B},{0x03B1, 0xA35C},{0x03B2, 0xA35D},{0x03B3, 0xA35E},
+ {0x03B4, 0xA35F},{0x03B5, 0xA360},{0x03B6, 0xA361},{0x03B7, 0xA362},{0x03B8, 0xA363},{0x03B9, 0xA364},{0x03BA, 0xA365},{0x03BB, 0xA366},
+ {0x03BC, 0xA367},{0x03BD, 0xA368},{0x03BE, 0xA369},{0x03BF, 0xA36A},{0x03C0, 0xA36B},{0x03C1, 0xA36C},{0x03C3, 0xA36D},{0x03C4, 0xA36E},
+ {0x03C5, 0xA36F},{0x03C6, 0xA370},{0x03C7, 0xA371},{0x03C8, 0xA372},{0x03C9, 0xA373},{0x0401, 0xC7B3},{0x0414, 0xC7B1},{0x0415, 0xC7B2},
+ {0x0416, 0xC7B4},{0x0417, 0xC7B5},{0x0418, 0xC7B6},{0x0419, 0xC7B7},{0x041A, 0xC7B8},{0x041B, 0xC7B9},{0x041C, 0xC7BA},{0x0423, 0xC7BB},
+ {0x0424, 0xC7BC},{0x0425, 0xC7BD},{0x0426, 0xC7BE},{0x0427, 0xC7BF},{0x0428, 0xC7C0},{0x0429, 0xC7C1},{0x042A, 0xC7C2},{0x042B, 0xC7C3},
+ {0x042C, 0xC7C4},{0x042D, 0xC7C5},{0x042E, 0xC7C6},{0x042F, 0xC7C7},{0x0430, 0xC7C8},{0x0431, 0xC7C9},{0x0432, 0xC7CA},{0x0433, 0xC7CB},
+ {0x0434, 0xC7CC},{0x0435, 0xC7CD},{0x0436, 0xC7CF},{0x0437, 0xC7D0},{0x0438, 0xC7D1},{0x0439, 0xC7D2},{0x043A, 0xC7D3},{0x043B, 0xC7D4},
+ {0x043C, 0xC7D5},{0x043D, 0xC7D6},{0x043E, 0xC7D7},{0x043F, 0xC7D8},{0x0440, 0xC7D9},{0x0441, 0xC7DA},{0x0442, 0xC7DB},{0x0443, 0xC7DC},
+ {0x0444, 0xC7DD},{0x0445, 0xC7DE},{0x0446, 0xC7DF},{0x0447, 0xC7E0},{0x0448, 0xC7E1},{0x0449, 0xC7E2},{0x044A, 0xC7E3},{0x044B, 0xC7E4},
+ {0x044C, 0xC7E5},{0x044D, 0xC7E6},{0x044E, 0xC7E7},{0x044F, 0xC7E8},{0x0451, 0xC7CE},{0x2013, 0xA156},{0x2014, 0xA158},{0x2018, 0xA1A5},
+ {0x2019, 0xA1A6},{0x201C, 0xA1A7},{0x201D, 0xA1A8},{0x2022, 0xA145},{0x2025, 0xA14C},{0x2026, 0xA14B},{0x2032, 0xA1AC},{0x2035, 0xA1AB},
+ {0x203B, 0xA1B0},{0x203E, 0xA1C2},{0x2103, 0xA24A},{0x2105, 0xA1C1},{0x2109, 0xA24B},{0x2160, 0xA2B9},{0x2161, 0xA2BA},{0x2162, 0xA2BB},
+ {0x2163, 0xA2BC},{0x2164, 0xA2BD},{0x2165, 0xA2BE},{0x2166, 0xA2BF},{0x2167, 0xA2C0},{0x2168, 0xA2C1},{0x2169, 0xA2C2},{0x2190, 0xA1F6},
+ {0x2191, 0xA1F4},{0x2192, 0xA1F7},{0x2193, 0xA1F5},{0x2196, 0xA1F8},{0x2197, 0xA1F9},{0x2198, 0xA1FB},{0x2199, 0xA1FA},{0x221A, 0xA1D4},
+ {0x221E, 0xA1DB},{0x221F, 0xA1E8},{0x2220, 0xA1E7},{0x2223, 0xA1FD},{0x2225, 0xA1FC},{0x2229, 0xA1E4},{0x222A, 0xA1E5},{0x222B, 0xA1EC},
+ {0x222E, 0xA1ED},{0x2234, 0xA1EF},{0x2235, 0xA1EE},{0x223C, 0xA1E3},{0x2252, 0xA1DC},{0x2260, 0xA1DA},{0x2261, 0xA1DD},{0x2266, 0xA1D8},
+ {0x2267, 0xA1D9},{0x22A5, 0xA1E6},{0x22BF, 0xA1E9},{0x2460, 0xC7E9},{0x2461, 0xC7EA},{0x2462, 0xC7EB},{0x2463, 0xC7EC},{0x2464, 0xC7ED},
+ {0x2465, 0xC7EE},{0x2466, 0xC7EF},{0x2467, 0xC7F0},{0x2468, 0xC7F1},{0x2469, 0xC7F2},{0x2474, 0xC7F3},{0x2475, 0xC7F4},{0x2476, 0xC7F5},
+ {0x2477, 0xC7F6},{0x2478, 0xC7F7},{0x2479, 0xC7F8},{0x247A, 0xC7F9},{0x247B, 0xC7FA},{0x247C, 0xC7FB},{0x247D, 0xC7FC},{0x2500, 0xA277},
+ {0x2502, 0xA278},{0x250C, 0xA27A},{0x2510, 0xA27B},{0x2514, 0xA27C},{0x2518, 0xA27D},{0x251C, 0xA275},{0x2524, 0xA274},{0x252C, 0xA273},
+ {0x2534, 0xA272},{0x253C, 0xA271},{0x2550, 0xA2A4},{0x255E, 0xA2A5},{0x2561, 0xA2A7},{0x256A, 0xA2A6},{0x256D, 0xA27E},{0x256E, 0xA2A1},
+ {0x256F, 0xA2A3},{0x2570, 0xA2A2},{0x2571, 0xA2AC},{0x2572, 0xA2AD},{0x2573, 0xA2AE},{0x2581, 0xA262},{0x2582, 0xA263},{0x2583, 0xA264},
+ {0x2584, 0xA265},{0x2585, 0xA266},{0x2586, 0xA267},{0x2587, 0xA268},{0x2588, 0xA269},{0x2589, 0xA270},{0x258A, 0xA26F},{0x258B, 0xA26E},
+ {0x258C, 0xA26D},{0x258D, 0xA26C},{0x258E, 0xA26B},{0x258F, 0xA26A},{0x2594, 0xA276},{0x2595, 0xA279},{0x25A0, 0xA1BD},{0x25A1, 0xA1BC},
+ {0x25B2, 0xA1B6},{0x25B3, 0xA1B5},{0x25BC, 0xA1BF},{0x25BD, 0xA1BE},{0x25C6, 0xA1BB},{0x25C7, 0xA1BA},{0x25CB, 0xA1B3},{0x25CE, 0xA1B7},
+ {0x25CF, 0xA1B4},{0x25E2, 0xA2A8},{0x25E3, 0xA2A9},{0x25E4, 0xA2AB},{0x25E5, 0xA2AA},{0x2605, 0xA1B9},{0x2606, 0xA1B8},{0x2609, 0xA1F3},
+ {0x2640, 0xA1F0},{0x2641, 0xA1F2},{0x2642, 0xA1F1},{0x3000, 0xA140},{0x3001, 0xA142},{0x3002, 0xA143},{0x3003, 0xA1B2},{0x3005, 0xC6A4},
+ {0x3008, 0xA171},{0x3009, 0xA172},{0x300A, 0xA16D},{0x300B, 0xA16E},{0x300C, 0xA175},{0x300D, 0xA176},{0x300E, 0xA179},{0x300F, 0xA17A},
+ {0x3010, 0xA169},{0x3011, 0xA16A},{0x3012, 0xA245},{0x3014, 0xA165},{0x3015, 0xA166},{0x301D, 0xA1A9},{0x301E, 0xA1AA},{0x3021, 0xA2C3},
+ {0x3022, 0xA2C4},{0x3023, 0xA2C5},{0x3024, 0xA2C6},{0x3025, 0xA2C7},{0x3026, 0xA2C8},{0x3027, 0xA2C9},{0x3028, 0xA2CA},{0x3029, 0xA2CB},
+ {0x3041, 0xC6A5},{0x3042, 0xC6A6},{0x3043, 0xC6A7},{0x3044, 0xC6A8},{0x3045, 0xC6A9},{0x3046, 0xC6AA},{0x3047, 0xC6AB},{0x3048, 0xC6AC},
+ {0x3049, 0xC6AD},{0x304A, 0xC6AE},{0x304B, 0xC6AF},{0x304C, 0xC6B0},{0x304D, 0xC6B1},{0x304E, 0xC6B2},{0x304F, 0xC6B3},{0x3050, 0xC6B4},
+ {0x3051, 0xC6B5},{0x3052, 0xC6B6},{0x3053, 0xC6B7},{0x3054, 0xC6B8},{0x3055, 0xC6B9},{0x3056, 0xC6BA},{0x3057, 0xC6BB},{0x3058, 0xC6BC},
+ {0x3059, 0xC6BD},{0x305A, 0xC6BE},{0x305B, 0xC6BF},{0x305C, 0xC6C0},{0x305D, 0xC6C1},{0x305E, 0xC6C2},{0x305F, 0xC6C3},{0x3060, 0xC6C4},
+ {0x3061, 0xC6C5},{0x3062, 0xC6C6},{0x3063, 0xC6C7},{0x3064, 0xC6C8},{0x3065, 0xC6C9},{0x3066, 0xC6CA},{0x3067, 0xC6CB},{0x3068, 0xC6CC},
+ {0x3069, 0xC6CD},{0x306A, 0xC6CE},{0x306B, 0xC6CF},{0x306C, 0xC6D0},{0x306D, 0xC6D1},{0x306E, 0xC6D2},{0x306F, 0xC6D3},{0x3070, 0xC6D4},
+ {0x3071, 0xC6D5},{0x3072, 0xC6D6},{0x3073, 0xC6D7},{0x3074, 0xC6D8},{0x3075, 0xC6D9},{0x3076, 0xC6DA},{0x3077, 0xC6DB},{0x3078, 0xC6DC},
+ {0x3079, 0xC6DD},{0x307A, 0xC6DE},{0x307B, 0xC6DF},{0x307C, 0xC6E0},{0x307D, 0xC6E1},{0x307E, 0xC6E2},{0x307F, 0xC6E3},{0x3080, 0xC6E4},
+ {0x3081, 0xC6E5},{0x3082, 0xC6E6},{0x3083, 0xC6E7},{0x3084, 0xC6E8},{0x3085, 0xC6E9},{0x3086, 0xC6EA},{0x3087, 0xC6EB},{0x3088, 0xC6EC},
+ {0x3089, 0xC6ED},{0x308A, 0xC6EE},{0x308B, 0xC6EF},{0x308C, 0xC6F0},{0x308D, 0xC6F1},{0x308E, 0xC6F2},{0x308F, 0xC6F3},{0x3090, 0xC6F4},
+ {0x3091, 0xC6F5},{0x3092, 0xC6F6},{0x3093, 0xC6F7},{0x309D, 0xC6A2},{0x309E, 0xC6A3},{0x30A1, 0xC6F8},{0x30A2, 0xC6F9},{0x30A3, 0xC6FA},
+ {0x30A4, 0xC6FB},{0x30A5, 0xC6FC},{0x30A6, 0xC6FD},{0x30A7, 0xC6FE},{0x30A8, 0xC740},{0x30A9, 0xC741},{0x30AA, 0xC742},{0x30AB, 0xC743},
+ {0x30AC, 0xC744},{0x30AD, 0xC745},{0x30AE, 0xC746},{0x30AF, 0xC747},{0x30B0, 0xC748},{0x30B1, 0xC749},{0x30B2, 0xC74A},{0x30B3, 0xC74B},
+ {0x30B4, 0xC74C},{0x30B5, 0xC74D},{0x30B6, 0xC74E},{0x30B7, 0xC74F},{0x30B8, 0xC750},{0x30B9, 0xC751},{0x30BA, 0xC752},{0x30BB, 0xC753},
+ {0x30BC, 0xC754},{0x30BD, 0xC755},{0x30BE, 0xC756},{0x30BF, 0xC757},{0x30C0, 0xC758},{0x30C1, 0xC759},{0x30C2, 0xC75A},{0x30C3, 0xC75B},
+ {0x30C4, 0xC75C},{0x30C5, 0xC75D},{0x30C6, 0xC75E},{0x30C7, 0xC75F},{0x30C8, 0xC760},{0x30C9, 0xC761},{0x30CA, 0xC762},{0x30CB, 0xC763},
+ {0x30CC, 0xC764},{0x30CD, 0xC765},{0x30CE, 0xC766},{0x30CF, 0xC767},{0x30D0, 0xC768},{0x30D1, 0xC769},{0x30D2, 0xC76A},{0x30D3, 0xC76B},
+ {0x30D4, 0xC76C},{0x30D5, 0xC76D},{0x30D6, 0xC76E},{0x30D7, 0xC76F},{0x30D8, 0xC770},{0x30D9, 0xC771},{0x30DA, 0xC772},{0x30DB, 0xC773},
+ {0x30DC, 0xC774},{0x30DD, 0xC775},{0x30DE, 0xC776},{0x30DF, 0xC777},{0x30E0, 0xC778},{0x30E1, 0xC779},{0x30E2, 0xC77A},{0x30E3, 0xC77B},
+ {0x30E4, 0xC77C},{0x30E5, 0xC77D},{0x30E6, 0xC77E},{0x30E7, 0xC7A1},{0x30E8, 0xC7A2},{0x30E9, 0xC7A3},{0x30EA, 0xC7A4},{0x30EB, 0xC7A5},
+ {0x30EC, 0xC7A6},{0x30ED, 0xC7A7},{0x30EE, 0xC7A8},{0x30EF, 0xC7A9},{0x30F0, 0xC7AA},{0x30F1, 0xC7AB},{0x30F2, 0xC7AC},{0x30F3, 0xC7AD},
+ {0x30F4, 0xC7AE},{0x30F5, 0xC7AF},{0x30F6, 0xC7B0},{0x30FE, 0xC6A1},{0x3105, 0xA374},{0x3106, 0xA375},{0x3107, 0xA376},{0x3108, 0xA377},
+ {0x3109, 0xA378},{0x310A, 0xA379},{0x310B, 0xA37A},{0x310C, 0xA37B},{0x310D, 0xA37C},{0x310E, 0xA37D},{0x310F, 0xA37E},{0x3110, 0xA3A1},
+ {0x3111, 0xA3A2},{0x3112, 0xA3A3},{0x3113, 0xA3A4},{0x3114, 0xA3A5},{0x3115, 0xA3A6},{0x3116, 0xA3A7},{0x3117, 0xA3A8},{0x3118, 0xA3A9},
+ {0x3119, 0xA3AA},{0x311A, 0xA3AB},{0x311B, 0xA3AC},{0x311C, 0xA3AD},{0x311D, 0xA3AE},{0x311E, 0xA3AF},{0x311F, 0xA3B0},{0x3120, 0xA3B1},
+ {0x3121, 0xA3B2},{0x3122, 0xA3B3},{0x3123, 0xA3B4},{0x3124, 0xA3B5},{0x3125, 0xA3B6},{0x3126, 0xA3B7},{0x3127, 0xA3B8},{0x3128, 0xA3B9},
+ {0x3129, 0xA3BA},{0x32A3, 0xA1C0},{0x338E, 0xA255},{0x338F, 0xA256},{0x339C, 0xA250},{0x339D, 0xA251},{0x339E, 0xA252},{0x33A1, 0xA254},
+ {0x33C4, 0xA257},{0x33CE, 0xA253},{0x33D1, 0xA1EB},{0x33D2, 0xA1EA},{0x33D5, 0xA24F},{0x4E00, 0xA440},{0x4E01, 0xA442},{0x4E03, 0xA443},
+ {0x4E07, 0xC945},{0x4E08, 0xA456},{0x4E09, 0xA454},{0x4E0A, 0xA457},{0x4E0B, 0xA455},{0x4E0C, 0xC946},{0x4E0D, 0xA4A3},{0x4E0E, 0xC94F},
+ {0x4E0F, 0xC94D},{0x4E10, 0xA4A2},{0x4E11, 0xA4A1},{0x4E14, 0xA542},{0x4E15, 0xA541},{0x4E16, 0xA540},{0x4E18, 0xA543},{0x4E19, 0xA4FE},
+ {0x4E1E, 0xA5E0},{0x4E1F, 0xA5E1},{0x4E26, 0xA8C3},{0x4E2B, 0xA458},{0x4E2D, 0xA4A4},{0x4E2E, 0xC950},{0x4E30, 0xA4A5},{0x4E31, 0xC963},
+ {0x4E32, 0xA6EA},{0x4E33, 0xCBB1},{0x4E38, 0xA459},{0x4E39, 0xA4A6},{0x4E3B, 0xA544},{0x4E3C, 0xC964},{0x4E42, 0xC940},{0x4E43, 0xA444},
+ {0x4E45, 0xA45B},{0x4E47, 0xC947},{0x4E48, 0xA45C},{0x4E4B, 0xA4A7},{0x4E4D, 0xA545},{0x4E4E, 0xA547},{0x4E4F, 0xA546},{0x4E52, 0xA5E2},
+ {0x4E53, 0xA5E3},{0x4E56, 0xA8C4},{0x4E58, 0xADBC},{0x4E59, 0xA441},{0x4E5C, 0xC941},{0x4E5D, 0xA445},{0x4E5E, 0xA45E},{0x4E5F, 0xA45D},
+ {0x4E69, 0xA5E4},{0x4E73, 0xA8C5},{0x4E7E, 0xB0AE},{0x4E7F, 0xD44B},{0x4E82, 0xB6C3},{0x4E83, 0xDCB1},{0x4E84, 0xDCB2},{0x4E86, 0xA446},
+ {0x4E88, 0xA4A9},{0x4E8B, 0xA8C6},{0x4E8C, 0xA447},{0x4E8D, 0xC948},{0x4E8E, 0xA45F},{0x4E91, 0xA4AA},{0x4E92, 0xA4AC},{0x4E93, 0xC951},
+ {0x4E94, 0xA4AD},{0x4E95, 0xA4AB},{0x4E99, 0xA5E5},{0x4E9B, 0xA8C7},{0x4E9E, 0xA8C8},{0x4E9F, 0xAB45},{0x4EA1, 0xA460},{0x4EA2, 0xA4AE},
+ {0x4EA4, 0xA5E6},{0x4EA5, 0xA5E8},{0x4EA6, 0xA5E7},{0x4EA8, 0xA6EB},{0x4EAB, 0xA8C9},{0x4EAC, 0xA8CA},{0x4EAD, 0xAB46},{0x4EAE, 0xAB47},
+ {0x4EB3, 0xADBD},{0x4EB6, 0xDCB3},{0x4EB9, 0xF6D6},{0x4EBA, 0xA448},{0x4EC0, 0xA4B0},{0x4EC1, 0xA4AF},{0x4EC2, 0xC952},{0x4EC3, 0xA4B1},
+ {0x4EC4, 0xA4B7},{0x4EC6, 0xA4B2},{0x4EC7, 0xA4B3},{0x4EC8, 0xC954},{0x4EC9, 0xC953},{0x4ECA, 0xA4B5},{0x4ECB, 0xA4B6},{0x4ECD, 0xA4B4},
+ {0x4ED4, 0xA54A},{0x4ED5, 0xA54B},{0x4ED6, 0xA54C},{0x4ED7, 0xA54D},{0x4ED8, 0xA549},{0x4ED9, 0xA550},{0x4EDA, 0xC96A},{0x4EDC, 0xC966},
+ {0x4EDD, 0xC969},{0x4EDE, 0xA551},{0x4EDF, 0xA561},{0x4EE1, 0xC968},{0x4EE3, 0xA54E},{0x4EE4, 0xA54F},{0x4EE5, 0xA548},{0x4EE8, 0xC965},
+ {0x4EE9, 0xC967},{0x4EF0, 0xA5F5},{0x4EF1, 0xC9B0},{0x4EF2, 0xA5F2},{0x4EF3, 0xA5F6},{0x4EF4, 0xC9BA},{0x4EF5, 0xC9AE},{0x4EF6, 0xA5F3},
+ {0x4EF7, 0xC9B2},{0x4EFB, 0xA5F4},{0x4EFD, 0xA5F7},{0x4EFF, 0xA5E9},{0x4F00, 0xC9B1},{0x4F01, 0xA5F8},{0x4F02, 0xC9B5},{0x4F04, 0xC9B9},
+ {0x4F05, 0xC9B6},{0x4F08, 0xC9B3},{0x4F09, 0xA5EA},{0x4F0A, 0xA5EC},{0x4F0B, 0xA5F9},{0x4F0D, 0xA5EE},{0x4F0E, 0xC9AB},{0x4F0F, 0xA5F1},
+ {0x4F10, 0xA5EF},{0x4F11, 0xA5F0},{0x4F12, 0xC9BB},{0x4F13, 0xC9B8},{0x4F14, 0xC9AF},{0x4F15, 0xA5ED},{0x4F18, 0xC9AC},{0x4F19, 0xA5EB},
+ {0x4F1D, 0xC9B4},{0x4F22, 0xC9B7},{0x4F2C, 0xC9AD},{0x4F2D, 0xCA66},{0x4F2F, 0xA742},{0x4F30, 0xA6F4},{0x4F33, 0xCA67},{0x4F34, 0xA6F1},
+ {0x4F36, 0xA744},{0x4F38, 0xA6F9},{0x4F3A, 0xA6F8},{0x4F3B, 0xCA5B},{0x4F3C, 0xA6FC},{0x4F3D, 0xA6F7},{0x4F3E, 0xCA60},{0x4F3F, 0xCA68},
+ {0x4F41, 0xCA64},{0x4F43, 0xA6FA},{0x4F46, 0xA6FD},{0x4F47, 0xA6EE},{0x4F48, 0xA747},{0x4F49, 0xCA5D},{0x4F4C, 0xCBBD},{0x4F4D, 0xA6EC},
+ {0x4F4E, 0xA743},{0x4F4F, 0xA6ED},{0x4F50, 0xA6F5},{0x4F51, 0xA6F6},{0x4F52, 0xCA62},{0x4F53, 0xCA5E},{0x4F54, 0xA6FB},{0x4F55, 0xA6F3},
+ {0x4F56, 0xCA5A},{0x4F57, 0xA6EF},{0x4F58, 0xCA65},{0x4F59, 0xA745},{0x4F5A, 0xA748},{0x4F5B, 0xA6F2},{0x4F5C, 0xA740},{0x4F5D, 0xA746},
+ {0x4F5E, 0xA6F0},{0x4F5F, 0xCA63},{0x4F60, 0xA741},{0x4F61, 0xCA69},{0x4F62, 0xCA5C},{0x4F63, 0xA6FE},{0x4F64, 0xCA5F},{0x4F67, 0xCA61},
+ {0x4F69, 0xA8D8},{0x4F6A, 0xCBBF},{0x4F6B, 0xCBCB},{0x4F6C, 0xA8D0},{0x4F6E, 0xCBCC},{0x4F6F, 0xA8CB},{0x4F70, 0xA8D5},{0x4F73, 0xA8CE},
+ {0x4F74, 0xCBB9},{0x4F75, 0xA8D6},{0x4F76, 0xCBB8},{0x4F77, 0xCBBC},{0x4F78, 0xCBC3},{0x4F79, 0xCBC1},{0x4F7A, 0xA8DE},{0x4F7B, 0xA8D9},
+ {0x4F7C, 0xCBB3},{0x4F7D, 0xCBB5},{0x4F7E, 0xA8DB},{0x4F7F, 0xA8CF},{0x4F80, 0xCBB6},{0x4F81, 0xCBC2},{0x4F82, 0xCBC9},{0x4F83, 0xA8D4},
+ {0x4F84, 0xCBBB},{0x4F85, 0xCBB4},{0x4F86, 0xA8D3},{0x4F87, 0xCBB7},{0x4F88, 0xA8D7},{0x4F89, 0xCBBA},{0x4F8B, 0xA8D2},{0x4F8D, 0xA8CD},
+ {0x4F8F, 0xA8DC},{0x4F90, 0xCBC4},{0x4F91, 0xA8DD},{0x4F92, 0xCBC8},{0x4F94, 0xCBC6},{0x4F95, 0xCBCA},{0x4F96, 0xA8DA},{0x4F97, 0xCBBE},
+ {0x4F98, 0xCBB2},{0x4F9A, 0xCBC0},{0x4F9B, 0xA8D1},{0x4F9C, 0xCBC5},{0x4F9D, 0xA8CC},{0x4F9E, 0xCBC7},{0x4FAE, 0xAB56},{0x4FAF, 0xAB4A},
+ {0x4FB2, 0xCDE0},{0x4FB3, 0xCDE8},{0x4FB5, 0xAB49},{0x4FB6, 0xAB51},{0x4FB7, 0xAB5D},{0x4FB9, 0xCDEE},{0x4FBA, 0xCDEC},{0x4FBB, 0xCDE7},
+ {0x4FBF, 0xAB4B},{0x4FC0, 0xCDED},{0x4FC1, 0xCDE3},{0x4FC2, 0xAB59},{0x4FC3, 0xAB50},{0x4FC4, 0xAB58},{0x4FC5, 0xCDDE},{0x4FC7, 0xCDEA},
+ {0x4FC9, 0xCDE1},{0x4FCA, 0xAB54},{0x4FCB, 0xCDE2},{0x4FCD, 0xCDDD},{0x4FCE, 0xAB5B},{0x4FCF, 0xAB4E},{0x4FD0, 0xAB57},{0x4FD1, 0xAB4D},
+ {0x4FD3, 0xCDDF},{0x4FD4, 0xCDE4},{0x4FD6, 0xCDEB},{0x4FD7, 0xAB55},{0x4FD8, 0xAB52},{0x4FD9, 0xCDE6},{0x4FDA, 0xAB5A},{0x4FDB, 0xCDE9},
+ {0x4FDC, 0xCDE5},{0x4FDD, 0xAB4F},{0x4FDE, 0xAB5C},{0x4FDF, 0xAB53},{0x4FE0, 0xAB4C},{0x4FE1, 0xAB48},{0x4FEC, 0xCDEF},{0x4FEE, 0xADD7},
+ {0x4FEF, 0xADC1},{0x4FF1, 0xADD1},{0x4FF3, 0xADD6},{0x4FF4, 0xD0D0},{0x4FF5, 0xD0CF},{0x4FF6, 0xD0D4},{0x4FF7, 0xD0D5},{0x4FF8, 0xADC4},
+ {0x4FFA, 0xADCD},{0x4FFE, 0xADDA},{0x5000, 0xADCE},{0x5005, 0xD0C9},{0x5006, 0xADC7},{0x5007, 0xD0CA},{0x5009, 0xADDC},{0x500B, 0xADD3},
+ {0x500C, 0xADBE},{0x500D, 0xADBF},{0x500E, 0xD0DD},{0x500F, 0xB0BF},{0x5011, 0xADCC},{0x5012, 0xADCB},{0x5013, 0xD0CB},{0x5014, 0xADCF},
+ {0x5015, 0xD45B},{0x5016, 0xADC6},{0x5017, 0xD0D6},{0x5018, 0xADD5},{0x5019, 0xADD4},{0x501A, 0xADCA},{0x501B, 0xD0CE},{0x501C, 0xD0D7},
+ {0x501E, 0xD0C8},{0x501F, 0xADC9},{0x5020, 0xD0D8},{0x5021, 0xADD2},{0x5022, 0xD0CC},{0x5023, 0xADC0},{0x5025, 0xADC3},{0x5026, 0xADC2},
+ {0x5027, 0xD0D9},{0x5028, 0xADD0},{0x5029, 0xADC5},{0x502A, 0xADD9},{0x502B, 0xADDB},{0x502C, 0xD0D3},{0x502D, 0xADD8},{0x502F, 0xD0DB},
+ {0x5030, 0xD0CD},{0x5031, 0xD0DC},{0x5033, 0xD0D1},{0x5035, 0xD0DA},{0x5037, 0xD0D2},{0x503C, 0xADC8},{0x5040, 0xD463},{0x5041, 0xD457},
+ {0x5043, 0xB0B3},{0x5045, 0xD45C},{0x5046, 0xD462},{0x5047, 0xB0B2},{0x5048, 0xD455},{0x5049, 0xB0B6},{0x504A, 0xD459},{0x504B, 0xD452},
+ {0x504C, 0xB0B4},{0x504D, 0xD456},{0x504E, 0xB0B9},{0x504F, 0xB0BE},{0x5051, 0xD467},{0x5053, 0xD451},{0x5055, 0xB0BA},{0x5057, 0xD466},
+ {0x505A, 0xB0B5},{0x505B, 0xD458},{0x505C, 0xB0B1},{0x505D, 0xD453},{0x505E, 0xD44F},{0x505F, 0xD45D},{0x5060, 0xD450},{0x5061, 0xD44E},
+ {0x5062, 0xD45A},{0x5063, 0xD460},{0x5064, 0xD461},{0x5065, 0xB0B7},{0x5068, 0xD85B},{0x5069, 0xD45E},{0x506A, 0xD44D},{0x506B, 0xD45F},
+ {0x506D, 0xB0C1},{0x506E, 0xD464},{0x506F, 0xB0C0},{0x5070, 0xD44C},{0x5072, 0xD454},{0x5073, 0xD465},{0x5074, 0xB0BC},{0x5075, 0xB0BB},
+ {0x5076, 0xB0B8},{0x5077, 0xB0BD},{0x507A, 0xB0AF},{0x507D, 0xB0B0},{0x5080, 0xB3C8},{0x5082, 0xD85E},{0x5083, 0xD857},{0x5085, 0xB3C5},
+ {0x5087, 0xD85F},{0x508B, 0xD855},{0x508C, 0xD858},{0x508D, 0xB3C4},{0x508E, 0xD859},{0x5091, 0xB3C7},{0x5092, 0xD85D},{0x5094, 0xD853},
+ {0x5095, 0xD852},{0x5096, 0xB3C9},{0x5098, 0xB3CA},{0x5099, 0xB3C6},{0x509A, 0xB3CB},{0x509B, 0xD851},{0x509C, 0xD85C},{0x509D, 0xD85A},
+ {0x509E, 0xD854},{0x50A2, 0xB3C3},{0x50A3, 0xD856},{0x50AC, 0xB6CA},{0x50AD, 0xB6C4},{0x50AE, 0xDCB7},{0x50AF, 0xB6CD},{0x50B0, 0xDCBD},
+ {0x50B1, 0xDCC0},{0x50B2, 0xB6C6},{0x50B3, 0xB6C7},{0x50B4, 0xDCBA},{0x50B5, 0xB6C5},{0x50B6, 0xDCC3},{0x50B7, 0xB6CB},{0x50B8, 0xDCC4},
+ {0x50BA, 0xDCBF},{0x50BB, 0xB6CC},{0x50BD, 0xDCB4},{0x50BE, 0xB6C9},{0x50BF, 0xDCB5},{0x50C1, 0xDCBE},{0x50C2, 0xDCBC},{0x50C4, 0xDCB8},
+ {0x50C5, 0xB6C8},{0x50C6, 0xDCB6},{0x50C7, 0xB6CE},{0x50C8, 0xDCBB},{0x50C9, 0xDCC2},{0x50CA, 0xDCB9},{0x50CB, 0xDCC1},{0x50CE, 0xB9B6},
+ {0x50CF, 0xB9B3},{0x50D1, 0xB9B4},{0x50D3, 0xE0F9},{0x50D4, 0xE0F1},{0x50D5, 0xB9B2},{0x50D6, 0xB9AF},{0x50D7, 0xE0F2},{0x50DA, 0xB9B1},
+ {0x50DB, 0xE0F5},{0x50DD, 0xE0F7},{0x50E0, 0xE0FE},{0x50E3, 0xE0FD},{0x50E4, 0xE0F8},{0x50E5, 0xB9AE},{0x50E6, 0xE0F0},{0x50E7, 0xB9AC},
+ {0x50E8, 0xE0F3},{0x50E9, 0xB9B7},{0x50EA, 0xE0F6},{0x50EC, 0xE0FA},{0x50ED, 0xB9B0},{0x50EE, 0xB9AD},{0x50EF, 0xE0FC},{0x50F0, 0xE0FB},
+ {0x50F1, 0xB9B5},{0x50F3, 0xE0F4},{0x50F5, 0xBBF8},{0x50F6, 0xE4EC},{0x50F8, 0xE4E9},{0x50F9, 0xBBF9},{0x50FB, 0xBBF7},{0x50FD, 0xE4F0},
+ {0x50FE, 0xE4ED},{0x50FF, 0xE4E6},{0x5100, 0xBBF6},{0x5102, 0xBBFA},{0x5103, 0xE4E7},{0x5104, 0xBBF5},{0x5105, 0xBBFD},{0x5106, 0xE4EA},
+ {0x5107, 0xE4EB},{0x5108, 0xBBFB},{0x5109, 0xBBFC},{0x510A, 0xE4F1},{0x510B, 0xE4EE},{0x510C, 0xE4EF},{0x5110, 0xBEAA},{0x5111, 0xE8F8},
+ {0x5112, 0xBEA7},{0x5113, 0xE8F5},{0x5114, 0xBEA9},{0x5115, 0xBEAB},{0x5117, 0xE8F6},{0x5118, 0xBEA8},{0x511A, 0xE8F7},{0x511C, 0xE8F4},
+ {0x511F, 0xC076},{0x5120, 0xECBD},{0x5121, 0xC077},{0x5122, 0xECBB},{0x5124, 0xECBC},{0x5125, 0xECBA},{0x5126, 0xECB9},{0x5129, 0xECBE},
+ {0x512A, 0xC075},{0x512D, 0xEFB8},{0x512E, 0xEFB9},{0x5130, 0xE4E8},{0x5131, 0xEFB7},{0x5132, 0xC078},{0x5133, 0xC35F},{0x5134, 0xF1EB},
+ {0x5135, 0xF1EC},{0x5137, 0xC4D7},{0x5138, 0xC4D8},{0x5139, 0xF5C1},{0x513A, 0xF5C0},{0x513B, 0xC56C},{0x513C, 0xC56B},{0x513D, 0xF7D0},
+ {0x513F, 0xA449},{0x5140, 0xA461},{0x5141, 0xA4B9},{0x5143, 0xA4B8},{0x5144, 0xA553},{0x5145, 0xA552},{0x5146, 0xA5FC},{0x5147, 0xA5FB},
+ {0x5148, 0xA5FD},{0x5149, 0xA5FA},{0x514B, 0xA74A},{0x514C, 0xA749},{0x514D, 0xA74B},{0x5152, 0xA8E0},{0x5154, 0xA8DF},{0x5155, 0xA8E1},
+ {0x5157, 0xAB5E},{0x5159, 0xA259},{0x515A, 0xD0DE},{0x515B, 0xA25A},{0x515C, 0xB0C2},{0x515D, 0xA25C},{0x515E, 0xA25B},{0x515F, 0xD860},
+ {0x5161, 0xA25D},{0x5162, 0xB9B8},{0x5163, 0xA25E},{0x5165, 0xA44A},{0x5167, 0xA4BA},{0x5168, 0xA5FE},{0x5169, 0xA8E2},{0x516B, 0xA44B},
+ {0x516C, 0xA4BD},{0x516D, 0xA4BB},{0x516E, 0xA4BC},{0x5171, 0xA640},{0x5175, 0xA74C},{0x5176, 0xA8E4},{0x5177, 0xA8E3},{0x5178, 0xA8E5},
+ {0x517C, 0xADDD},{0x5180, 0xBEAC},{0x5187, 0xC94E},{0x5189, 0xA554},{0x518A, 0xA555},{0x518D, 0xA641},{0x518F, 0xCA6A},{0x5191, 0xAB60},
+ {0x5192, 0xAB5F},{0x5193, 0xD0E0},{0x5194, 0xD0DF},{0x5195, 0xB0C3},{0x5197, 0xA4BE},{0x5198, 0xC955},{0x519E, 0xCBCD},{0x51A0, 0xAB61},
+ {0x51A2, 0xADE0},{0x51A4, 0xADDE},{0x51A5, 0xADDF},{0x51AA, 0xBEAD},{0x51AC, 0xA556},{0x51B0, 0xA642},{0x51B1, 0xC9BC},{0x51B6, 0xA74D},
+ {0x51B7, 0xA74E},{0x51B9, 0xCA6B},{0x51BC, 0xCBCE},{0x51BD, 0xA8E6},{0x51BE, 0xCBCF},{0x51C4, 0xD0E2},{0x51C5, 0xD0E3},{0x51C6, 0xADE3},
+ {0x51C8, 0xD0E4},{0x51CA, 0xD0E1},{0x51CB, 0xADE4},{0x51CC, 0xADE2},{0x51CD, 0xADE1},{0x51CE, 0xD0E5},{0x51D0, 0xD468},{0x51D4, 0xD861},
+ {0x51D7, 0xDCC5},{0x51D8, 0xE140},{0x51DC, 0xBBFE},{0x51DD, 0xBEAE},{0x51DE, 0xE8F9},{0x51E0, 0xA44C},{0x51E1, 0xA45A},{0x51F0, 0xB0C4},
+ {0x51F1, 0xB3CD},{0x51F3, 0xB9B9},{0x51F5, 0xC942},{0x51F6, 0xA4BF},{0x51F8, 0xA559},{0x51F9, 0xA557},{0x51FA, 0xA558},{0x51FD, 0xA8E7},
+ {0x5200, 0xA44D},{0x5201, 0xA44E},{0x5203, 0xA462},{0x5206, 0xA4C0},{0x5207, 0xA4C1},{0x5208, 0xA4C2},{0x5209, 0xC9BE},{0x520A, 0xA55A},
+ {0x520C, 0xC96B},{0x520E, 0xA646},{0x5210, 0xC9BF},{0x5211, 0xA644},{0x5212, 0xA645},{0x5213, 0xC9BD},{0x5216, 0xA647},{0x5217, 0xA643},
+ {0x521C, 0xCA6C},{0x521D, 0xAAEC},{0x521E, 0xCA6D},{0x5221, 0xCA6E},{0x5224, 0xA750},{0x5225, 0xA74F},{0x5228, 0xA753},{0x5229, 0xA751},
+ {0x522A, 0xA752},{0x522E, 0xA8ED},{0x5230, 0xA8EC},{0x5231, 0xCBD4},{0x5232, 0xCBD1},{0x5233, 0xCBD2},{0x5235, 0xCBD0},{0x5236, 0xA8EE},
+ {0x5237, 0xA8EA},{0x5238, 0xA8E9},{0x523A, 0xA8EB},{0x523B, 0xA8E8},{0x5241, 0xA8EF},{0x5243, 0xAB63},{0x5244, 0xCDF0},{0x5246, 0xCBD3},
+ {0x5247, 0xAB68},{0x5249, 0xCDF1},{0x524A, 0xAB64},{0x524B, 0xAB67},{0x524C, 0xAB66},{0x524D, 0xAB65},{0x524E, 0xAB62},{0x5252, 0xD0E8},
+ {0x5254, 0xADE7},{0x5255, 0xD0EB},{0x5256, 0xADE5},{0x525A, 0xD0E7},{0x525B, 0xADE8},{0x525C, 0xADE6},{0x525D, 0xADE9},{0x525E, 0xD0E9},
+ {0x525F, 0xD0EA},{0x5261, 0xD0E6},{0x5262, 0xD0EC},{0x5269, 0xB3D1},{0x526A, 0xB0C5},{0x526B, 0xD469},{0x526C, 0xD46B},{0x526D, 0xD46A},
+ {0x526E, 0xD46C},{0x526F, 0xB0C6},{0x5272, 0xB3CE},{0x5274, 0xB3CF},{0x5275, 0xB3D0},{0x5277, 0xB6D0},{0x5278, 0xDCC7},{0x527A, 0xDCC6},
+ {0x527B, 0xDCC8},{0x527C, 0xDCC9},{0x527D, 0xB6D1},{0x527F, 0xB6CF},{0x5280, 0xE141},{0x5281, 0xE142},{0x5282, 0xB9BB},{0x5283, 0xB9BA},
+ {0x5284, 0xE35A},{0x5287, 0xBC40},{0x5288, 0xBC41},{0x5289, 0xBC42},{0x528A, 0xBC44},{0x528B, 0xE4F2},{0x528C, 0xE4F3},{0x528D, 0xBC43},
+ {0x5291, 0xBEAF},{0x5293, 0xBEB0},{0x5296, 0xF1ED},{0x5297, 0xF5C3},{0x5298, 0xF5C2},{0x5299, 0xF7D1},{0x529B, 0xA44F},{0x529F, 0xA55C},
+ {0x52A0, 0xA55B},{0x52A3, 0xA648},{0x52A6, 0xC9C0},{0x52A9, 0xA755},{0x52AA, 0xA756},{0x52AB, 0xA754},{0x52AC, 0xA757},{0x52AD, 0xCA6F},
+ {0x52AE, 0xCA70},{0x52BB, 0xA8F1},{0x52BC, 0xCBD5},{0x52BE, 0xA8F0},{0x52C0, 0xCDF2},{0x52C1, 0xAB6C},{0x52C2, 0xCDF3},{0x52C3, 0xAB6B},
+ {0x52C7, 0xAB69},{0x52C9, 0xAB6A},{0x52CD, 0xD0ED},{0x52D2, 0xB0C7},{0x52D3, 0xD46E},{0x52D5, 0xB0CA},{0x52D6, 0xD46D},{0x52D7, 0xB1E5},
+ {0x52D8, 0xB0C9},{0x52D9, 0xB0C8},{0x52DB, 0xB3D4},{0x52DD, 0xB3D3},{0x52DE, 0xB3D2},{0x52DF, 0xB6D2},{0x52E2, 0xB6D5},{0x52E3, 0xB6D6},
+ {0x52E4, 0xB6D4},{0x52E6, 0xB6D3},{0x52E9, 0xE143},{0x52EB, 0xE144},{0x52EF, 0xE4F5},{0x52F0, 0xBC45},{0x52F1, 0xE4F4},{0x52F3, 0xBEB1},
+ {0x52F4, 0xECBF},{0x52F5, 0xC079},{0x52F7, 0xF1EE},{0x52F8, 0xC455},{0x52FA, 0xA463},{0x52FB, 0xA4C3},{0x52FC, 0xC956},{0x52FE, 0xA4C4},
+ {0x52FF, 0xA4C5},{0x5305, 0xA55D},{0x5306, 0xA55E},{0x5308, 0xA649},{0x5309, 0xCA71},{0x530A, 0xCBD6},{0x530B, 0xCBD7},{0x530D, 0xAB6D},
+ {0x530E, 0xD0EE},{0x530F, 0xB0CC},{0x5310, 0xB0CB},{0x5311, 0xD863},{0x5312, 0xD862},{0x5315, 0xA450},{0x5316, 0xA4C6},{0x5317, 0xA55F},
+ {0x5319, 0xB0CD},{0x531A, 0xC943},{0x531C, 0xC96C},{0x531D, 0xA560},{0x531F, 0xC9C2},{0x5320, 0xA64B},{0x5321, 0xA64A},{0x5322, 0xC9C1},
+ {0x5323, 0xA758},{0x532A, 0xADEA},{0x532D, 0xD46F},{0x532F, 0xB6D7},{0x5330, 0xE145},{0x5331, 0xB9BC},{0x5334, 0xE8FA},{0x5337, 0xF3FD},
+ {0x5339, 0xA4C7},{0x533C, 0xCBD8},{0x533D, 0xCDF4},{0x533E, 0xB0D0},{0x533F, 0xB0CE},{0x5340, 0xB0CF},{0x5341, 0xA451},{0x5343, 0xA464},
+ {0x5344, 0xA2CD},{0x5345, 0xA4CA},{0x5347, 0xA4C9},{0x5348, 0xA4C8},{0x5349, 0xA563},{0x534A, 0xA562},{0x534C, 0xC96D},{0x534D, 0xC9C3},
+ {0x5351, 0xA8F5},{0x5352, 0xA8F2},{0x5353, 0xA8F4},{0x5354, 0xA8F3},{0x5357, 0xAB6E},{0x535A, 0xB3D5},{0x535C, 0xA452},{0x535E, 0xA4CB},
+ {0x5360, 0xA565},{0x5361, 0xA564},{0x5363, 0xCA72},{0x5366, 0xA8F6},{0x536C, 0xC957},{0x536E, 0xA567},{0x536F, 0xA566},{0x5370, 0xA64C},
+ {0x5371, 0xA64D},{0x5372, 0xCA73},{0x5373, 0xA759},{0x5375, 0xA75A},{0x5377, 0xA8F7},{0x5378, 0xA8F8},{0x5379, 0xA8F9},{0x537B, 0xAB6F},
+ {0x537C, 0xCDF5},{0x537F, 0xADEB},{0x5382, 0xC944},{0x5384, 0xA4CC},{0x538A, 0xC9C4},{0x538E, 0xCA74},{0x538F, 0xCA75},{0x5392, 0xCBD9},
+ {0x5394, 0xCBDA},{0x5396, 0xCDF7},{0x5397, 0xCDF6},{0x5398, 0xCDF9},{0x5399, 0xCDF8},{0x539A, 0xAB70},{0x539C, 0xD470},{0x539D, 0xADED},
+ {0x539E, 0xD0EF},{0x539F, 0xADEC},{0x53A4, 0xD864},{0x53A5, 0xB3D6},{0x53A7, 0xD865},{0x53AC, 0xE146},{0x53AD, 0xB9BD},{0x53B2, 0xBC46},
+ {0x53B4, 0xF1EF},{0x53B9, 0xC958},{0x53BB, 0xA568},{0x53C3, 0xB0D1},{0x53C8, 0xA453},{0x53C9, 0xA465},{0x53CA, 0xA4CE},{0x53CB, 0xA4CD},
+ {0x53CD, 0xA4CF},{0x53D4, 0xA8FB},{0x53D6, 0xA8FA},{0x53D7, 0xA8FC},{0x53DB, 0xAB71},{0x53DF, 0xADEE},{0x53E1, 0xE8FB},{0x53E2, 0xC24F},
+ {0x53E3, 0xA466},{0x53E4, 0xA56A},{0x53E5, 0xA579},{0x53E6, 0xA574},{0x53E8, 0xA56F},{0x53E9, 0xA56E},{0x53EA, 0xA575},{0x53EB, 0xA573},
+ {0x53EC, 0xA56C},{0x53ED, 0xA57A},{0x53EE, 0xA56D},{0x53EF, 0xA569},{0x53F0, 0xA578},{0x53F1, 0xA577},{0x53F2, 0xA576},{0x53F3, 0xA56B},
+ {0x53F5, 0xA572},{0x53F8, 0xA571},{0x53FB, 0xA57B},{0x53FC, 0xA570},{0x5401, 0xA653},{0x5403, 0xA659},{0x5404, 0xA655},{0x5406, 0xA65B},
+ {0x5407, 0xC9C5},{0x5408, 0xA658},{0x5409, 0xA64E},{0x540A, 0xA651},{0x540B, 0xA654},{0x540C, 0xA650},{0x540D, 0xA657},{0x540E, 0xA65A},
+ {0x540F, 0xA64F},{0x5410, 0xA652},{0x5411, 0xA656},{0x5412, 0xA65C},{0x5418, 0xCA7E},{0x5419, 0xCA7B},{0x541B, 0xA767},{0x541C, 0xCA7C},
+ {0x541D, 0xA75B},{0x541E, 0xA75D},{0x541F, 0xA775},{0x5420, 0xA770},{0x5424, 0xCAA5},{0x5425, 0xCA7D},{0x5426, 0xA75F},{0x5427, 0xA761},
+ {0x5428, 0xCAA4},{0x5429, 0xA768},{0x542A, 0xCA78},{0x542B, 0xA774},{0x542C, 0xA776},{0x542D, 0xA75C},{0x542E, 0xA76D},{0x5430, 0xCA76},
+ {0x5431, 0xA773},{0x5433, 0xA764},{0x5435, 0xA76E},{0x5436, 0xA76F},{0x5437, 0xCA77},{0x5438, 0xA76C},{0x5439, 0xA76A},{0x543B, 0xA76B},
+ {0x543C, 0xA771},{0x543D, 0xCAA1},{0x543E, 0xA75E},{0x5440, 0xA772},{0x5441, 0xCAA3},{0x5442, 0xA766},{0x5443, 0xA763},{0x5445, 0xCA7A},
+ {0x5446, 0xA762},{0x5447, 0xCAA6},{0x5448, 0xA765},{0x544A, 0xA769},{0x544E, 0xA760},{0x544F, 0xCAA2},{0x5454, 0xCA79},{0x5460, 0xCBEB},
+ {0x5461, 0xCBEA},{0x5462, 0xA94F},{0x5463, 0xCBED},{0x5464, 0xCBEF},{0x5465, 0xCBE4},{0x5466, 0xCBE7},{0x5467, 0xCBEE},{0x5468, 0xA950},
+ {0x546B, 0xCBE1},{0x546C, 0xCBE5},{0x546F, 0xCBE9},{0x5470, 0xCE49},{0x5471, 0xA94B},{0x5472, 0xCE4D},{0x5473, 0xA8FD},{0x5474, 0xCBE6},
+ {0x5475, 0xA8FE},{0x5476, 0xA94C},{0x5477, 0xA945},{0x5478, 0xA941},{0x547A, 0xCBE2},{0x547B, 0xA944},{0x547C, 0xA949},{0x547D, 0xA952},
+ {0x547E, 0xCBE3},{0x547F, 0xCBDC},{0x5480, 0xA943},{0x5481, 0xCBDD},{0x5482, 0xCBDF},{0x5484, 0xA946},{0x5486, 0xA948},{0x5487, 0xCBDB},
+ {0x5488, 0xCBE0},{0x548B, 0xA951},{0x548C, 0xA94D},{0x548D, 0xCBE8},{0x548E, 0xA953},{0x5490, 0xA94A},{0x5491, 0xCBDE},{0x5492, 0xA947},
+ {0x5495, 0xA942},{0x5496, 0xA940},{0x5498, 0xCBEC},{0x549A, 0xA94E},{0x54A0, 0xCE48},{0x54A1, 0xCDFB},{0x54A2, 0xCE4B},{0x54A5, 0xCDFD},
+ {0x54A6, 0xAB78},{0x54A7, 0xABA8},{0x54A8, 0xAB74},{0x54A9, 0xABA7},{0x54AA, 0xAB7D},{0x54AB, 0xABA4},{0x54AC, 0xAB72},{0x54AD, 0xCDFC},
+ {0x54AE, 0xCE43},{0x54AF, 0xABA3},{0x54B0, 0xCE4F},{0x54B1, 0xABA5},{0x54B3, 0xAB79},{0x54B6, 0xCE45},{0x54B7, 0xCE42},{0x54B8, 0xAB77},
+ {0x54BA, 0xCDFA},{0x54BB, 0xABA6},{0x54BC, 0xCE4A},{0x54BD, 0xAB7C},{0x54BE, 0xCE4C},{0x54BF, 0xABA9},{0x54C0, 0xAB73},{0x54C1, 0xAB7E},
+ {0x54C2, 0xAB7B},{0x54C3, 0xCE40},{0x54C4, 0xABA1},{0x54C5, 0xCE46},{0x54C6, 0xCE47},{0x54C7, 0xAB7A},{0x54C8, 0xABA2},{0x54C9, 0xAB76},
+ {0x54CE, 0xAB75},{0x54CF, 0xCDFE},{0x54D6, 0xCE44},{0x54DE, 0xCE4E},{0x54E0, 0xD144},{0x54E1, 0xADFB},{0x54E2, 0xD0F1},{0x54E4, 0xD0F6},
+ {0x54E5, 0xADF4},{0x54E6, 0xAE40},{0x54E7, 0xD0F4},{0x54E8, 0xADEF},{0x54E9, 0xADF9},{0x54EA, 0xADFE},{0x54EB, 0xD0FB},{0x54ED, 0xADFA},
+ {0x54EE, 0xADFD},{0x54F1, 0xD0FE},{0x54F2, 0xADF5},{0x54F3, 0xD0F5},{0x54F7, 0xD142},{0x54F8, 0xD143},{0x54FA, 0xADF7},{0x54FB, 0xD141},
+ {0x54FC, 0xADF3},{0x54FD, 0xAE43},{0x54FF, 0xD0F8},{0x5501, 0xADF1},{0x5503, 0xD146},{0x5504, 0xD0F9},{0x5505, 0xD0FD},{0x5506, 0xADF6},
+ {0x5507, 0xAE42},{0x5508, 0xD0FA},{0x5509, 0xADFC},{0x550A, 0xD140},{0x550B, 0xD147},{0x550C, 0xD4A1},{0x550E, 0xD145},{0x550F, 0xAE44},
+ {0x5510, 0xADF0},{0x5511, 0xD0FC},{0x5512, 0xD0F3},{0x5514, 0xADF8},{0x5517, 0xD0F2},{0x551A, 0xD0F7},{0x5526, 0xD0F0},{0x5527, 0xAE41},
+ {0x552A, 0xD477},{0x552C, 0xB0E4},{0x552D, 0xD4A7},{0x552E, 0xB0E2},{0x552F, 0xB0DF},{0x5530, 0xD47C},{0x5531, 0xB0DB},{0x5532, 0xD4A2},
+ {0x5533, 0xB0E6},{0x5534, 0xD476},{0x5535, 0xD47B},{0x5536, 0xD47A},{0x5537, 0xADF2},{0x5538, 0xB0E1},{0x5539, 0xD4A5},{0x553B, 0xD4A8},
+ {0x553C, 0xD473},{0x553E, 0xB3E8},{0x5540, 0xD4A9},{0x5541, 0xB0E7},{0x5543, 0xB0D9},{0x5544, 0xB0D6},{0x5545, 0xD47E},{0x5546, 0xB0D3},
+ {0x5548, 0xD4A6},{0x554A, 0xB0DA},{0x554B, 0xD4AA},{0x554D, 0xD474},{0x554E, 0xD4A4},{0x554F, 0xB0DD},{0x5550, 0xD475},{0x5551, 0xD478},
+ {0x5552, 0xD47D},{0x5555, 0xB0DE},{0x5556, 0xB0DC},{0x5557, 0xB0E8},{0x555C, 0xB0E3},{0x555E, 0xB0D7},{0x555F, 0xB1D2},{0x5561, 0xB0D8},
+ {0x5562, 0xD479},{0x5563, 0xB0E5},{0x5564, 0xB0E0},{0x5565, 0xD4A3},{0x5566, 0xB0D5},{0x556A, 0xB0D4},{0x5575, 0xD471},{0x5576, 0xD472},
+ {0x5577, 0xD86A},{0x557B, 0xB3D7},{0x557C, 0xB3DA},{0x557D, 0xD875},{0x557E, 0xB3EE},{0x557F, 0xD878},{0x5580, 0xB3D8},{0x5581, 0xD871},
+ {0x5582, 0xB3DE},{0x5583, 0xB3E4},{0x5584, 0xB5BD},{0x5587, 0xB3E2},{0x5588, 0xD86E},{0x5589, 0xB3EF},{0x558A, 0xB3DB},{0x558B, 0xB3E3},
+ {0x558C, 0xD876},{0x558D, 0xDCD7},{0x558E, 0xD87B},{0x558F, 0xD86F},{0x5591, 0xD866},{0x5592, 0xD873},{0x5593, 0xD86D},{0x5594, 0xB3E1},
+ {0x5595, 0xD879},{0x5598, 0xB3DD},{0x5599, 0xB3F1},{0x559A, 0xB3EA},{0x559C, 0xB3DF},{0x559D, 0xB3DC},{0x559F, 0xB3E7},{0x55A1, 0xD87A},
+ {0x55A2, 0xD86C},{0x55A3, 0xD872},{0x55A4, 0xD874},{0x55A5, 0xD868},{0x55A6, 0xD877},{0x55A7, 0xB3D9},{0x55A8, 0xD867},{0x55AA, 0xB3E0},
+ {0x55AB, 0xB3F0},{0x55AC, 0xB3EC},{0x55AD, 0xD869},{0x55AE, 0xB3E6},{0x55B1, 0xB3ED},{0x55B2, 0xB3E9},{0x55B3, 0xB3E5},{0x55B5, 0xD870},
+ {0x55BB, 0xB3EB},{0x55BF, 0xDCD5},{0x55C0, 0xDCD1},{0x55C2, 0xDCE0},{0x55C3, 0xDCCA},{0x55C4, 0xDCD3},{0x55C5, 0xB6E5},{0x55C6, 0xB6E6},
+ {0x55C7, 0xB6DE},{0x55C8, 0xDCDC},{0x55C9, 0xB6E8},{0x55CA, 0xDCCF},{0x55CB, 0xDCCE},{0x55CC, 0xDCCC},{0x55CD, 0xDCDE},{0x55CE, 0xB6DC},
+ {0x55CF, 0xDCD8},{0x55D0, 0xDCCD},{0x55D1, 0xB6DF},{0x55D2, 0xDCD6},{0x55D3, 0xB6DA},{0x55D4, 0xDCD2},{0x55D5, 0xDCD9},{0x55D6, 0xDCDB},
+ {0x55D9, 0xDCDF},{0x55DA, 0xB6E3},{0x55DB, 0xDCCB},{0x55DC, 0xB6DD},{0x55DD, 0xDCD0},{0x55DF, 0xB6D8},{0x55E1, 0xB6E4},{0x55E2, 0xDCDA},
+ {0x55E3, 0xB6E0},{0x55E4, 0xB6E1},{0x55E5, 0xB6E7},{0x55E6, 0xB6DB},{0x55E7, 0xA25F},{0x55E8, 0xB6D9},{0x55E9, 0xDCD4},{0x55EF, 0xB6E2},
+ {0x55F2, 0xDCDD},{0x55F6, 0xB9CD},{0x55F7, 0xB9C8},{0x55F9, 0xE155},{0x55FA, 0xE151},{0x55FC, 0xE14B},{0x55FD, 0xB9C2},{0x55FE, 0xB9BE},
+ {0x55FF, 0xE154},{0x5600, 0xB9BF},{0x5601, 0xE14E},{0x5602, 0xE150},{0x5604, 0xE153},{0x5606, 0xB9C4},{0x5608, 0xB9CB},{0x5609, 0xB9C5},
+ {0x560C, 0xE149},{0x560D, 0xB9C6},{0x560E, 0xB9C7},{0x560F, 0xE14C},{0x5610, 0xB9CC},{0x5612, 0xE14A},{0x5613, 0xE14F},{0x5614, 0xB9C3},
+ {0x5615, 0xE148},{0x5616, 0xB9C9},{0x5617, 0xB9C1},{0x561B, 0xB9C0},{0x561C, 0xE14D},{0x561D, 0xE152},{0x561F, 0xB9CA},{0x5627, 0xE147},
+ {0x5629, 0xBC4D},{0x562A, 0xE547},{0x562C, 0xE544},{0x562E, 0xBC47},{0x562F, 0xBC53},{0x5630, 0xBC54},{0x5632, 0xBC4A},{0x5633, 0xE542},
+ {0x5634, 0xBC4C},{0x5635, 0xE4F9},{0x5636, 0xBC52},{0x5638, 0xE546},{0x5639, 0xBC49},{0x563A, 0xE548},{0x563B, 0xBC48},{0x563D, 0xE543},
+ {0x563E, 0xE545},{0x563F, 0xBC4B},{0x5640, 0xE541},{0x5641, 0xE4FA},{0x5642, 0xE4F7},{0x5645, 0xD86B},{0x5646, 0xE4FD},{0x5648, 0xE4F6},
+ {0x5649, 0xE4FC},{0x564A, 0xE4FB},{0x564C, 0xE4F8},{0x564E, 0xBC4F},{0x5653, 0xBC4E},{0x5657, 0xBC50},{0x5658, 0xE4FE},{0x5659, 0xBEB2},
+ {0x565A, 0xE540},{0x565E, 0xE945},{0x5660, 0xE8FD},{0x5662, 0xBEBE},{0x5663, 0xE942},{0x5664, 0xBEB6},{0x5665, 0xBEBA},{0x5666, 0xE941},
+ {0x5668, 0xBEB9},{0x5669, 0xBEB5},{0x566A, 0xBEB8},{0x566B, 0xBEB3},{0x566C, 0xBEBD},{0x566D, 0xE943},{0x566E, 0xE8FE},{0x566F, 0xBEBC},
+ {0x5670, 0xE8FC},{0x5671, 0xBEBB},{0x5672, 0xE944},{0x5673, 0xE940},{0x5674, 0xBC51},{0x5676, 0xBEBF},{0x5677, 0xE946},{0x5678, 0xBEB7},
+ {0x5679, 0xBEB4},{0x567E, 0xECC6},{0x567F, 0xECC8},{0x5680, 0xC07B},{0x5681, 0xECC9},{0x5682, 0xECC7},{0x5683, 0xECC5},{0x5684, 0xECC4},
+ {0x5685, 0xC07D},{0x5686, 0xECC3},{0x5687, 0xC07E},{0x568C, 0xECC1},{0x568D, 0xECC2},{0x568E, 0xC07A},{0x568F, 0xC0A1},{0x5690, 0xC07C},
+ {0x5693, 0xECC0},{0x5695, 0xC250},{0x5697, 0xEFBC},{0x5698, 0xEFBA},{0x5699, 0xEFBF},{0x569A, 0xEFBD},{0x569C, 0xEFBB},{0x569D, 0xEFBE},
+ {0x56A5, 0xC360},{0x56A6, 0xF1F2},{0x56A7, 0xF1F3},{0x56A8, 0xC456},{0x56AA, 0xF1F4},{0x56AB, 0xF1F0},{0x56AC, 0xF1F5},{0x56AD, 0xF1F1},
+ {0x56AE, 0xC251},{0x56B2, 0xF3FE},{0x56B3, 0xF441},{0x56B4, 0xC459},{0x56B5, 0xF440},{0x56B6, 0xC458},{0x56B7, 0xC457},{0x56BC, 0xC45A},
+ {0x56BD, 0xF5C5},{0x56BE, 0xF5C6},{0x56C0, 0xC4DA},{0x56C1, 0xC4D9},{0x56C2, 0xC4DB},{0x56C3, 0xF5C4},{0x56C5, 0xF6D8},{0x56C6, 0xF6D7},
+ {0x56C8, 0xC56D},{0x56C9, 0xC56F},{0x56CA, 0xC56E},{0x56CB, 0xF6D9},{0x56CC, 0xC5C8},{0x56CD, 0xF8A6},{0x56D1, 0xC5F1},{0x56D3, 0xF8A5},
+ {0x56D4, 0xF8EE},{0x56D7, 0xC949},{0x56DA, 0xA57D},{0x56DB, 0xA57C},{0x56DD, 0xA65F},{0x56DE, 0xA65E},{0x56DF, 0xC9C7},{0x56E0, 0xA65D},
+ {0x56E1, 0xC9C6},{0x56E4, 0xA779},{0x56E5, 0xCAA9},{0x56E7, 0xCAA8},{0x56EA, 0xA777},{0x56EB, 0xA77A},{0x56EE, 0xCAA7},{0x56F0, 0xA778},
+ {0x56F7, 0xCBF0},{0x56F9, 0xCBF1},{0x56FA, 0xA954},{0x56FF, 0xABAA},{0x5701, 0xD148},{0x5702, 0xD149},{0x5703, 0xAE45},{0x5704, 0xAE46},
+ {0x5707, 0xD4AC},{0x5708, 0xB0E9},{0x5709, 0xB0EB},{0x570A, 0xD4AB},{0x570B, 0xB0EA},{0x570C, 0xD87C},{0x570D, 0xB3F2},{0x5712, 0xB6E9},
+ {0x5713, 0xB6EA},{0x5714, 0xDCE1},{0x5716, 0xB9CF},{0x5718, 0xB9CE},{0x571A, 0xE549},{0x571B, 0xE948},{0x571C, 0xE947},{0x571E, 0xF96B},
+ {0x571F, 0xA467},{0x5720, 0xC959},{0x5722, 0xC96E},{0x5723, 0xC96F},{0x5728, 0xA662},{0x5729, 0xA666},{0x572A, 0xC9C9},{0x572C, 0xA664},
+ {0x572D, 0xA663},{0x572E, 0xC9C8},{0x572F, 0xA665},{0x5730, 0xA661},{0x5733, 0xA660},{0x5734, 0xC9CA},{0x573B, 0xA7A6},{0x573E, 0xA7A3},
+ {0x5740, 0xA77D},{0x5741, 0xCAAA},{0x5745, 0xCAAB},{0x5747, 0xA7A1},{0x5749, 0xCAAD},{0x574A, 0xA77B},{0x574B, 0xCAAE},{0x574C, 0xCAAC},
+ {0x574D, 0xA77E},{0x574E, 0xA7A2},{0x574F, 0xA7A5},{0x5750, 0xA7A4},{0x5751, 0xA77C},{0x5752, 0xCAAF},{0x5761, 0xA959},{0x5762, 0xCBFE},
+ {0x5764, 0xA95B},{0x5766, 0xA95A},{0x5768, 0xCC40},{0x5769, 0xA958},{0x576A, 0xA957},{0x576B, 0xCBF5},{0x576D, 0xCBF4},{0x576F, 0xCBF2},
+ {0x5770, 0xCBF7},{0x5771, 0xCBF6},{0x5772, 0xCBF3},{0x5773, 0xCBFC},{0x5774, 0xCBFD},{0x5775, 0xCBFA},{0x5776, 0xCBF8},{0x5777, 0xA956},
+ {0x577B, 0xCBFB},{0x577C, 0xA95C},{0x577D, 0xCC41},{0x5780, 0xCBF9},{0x5782, 0xABAB},{0x5783, 0xA955},{0x578B, 0xABAC},{0x578C, 0xCE54},
+ {0x578F, 0xCE5A},{0x5793, 0xABB2},{0x5794, 0xCE58},{0x5795, 0xCE5E},{0x5797, 0xCE55},{0x5798, 0xCE59},{0x5799, 0xCE5B},{0x579A, 0xCE5D},
+ {0x579B, 0xCE57},{0x579D, 0xCE56},{0x579E, 0xCE51},{0x579F, 0xCE52},{0x57A0, 0xABAD},{0x57A2, 0xABAF},{0x57A3, 0xABAE},{0x57A4, 0xCE53},
+ {0x57A5, 0xCE5C},{0x57AE, 0xABB1},{0x57B5, 0xCE50},{0x57B6, 0xD153},{0x57B8, 0xD152},{0x57B9, 0xD157},{0x57BA, 0xD14E},{0x57BC, 0xD151},
+ {0x57BD, 0xD150},{0x57BF, 0xD154},{0x57C1, 0xD158},{0x57C2, 0xAE47},{0x57C3, 0xAE4A},{0x57C6, 0xD14F},{0x57C7, 0xD155},{0x57CB, 0xAE49},
+ {0x57CC, 0xD14A},{0x57CE, 0xABB0},{0x57CF, 0xD4BA},{0x57D0, 0xD156},{0x57D2, 0xD14D},{0x57D4, 0xAE48},{0x57D5, 0xD14C},{0x57DC, 0xD4B1},
+ {0x57DF, 0xB0EC},{0x57E0, 0xB0F0},{0x57E1, 0xD4C1},{0x57E2, 0xD4AF},{0x57E3, 0xD4BD},{0x57E4, 0xB0F1},{0x57E5, 0xD4BF},{0x57E7, 0xD4C5},
+ {0x57E9, 0xD4C9},{0x57EC, 0xD4C0},{0x57ED, 0xD4B4},{0x57EE, 0xD4BC},{0x57F0, 0xD4CA},{0x57F1, 0xD4C8},{0x57F2, 0xD4BE},{0x57F3, 0xD4B9},
+ {0x57F4, 0xD4B2},{0x57F5, 0xD8A6},{0x57F6, 0xD4B0},{0x57F7, 0xB0F5},{0x57F8, 0xD4B7},{0x57F9, 0xB0F6},{0x57FA, 0xB0F2},{0x57FB, 0xD4AD},
+ {0x57FC, 0xD4C3},{0x57FD, 0xD4B5},{0x5800, 0xD4B3},{0x5801, 0xD4C6},{0x5802, 0xB0F3},{0x5804, 0xD4CC},{0x5805, 0xB0ED},{0x5806, 0xB0EF},
+ {0x5807, 0xD4BB},{0x5808, 0xD4B6},{0x5809, 0xAE4B},{0x580A, 0xB0EE},{0x580B, 0xD4B8},{0x580C, 0xD4C7},{0x580D, 0xD4CB},{0x580E, 0xD4C2},
+ {0x5810, 0xD4C4},{0x5814, 0xD4AE},{0x5819, 0xD8A1},{0x581B, 0xD8AA},{0x581C, 0xD8A9},{0x581D, 0xB3FA},{0x581E, 0xD8A2},{0x5820, 0xB3FB},
+ {0x5821, 0xB3F9},{0x5823, 0xD8A4},{0x5824, 0xB3F6},{0x5825, 0xD8A8},{0x5827, 0xD8A3},{0x5828, 0xD8A5},{0x5829, 0xD87D},{0x582A, 0xB3F4},
+ {0x582C, 0xD8B2},{0x582D, 0xD8B1},{0x582E, 0xD8AE},{0x582F, 0xB3F3},{0x5830, 0xB3F7},{0x5831, 0xB3F8},{0x5832, 0xD14B},{0x5833, 0xD8AB},
+ {0x5834, 0xB3F5},{0x5835, 0xB0F4},{0x5836, 0xD8AD},{0x5837, 0xD87E},{0x5838, 0xD8B0},{0x5839, 0xD8AF},{0x583B, 0xD8B3},{0x583D, 0xDCEF},
+ {0x583F, 0xD8AC},{0x5848, 0xD8A7},{0x5849, 0xDCE7},{0x584A, 0xB6F4},{0x584B, 0xB6F7},{0x584C, 0xB6F2},{0x584D, 0xDCE6},{0x584E, 0xDCEA},
+ {0x584F, 0xDCE5},{0x5851, 0xB6EC},{0x5852, 0xB6F6},{0x5853, 0xDCE2},{0x5854, 0xB6F0},{0x5855, 0xDCE9},{0x5857, 0xB6EE},{0x5858, 0xB6ED},
+ {0x5859, 0xDCEC},{0x585A, 0xB6EF},{0x585B, 0xDCEE},{0x585D, 0xDCEB},{0x585E, 0xB6EB},{0x5862, 0xB6F5},{0x5863, 0xDCF0},{0x5864, 0xDCE4},
+ {0x5865, 0xDCED},{0x5868, 0xDCE3},{0x586B, 0xB6F1},{0x586D, 0xB6F3},{0x586F, 0xDCE8},{0x5871, 0xDCF1},{0x5874, 0xE15D},{0x5875, 0xB9D0},
+ {0x5876, 0xE163},{0x5879, 0xB9D5},{0x587A, 0xE15F},{0x587B, 0xE166},{0x587C, 0xE157},{0x587D, 0xB9D7},{0x587E, 0xB9D1},{0x587F, 0xE15C},
+ {0x5880, 0xBC55},{0x5881, 0xE15B},{0x5882, 0xE164},{0x5883, 0xB9D2},{0x5885, 0xB9D6},{0x5886, 0xE15A},{0x5887, 0xE160},{0x5888, 0xE165},
+ {0x5889, 0xE156},{0x588A, 0xB9D4},{0x588B, 0xE15E},{0x588E, 0xE162},{0x588F, 0xE168},{0x5890, 0xE158},{0x5891, 0xE161},{0x5893, 0xB9D3},
+ {0x5894, 0xE167},{0x5898, 0xE159},{0x589C, 0xBC59},{0x589D, 0xE54B},{0x589E, 0xBC57},{0x589F, 0xBC56},{0x58A0, 0xE54D},{0x58A1, 0xE552},
+ {0x58A3, 0xE54E},{0x58A5, 0xE551},{0x58A6, 0xBC5C},{0x58A8, 0xBEA5},{0x58A9, 0xBC5B},{0x58AB, 0xE54A},{0x58AC, 0xE550},{0x58AE, 0xBC5A},
+ {0x58AF, 0xE54F},{0x58B1, 0xE54C},{0x58B3, 0xBC58},{0x58BA, 0xE94D},{0x58BC, 0xE94F},{0x58BD, 0xE94A},{0x58BE, 0xBEC1},{0x58BF, 0xE94C},
+ {0x58C1, 0xBEC0},{0x58C2, 0xE94E},{0x58C5, 0xBEC3},{0x58C6, 0xE950},{0x58C7, 0xBEC2},{0x58C8, 0xE949},{0x58C9, 0xE94B},{0x58CE, 0xC0A5},
+ {0x58CF, 0xECCC},{0x58D1, 0xC0A4},{0x58D2, 0xECCD},{0x58D3, 0xC0A3},{0x58D4, 0xECCB},{0x58D5, 0xC0A2},{0x58D6, 0xECCA},{0x58D8, 0xC253},
+ {0x58D9, 0xC252},{0x58DA, 0xF1F6},{0x58DB, 0xF1F8},{0x58DD, 0xF1F7},{0x58DE, 0xC361},{0x58DF, 0xC362},{0x58E2, 0xC363},{0x58E3, 0xF442},
+ {0x58E4, 0xC45B},{0x58E7, 0xF7D3},{0x58E8, 0xF7D2},{0x58E9, 0xC5F2},{0x58EB, 0xA468},{0x58EC, 0xA4D0},{0x58EF, 0xA7A7},{0x58F4, 0xCE5F},
+ {0x58F9, 0xB3FC},{0x58FA, 0xB3FD},{0x58FC, 0xDCF2},{0x58FD, 0xB9D8},{0x58FE, 0xE169},{0x58FF, 0xE553},{0x5903, 0xC95A},{0x5906, 0xCAB0},
+ {0x590C, 0xCC42},{0x590D, 0xCE60},{0x590E, 0xD159},{0x590F, 0xAE4C},{0x5912, 0xF1F9},{0x5914, 0xC4DC},{0x5915, 0xA469},{0x5916, 0xA57E},
+ {0x5917, 0xC970},{0x5919, 0xA667},{0x591A, 0xA668},{0x591C, 0xA95D},{0x5920, 0xB0F7},{0x5922, 0xB9DA},{0x5924, 0xB9DB},{0x5925, 0xB9D9},
+ {0x5927, 0xA46A},{0x5929, 0xA4D1},{0x592A, 0xA4D3},{0x592B, 0xA4D2},{0x592C, 0xC95B},{0x592D, 0xA4D4},{0x592E, 0xA5A1},{0x592F, 0xC971},
+ {0x5931, 0xA5A2},{0x5937, 0xA669},{0x5938, 0xA66A},{0x593C, 0xC9CB},{0x593E, 0xA7A8},{0x5940, 0xCAB1},{0x5944, 0xA961},{0x5945, 0xCC43},
+ {0x5947, 0xA95F},{0x5948, 0xA960},{0x5949, 0xA95E},{0x594A, 0xD15A},{0x594E, 0xABB6},{0x594F, 0xABB5},{0x5950, 0xABB7},{0x5951, 0xABB4},
+ {0x5953, 0xCE61},{0x5954, 0xA962},{0x5955, 0xABB3},{0x5957, 0xAE4D},{0x5958, 0xAE4E},{0x595A, 0xAE4F},{0x595C, 0xD4CD},{0x5960, 0xB3FE},
+ {0x5961, 0xD8B4},{0x5962, 0xB0F8},{0x5967, 0xB6F8},{0x5969, 0xB9DD},{0x596A, 0xB9DC},{0x596B, 0xE16A},{0x596D, 0xBC5D},{0x596E, 0xBEC4},
+ {0x5970, 0xEFC0},{0x5971, 0xF6DA},{0x5972, 0xF7D4},{0x5973, 0xA46B},{0x5974, 0xA5A3},{0x5976, 0xA5A4},{0x5977, 0xC9D1},{0x5978, 0xA66C},
+ {0x5979, 0xA66F},{0x597B, 0xC9CF},{0x597C, 0xC9CD},{0x597D, 0xA66E},{0x597E, 0xC9D0},{0x597F, 0xC9D2},{0x5980, 0xC9CC},{0x5981, 0xA671},
+ {0x5982, 0xA670},{0x5983, 0xA66D},{0x5984, 0xA66B},{0x5985, 0xC9CE},{0x598A, 0xA7B3},{0x598D, 0xA7B0},{0x598E, 0xCAB6},{0x598F, 0xCAB9},
+ {0x5990, 0xCAB8},{0x5992, 0xA7AA},{0x5993, 0xA7B2},{0x5996, 0xA7AF},{0x5997, 0xCAB5},{0x5998, 0xCAB3},{0x5999, 0xA7AE},{0x599D, 0xA7A9},
+ {0x599E, 0xA7AC},{0x59A0, 0xCAB4},{0x59A1, 0xCABB},{0x59A2, 0xCAB7},{0x59A3, 0xA7AD},{0x59A4, 0xA7B1},{0x59A5, 0xA7B4},{0x59A6, 0xCAB2},
+ {0x59A7, 0xCABA},{0x59A8, 0xA7AB},{0x59AE, 0xA967},{0x59AF, 0xA96F},{0x59B1, 0xCC4F},{0x59B2, 0xCC48},{0x59B3, 0xA970},{0x59B4, 0xCC53},
+ {0x59B5, 0xCC44},{0x59B6, 0xCC4B},{0x59B9, 0xA966},{0x59BA, 0xCC45},{0x59BB, 0xA964},{0x59BC, 0xCC4C},{0x59BD, 0xCC50},{0x59BE, 0xA963},
+ {0x59C0, 0xCC51},{0x59C1, 0xCC4A},{0x59C3, 0xCC4D},{0x59C5, 0xA972},{0x59C6, 0xA969},{0x59C7, 0xCC54},{0x59C8, 0xCC52},{0x59CA, 0xA96E},
+ {0x59CB, 0xA96C},{0x59CC, 0xCC49},{0x59CD, 0xA96B},{0x59CE, 0xCC47},{0x59CF, 0xCC46},{0x59D0, 0xA96A},{0x59D1, 0xA968},{0x59D2, 0xA971},
+ {0x59D3, 0xA96D},{0x59D4, 0xA965},{0x59D6, 0xCC4E},{0x59D8, 0xABB9},{0x59DA, 0xABC0},{0x59DB, 0xCE6F},{0x59DC, 0xABB8},{0x59DD, 0xCE67},
+ {0x59DE, 0xCE63},{0x59E0, 0xCE73},{0x59E1, 0xCE62},{0x59E3, 0xABBB},{0x59E4, 0xCE6C},{0x59E5, 0xABBE},{0x59E6, 0xABC1},{0x59E8, 0xABBC},
+ {0x59E9, 0xCE70},{0x59EA, 0xABBF},{0x59EC, 0xAE56},{0x59ED, 0xCE76},{0x59EE, 0xCE64},{0x59F1, 0xCE66},{0x59F2, 0xCE6D},{0x59F3, 0xCE71},
+ {0x59F4, 0xCE75},{0x59F5, 0xCE72},{0x59F6, 0xCE6B},{0x59F7, 0xCE6E},{0x59FA, 0xCE68},{0x59FB, 0xABC3},{0x59FC, 0xCE6A},{0x59FD, 0xCE69},
+ {0x59FE, 0xCE74},{0x59FF, 0xABBA},{0x5A00, 0xCE65},{0x5A01, 0xABC2},{0x5A03, 0xABBD},{0x5A09, 0xAE5C},{0x5A0A, 0xD162},{0x5A0C, 0xAE5B},
+ {0x5A0F, 0xD160},{0x5A11, 0xAE50},{0x5A13, 0xAE55},{0x5A15, 0xD15F},{0x5A16, 0xD15C},{0x5A17, 0xD161},{0x5A18, 0xAE51},{0x5A19, 0xD15B},
+ {0x5A1B, 0xAE54},{0x5A1C, 0xAE52},{0x5A1E, 0xD163},{0x5A1F, 0xAE53},{0x5A20, 0xAE57},{0x5A23, 0xAE58},{0x5A25, 0xAE5A},{0x5A29, 0xAE59},
+ {0x5A2D, 0xD15D},{0x5A2E, 0xD15E},{0x5A33, 0xD164},{0x5A35, 0xD4D4},{0x5A36, 0xB0F9},{0x5A37, 0xD8C2},{0x5A38, 0xD4D3},{0x5A39, 0xD4E6},
+ {0x5A3C, 0xB140},{0x5A3E, 0xD4E4},{0x5A40, 0xB0FE},{0x5A41, 0xB0FA},{0x5A42, 0xD4ED},{0x5A43, 0xD4DD},{0x5A44, 0xD4E0},{0x5A46, 0xB143},
+ {0x5A47, 0xD4EA},{0x5A48, 0xD4E2},{0x5A49, 0xB0FB},{0x5A4A, 0xB144},{0x5A4C, 0xD4E7},{0x5A4D, 0xD4E5},{0x5A50, 0xD4D6},{0x5A51, 0xD4EB},
+ {0x5A52, 0xD4DF},{0x5A53, 0xD4DA},{0x5A55, 0xD4D0},{0x5A56, 0xD4EC},{0x5A57, 0xD4DC},{0x5A58, 0xD4CF},{0x5A5A, 0xB142},{0x5A5B, 0xD4E1},
+ {0x5A5C, 0xD4EE},{0x5A5D, 0xD4DE},{0x5A5E, 0xD4D2},{0x5A5F, 0xD4D7},{0x5A60, 0xD4CE},{0x5A62, 0xB141},{0x5A64, 0xD4DB},{0x5A65, 0xD4D8},
+ {0x5A66, 0xB0FC},{0x5A67, 0xD4D1},{0x5A69, 0xD4E9},{0x5A6A, 0xB0FD},{0x5A6C, 0xD4D9},{0x5A6D, 0xD4D5},{0x5A70, 0xD4E8},{0x5A77, 0xB440},
+ {0x5A78, 0xD8BB},{0x5A7A, 0xD8B8},{0x5A7B, 0xD8C9},{0x5A7C, 0xD8BD},{0x5A7D, 0xD8CA},{0x5A7F, 0xB442},{0x5A83, 0xD8C6},{0x5A84, 0xD8C3},
+ {0x5A8A, 0xD8C4},{0x5A8B, 0xD8C7},{0x5A8C, 0xD8CB},{0x5A8E, 0xD4E3},{0x5A8F, 0xD8CD},{0x5A90, 0xDD47},{0x5A92, 0xB443},{0x5A93, 0xD8CE},
+ {0x5A94, 0xD8B6},{0x5A95, 0xD8C0},{0x5A97, 0xD8C5},{0x5A9A, 0xB441},{0x5A9B, 0xB444},{0x5A9C, 0xD8CC},{0x5A9D, 0xD8CF},{0x5A9E, 0xD8BA},
+ {0x5A9F, 0xD8B7},{0x5AA2, 0xD8B9},{0x5AA5, 0xD8BE},{0x5AA6, 0xD8BC},{0x5AA7, 0xB445},{0x5AA9, 0xD8C8},{0x5AAC, 0xD8BF},{0x5AAE, 0xD8C1},
+ {0x5AAF, 0xD8B5},{0x5AB0, 0xDCFA},{0x5AB1, 0xDCF8},{0x5AB2, 0xB742},{0x5AB3, 0xB740},{0x5AB4, 0xDD43},{0x5AB5, 0xDCF9},{0x5AB6, 0xDD44},
+ {0x5AB7, 0xDD40},{0x5AB8, 0xDCF7},{0x5AB9, 0xDD46},{0x5ABA, 0xDCF6},{0x5ABB, 0xDCFD},{0x5ABC, 0xB6FE},{0x5ABD, 0xB6FD},{0x5ABE, 0xB6FC},
+ {0x5ABF, 0xDCFB},{0x5AC0, 0xDD41},{0x5AC1, 0xB6F9},{0x5AC2, 0xB741},{0x5AC4, 0xDCF4},{0x5AC6, 0xDCFE},{0x5AC7, 0xDCF3},{0x5AC8, 0xDCFC},
+ {0x5AC9, 0xB6FA},{0x5ACA, 0xDD42},{0x5ACB, 0xDCF5},{0x5ACC, 0xB6FB},{0x5ACD, 0xDD45},{0x5AD5, 0xE16E},{0x5AD6, 0xB9E2},{0x5AD7, 0xB9E1},
+ {0x5AD8, 0xB9E3},{0x5AD9, 0xE17A},{0x5ADA, 0xE170},{0x5ADB, 0xE176},{0x5ADC, 0xE16B},{0x5ADD, 0xE179},{0x5ADE, 0xE178},{0x5ADF, 0xE17C},
+ {0x5AE0, 0xE175},{0x5AE1, 0xB9DE},{0x5AE2, 0xE174},{0x5AE3, 0xB9E4},{0x5AE5, 0xE16D},{0x5AE6, 0xB9DF},{0x5AE8, 0xE17B},{0x5AE9, 0xB9E0},
+ {0x5AEA, 0xE16F},{0x5AEB, 0xE172},{0x5AEC, 0xE177},{0x5AED, 0xE171},{0x5AEE, 0xE16C},{0x5AF3, 0xE173},{0x5AF4, 0xE555},{0x5AF5, 0xBC61},
+ {0x5AF6, 0xE558},{0x5AF7, 0xE557},{0x5AF8, 0xE55A},{0x5AF9, 0xE55C},{0x5AFB, 0xBC5F},{0x5AFD, 0xE556},{0x5AFF, 0xE554},{0x5B01, 0xE55D},
+ {0x5B02, 0xE55B},{0x5B03, 0xE559},{0x5B05, 0xE55F},{0x5B07, 0xE55E},{0x5B08, 0xBC63},{0x5B09, 0xBC5E},{0x5B0B, 0xBC60},{0x5B0C, 0xBC62},
+ {0x5B0F, 0xE560},{0x5B10, 0xE957},{0x5B13, 0xE956},{0x5B14, 0xE955},{0x5B16, 0xE958},{0x5B17, 0xE951},{0x5B19, 0xE952},{0x5B1A, 0xE95A},
+ {0x5B1B, 0xE953},{0x5B1D, 0xBEC5},{0x5B1E, 0xE95C},{0x5B20, 0xE95B},{0x5B21, 0xE954},{0x5B23, 0xECD1},{0x5B24, 0xC0A8},{0x5B25, 0xECCF},
+ {0x5B26, 0xECD4},{0x5B27, 0xECD3},{0x5B28, 0xE959},{0x5B2A, 0xC0A7},{0x5B2C, 0xECD2},{0x5B2D, 0xECCE},{0x5B2E, 0xECD6},{0x5B2F, 0xECD5},
+ {0x5B30, 0xC0A6},{0x5B32, 0xECD0},{0x5B34, 0xBEC6},{0x5B38, 0xC254},{0x5B3C, 0xEFC1},{0x5B3D, 0xF1FA},{0x5B3E, 0xF1FB},{0x5B3F, 0xF1FC},
+ {0x5B40, 0xC45C},{0x5B43, 0xC45D},{0x5B45, 0xF443},{0x5B47, 0xF5C8},{0x5B48, 0xF5C7},{0x5B4B, 0xF6DB},{0x5B4C, 0xF6DC},{0x5B4D, 0xF7D5},
+ {0x5B4E, 0xF8A7},{0x5B50, 0xA46C},{0x5B51, 0xA46D},{0x5B53, 0xA46E},{0x5B54, 0xA4D5},{0x5B55, 0xA5A5},{0x5B56, 0xC9D3},{0x5B57, 0xA672},
+ {0x5B58, 0xA673},{0x5B5A, 0xA7B7},{0x5B5B, 0xA7B8},{0x5B5C, 0xA7B6},{0x5B5D, 0xA7B5},{0x5B5F, 0xA973},{0x5B62, 0xCC55},{0x5B63, 0xA975},
+ {0x5B64, 0xA974},{0x5B65, 0xCC56},{0x5B69, 0xABC4},{0x5B6B, 0xAE5D},{0x5B6C, 0xD165},{0x5B6E, 0xD4F0},{0x5B70, 0xB145},{0x5B71, 0xB447},
+ {0x5B72, 0xD4EF},{0x5B73, 0xB446},{0x5B75, 0xB9E5},{0x5B77, 0xE17D},{0x5B78, 0xBEC7},{0x5B7A, 0xC0A9},{0x5B7B, 0xECD7},{0x5B7D, 0xC45E},
+ {0x5B7F, 0xC570},{0x5B81, 0xC972},{0x5B83, 0xA5A6},{0x5B84, 0xC973},{0x5B85, 0xA676},{0x5B87, 0xA674},{0x5B88, 0xA675},{0x5B89, 0xA677},
+ {0x5B8B, 0xA7BA},{0x5B8C, 0xA7B9},{0x5B8E, 0xCABC},{0x5B8F, 0xA7BB},{0x5B92, 0xCABD},{0x5B93, 0xCC57},{0x5B95, 0xCC58},{0x5B97, 0xA976},
+ {0x5B98, 0xA978},{0x5B99, 0xA97A},{0x5B9A, 0xA977},{0x5B9B, 0xA97B},{0x5B9C, 0xA979},{0x5BA2, 0xABC8},{0x5BA3, 0xABC5},{0x5BA4, 0xABC7},
+ {0x5BA5, 0xABC9},{0x5BA6, 0xABC6},{0x5BA7, 0xD166},{0x5BA8, 0xCE77},{0x5BAC, 0xD168},{0x5BAD, 0xD167},{0x5BAE, 0xAE63},{0x5BB0, 0xAE5F},
+ {0x5BB3, 0xAE60},{0x5BB4, 0xAE62},{0x5BB5, 0xAE64},{0x5BB6, 0xAE61},{0x5BB8, 0xAE66},{0x5BB9, 0xAE65},{0x5BBF, 0xB14A},{0x5BC0, 0xD4F2},
+ {0x5BC1, 0xD4F1},{0x5BC2, 0xB149},{0x5BC4, 0xB148},{0x5BC5, 0xB147},{0x5BC6, 0xB14B},{0x5BC7, 0xB146},{0x5BCA, 0xD8D5},{0x5BCB, 0xD8D2},
+ {0x5BCC, 0xB449},{0x5BCD, 0xD8D1},{0x5BCE, 0xD8D6},{0x5BD0, 0xB44B},{0x5BD1, 0xD8D4},{0x5BD2, 0xB448},{0x5BD3, 0xB44A},{0x5BD4, 0xD8D3},
+ {0x5BD6, 0xDD48},{0x5BD8, 0xDD49},{0x5BD9, 0xDD4A},{0x5BDE, 0xB9E6},{0x5BDF, 0xB9EE},{0x5BE0, 0xE17E},{0x5BE1, 0xB9E8},{0x5BE2, 0xB9EC},
+ {0x5BE3, 0xE1A1},{0x5BE4, 0xB9ED},{0x5BE5, 0xB9E9},{0x5BE6, 0xB9EA},{0x5BE7, 0xB9E7},{0x5BE8, 0xB9EB},{0x5BE9, 0xBC66},{0x5BEA, 0xD8D0},
+ {0x5BEB, 0xBC67},{0x5BEC, 0xBC65},{0x5BEE, 0xBC64},{0x5BEF, 0xE95D},{0x5BF0, 0xBEC8},{0x5BF1, 0xECD8},{0x5BF2, 0xECD9},{0x5BF5, 0xC364},
+ {0x5BF6, 0xC45F},{0x5BF8, 0xA46F},{0x5BFA, 0xA678},{0x5C01, 0xABCA},{0x5C03, 0xD169},{0x5C04, 0xAE67},{0x5C07, 0xB14E},{0x5C08, 0xB14D},
+ {0x5C09, 0xB14C},{0x5C0A, 0xB44C},{0x5C0B, 0xB44D},{0x5C0C, 0xD8D7},{0x5C0D, 0xB9EF},{0x5C0E, 0xBEC9},{0x5C0F, 0xA470},{0x5C10, 0xC95C},
+ {0x5C11, 0xA4D6},{0x5C12, 0xC974},{0x5C15, 0xC9D4},{0x5C16, 0xA679},{0x5C1A, 0xA97C},{0x5C1F, 0xDD4B},{0x5C22, 0xA471},{0x5C24, 0xA4D7},
+ {0x5C25, 0xC9D5},{0x5C28, 0xCABE},{0x5C2A, 0xCABF},{0x5C2C, 0xA7BC},{0x5C30, 0xD8D8},{0x5C31, 0xB44E},{0x5C33, 0xDD4C},{0x5C37, 0xC0AA},
+ {0x5C38, 0xA472},{0x5C39, 0xA4A8},{0x5C3A, 0xA4D8},{0x5C3B, 0xC975},{0x5C3C, 0xA5A7},{0x5C3E, 0xA7C0},{0x5C3F, 0xA7BF},{0x5C40, 0xA7BD},
+ {0x5C41, 0xA7BE},{0x5C44, 0xCC59},{0x5C45, 0xA97E},{0x5C46, 0xA9A1},{0x5C47, 0xCC5A},{0x5C48, 0xA97D},{0x5C4B, 0xABCE},{0x5C4C, 0xCE78},
+ {0x5C4D, 0xABCD},{0x5C4E, 0xABCB},{0x5C4F, 0xABCC},{0x5C50, 0xAE6A},{0x5C51, 0xAE68},{0x5C54, 0xD16B},{0x5C55, 0xAE69},{0x5C56, 0xD16A},
+ {0x5C58, 0xAE5E},{0x5C59, 0xD4F3},{0x5C5C, 0xB150},{0x5C5D, 0xB151},{0x5C60, 0xB14F},{0x5C62, 0xB9F0},{0x5C63, 0xE1A2},{0x5C64, 0xBC68},
+ {0x5C65, 0xBC69},{0x5C67, 0xE561},{0x5C68, 0xC0AB},{0x5C69, 0xEFC2},{0x5C6A, 0xEFC3},{0x5C6C, 0xC4DD},{0x5C6D, 0xF8A8},{0x5C6E, 0xC94B},
+ {0x5C6F, 0xA4D9},{0x5C71, 0xA473},{0x5C73, 0xC977},{0x5C74, 0xC976},{0x5C79, 0xA67A},{0x5C7A, 0xC9D7},{0x5C7B, 0xC9D8},{0x5C7C, 0xC9D6},
+ {0x5C7E, 0xC9D9},{0x5C86, 0xCAC7},{0x5C88, 0xCAC2},{0x5C89, 0xCAC4},{0x5C8A, 0xCAC6},{0x5C8B, 0xCAC3},{0x5C8C, 0xA7C4},{0x5C8D, 0xCAC0},
+ {0x5C8F, 0xCAC1},{0x5C90, 0xA7C1},{0x5C91, 0xA7C2},{0x5C92, 0xCAC5},{0x5C93, 0xCAC8},{0x5C94, 0xA7C3},{0x5C95, 0xCAC9},{0x5C9D, 0xCC68},
+ {0x5C9F, 0xCC62},{0x5CA0, 0xCC5D},{0x5CA1, 0xA9A3},{0x5CA2, 0xCC65},{0x5CA3, 0xCC63},{0x5CA4, 0xCC5C},{0x5CA5, 0xCC69},{0x5CA6, 0xCC6C},
+ {0x5CA7, 0xCC67},{0x5CA8, 0xCC60},{0x5CA9, 0xA9A5},{0x5CAA, 0xCC66},{0x5CAB, 0xA9A6},{0x5CAC, 0xCC61},{0x5CAD, 0xCC64},{0x5CAE, 0xCC5B},
+ {0x5CAF, 0xCC5F},{0x5CB0, 0xCC6B},{0x5CB1, 0xA9A7},{0x5CB3, 0xA9A8},{0x5CB5, 0xCC5E},{0x5CB6, 0xCC6A},{0x5CB7, 0xA9A2},{0x5CB8, 0xA9A4},
+ {0x5CC6, 0xCEAB},{0x5CC7, 0xCEA4},{0x5CC8, 0xCEAA},{0x5CC9, 0xCEA3},{0x5CCA, 0xCEA5},{0x5CCB, 0xCE7D},{0x5CCC, 0xCE7B},{0x5CCE, 0xCEAC},
+ {0x5CCF, 0xCEA9},{0x5CD0, 0xCE79},{0x5CD2, 0xABD0},{0x5CD3, 0xCEA7},{0x5CD4, 0xCEA8},{0x5CD6, 0xCEA6},{0x5CD7, 0xCE7C},{0x5CD8, 0xCE7A},
+ {0x5CD9, 0xABCF},{0x5CDA, 0xCEA2},{0x5CDB, 0xCE7E},{0x5CDE, 0xCEA1},{0x5CDF, 0xCEAD},{0x5CE8, 0xAE6F},{0x5CEA, 0xAE6E},{0x5CEC, 0xD16C},
+ {0x5CED, 0xAE6B},{0x5CEE, 0xD16E},{0x5CF0, 0xAE70},{0x5CF1, 0xD16F},{0x5CF4, 0xAE73},{0x5CF6, 0xAE71},{0x5CF7, 0xD170},{0x5CF8, 0xCEAE},
+ {0x5CF9, 0xD172},{0x5CFB, 0xAE6D},{0x5CFD, 0xAE6C},{0x5CFF, 0xD16D},{0x5D00, 0xD171},{0x5D01, 0xAE72},{0x5D06, 0xB153},{0x5D07, 0xB152},
+ {0x5D0B, 0xD4F5},{0x5D0C, 0xD4F9},{0x5D0D, 0xD4FB},{0x5D0E, 0xB154},{0x5D0F, 0xD4FE},{0x5D11, 0xB158},{0x5D12, 0xD541},{0x5D14, 0xB15A},
+ {0x5D16, 0xB156},{0x5D17, 0xB15E},{0x5D19, 0xB15B},{0x5D1A, 0xD4F7},{0x5D1B, 0xB155},{0x5D1D, 0xD4F6},{0x5D1E, 0xD4F4},{0x5D1F, 0xD543},
+ {0x5D20, 0xD4F8},{0x5D22, 0xB157},{0x5D23, 0xD542},{0x5D24, 0xB15C},{0x5D25, 0xD4FD},{0x5D26, 0xD4FC},{0x5D27, 0xB15D},{0x5D28, 0xD4FA},
+ {0x5D29, 0xB159},{0x5D2E, 0xD544},{0x5D30, 0xD540},{0x5D31, 0xD8E7},{0x5D32, 0xD8EE},{0x5D33, 0xD8E3},{0x5D34, 0xB451},{0x5D35, 0xD8DF},
+ {0x5D36, 0xD8EF},{0x5D37, 0xD8D9},{0x5D38, 0xD8EC},{0x5D39, 0xD8EA},{0x5D3A, 0xD8E4},{0x5D3C, 0xD8ED},{0x5D3D, 0xD8E6},{0x5D3F, 0xD8DE},
+ {0x5D40, 0xD8F0},{0x5D41, 0xD8DC},{0x5D42, 0xD8E9},{0x5D43, 0xD8DA},{0x5D45, 0xD8F1},{0x5D47, 0xB452},{0x5D49, 0xD8EB},{0x5D4A, 0xDD4F},
+ {0x5D4B, 0xD8DD},{0x5D4C, 0xB44F},{0x5D4E, 0xD8E1},{0x5D50, 0xB450},{0x5D51, 0xD8E0},{0x5D52, 0xD8E5},{0x5D55, 0xD8E2},{0x5D59, 0xD8E8},
+ {0x5D5E, 0xDD53},{0x5D62, 0xDD56},{0x5D63, 0xDD4E},{0x5D65, 0xDD50},{0x5D67, 0xDD55},{0x5D68, 0xDD54},{0x5D69, 0xB743},{0x5D6B, 0xD8DB},
+ {0x5D6C, 0xDD52},{0x5D6F, 0xB744},{0x5D71, 0xDD4D},{0x5D72, 0xDD51},{0x5D77, 0xE1A9},{0x5D79, 0xE1B0},{0x5D7A, 0xE1A7},{0x5D7C, 0xE1AE},
+ {0x5D7D, 0xE1A5},{0x5D7E, 0xE1AD},{0x5D7F, 0xE1B1},{0x5D80, 0xE1A4},{0x5D81, 0xE1A8},{0x5D82, 0xE1A3},{0x5D84, 0xB9F1},{0x5D86, 0xE1A6},
+ {0x5D87, 0xB9F2},{0x5D88, 0xE1AC},{0x5D89, 0xE1AB},{0x5D8A, 0xE1AA},{0x5D8D, 0xE1AF},{0x5D92, 0xE565},{0x5D93, 0xE567},{0x5D94, 0xBC6B},
+ {0x5D95, 0xE568},{0x5D97, 0xE563},{0x5D99, 0xE562},{0x5D9A, 0xE56C},{0x5D9C, 0xE56A},{0x5D9D, 0xBC6A},{0x5D9E, 0xE56D},{0x5D9F, 0xE564},
+ {0x5DA0, 0xE569},{0x5DA1, 0xE56B},{0x5DA2, 0xE566},{0x5DA7, 0xE961},{0x5DA8, 0xE966},{0x5DA9, 0xE960},{0x5DAA, 0xE965},{0x5DAC, 0xE95E},
+ {0x5DAD, 0xE968},{0x5DAE, 0xE964},{0x5DAF, 0xE969},{0x5DB0, 0xE963},{0x5DB1, 0xE95F},{0x5DB2, 0xE967},{0x5DB4, 0xE96A},{0x5DB5, 0xE962},
+ {0x5DB7, 0xECDA},{0x5DB8, 0xC0AF},{0x5DBA, 0xC0AD},{0x5DBC, 0xC0AC},{0x5DBD, 0xC0AE},{0x5DC0, 0xEFC4},{0x5DC2, 0xF172},{0x5DC3, 0xF1FD},
+ {0x5DC6, 0xF444},{0x5DC7, 0xF445},{0x5DC9, 0xC460},{0x5DCB, 0xF5C9},{0x5DCD, 0xC4DE},{0x5DCF, 0xF5CA},{0x5DD1, 0xF6DE},{0x5DD2, 0xC572},
+ {0x5DD4, 0xC571},{0x5DD5, 0xF6DD},{0x5DD6, 0xC5C9},{0x5DD8, 0xF7D6},{0x5DDD, 0xA474},{0x5DDE, 0xA67B},{0x5DDF, 0xC9DA},{0x5DE0, 0xCACA},
+ {0x5DE1, 0xA8B5},{0x5DE2, 0xB15F},{0x5DE5, 0xA475},{0x5DE6, 0xA5AA},{0x5DE7, 0xA5A9},{0x5DE8, 0xA5A8},{0x5DEB, 0xA7C5},{0x5DEE, 0xAE74},
+ {0x5DF0, 0xDD57},{0x5DF1, 0xA476},{0x5DF2, 0xA477},{0x5DF3, 0xA478},{0x5DF4, 0xA4DA},{0x5DF7, 0xABD1},{0x5DF9, 0xCEAF},{0x5DFD, 0xB453},
+ {0x5DFE, 0xA479},{0x5DFF, 0xC95D},{0x5E02, 0xA5AB},{0x5E03, 0xA5AC},{0x5E04, 0xC978},{0x5E06, 0xA67C},{0x5E0A, 0xCACB},{0x5E0C, 0xA7C6},
+ {0x5E0E, 0xCACC},{0x5E11, 0xA9AE},{0x5E14, 0xCC6E},{0x5E15, 0xA9AC},{0x5E16, 0xA9AB},{0x5E17, 0xCC6D},{0x5E18, 0xA9A9},{0x5E19, 0xCC6F},
+ {0x5E1A, 0xA9AA},{0x5E1B, 0xA9AD},{0x5E1D, 0xABD2},{0x5E1F, 0xABD4},{0x5E20, 0xCEB3},{0x5E21, 0xCEB0},{0x5E22, 0xCEB1},{0x5E23, 0xCEB2},
+ {0x5E24, 0xCEB4},{0x5E25, 0xABD3},{0x5E28, 0xD174},{0x5E29, 0xD173},{0x5E2B, 0xAE76},{0x5E2D, 0xAE75},{0x5E33, 0xB162},{0x5E34, 0xD546},
+ {0x5E36, 0xB161},{0x5E37, 0xB163},{0x5E38, 0xB160},{0x5E3D, 0xB455},{0x5E3E, 0xD545},{0x5E40, 0xB456},{0x5E41, 0xD8F3},{0x5E43, 0xB457},
+ {0x5E44, 0xD8F2},{0x5E45, 0xB454},{0x5E4A, 0xDD5A},{0x5E4B, 0xDD5C},{0x5E4C, 0xB745},{0x5E4D, 0xDD5B},{0x5E4E, 0xDD59},{0x5E4F, 0xDD58},
+ {0x5E53, 0xE1B4},{0x5E54, 0xB9F7},{0x5E55, 0xB9F5},{0x5E57, 0xB9F6},{0x5E58, 0xE1B2},{0x5E59, 0xE1B3},{0x5E5B, 0xB9F3},{0x5E5C, 0xE571},
+ {0x5E5D, 0xE56F},{0x5E5F, 0xBC6D},{0x5E60, 0xE570},{0x5E61, 0xBC6E},{0x5E62, 0xBC6C},{0x5E63, 0xB9F4},{0x5E66, 0xE96D},{0x5E67, 0xE96B},
+ {0x5E68, 0xE96C},{0x5E69, 0xE56E},{0x5E6A, 0xECDC},{0x5E6B, 0xC0B0},{0x5E6C, 0xECDB},{0x5E6D, 0xEFC5},{0x5E6E, 0xEFC6},{0x5E6F, 0xE96E},
+ {0x5E70, 0xF1FE},{0x5E72, 0xA47A},{0x5E73, 0xA5AD},{0x5E74, 0xA67E},{0x5E75, 0xC9DB},{0x5E76, 0xA67D},{0x5E78, 0xA9AF},{0x5E79, 0xB746},
+ {0x5E7B, 0xA4DB},{0x5E7C, 0xA5AE},{0x5E7D, 0xABD5},{0x5E7E, 0xB458},{0x5E80, 0xC979},{0x5E82, 0xC97A},{0x5E84, 0xC9DC},{0x5E87, 0xA7C8},
+ {0x5E88, 0xCAD0},{0x5E89, 0xCACE},{0x5E8A, 0xA7C9},{0x5E8B, 0xCACD},{0x5E8C, 0xCACF},{0x5E8D, 0xCAD1},{0x5E8F, 0xA7C7},{0x5E95, 0xA9B3},
+ {0x5E96, 0xA9B4},{0x5E97, 0xA9B1},{0x5E9A, 0xA9B0},{0x5E9B, 0xCEB8},{0x5E9C, 0xA9B2},{0x5EA0, 0xABD6},{0x5EA2, 0xCEB7},{0x5EA3, 0xCEB9},
+ {0x5EA4, 0xCEB6},{0x5EA5, 0xCEBA},{0x5EA6, 0xABD7},{0x5EA7, 0xAE79},{0x5EA8, 0xD175},{0x5EAA, 0xD177},{0x5EAB, 0xAE77},{0x5EAC, 0xD178},
+ {0x5EAD, 0xAE78},{0x5EAE, 0xD176},{0x5EB0, 0xCEB5},{0x5EB1, 0xD547},{0x5EB2, 0xD54A},{0x5EB3, 0xD54B},{0x5EB4, 0xD548},{0x5EB5, 0xB167},
+ {0x5EB6, 0xB166},{0x5EB7, 0xB164},{0x5EB8, 0xB165},{0x5EB9, 0xD549},{0x5EBE, 0xB168},{0x5EC1, 0xB45A},{0x5EC2, 0xB45B},{0x5EC4, 0xB45C},
+ {0x5EC5, 0xDD5D},{0x5EC6, 0xDD5F},{0x5EC7, 0xDD61},{0x5EC8, 0xB748},{0x5EC9, 0xB747},{0x5ECA, 0xB459},{0x5ECB, 0xDD60},{0x5ECC, 0xDD5E},
+ {0x5ECE, 0xE1B8},{0x5ED1, 0xE1B6},{0x5ED2, 0xE1BC},{0x5ED3, 0xB9F8},{0x5ED4, 0xE1BD},{0x5ED5, 0xE1BA},{0x5ED6, 0xB9F9},{0x5ED7, 0xE1B7},
+ {0x5ED8, 0xE1B5},{0x5ED9, 0xE1BB},{0x5EDA, 0xBC70},{0x5EDB, 0xE573},{0x5EDC, 0xE1B9},{0x5EDD, 0xBC72},{0x5EDE, 0xE574},{0x5EDF, 0xBC71},
+ {0x5EE0, 0xBC74},{0x5EE1, 0xE575},{0x5EE2, 0xBC6F},{0x5EE3, 0xBC73},{0x5EE5, 0xE973},{0x5EE6, 0xE971},{0x5EE7, 0xE970},{0x5EE8, 0xE972},
+ {0x5EE9, 0xE96F},{0x5EEC, 0xC366},{0x5EEE, 0xF446},{0x5EEF, 0xF447},{0x5EF1, 0xF5CB},{0x5EF2, 0xF6DF},{0x5EF3, 0xC655},{0x5EF6, 0xA9B5},
+ {0x5EF7, 0xA7CA},{0x5EFA, 0xABD8},{0x5EFE, 0xA47B},{0x5EFF, 0xA4DC},{0x5F01, 0xA5AF},{0x5F02, 0xC9DD},{0x5F04, 0xA7CB},{0x5F05, 0xCAD2},
+ {0x5F07, 0xCEBB},{0x5F08, 0xABD9},{0x5F0A, 0xB9FA},{0x5F0B, 0xA47C},{0x5F0F, 0xA6A1},{0x5F12, 0xB749},{0x5F13, 0xA47D},{0x5F14, 0xA4DD},
+ {0x5F15, 0xA4DE},{0x5F17, 0xA5B1},{0x5F18, 0xA5B0},{0x5F1A, 0xC9DE},{0x5F1B, 0xA6A2},{0x5F1D, 0xCAD3},{0x5F1F, 0xA7CC},{0x5F22, 0xCC71},
+ {0x5F23, 0xCC72},{0x5F24, 0xCC73},{0x5F26, 0xA9B6},{0x5F27, 0xA9B7},{0x5F28, 0xCC70},{0x5F29, 0xA9B8},{0x5F2D, 0xABDA},{0x5F2E, 0xCEBC},
+ {0x5F30, 0xD17A},{0x5F31, 0xAE7A},{0x5F33, 0xD179},{0x5F35, 0xB169},{0x5F36, 0xD54C},{0x5F37, 0xB16A},{0x5F38, 0xD54D},{0x5F3C, 0xB45D},
+ {0x5F40, 0xDD62},{0x5F43, 0xE1BF},{0x5F44, 0xE1BE},{0x5F46, 0xB9FB},{0x5F48, 0xBC75},{0x5F49, 0xE576},{0x5F4A, 0xBECA},{0x5F4B, 0xE974},
+ {0x5F4C, 0xC0B1},{0x5F4E, 0xC573},{0x5F4F, 0xF7D8},{0x5F54, 0xCC74},{0x5F56, 0xCEBD},{0x5F57, 0xB16B},{0x5F58, 0xD8F4},{0x5F59, 0xB74A},
+ {0x5F5D, 0xC255},{0x5F62, 0xA7CE},{0x5F64, 0xA7CD},{0x5F65, 0xABDB},{0x5F67, 0xD17B},{0x5F69, 0xB16D},{0x5F6A, 0xB343},{0x5F6B, 0xB16E},
+ {0x5F6C, 0xB16C},{0x5F6D, 0xB45E},{0x5F6F, 0xE1C0},{0x5F70, 0xB9FC},{0x5F71, 0xBC76},{0x5F73, 0xC94C},{0x5F74, 0xC9DF},{0x5F76, 0xCAD5},
+ {0x5F77, 0xA7CF},{0x5F78, 0xCAD4},{0x5F79, 0xA7D0},{0x5F7C, 0xA9BC},{0x5F7D, 0xCC77},{0x5F7E, 0xCC76},{0x5F7F, 0xA9BB},{0x5F80, 0xA9B9},
+ {0x5F81, 0xA9BA},{0x5F82, 0xCC75},{0x5F85, 0xABDD},{0x5F86, 0xCEBE},{0x5F87, 0xABE0},{0x5F88, 0xABDC},{0x5F89, 0xABE2},{0x5F8A, 0xABDE},
+ {0x5F8B, 0xABDF},{0x5F8C, 0xABE1},{0x5F90, 0xAE7D},{0x5F91, 0xAE7C},{0x5F92, 0xAE7B},{0x5F96, 0xD54F},{0x5F97, 0xB16F},{0x5F98, 0xB172},
+ {0x5F99, 0xB170},{0x5F9B, 0xD54E},{0x5F9C, 0xB175},{0x5F9E, 0xB171},{0x5F9F, 0xD550},{0x5FA0, 0xB174},{0x5FA1, 0xB173},{0x5FA5, 0xD8F6},
+ {0x5FA6, 0xD8F5},{0x5FA8, 0xB461},{0x5FA9, 0xB45F},{0x5FAA, 0xB460},{0x5FAB, 0xD8F7},{0x5FAC, 0xB74B},{0x5FAD, 0xDD64},{0x5FAE, 0xB74C},
+ {0x5FAF, 0xDD63},{0x5FB2, 0xE577},{0x5FB5, 0xBC78},{0x5FB6, 0xE1C1},{0x5FB7, 0xBC77},{0x5FB9, 0xB9FD},{0x5FBB, 0xECDE},{0x5FBC, 0xE975},
+ {0x5FBD, 0xC0B2},{0x5FBE, 0xECDD},{0x5FBF, 0xF240},{0x5FC0, 0xF448},{0x5FC1, 0xF449},{0x5FC3, 0xA4DF},{0x5FC5, 0xA5B2},{0x5FC9, 0xC97B},
+ {0x5FCC, 0xA7D2},{0x5FCD, 0xA7D4},{0x5FCF, 0xC9E2},{0x5FD0, 0xCAD8},{0x5FD1, 0xCAD7},{0x5FD2, 0xCAD6},{0x5FD4, 0xC9E1},{0x5FD5, 0xC9E0},
+ {0x5FD6, 0xA6A4},{0x5FD7, 0xA7D3},{0x5FD8, 0xA7D1},{0x5FD9, 0xA6A3},{0x5FDD, 0xA9BD},{0x5FDE, 0xCC78},{0x5FE0, 0xA9BE},{0x5FE1, 0xCADD},
+ {0x5FE3, 0xCADF},{0x5FE4, 0xCADE},{0x5FE5, 0xCC79},{0x5FE8, 0xCADA},{0x5FEA, 0xA7D8},{0x5FEB, 0xA7D6},{0x5FED, 0xCAD9},{0x5FEE, 0xCADB},
+ {0x5FEF, 0xCAE1},{0x5FF1, 0xA7D5},{0x5FF3, 0xCADC},{0x5FF4, 0xCAE5},{0x5FF5, 0xA9C0},{0x5FF7, 0xCAE2},{0x5FF8, 0xA7D7},{0x5FFA, 0xCAE0},
+ {0x5FFB, 0xCAE3},{0x5FFD, 0xA9BF},{0x5FFF, 0xA9C1},{0x6000, 0xCAE4},{0x6009, 0xCCAF},{0x600A, 0xCCA2},{0x600B, 0xCC7E},{0x600C, 0xCCAE},
+ {0x600D, 0xCCA9},{0x600E, 0xABE7},{0x600F, 0xA9C2},{0x6010, 0xCCAA},{0x6011, 0xCCAD},{0x6012, 0xABE3},{0x6013, 0xCCAC},{0x6014, 0xA9C3},
+ {0x6015, 0xA9C8},{0x6016, 0xA9C6},{0x6017, 0xCCA3},{0x6019, 0xCC7C},{0x601A, 0xCCA5},{0x601B, 0xA9CD},{0x601C, 0xCCB0},{0x601D, 0xABE4},
+ {0x601E, 0xCCA6},{0x6020, 0xABE5},{0x6021, 0xA9C9},{0x6022, 0xCCA8},{0x6024, 0xCECD},{0x6025, 0xABE6},{0x6026, 0xCC7B},{0x6027, 0xA9CA},
+ {0x6028, 0xABE8},{0x6029, 0xA9CB},{0x602A, 0xA9C7},{0x602B, 0xA9CC},{0x602C, 0xCCA7},{0x602D, 0xCC7A},{0x602E, 0xCCAB},{0x602F, 0xA9C4},
+ {0x6032, 0xCC7D},{0x6033, 0xCCA4},{0x6034, 0xCCA1},{0x6035, 0xA9C5},{0x6037, 0xCEBF},{0x6039, 0xCEC0},{0x6040, 0xCECA},{0x6041, 0xD1A1},
+ {0x6042, 0xCECB},{0x6043, 0xABEE},{0x6044, 0xCECE},{0x6045, 0xCEC4},{0x6046, 0xABED},{0x6047, 0xCEC6},{0x6049, 0xCEC7},{0x604C, 0xCEC9},
+ {0x604D, 0xABE9},{0x6050, 0xAEA3},{0x6053, 0xCEC5},{0x6054, 0xCEC1},{0x6055, 0xAEA4},{0x6058, 0xCECF},{0x6059, 0xAE7E},{0x605A, 0xD17D},
+ {0x605B, 0xCEC8},{0x605D, 0xD17C},{0x605E, 0xCEC3},{0x605F, 0xCECC},{0x6062, 0xABEC},{0x6063, 0xAEA1},{0x6064, 0xABF2},{0x6065, 0xAEA2},
+ {0x6066, 0xCED0},{0x6067, 0xD17E},{0x6068, 0xABEB},{0x6069, 0xAEA6},{0x606A, 0xABF1},{0x606B, 0xABF0},{0x606C, 0xABEF},{0x606D, 0xAEA5},
+ {0x606E, 0xCED1},{0x606F, 0xAEA7},{0x6070, 0xABEA},{0x6072, 0xCEC2},{0x607F, 0xB176},{0x6080, 0xD1A4},{0x6081, 0xD1A6},{0x6083, 0xD1A8},
+ {0x6084, 0xAEA8},{0x6085, 0xAEAE},{0x6086, 0xD553},{0x6087, 0xD1AC},{0x6088, 0xD1A3},{0x6089, 0xB178},{0x608A, 0xD551},{0x608C, 0xAEAD},
+ {0x608D, 0xAEAB},{0x608E, 0xD1AE},{0x6090, 0xD552},{0x6092, 0xD1A5},{0x6094, 0xAEAC},{0x6095, 0xD1A9},{0x6096, 0xAEAF},{0x6097, 0xD1AB},
+ {0x609A, 0xAEAA},{0x609B, 0xD1AA},{0x609C, 0xD1AD},{0x609D, 0xD1A7},{0x609F, 0xAEA9},{0x60A0, 0xB179},{0x60A2, 0xD1A2},{0x60A3, 0xB177},
+ {0x60A8, 0xB17A},{0x60B0, 0xD555},{0x60B1, 0xD55E},{0x60B2, 0xB464},{0x60B4, 0xB17C},{0x60B5, 0xB1A3},{0x60B6, 0xB465},{0x60B7, 0xD560},
+ {0x60B8, 0xB1AA},{0x60B9, 0xD8F9},{0x60BA, 0xD556},{0x60BB, 0xB1A2},{0x60BC, 0xB1A5},{0x60BD, 0xB17E},{0x60BE, 0xD554},{0x60BF, 0xD562},
+ {0x60C0, 0xD565},{0x60C1, 0xD949},{0x60C3, 0xD563},{0x60C4, 0xD8FD},{0x60C5, 0xB1A1},{0x60C6, 0xB1A8},{0x60C7, 0xB1AC},{0x60C8, 0xD55D},
+ {0x60C9, 0xD8F8},{0x60CA, 0xD561},{0x60CB, 0xB17B},{0x60CC, 0xD8FA},{0x60CD, 0xD564},{0x60CE, 0xD8FC},{0x60CF, 0xD559},{0x60D1, 0xB462},
+ {0x60D3, 0xD557},{0x60D4, 0xD558},{0x60D5, 0xB1A7},{0x60D8, 0xB1A6},{0x60D9, 0xD55B},{0x60DA, 0xB1AB},{0x60DB, 0xD55F},{0x60DC, 0xB1A4},
+ {0x60DD, 0xD55C},{0x60DF, 0xB1A9},{0x60E0, 0xB466},{0x60E1, 0xB463},{0x60E2, 0xD8FB},{0x60E4, 0xD55A},{0x60E6, 0xB17D},{0x60F0, 0xB46B},
+ {0x60F1, 0xB46F},{0x60F2, 0xD940},{0x60F3, 0xB751},{0x60F4, 0xB46D},{0x60F5, 0xD944},{0x60F6, 0xB471},{0x60F7, 0xDD65},{0x60F8, 0xD946},
+ {0x60F9, 0xB753},{0x60FA, 0xB469},{0x60FB, 0xB46C},{0x60FC, 0xD947},{0x60FE, 0xD948},{0x60FF, 0xD94E},{0x6100, 0xB473},{0x6101, 0xB754},
+ {0x6103, 0xD94A},{0x6104, 0xD94F},{0x6105, 0xD943},{0x6106, 0xB75E},{0x6108, 0xB755},{0x6109, 0xB472},{0x610A, 0xD941},{0x610B, 0xD950},
+ {0x610D, 0xB75D},{0x610E, 0xB470},{0x610F, 0xB74E},{0x6110, 0xD94D},{0x6112, 0xB474},{0x6113, 0xD945},{0x6114, 0xD8FE},{0x6115, 0xB46A},
+ {0x6116, 0xD942},{0x6118, 0xD94B},{0x611A, 0xB74D},{0x611B, 0xB752},{0x611C, 0xB467},{0x611D, 0xD94C},{0x611F, 0xB750},{0x6123, 0xB468},
+ {0x6127, 0xB75C},{0x6128, 0xE1C3},{0x6129, 0xDD70},{0x612B, 0xDD68},{0x612C, 0xE1C2},{0x612E, 0xDD6C},{0x612F, 0xDD6E},{0x6132, 0xDD6B},
+ {0x6134, 0xB75B},{0x6136, 0xDD6A},{0x6137, 0xB75F},{0x613B, 0xE1D2},{0x613E, 0xB75A},{0x613F, 0xBA40},{0x6140, 0xDD71},{0x6141, 0xE1C4},
+ {0x6144, 0xB758},{0x6145, 0xDD69},{0x6146, 0xDD6D},{0x6147, 0xB9FE},{0x6148, 0xB74F},{0x6149, 0xDD66},{0x614A, 0xDD67},{0x614B, 0xBA41},
+ {0x614C, 0xB757},{0x614D, 0xB759},{0x614E, 0xB756},{0x614F, 0xDD6F},{0x6152, 0xE1C8},{0x6153, 0xE1C9},{0x6154, 0xE1CE},{0x6155, 0xBC7D},
+ {0x6156, 0xE1D5},{0x6158, 0xBA47},{0x615A, 0xBA46},{0x615B, 0xE1D0},{0x615D, 0xBC7C},{0x615E, 0xE1C5},{0x615F, 0xBA45},{0x6161, 0xE1D4},
+ {0x6162, 0xBA43},{0x6163, 0xBA44},{0x6165, 0xE1D1},{0x6166, 0xE5AA},{0x6167, 0xBC7A},{0x6168, 0xB46E},{0x616A, 0xE1D3},{0x616B, 0xBCA3},
+ {0x616C, 0xE1CB},{0x616E, 0xBC7B},{0x6170, 0xBCA2},{0x6171, 0xE1C6},{0x6172, 0xE1CA},{0x6173, 0xE1C7},{0x6174, 0xE1CD},{0x6175, 0xBA48},
+ {0x6176, 0xBC79},{0x6177, 0xBA42},{0x6179, 0xE57A},{0x617A, 0xE1CF},{0x617C, 0xBCA1},{0x617E, 0xBCA4},{0x6180, 0xE1CC},{0x6182, 0xBC7E},
+ {0x6183, 0xE579},{0x6189, 0xE57E},{0x618A, 0xBECE},{0x618B, 0xE578},{0x618C, 0xE9A3},{0x618D, 0xE5A9},{0x618E, 0xBCA8},{0x6190, 0xBCA6},
+ {0x6191, 0xBECC},{0x6192, 0xE5A6},{0x6193, 0xE5A2},{0x6194, 0xBCAC},{0x6196, 0xE978},{0x619A, 0xBCAA},{0x619B, 0xE5A1},{0x619D, 0xE976},
+ {0x619F, 0xE5A5},{0x61A1, 0xE5A8},{0x61A2, 0xE57D},{0x61A4, 0xBCAB},{0x61A7, 0xBCA5},{0x61A8, 0xE977},{0x61A9, 0xBECD},{0x61AA, 0xE5A7},
+ {0x61AB, 0xBCA7},{0x61AC, 0xBCA9},{0x61AD, 0xE5A4},{0x61AE, 0xBCAD},{0x61AF, 0xE5A3},{0x61B0, 0xE57C},{0x61B1, 0xE57B},{0x61B2, 0xBECB},
+ {0x61B3, 0xE5AB},{0x61B4, 0xE97A},{0x61B5, 0xECE0},{0x61B6, 0xBED0},{0x61B8, 0xE9A2},{0x61BA, 0xE97E},{0x61BC, 0xECE1},{0x61BE, 0xBED1},
+ {0x61BF, 0xE9A1},{0x61C1, 0xE97C},{0x61C2, 0xC0B4},{0x61C3, 0xECDF},{0x61C5, 0xE979},{0x61C6, 0xE97B},{0x61C7, 0xC0B5},{0x61C8, 0xBED3},
+ {0x61C9, 0xC0B3},{0x61CA, 0xBED2},{0x61CB, 0xC0B7},{0x61CC, 0xE97D},{0x61CD, 0xBECF},{0x61D6, 0xEFCF},{0x61D8, 0xEFC7},{0x61DE, 0xECE7},
+ {0x61DF, 0xEFC8},{0x61E0, 0xECE3},{0x61E3, 0xC256},{0x61E4, 0xECE5},{0x61E5, 0xECE4},{0x61E6, 0xC0B6},{0x61E7, 0xECE2},{0x61E8, 0xECE6},
+ {0x61E9, 0xEFD0},{0x61EA, 0xEFCC},{0x61EB, 0xEFCE},{0x61ED, 0xEFC9},{0x61EE, 0xEFCA},{0x61F0, 0xEFCD},{0x61F1, 0xEFCB},{0x61F2, 0xC367},
+ {0x61F5, 0xC36A},{0x61F6, 0xC369},{0x61F7, 0xC368},{0x61F8, 0xC461},{0x61F9, 0xF44A},{0x61FA, 0xC462},{0x61FB, 0xF241},{0x61FC, 0xC4DF},
+ {0x61FD, 0xF5CC},{0x61FE, 0xC4E0},{0x61FF, 0xC574},{0x6200, 0xC5CA},{0x6201, 0xF7D9},{0x6203, 0xF7DA},{0x6204, 0xF7DB},{0x6207, 0xF9BA},
+ {0x6208, 0xA4E0},{0x6209, 0xC97C},{0x620A, 0xA5B3},{0x620C, 0xA6A6},{0x620D, 0xA6A7},{0x620E, 0xA6A5},{0x6210, 0xA6A8},{0x6211, 0xA7DA},
+ {0x6212, 0xA7D9},{0x6214, 0xCCB1},{0x6215, 0xA9CF},{0x6216, 0xA9CE},{0x6219, 0xD1AF},{0x621A, 0xB1AD},{0x621B, 0xB1AE},{0x621F, 0xB475},
+ {0x6220, 0xDD72},{0x6221, 0xB760},{0x6222, 0xB761},{0x6223, 0xDD74},{0x6224, 0xDD76},{0x6225, 0xDD75},{0x6227, 0xE1D7},{0x6229, 0xE1D6},
+ {0x622A, 0xBA49},{0x622B, 0xE1D8},{0x622D, 0xE5AC},{0x622E, 0xBCAE},{0x6230, 0xBED4},{0x6232, 0xC0B8},{0x6233, 0xC257},{0x6234, 0xC0B9},
+ {0x6236, 0xA4E1},{0x623A, 0xCAE6},{0x623D, 0xCCB2},{0x623E, 0xA9D1},{0x623F, 0xA9D0},{0x6240, 0xA9D2},{0x6241, 0xABF3},{0x6242, 0xCED2},
+ {0x6243, 0xCED3},{0x6246, 0xD1B0},{0x6247, 0xAEB0},{0x6248, 0xB1AF},{0x6249, 0xB476},{0x624A, 0xD951},{0x624B, 0xA4E2},{0x624D, 0xA47E},
+ {0x624E, 0xA4E3},{0x6250, 0xC97D},{0x6251, 0xA5B7},{0x6252, 0xA5B6},{0x6253, 0xA5B4},{0x6254, 0xA5B5},{0x6258, 0xA6AB},{0x6259, 0xC9E9},
+ {0x625A, 0xC9EB},{0x625B, 0xA6AA},{0x625C, 0xC9E3},{0x625E, 0xC9E4},{0x6260, 0xC9EA},{0x6261, 0xC9E6},{0x6262, 0xC9E8},{0x6263, 0xA6A9},
+ {0x6264, 0xC9E5},{0x6265, 0xC9EC},{0x6266, 0xC9E7},{0x626D, 0xA7E1},{0x626E, 0xA7EA},{0x626F, 0xA7E8},{0x6270, 0xCAF0},{0x6271, 0xCAED},
+ {0x6272, 0xCAF5},{0x6273, 0xA7E6},{0x6274, 0xCAF6},{0x6276, 0xA7DF},{0x6277, 0xCAF3},{0x6279, 0xA7E5},{0x627A, 0xCAEF},{0x627B, 0xCAEE},
+ {0x627C, 0xA7E3},{0x627D, 0xCAF4},{0x627E, 0xA7E4},{0x627F, 0xA9D3},{0x6280, 0xA7DE},{0x6281, 0xCAF1},{0x6283, 0xCAE7},{0x6284, 0xA7DB},
+ {0x6286, 0xA7EE},{0x6287, 0xCAEC},{0x6288, 0xCAF2},{0x6289, 0xA7E0},{0x628A, 0xA7E2},{0x628C, 0xCAE8},{0x628E, 0xCAE9},{0x628F, 0xCAEA},
+ {0x6291, 0xA7ED},{0x6292, 0xA7E7},{0x6293, 0xA7EC},{0x6294, 0xCAEB},{0x6295, 0xA7EB},{0x6296, 0xA7DD},{0x6297, 0xA7DC},{0x6298, 0xA7E9},
+ {0x62A8, 0xA9E1},{0x62A9, 0xCCBE},{0x62AA, 0xCCB7},{0x62AB, 0xA9DC},{0x62AC, 0xA9EF},{0x62AD, 0xCCB3},{0x62AE, 0xCCBA},{0x62AF, 0xCCBC},
+ {0x62B0, 0xCCBF},{0x62B1, 0xA9EA},{0x62B3, 0xCCBB},{0x62B4, 0xCCB4},{0x62B5, 0xA9E8},{0x62B6, 0xCCB8},{0x62B8, 0xCCC0},{0x62B9, 0xA9D9},
+ {0x62BB, 0xCCBD},{0x62BC, 0xA9E3},{0x62BD, 0xA9E2},{0x62BE, 0xCCB6},{0x62BF, 0xA9D7},{0x62C2, 0xA9D8},{0x62C4, 0xA9D6},{0x62C6, 0xA9EE},
+ {0x62C7, 0xA9E6},{0x62C8, 0xA9E0},{0x62C9, 0xA9D4},{0x62CA, 0xCCB9},{0x62CB, 0xA9DF},{0x62CC, 0xA9D5},{0x62CD, 0xA9E7},{0x62CE, 0xA9F0},
+ {0x62CF, 0xCED4},{0x62D0, 0xA9E4},{0x62D1, 0xCCB5},{0x62D2, 0xA9DA},{0x62D3, 0xA9DD},{0x62D4, 0xA9DE},{0x62D6, 0xA9EC},{0x62D7, 0xA9ED},
+ {0x62D8, 0xA9EB},{0x62D9, 0xA9E5},{0x62DA, 0xA9E9},{0x62DB, 0xA9DB},{0x62DC, 0xABF4},{0x62EB, 0xCEDA},{0x62EC, 0xAC41},{0x62ED, 0xABF8},
+ {0x62EE, 0xABFA},{0x62EF, 0xAC40},{0x62F0, 0xCEE6},{0x62F1, 0xABFD},{0x62F2, 0xD1B1},{0x62F3, 0xAEB1},{0x62F4, 0xAC43},{0x62F5, 0xCED7},
+ {0x62F6, 0xCEDF},{0x62F7, 0xABFE},{0x62F8, 0xCEDE},{0x62F9, 0xCEDB},{0x62FA, 0xCEE3},{0x62FB, 0xCEE5},{0x62FC, 0xABF7},{0x62FD, 0xABFB},
+ {0x62FE, 0xAC42},{0x62FF, 0xAEB3},{0x6300, 0xCEE0},{0x6301, 0xABF9},{0x6302, 0xAC45},{0x6303, 0xCED9},{0x6307, 0xABFC},{0x6308, 0xAEB2},
+ {0x6309, 0xABF6},{0x630B, 0xCED6},{0x630C, 0xCEDD},{0x630D, 0xCED5},{0x630E, 0xCED8},{0x630F, 0xCEDC},{0x6310, 0xD1B2},{0x6311, 0xAC44},
+ {0x6313, 0xCEE1},{0x6314, 0xCEE2},{0x6315, 0xCEE4},{0x6316, 0xABF5},{0x6328, 0xAEC1},{0x6329, 0xD1BE},{0x632A, 0xAEBF},{0x632B, 0xAEC0},
+ {0x632C, 0xD1B4},{0x632D, 0xD1C4},{0x632F, 0xAEB6},{0x6332, 0xD566},{0x6333, 0xD1C6},{0x6334, 0xD1C0},{0x6336, 0xD1B7},{0x6338, 0xD1C9},
+ {0x6339, 0xD1BA},{0x633A, 0xAEBC},{0x633B, 0xD57D},{0x633C, 0xD1BD},{0x633D, 0xAEBE},{0x633E, 0xAEB5},{0x6340, 0xD1CB},{0x6341, 0xD1BF},
+ {0x6342, 0xAEB8},{0x6343, 0xD1B8},{0x6344, 0xD1B5},{0x6345, 0xD1B6},{0x6346, 0xAEB9},{0x6347, 0xD1C5},{0x6348, 0xD1CC},{0x6349, 0xAEBB},
+ {0x634A, 0xD1BC},{0x634B, 0xD1BB},{0x634C, 0xAEC3},{0x634D, 0xAEC2},{0x634E, 0xAEB4},{0x634F, 0xAEBA},{0x6350, 0xAEBD},{0x6351, 0xD1C8},
+ {0x6354, 0xD1C2},{0x6355, 0xAEB7},{0x6356, 0xD1B3},{0x6357, 0xD1CA},{0x6358, 0xD1C1},{0x6359, 0xD1C3},{0x635A, 0xD1C7},{0x6365, 0xD567},
+ {0x6367, 0xB1B7},{0x6368, 0xB1CB},{0x6369, 0xB1CA},{0x636B, 0xB1BF},{0x636D, 0xD579},{0x636E, 0xD575},{0x636F, 0xD572},{0x6370, 0xD5A6},
+ {0x6371, 0xB1BA},{0x6372, 0xB1B2},{0x6375, 0xD577},{0x6376, 0xB4A8},{0x6377, 0xB1B6},{0x6378, 0xD5A1},{0x637A, 0xB1CC},{0x637B, 0xB1C9},
+ {0x637C, 0xD57B},{0x637D, 0xD56A},{0x6380, 0xB1C8},{0x6381, 0xD5A3},{0x6382, 0xD569},{0x6383, 0xB1BD},{0x6384, 0xB1C1},{0x6385, 0xD5A2},
+ {0x6387, 0xD573},{0x6388, 0xB1C2},{0x6389, 0xB1BC},{0x638A, 0xD568},{0x638C, 0xB478},{0x638D, 0xD5A5},{0x638E, 0xD571},{0x638F, 0xB1C7},
+ {0x6390, 0xD574},{0x6391, 0xD5A4},{0x6392, 0xB1C6},{0x6394, 0xD952},{0x6396, 0xB1B3},{0x6397, 0xD56F},{0x6398, 0xB1B8},{0x6399, 0xB1C3},
+ {0x639B, 0xB1BE},{0x639C, 0xD578},{0x639D, 0xD56E},{0x639E, 0xD56C},{0x639F, 0xD57E},{0x63A0, 0xB1B0},{0x63A1, 0xB1C4},{0x63A2, 0xB1B4},
+ {0x63A3, 0xB477},{0x63A4, 0xD57C},{0x63A5, 0xB1B5},{0x63A7, 0xB1B1},{0x63A8, 0xB1C0},{0x63A9, 0xB1BB},{0x63AA, 0xB1B9},{0x63AB, 0xD570},
+ {0x63AC, 0xB1C5},{0x63AD, 0xD56D},{0x63AE, 0xD57A},{0x63AF, 0xD576},{0x63B0, 0xD954},{0x63B1, 0xD953},{0x63BD, 0xD56B},{0x63BE, 0xD964},
+ {0x63C0, 0xB47A},{0x63C2, 0xD96A},{0x63C3, 0xD959},{0x63C4, 0xD967},{0x63C5, 0xDD77},{0x63C6, 0xB47D},{0x63C7, 0xD96B},{0x63C8, 0xD96E},
+ {0x63C9, 0xB47C},{0x63CA, 0xD95C},{0x63CB, 0xD96D},{0x63CC, 0xD96C},{0x63CD, 0xB47E},{0x63CE, 0xD955},{0x63CF, 0xB479},{0x63D0, 0xB4A3},
+ {0x63D2, 0xB4A1},{0x63D3, 0xD969},{0x63D5, 0xD95F},{0x63D6, 0xB4A5},{0x63D7, 0xD970},{0x63D8, 0xD968},{0x63D9, 0xD971},{0x63DA, 0xB4AD},
+ {0x63DB, 0xB4AB},{0x63DC, 0xD966},{0x63DD, 0xD965},{0x63DF, 0xD963},{0x63E0, 0xD95D},{0x63E1, 0xB4A4},{0x63E3, 0xB4A2},{0x63E4, 0xD1B9},
+ {0x63E5, 0xD956},{0x63E7, 0xDDB7},{0x63E8, 0xD957},{0x63E9, 0xB47B},{0x63EA, 0xB4AA},{0x63EB, 0xDD79},{0x63ED, 0xB4A6},{0x63EE, 0xB4A7},
+ {0x63EF, 0xD958},{0x63F0, 0xD96F},{0x63F1, 0xDD78},{0x63F2, 0xD960},{0x63F3, 0xD95B},{0x63F4, 0xB4A9},{0x63F5, 0xD961},{0x63F6, 0xD95E},
+ {0x63F9, 0xB4AE},{0x6406, 0xB770},{0x6409, 0xDD7C},{0x640A, 0xDDB1},{0x640B, 0xDDB6},{0x640C, 0xDDAA},{0x640D, 0xB76C},{0x640E, 0xDDBB},
+ {0x640F, 0xB769},{0x6410, 0xDD7A},{0x6412, 0xDD7B},{0x6413, 0xB762},{0x6414, 0xB76B},{0x6415, 0xDDA4},{0x6416, 0xB76E},{0x6417, 0xB76F},
+ {0x6418, 0xDDA5},{0x641A, 0xDDB2},{0x641B, 0xDDB8},{0x641C, 0xB76A},{0x641E, 0xB764},{0x641F, 0xDDA3},{0x6420, 0xDD7D},{0x6421, 0xDDBA},
+ {0x6422, 0xDDA8},{0x6423, 0xDDA9},{0x6424, 0xDD7E},{0x6425, 0xDDB4},{0x6426, 0xDDAB},{0x6427, 0xDDB5},{0x6428, 0xDDAD},{0x642A, 0xB765},
+ {0x642B, 0xE1D9},{0x642C, 0xB768},{0x642D, 0xB766},{0x642E, 0xDDB9},{0x642F, 0xDDB0},{0x6430, 0xDDAC},{0x6433, 0xDDA1},{0x6434, 0xBA53},
+ {0x6435, 0xDDAF},{0x6436, 0xB76D},{0x6437, 0xDDA7},{0x6439, 0xDDA6},{0x643D, 0xB767},{0x643E, 0xB763},{0x643F, 0xE1EE},{0x6440, 0xDDB3},
+ {0x6441, 0xDDAE},{0x6443, 0xDDA2},{0x644B, 0xE1E9},{0x644D, 0xE1DA},{0x644E, 0xE1E5},{0x6450, 0xE1EC},{0x6451, 0xBA51},{0x6452, 0xB4AC},
+ {0x6453, 0xE1EA},{0x6454, 0xBA4C},{0x6458, 0xBA4B},{0x6459, 0xE1F1},{0x645B, 0xE1DB},{0x645C, 0xE1E8},{0x645D, 0xE1DC},{0x645E, 0xE1E7},
+ {0x645F, 0xBA4F},{0x6460, 0xE1EB},{0x6461, 0xD962},{0x6465, 0xE1F2},{0x6466, 0xE1E3},{0x6467, 0xBA52},{0x6468, 0xE5BA},{0x6469, 0xBCAF},
+ {0x646B, 0xE1F0},{0x646C, 0xE1EF},{0x646D, 0xBA54},{0x646E, 0xE5AD},{0x646F, 0xBCB0},{0x6470, 0xE5AE},{0x6472, 0xE1DF},{0x6473, 0xE1E0},
+ {0x6474, 0xE1DD},{0x6475, 0xE1E2},{0x6476, 0xE1DE},{0x6477, 0xE1F3},{0x6478, 0xBA4E},{0x6479, 0xBCB1},{0x647A, 0xBA50},{0x647B, 0xBA55},
+ {0x647D, 0xE1E1},{0x647F, 0xE1ED},{0x6482, 0xE1E6},{0x6485, 0xE5B1},{0x6487, 0xBA4A},{0x6488, 0xBCB4},{0x6489, 0xE9AA},{0x648A, 0xE5B6},
+ {0x648B, 0xE5B5},{0x648C, 0xE5B7},{0x648F, 0xE5B4},{0x6490, 0xBCB5},{0x6492, 0xBCBB},{0x6493, 0xBCB8},{0x6495, 0xBCB9},{0x6496, 0xE5AF},
+ {0x6497, 0xE5B2},{0x6498, 0xE5BC},{0x6499, 0xBCC1},{0x649A, 0xBCBF},{0x649C, 0xE5B3},{0x649D, 0xD95A},{0x649E, 0xBCB2},{0x649F, 0xE5B9},
+ {0x64A0, 0xE5B0},{0x64A2, 0xBCC2},{0x64A3, 0xE5B8},{0x64A4, 0xBA4D},{0x64A5, 0xBCB7},{0x64A6, 0xE1E4},{0x64A9, 0xBCBA},{0x64AB, 0xBCBE},
+ {0x64AC, 0xBCC0},{0x64AD, 0xBCBD},{0x64AE, 0xBCBC},{0x64B0, 0xBCB6},{0x64B1, 0xE5BB},{0x64B2, 0xBCB3},{0x64B3, 0xBCC3},{0x64BB, 0xBED8},
+ {0x64BC, 0xBED9},{0x64BD, 0xE9A9},{0x64BE, 0xBEE2},{0x64BF, 0xBEDF},{0x64C1, 0xBED6},{0x64C2, 0xBEDD},{0x64C3, 0xE9AB},{0x64C4, 0xBEDB},
+ {0x64C5, 0xBED5},{0x64C7, 0xBEDC},{0x64C9, 0xE9A8},{0x64CA, 0xC0BB},{0x64CB, 0xBED7},{0x64CD, 0xBEDE},{0x64CE, 0xC0BA},{0x64CF, 0xE9A7},
+ {0x64D0, 0xE9A6},{0x64D2, 0xBEE0},{0x64D4, 0xBEE1},{0x64D6, 0xE9A5},{0x64D7, 0xE9A4},{0x64D8, 0xC0BC},{0x64D9, 0xE9AE},{0x64DA, 0xBEDA},
+ {0x64DB, 0xE9AC},{0x64E0, 0xC0BD},{0x64E2, 0xC0C2},{0x64E3, 0xECEA},{0x64E4, 0xECEC},{0x64E6, 0xC0BF},{0x64E8, 0xECED},{0x64E9, 0xECE9},
+ {0x64EB, 0xECEB},{0x64EC, 0xC0C0},{0x64ED, 0xC0C3},{0x64EF, 0xECE8},{0x64F0, 0xC0BE},{0x64F1, 0xC0C1},{0x64F2, 0xC259},{0x64F3, 0xE9AD},
+ {0x64F4, 0xC258},{0x64F7, 0xC25E},{0x64F8, 0xEFD4},{0x64FA, 0xC25C},{0x64FB, 0xC25D},{0x64FC, 0xEFD7},{0x64FD, 0xEFD3},{0x64FE, 0xC25A},
+ {0x64FF, 0xEFD1},{0x6500, 0xC36B},{0x6501, 0xEFD5},{0x6503, 0xEFD6},{0x6504, 0xEFD2},{0x6506, 0xC25B},{0x6507, 0xF242},{0x6509, 0xF245},
+ {0x650C, 0xF246},{0x650D, 0xF244},{0x650E, 0xF247},{0x650F, 0xC36C},{0x6510, 0xF243},{0x6513, 0xF44E},{0x6514, 0xC464},{0x6515, 0xF44D},
+ {0x6516, 0xF44C},{0x6517, 0xF44B},{0x6518, 0xC463},{0x6519, 0xC465},{0x651B, 0xF5CD},{0x651C, 0xC4E2},{0x651D, 0xC4E1},{0x6520, 0xF6E1},
+ {0x6521, 0xF6E0},{0x6522, 0xF6E3},{0x6523, 0xC5CB},{0x6524, 0xC575},{0x6525, 0xF7DD},{0x6526, 0xF6E2},{0x6529, 0xF7DC},{0x652A, 0xC5CD},
+ {0x652B, 0xC5CC},{0x652C, 0xC5F3},{0x652D, 0xF8A9},{0x652E, 0xF8EF},{0x652F, 0xA4E4},{0x6532, 0xD972},{0x6533, 0xE9AF},{0x6536, 0xA6AC},
+ {0x6537, 0xCAF7},{0x6538, 0xA7F1},{0x6539, 0xA7EF},{0x653B, 0xA7F0},{0x653D, 0xCCC1},{0x653E, 0xA9F1},{0x653F, 0xAC46},{0x6541, 0xCEE7},
+ {0x6543, 0xCEE8},{0x6545, 0xAC47},{0x6546, 0xD1CE},{0x6548, 0xAEC4},{0x6549, 0xAEC5},{0x654A, 0xD1CD},{0x654F, 0xB1D3},{0x6551, 0xB1CF},
+ {0x6553, 0xD5A7},{0x6554, 0xB1D6},{0x6555, 0xB1D5},{0x6556, 0xB1CE},{0x6557, 0xB1D1},{0x6558, 0xB1D4},{0x6559, 0xB1D0},{0x655C, 0xD976},
+ {0x655D, 0xB1CD},{0x655E, 0xB4AF},{0x6562, 0xB4B1},{0x6563, 0xB4B2},{0x6564, 0xD975},{0x6565, 0xD978},{0x6566, 0xB4B0},{0x6567, 0xD973},
+ {0x6568, 0xD977},{0x656A, 0xD974},{0x656C, 0xB771},{0x656F, 0xDDBC},{0x6572, 0xBA56},{0x6573, 0xE1F4},{0x6574, 0xBEE3},{0x6575, 0xBCC4},
+ {0x6576, 0xE5BD},{0x6577, 0xBCC5},{0x6578, 0xBCC6},{0x6579, 0xE5BF},{0x657A, 0xE5BE},{0x657B, 0xE5C0},{0x657C, 0xE9B1},{0x657F, 0xE9B0},
+ {0x6580, 0xECEF},{0x6581, 0xECEE},{0x6582, 0xC0C4},{0x6583, 0xC0C5},{0x6584, 0xF248},{0x6587, 0xA4E5},{0x658C, 0xD979},{0x6590, 0xB4B4},
+ {0x6591, 0xB4B3},{0x6592, 0xDDBD},{0x6594, 0xEFD8},{0x6595, 0xC4E3},{0x6596, 0xF7DE},{0x6597, 0xA4E6},{0x6599, 0xAEC6},{0x659B, 0xB1D8},
+ {0x659C, 0xB1D7},{0x659D, 0xD97A},{0x659E, 0xD97B},{0x659F, 0xB772},{0x65A0, 0xE1F5},{0x65A1, 0xBA57},{0x65A2, 0xE9B2},{0x65A4, 0xA4E7},
+ {0x65A5, 0xA5B8},{0x65A7, 0xA9F2},{0x65A8, 0xCCC2},{0x65AA, 0xCEE9},{0x65AB, 0xAC48},{0x65AC, 0xB1D9},{0x65AE, 0xD97C},{0x65AF, 0xB4B5},
+ {0x65B0, 0xB773},{0x65B2, 0xE5C1},{0x65B3, 0xE5C2},{0x65B6, 0xECF0},{0x65B7, 0xC25F},{0x65B8, 0xF8F0},{0x65B9, 0xA4E8},{0x65BB, 0xCCC3},
+ {0x65BC, 0xA9F3},{0x65BD, 0xAC49},{0x65BF, 0xCEEA},{0x65C1, 0xAEC7},{0x65C2, 0xD1D2},{0x65C3, 0xD1D0},{0x65C4, 0xD1D1},{0x65C5, 0xAEC8},
+ {0x65C6, 0xD1CF},{0x65CB, 0xB1DB},{0x65CC, 0xB1DC},{0x65CD, 0xD5A8},{0x65CE, 0xB1DD},{0x65CF, 0xB1DA},{0x65D0, 0xD97D},{0x65D2, 0xD97E},
+ {0x65D3, 0xDDBE},{0x65D6, 0xBA59},{0x65D7, 0xBA58},{0x65DA, 0xECF1},{0x65DB, 0xEFD9},{0x65DD, 0xF24A},{0x65DE, 0xF249},{0x65DF, 0xF44F},
+ {0x65E1, 0xC95E},{0x65E2, 0xAC4A},{0x65E5, 0xA4E9},{0x65E6, 0xA5B9},{0x65E8, 0xA6AE},{0x65E9, 0xA6AD},{0x65EC, 0xA6AF},{0x65ED, 0xA6B0},
+ {0x65EE, 0xC9EE},{0x65EF, 0xC9ED},{0x65F0, 0xCAF8},{0x65F1, 0xA7F2},{0x65F2, 0xCAFB},{0x65F3, 0xCAFA},{0x65F4, 0xCAF9},{0x65F5, 0xCAFC},
+ {0x65FA, 0xA9F4},{0x65FB, 0xCCC9},{0x65FC, 0xCCC5},{0x65FD, 0xCCCE},{0x6600, 0xA9FB},{0x6602, 0xA9F9},{0x6603, 0xCCCA},{0x6604, 0xCCC6},
+ {0x6605, 0xCCCD},{0x6606, 0xA9F8},{0x6607, 0xAA40},{0x6608, 0xCCC8},{0x6609, 0xCCC4},{0x660A, 0xA9FE},{0x660B, 0xCCCB},{0x660C, 0xA9F7},
+ {0x660D, 0xCCCC},{0x660E, 0xA9FA},{0x660F, 0xA9FC},{0x6610, 0xCCD0},{0x6611, 0xCCCF},{0x6612, 0xCCC7},{0x6613, 0xA9F6},{0x6614, 0xA9F5},
+ {0x6615, 0xA9FD},{0x661C, 0xCEEF},{0x661D, 0xCEF5},{0x661F, 0xAC50},{0x6620, 0xAC4D},{0x6621, 0xCEEC},{0x6622, 0xCEF1},{0x6624, 0xAC53},
+ {0x6625, 0xAC4B},{0x6626, 0xCEF0},{0x6627, 0xAC4E},{0x6628, 0xAC51},{0x662B, 0xCEF3},{0x662D, 0xAC4C},{0x662E, 0xCEF8},{0x662F, 0xAC4F},
+ {0x6631, 0xAC52},{0x6632, 0xCEED},{0x6633, 0xCEF2},{0x6634, 0xCEF6},{0x6635, 0xCEEE},{0x6636, 0xCEEB},{0x6639, 0xCEF7},{0x663A, 0xCEF4},
+ {0x6641, 0xAED0},{0x6642, 0xAEC9},{0x6643, 0xAECC},{0x6645, 0xAECF},{0x6647, 0xD1D5},{0x6649, 0xAECA},{0x664A, 0xD1D3},{0x664C, 0xAECE},
+ {0x664F, 0xAECB},{0x6651, 0xD1D6},{0x6652, 0xAECD},{0x6659, 0xD5AC},{0x665A, 0xB1DF},{0x665B, 0xD5AB},{0x665C, 0xD5AD},{0x665D, 0xB1DE},
+ {0x665E, 0xB1E3},{0x665F, 0xD1D4},{0x6661, 0xD5AA},{0x6662, 0xD5AE},{0x6664, 0xB1E0},{0x6665, 0xD5A9},{0x6666, 0xB1E2},{0x6668, 0xB1E1},
+ {0x666A, 0xD9A7},{0x666C, 0xD9A2},{0x666E, 0xB4B6},{0x666F, 0xB4BA},{0x6670, 0xB4B7},{0x6671, 0xD9A5},{0x6672, 0xD9A8},{0x6674, 0xB4B8},
+ {0x6676, 0xB4B9},{0x6677, 0xB4BE},{0x6678, 0xDDC7},{0x6679, 0xD9A6},{0x667A, 0xB4BC},{0x667B, 0xD9A3},{0x667C, 0xD9A1},{0x667E, 0xB4BD},
+ {0x6680, 0xD9A4},{0x6684, 0xB779},{0x6686, 0xDDBF},{0x6687, 0xB776},{0x6688, 0xB777},{0x6689, 0xB775},{0x668A, 0xDDC4},{0x668B, 0xDDC3},
+ {0x668C, 0xDDC0},{0x668D, 0xB77B},{0x6690, 0xDDC2},{0x6691, 0xB4BB},{0x6694, 0xDDC6},{0x6695, 0xDDC1},{0x6696, 0xB778},{0x6697, 0xB774},
+ {0x6698, 0xB77A},{0x6699, 0xDDC5},{0x669D, 0xBA5C},{0x669F, 0xE1F8},{0x66A0, 0xE1F7},{0x66A1, 0xE1F6},{0x66A2, 0xBA5A},{0x66A8, 0xBA5B},
+ {0x66A9, 0xE5C5},{0x66AA, 0xE5C8},{0x66AB, 0xBCC8},{0x66AE, 0xBCC7},{0x66AF, 0xE5C9},{0x66B0, 0xE5C4},{0x66B1, 0xBCCA},{0x66B2, 0xE5C6},
+ {0x66B4, 0xBCC9},{0x66B5, 0xE5C3},{0x66B7, 0xE5C7},{0x66B8, 0xBEE9},{0x66B9, 0xBEE6},{0x66BA, 0xE9BB},{0x66BB, 0xE9BA},{0x66BD, 0xE9B9},
+ {0x66BE, 0xE9B4},{0x66C0, 0xE9B5},{0x66C4, 0xBEE7},{0x66C6, 0xBEE4},{0x66C7, 0xBEE8},{0x66C8, 0xE9B3},{0x66C9, 0xBEE5},{0x66CA, 0xE9B6},
+ {0x66CB, 0xE9B7},{0x66CC, 0xE9BC},{0x66CF, 0xE9B8},{0x66D2, 0xECF2},{0x66D6, 0xC0C7},{0x66D8, 0xEFDC},{0x66D9, 0xC0C6},{0x66DA, 0xEFDA},
+ {0x66DB, 0xEFDB},{0x66DC, 0xC260},{0x66DD, 0xC36E},{0x66DE, 0xF24B},{0x66E0, 0xC36D},{0x66E3, 0xF451},{0x66E4, 0xF452},{0x66E6, 0xC466},
+ {0x66E8, 0xF450},{0x66E9, 0xC4E4},{0x66EB, 0xF7DF},{0x66EC, 0xC5CE},{0x66ED, 0xF8AA},{0x66EE, 0xF8AB},{0x66F0, 0xA4EA},{0x66F2, 0xA6B1},
+ {0x66F3, 0xA6B2},{0x66F4, 0xA7F3},{0x66F6, 0xCCD1},{0x66F7, 0xAC54},{0x66F8, 0xAED1},{0x66F9, 0xB1E4},{0x66FC, 0xB0D2},{0x66FE, 0xB4BF},
+ {0x66FF, 0xB4C0},{0x6700, 0xB3CC},{0x6701, 0xD9A9},{0x6703, 0xB77C},{0x6704, 0xE1FA},{0x6705, 0xE1F9},{0x6708, 0xA4EB},{0x6709, 0xA6B3},
+ {0x670A, 0xCCD2},{0x670B, 0xAA42},{0x670D, 0xAA41},{0x670F, 0xCEF9},{0x6710, 0xCEFA},{0x6712, 0xD1D7},{0x6713, 0xD1D8},{0x6714, 0xAED2},
+ {0x6715, 0xAED3},{0x6717, 0xAED4},{0x6718, 0xD5AF},{0x671B, 0xB1E6},{0x671D, 0xB4C2},{0x671F, 0xB4C1},{0x6720, 0xDDC8},{0x6721, 0xDF7A},
+ {0x6722, 0xE1FB},{0x6723, 0xE9BD},{0x6726, 0xC261},{0x6727, 0xC467},{0x6728, 0xA4EC},{0x672A, 0xA5BC},{0x672B, 0xA5BD},{0x672C, 0xA5BB},
+ {0x672D, 0xA5BE},{0x672E, 0xA5BA},{0x6731, 0xA6B6},{0x6733, 0xC9F6},{0x6734, 0xA6B5},{0x6735, 0xA6B7},{0x6738, 0xC9F1},{0x6739, 0xC9F0},
+ {0x673A, 0xC9F3},{0x673B, 0xC9F2},{0x673C, 0xC9F5},{0x673D, 0xA6B4},{0x673E, 0xC9EF},{0x673F, 0xC9F4},{0x6745, 0xCAFD},{0x6746, 0xA7FD},
+ {0x6747, 0xCAFE},{0x6748, 0xCB43},{0x6749, 0xA7FC},{0x674B, 0xCB47},{0x674C, 0xCB42},{0x674D, 0xCB45},{0x674E, 0xA7F5},{0x674F, 0xA7F6},
+ {0x6750, 0xA7F7},{0x6751, 0xA7F8},{0x6753, 0xA840},{0x6755, 0xCB41},{0x6756, 0xA7FA},{0x6757, 0xA841},{0x6759, 0xCB40},{0x675A, 0xCB46},
+ {0x675C, 0xA7F9},{0x675D, 0xCB44},{0x675E, 0xA7FB},{0x675F, 0xA7F4},{0x6760, 0xA7FE},{0x676A, 0xAA57},{0x676C, 0xCCD4},{0x676D, 0xAA43},
+ {0x676F, 0xAA4D},{0x6770, 0xAA4E},{0x6771, 0xAA46},{0x6772, 0xAA58},{0x6773, 0xAA48},{0x6774, 0xCCDC},{0x6775, 0xAA53},{0x6776, 0xCCD7},
+ {0x6777, 0xAA49},{0x6778, 0xCCE6},{0x6779, 0xCCE7},{0x677A, 0xCCDF},{0x677B, 0xCCD8},{0x677C, 0xAA56},{0x677D, 0xCCE4},{0x677E, 0xAA51},
+ {0x677F, 0xAA4F},{0x6781, 0xCCE5},{0x6783, 0xCCE3},{0x6784, 0xCCDB},{0x6785, 0xCCD3},{0x6786, 0xCCDA},{0x6787, 0xAA4A},{0x6789, 0xAA50},
+ {0x678B, 0xAA44},{0x678C, 0xCCDE},{0x678D, 0xCCDD},{0x678E, 0xCCD5},{0x6790, 0xAA52},{0x6791, 0xCCE1},{0x6792, 0xCCD6},{0x6793, 0xAA55},
+ {0x6794, 0xCCE8},{0x6795, 0xAA45},{0x6797, 0xAA4C},{0x6798, 0xCCD9},{0x6799, 0xCCE2},{0x679A, 0xAA54},{0x679C, 0xAA47},{0x679D, 0xAA4B},
+ {0x679F, 0xCCE0},{0x67AE, 0xCF5B},{0x67AF, 0xAC5C},{0x67B0, 0xAC69},{0x67B2, 0xCF56},{0x67B3, 0xCF4C},{0x67B4, 0xAC62},{0x67B5, 0xCF4A},
+ {0x67B6, 0xAC5B},{0x67B7, 0xCF45},{0x67B8, 0xAC65},{0x67B9, 0xCF52},{0x67BA, 0xCEFE},{0x67BB, 0xCF41},{0x67C0, 0xCF44},{0x67C1, 0xCEFB},
+ {0x67C2, 0xCF51},{0x67C3, 0xCF61},{0x67C4, 0xAC60},{0x67C5, 0xCF46},{0x67C6, 0xCF58},{0x67C8, 0xCEFD},{0x67C9, 0xCF5F},{0x67CA, 0xCF60},
+ {0x67CB, 0xCF63},{0x67CC, 0xCF5A},{0x67CD, 0xCF4B},{0x67CE, 0xCF53},{0x67CF, 0xAC66},{0x67D0, 0xAC59},{0x67D1, 0xAC61},{0x67D2, 0xAC6D},
+ {0x67D3, 0xAC56},{0x67D4, 0xAC58},{0x67D8, 0xCF43},{0x67D9, 0xAC6A},{0x67DA, 0xAC63},{0x67DB, 0xCF5D},{0x67DC, 0xCF40},{0x67DD, 0xAC6C},
+ {0x67DE, 0xAC67},{0x67DF, 0xCF49},{0x67E2, 0xAC6B},{0x67E3, 0xCF50},{0x67E4, 0xCF48},{0x67E5, 0xAC64},{0x67E6, 0xCF5C},{0x67E7, 0xCF54},
+ {0x67E9, 0xAC5E},{0x67EA, 0xCF62},{0x67EB, 0xCF47},{0x67EC, 0xAC5A},{0x67ED, 0xCF59},{0x67EE, 0xCF4F},{0x67EF, 0xAC5F},{0x67F0, 0xCF55},
+ {0x67F1, 0xAC57},{0x67F2, 0xCEFC},{0x67F3, 0xAC68},{0x67F4, 0xAEE3},{0x67F5, 0xAC5D},{0x67F6, 0xCF4E},{0x67F7, 0xCF4D},{0x67F8, 0xCF42},
+ {0x67FA, 0xCF5E},{0x67FC, 0xCF57},{0x67FF, 0xAC55},{0x6812, 0xD1EC},{0x6813, 0xAEEA},{0x6814, 0xD1ED},{0x6816, 0xD1E1},{0x6817, 0xAEDF},
+ {0x6818, 0xAEEB},{0x681A, 0xD1DA},{0x681C, 0xD1E3},{0x681D, 0xD1EB},{0x681F, 0xD1D9},{0x6820, 0xD1F4},{0x6821, 0xAED5},{0x6825, 0xD1F3},
+ {0x6826, 0xD1EE},{0x6828, 0xD1EF},{0x6829, 0xAEDD},{0x682A, 0xAEE8},{0x682B, 0xD1E5},{0x682D, 0xD1E6},{0x682E, 0xD1F0},{0x682F, 0xD1E7},
+ {0x6831, 0xD1E2},{0x6832, 0xD1DC},{0x6833, 0xD1DD},{0x6834, 0xD1EA},{0x6835, 0xD1E4},{0x6838, 0xAED6},{0x6839, 0xAEDA},{0x683A, 0xD1F2},
+ {0x683B, 0xD1DE},{0x683C, 0xAEE6},{0x683D, 0xAEE2},{0x6840, 0xAEE5},{0x6841, 0xAEEC},{0x6842, 0xAEDB},{0x6843, 0xAEE7},{0x6844, 0xD1E9},
+ {0x6845, 0xAEE9},{0x6846, 0xAED8},{0x6848, 0xAED7},{0x6849, 0xD1DB},{0x684B, 0xD1DF},{0x684C, 0xAEE0},{0x684D, 0xD1F1},{0x684E, 0xD1E8},
+ {0x684F, 0xD1E0},{0x6850, 0xAEE4},{0x6851, 0xAEE1},{0x6853, 0xAED9},{0x6854, 0xAEDC},{0x686B, 0xD5C4},{0x686D, 0xD5B4},{0x686E, 0xD5B5},
+ {0x686F, 0xD5B9},{0x6871, 0xD5C8},{0x6872, 0xD5C5},{0x6874, 0xD5BE},{0x6875, 0xD5BD},{0x6876, 0xB1ED},{0x6877, 0xD5C1},{0x6878, 0xD5D0},
+ {0x6879, 0xD5B0},{0x687B, 0xD5D1},{0x687C, 0xD5C3},{0x687D, 0xD5D5},{0x687E, 0xD5C9},{0x687F, 0xB1EC},{0x6880, 0xD5C7},{0x6881, 0xB1E7},
+ {0x6882, 0xB1FC},{0x6883, 0xB1F2},{0x6885, 0xB1F6},{0x6886, 0xB1F5},{0x6887, 0xD5B1},{0x6889, 0xD5CE},{0x688A, 0xD5D4},{0x688B, 0xD5CC},
+ {0x688C, 0xD5D3},{0x688F, 0xD5C0},{0x6890, 0xD5B2},{0x6891, 0xD5D2},{0x6892, 0xD5C2},{0x6893, 0xB1EA},{0x6894, 0xB1F7},{0x6896, 0xD5CB},
+ {0x6897, 0xB1F0},{0x689B, 0xD5CA},{0x689C, 0xD5B3},{0x689D, 0xB1F8},{0x689F, 0xB1FA},{0x68A0, 0xD5CD},{0x68A1, 0xB1FB},{0x68A2, 0xB1E9},
+ {0x68A3, 0xD5BA},{0x68A4, 0xD5CF},{0x68A7, 0xB1EF},{0x68A8, 0xB1F9},{0x68A9, 0xD5BC},{0x68AA, 0xD5C6},{0x68AB, 0xD5B7},{0x68AC, 0xD5BB},
+ {0x68AD, 0xB1F4},{0x68AE, 0xD5B6},{0x68AF, 0xB1E8},{0x68B0, 0xB1F1},{0x68B1, 0xB1EE},{0x68B2, 0xD5BF},{0x68B3, 0xAEDE},{0x68B4, 0xD9C0},
+ {0x68B5, 0xB1EB},{0x68C4, 0xB1F3},{0x68C6, 0xD9C3},{0x68C7, 0xD9D9},{0x68C8, 0xD9CE},{0x68C9, 0xB4D6},{0x68CB, 0xB4D1},{0x68CC, 0xD9BD},
+ {0x68CD, 0xB4D2},{0x68CE, 0xD9CD},{0x68D0, 0xD9C6},{0x68D1, 0xD9D3},{0x68D2, 0xB4CE},{0x68D3, 0xD9AB},{0x68D4, 0xD9D5},{0x68D5, 0xB4C4},
+ {0x68D6, 0xD9B3},{0x68D7, 0xB4C7},{0x68D8, 0xB4C6},{0x68DA, 0xB4D7},{0x68DC, 0xD9AD},{0x68DD, 0xD9CF},{0x68DE, 0xD9D0},{0x68DF, 0xB4C9},
+ {0x68E0, 0xB4C5},{0x68E1, 0xD9BB},{0x68E3, 0xB4D0},{0x68E4, 0xD9B6},{0x68E6, 0xD9D1},{0x68E7, 0xB4CC},{0x68E8, 0xD9C9},{0x68E9, 0xD9D6},
+ {0x68EA, 0xD9B0},{0x68EB, 0xD9B5},{0x68EC, 0xD9AF},{0x68EE, 0xB4CB},{0x68EF, 0xD9C2},{0x68F0, 0xDDDE},{0x68F1, 0xD9B1},{0x68F2, 0xB4CF},
+ {0x68F3, 0xD9BA},{0x68F4, 0xD9D2},{0x68F5, 0xB4CA},{0x68F6, 0xD9B7},{0x68F7, 0xD9B4},{0x68F8, 0xD9C5},{0x68F9, 0xB4CD},{0x68FA, 0xB4C3},
+ {0x68FB, 0xB4D9},{0x68FC, 0xD9C8},{0x68FD, 0xD9C7},{0x6904, 0xD9AC},{0x6905, 0xB4C8},{0x6906, 0xD9D4},{0x6907, 0xD9BC},{0x6908, 0xD9BE},
+ {0x690A, 0xD9CB},{0x690B, 0xD9CA},{0x690C, 0xD9AA},{0x690D, 0xB4D3},{0x690E, 0xB4D5},{0x690F, 0xD9B2},{0x6910, 0xD9B9},{0x6911, 0xD9C1},
+ {0x6912, 0xB4D4},{0x6913, 0xD9B8},{0x6914, 0xD9C4},{0x6915, 0xD9D7},{0x6917, 0xD9CC},{0x6925, 0xD9D8},{0x692A, 0xD9AE},{0x692F, 0xDDF2},
+ {0x6930, 0xB7A6},{0x6932, 0xDDF0},{0x6933, 0xDDDB},{0x6934, 0xDDE0},{0x6935, 0xDDD9},{0x6937, 0xDDEC},{0x6938, 0xDDCB},{0x6939, 0xDDD2},
+ {0x693B, 0xDDEA},{0x693C, 0xDDF4},{0x693D, 0xDDDC},{0x693F, 0xDDCF},{0x6940, 0xDDE2},{0x6941, 0xDDE7},{0x6942, 0xDDD3},{0x6944, 0xDDE4},
+ {0x6945, 0xDDD0},{0x6948, 0xDDD7},{0x6949, 0xDDD8},{0x694A, 0xB7A8},{0x694B, 0xDDEB},{0x694C, 0xDDE9},{0x694E, 0xDDCC},{0x694F, 0xDDEE},
+ {0x6951, 0xDDEF},{0x6952, 0xDDF1},{0x6953, 0xB7AC},{0x6954, 0xB7A4},{0x6956, 0xD5B8},{0x6957, 0xDDD4},{0x6958, 0xDDE6},{0x6959, 0xDDD5},
+ {0x695A, 0xB7A1},{0x695B, 0xB7B1},{0x695C, 0xDDED},{0x695D, 0xB7AF},{0x695E, 0xB7AB},{0x695F, 0xDDCA},{0x6960, 0xB7A3},{0x6962, 0xDDCD},
+ {0x6963, 0xB7B0},{0x6965, 0xDDDD},{0x6966, 0xDDC9},{0x6968, 0xB7A9},{0x6969, 0xDDE1},{0x696A, 0xDDD1},{0x696B, 0xB7AA},{0x696C, 0xDDDA},
+ {0x696D, 0xB77E},{0x696E, 0xB4D8},{0x696F, 0xDDE3},{0x6970, 0xD9BF},{0x6971, 0xDDCE},{0x6974, 0xDDE8},{0x6975, 0xB7A5},{0x6976, 0xDDE5},
+ {0x6977, 0xB7A2},{0x6978, 0xDDDF},{0x6979, 0xB7AD},{0x697A, 0xDDD6},{0x697B, 0xDDF3},{0x6982, 0xB7A7},{0x6983, 0xDEC6},{0x6986, 0xB7AE},
+ {0x698D, 0xE24A},{0x698E, 0xE248},{0x6990, 0xE25E},{0x6991, 0xE246},{0x6993, 0xE258},{0x6994, 0xB77D},{0x6995, 0xBA5F},{0x6996, 0xE242},
+ {0x6997, 0xE25D},{0x6999, 0xE247},{0x699A, 0xE255},{0x699B, 0xBA64},{0x699C, 0xBA5D},{0x699E, 0xE25B},{0x69A0, 0xE240},{0x69A1, 0xE25A},
+ {0x69A3, 0xBA6F},{0x69A4, 0xE251},{0x69A5, 0xE261},{0x69A6, 0xBA6D},{0x69A7, 0xE249},{0x69A8, 0xBA5E},{0x69A9, 0xE24B},{0x69AA, 0xE259},
+ {0x69AB, 0xBA67},{0x69AC, 0xE244},{0x69AD, 0xBA6B},{0x69AE, 0xBA61},{0x69AF, 0xE24D},{0x69B0, 0xE243},{0x69B1, 0xE1FC},{0x69B3, 0xE257},
+ {0x69B4, 0xBA68},{0x69B5, 0xE260},{0x69B6, 0xE1FD},{0x69B7, 0xBA65},{0x69B9, 0xE253},{0x69BB, 0xBA66},{0x69BC, 0xE245},{0x69BD, 0xE250},
+ {0x69BE, 0xE24C},{0x69BF, 0xE24E},{0x69C1, 0xBA60},{0x69C2, 0xE25F},{0x69C3, 0xBA6E},{0x69C4, 0xE24F},{0x69C6, 0xE262},{0x69C9, 0xE1FE},
+ {0x69CA, 0xE254},{0x69CB, 0xBA63},{0x69CC, 0xBA6C},{0x69CD, 0xBA6A},{0x69CE, 0xE241},{0x69CF, 0xE256},{0x69D0, 0xBA69},{0x69D3, 0xBA62},
+ {0x69D4, 0xE252},{0x69D9, 0xE25C},{0x69E2, 0xE5D5},{0x69E4, 0xE5D1},{0x69E5, 0xE5CD},{0x69E6, 0xE5E1},{0x69E7, 0xE5DE},{0x69E8, 0xBCCD},
+ {0x69EB, 0xE5E5},{0x69EC, 0xE5D4},{0x69ED, 0xBCD8},{0x69EE, 0xE5DB},{0x69F1, 0xE5D0},{0x69F2, 0xE5DA},{0x69F3, 0xBCD5},{0x69F4, 0xE5EE},
+ {0x69F6, 0xE5EB},{0x69F7, 0xE5DD},{0x69F8, 0xE5CE},{0x69FB, 0xE5E2},{0x69FC, 0xE5E4},{0x69FD, 0xBCD1},{0x69FE, 0xE5D8},{0x69FF, 0xE5D3},
+ {0x6A00, 0xE5CA},{0x6A01, 0xBCCE},{0x6A02, 0xBCD6},{0x6A04, 0xE5E7},{0x6A05, 0xBCD7},{0x6A06, 0xE5CB},{0x6A07, 0xE5ED},{0x6A08, 0xE5E0},
+ {0x6A09, 0xE5E6},{0x6A0A, 0xBCD4},{0x6A0D, 0xE5E3},{0x6A0F, 0xE5EA},{0x6A11, 0xBCD9},{0x6A13, 0xBCD3},{0x6A14, 0xE5DC},{0x6A15, 0xE5CF},
+ {0x6A16, 0xE5EF},{0x6A17, 0xE5CC},{0x6A18, 0xE5E8},{0x6A19, 0xBCD0},{0x6A1B, 0xE5D6},{0x6A1D, 0xE5D7},{0x6A1E, 0xBCCF},{0x6A1F, 0xBCCC},
+ {0x6A20, 0xE5D2},{0x6A21, 0xBCD2},{0x6A23, 0xBCCB},{0x6A25, 0xE5E9},{0x6A26, 0xE5EC},{0x6A27, 0xE5D9},{0x6A28, 0xE9CA},{0x6A32, 0xE9C2},
+ {0x6A34, 0xE9BE},{0x6A35, 0xBEF6},{0x6A38, 0xBEEB},{0x6A39, 0xBEF0},{0x6A3A, 0xBEEC},{0x6A3B, 0xE9CC},{0x6A3C, 0xE9D7},{0x6A3D, 0xBEEA},
+ {0x6A3E, 0xE9C4},{0x6A3F, 0xE9CD},{0x6A40, 0xE5DF},{0x6A41, 0xE9CE},{0x6A44, 0xBEF1},{0x6A46, 0xE9DD},{0x6A47, 0xBEF5},{0x6A48, 0xBEF8},
+ {0x6A49, 0xE9C0},{0x6A4B, 0xBEF4},{0x6A4D, 0xE9DB},{0x6A4E, 0xE9DC},{0x6A4F, 0xE9D2},{0x6A50, 0xE9D1},{0x6A51, 0xE9C9},{0x6A54, 0xE9D3},
+ {0x6A55, 0xE9DA},{0x6A56, 0xE9D9},{0x6A58, 0xBEEF},{0x6A59, 0xBEED},{0x6A5A, 0xE9CB},{0x6A5B, 0xE9C8},{0x6A5D, 0xE9C5},{0x6A5E, 0xE9D8},
+ {0x6A5F, 0xBEF7},{0x6A60, 0xE9D6},{0x6A61, 0xBEF3},{0x6A62, 0xBEF2},{0x6A64, 0xE9D0},{0x6A66, 0xE9BF},{0x6A67, 0xE9C1},{0x6A68, 0xE9C3},
+ {0x6A69, 0xE9D5},{0x6A6A, 0xE9CF},{0x6A6B, 0xBEEE},{0x6A6D, 0xE9C6},{0x6A6F, 0xE9D4},{0x6A76, 0xE9C7},{0x6A7E, 0xC0CF},{0x6A7F, 0xED45},
+ {0x6A80, 0xC0C8},{0x6A81, 0xECF5},{0x6A83, 0xED41},{0x6A84, 0xC0CA},{0x6A85, 0xED48},{0x6A87, 0xECFC},{0x6A89, 0xECF7},{0x6A8C, 0xED49},
+ {0x6A8D, 0xECF3},{0x6A8E, 0xECFE},{0x6A90, 0xC0D1},{0x6A91, 0xED44},{0x6A92, 0xED4A},{0x6A93, 0xECFD},{0x6A94, 0xC0C9},{0x6A95, 0xED40},
+ {0x6A96, 0xECF4},{0x6A97, 0xC0D0},{0x6A9A, 0xED47},{0x6A9B, 0xECF9},{0x6A9C, 0xC0CC},{0x6A9E, 0xECFB},{0x6A9F, 0xECF8},{0x6AA0, 0xC0D2},
+ {0x6AA1, 0xECFA},{0x6AA2, 0xC0CB},{0x6AA3, 0xC0CE},{0x6AA4, 0xED43},{0x6AA5, 0xECF6},{0x6AA6, 0xED46},{0x6AA8, 0xED42},{0x6AAC, 0xC263},
+ {0x6AAD, 0xEFE7},{0x6AAE, 0xC268},{0x6AAF, 0xC269},{0x6AB3, 0xC262},{0x6AB4, 0xEFE6},{0x6AB6, 0xEFE3},{0x6AB7, 0xEFE4},{0x6AB8, 0xC266},
+ {0x6AB9, 0xEFDE},{0x6ABA, 0xEFE2},{0x6ABB, 0xC265},{0x6ABD, 0xEFDF},{0x6AC2, 0xC267},{0x6AC3, 0xC264},{0x6AC5, 0xEFDD},{0x6AC6, 0xEFE1},
+ {0x6AC7, 0xEFE5},{0x6ACB, 0xF251},{0x6ACC, 0xF24E},{0x6ACD, 0xF257},{0x6ACF, 0xF256},{0x6AD0, 0xF254},{0x6AD1, 0xF24F},{0x6AD3, 0xC372},
+ {0x6AD9, 0xF250},{0x6ADA, 0xC371},{0x6ADB, 0xC0CD},{0x6ADC, 0xF253},{0x6ADD, 0xC370},{0x6ADE, 0xF258},{0x6ADF, 0xF252},{0x6AE0, 0xF24D},
+ {0x6AE1, 0xEFE0},{0x6AE5, 0xC36F},{0x6AE7, 0xF24C},{0x6AE8, 0xF456},{0x6AEA, 0xF455},{0x6AEB, 0xF255},{0x6AEC, 0xC468},{0x6AEE, 0xF459},
+ {0x6AEF, 0xF45A},{0x6AF0, 0xF454},{0x6AF1, 0xF458},{0x6AF3, 0xF453},{0x6AF8, 0xF5D1},{0x6AF9, 0xF457},{0x6AFA, 0xC4E7},{0x6AFB, 0xC4E5},
+ {0x6AFC, 0xF5CF},{0x6B00, 0xF5D2},{0x6B02, 0xF5CE},{0x6B03, 0xF5D0},{0x6B04, 0xC4E6},{0x6B08, 0xF6E5},{0x6B09, 0xF6E6},{0x6B0A, 0xC576},
+ {0x6B0B, 0xF6E4},{0x6B0F, 0xF7E2},{0x6B10, 0xC5CF},{0x6B11, 0xF7E0},{0x6B12, 0xF7E1},{0x6B13, 0xF8AC},{0x6B16, 0xC656},{0x6B17, 0xF8F3},
+ {0x6B18, 0xF8F1},{0x6B19, 0xF8F2},{0x6B1A, 0xF8F4},{0x6B1E, 0xF9BB},{0x6B20, 0xA4ED},{0x6B21, 0xA6B8},{0x6B23, 0xAA59},{0x6B25, 0xCCE9},
+ {0x6B28, 0xCF64},{0x6B2C, 0xD1F5},{0x6B2D, 0xD1F7},{0x6B2F, 0xD1F6},{0x6B31, 0xD1F8},{0x6B32, 0xB1FD},{0x6B33, 0xD5D7},{0x6B34, 0xD1F9},
+ {0x6B36, 0xD5D6},{0x6B37, 0xD5D8},{0x6B38, 0xD5D9},{0x6B39, 0xD9DA},{0x6B3A, 0xB4DB},{0x6B3B, 0xD9DB},{0x6B3C, 0xD9DD},{0x6B3D, 0xB4DC},
+ {0x6B3E, 0xB4DA},{0x6B3F, 0xD9DC},{0x6B41, 0xDDFA},{0x6B42, 0xDDF8},{0x6B43, 0xDDF7},{0x6B45, 0xDDF6},{0x6B46, 0xDDF5},{0x6B47, 0xB7B2},
+ {0x6B48, 0xDDF9},{0x6B49, 0xBA70},{0x6B4A, 0xE263},{0x6B4B, 0xE265},{0x6B4C, 0xBA71},{0x6B4D, 0xE264},{0x6B4E, 0xBCDB},{0x6B50, 0xBCDA},
+ {0x6B51, 0xE5F0},{0x6B54, 0xE9DF},{0x6B55, 0xE9DE},{0x6B56, 0xE9E0},{0x6B59, 0xBEF9},{0x6B5B, 0xED4B},{0x6B5C, 0xC0D3},{0x6B5E, 0xEFE8},
+ {0x6B5F, 0xC26A},{0x6B60, 0xF259},{0x6B61, 0xC577},{0x6B62, 0xA4EE},{0x6B63, 0xA5BF},{0x6B64, 0xA6B9},{0x6B65, 0xA842},{0x6B66, 0xAA5A},
+ {0x6B67, 0xAA5B},{0x6B6A, 0xAC6E},{0x6B6D, 0xD1FA},{0x6B72, 0xB7B3},{0x6B76, 0xE6D1},{0x6B77, 0xBEFA},{0x6B78, 0xC26B},{0x6B79, 0xA4EF},
+ {0x6B7B, 0xA6BA},{0x6B7E, 0xCCEB},{0x6B7F, 0xAA5C},{0x6B80, 0xCCEA},{0x6B82, 0xCF65},{0x6B83, 0xAC6F},{0x6B84, 0xCF66},{0x6B86, 0xAC70},
+ {0x6B88, 0xD1FC},{0x6B89, 0xAEEE},{0x6B8A, 0xAEED},{0x6B8C, 0xD5DE},{0x6B8D, 0xD5DC},{0x6B8E, 0xD5DD},{0x6B8F, 0xD5DB},{0x6B91, 0xD5DA},
+ {0x6B94, 0xD9DE},{0x6B95, 0xD9E1},{0x6B96, 0xB4DE},{0x6B97, 0xD9DF},{0x6B98, 0xB4DD},{0x6B99, 0xD9E0},{0x6B9B, 0xDDFB},{0x6B9E, 0xE266},
+ {0x6B9F, 0xE267},{0x6BA0, 0xE268},{0x6BA2, 0xE5F3},{0x6BA3, 0xE5F2},{0x6BA4, 0xBCDC},{0x6BA5, 0xE5F1},{0x6BA6, 0xE5F4},{0x6BA7, 0xE9E1},
+ {0x6BAA, 0xE9E2},{0x6BAB, 0xE9E3},{0x6BAD, 0xED4C},{0x6BAE, 0xC0D4},{0x6BAF, 0xC26C},{0x6BB0, 0xF25A},{0x6BB2, 0xC4E8},{0x6BB3, 0xC95F},
+ {0x6BB5, 0xAC71},{0x6BB6, 0xCF67},{0x6BB7, 0xAEEF},{0x6BBA, 0xB1FE},{0x6BBC, 0xB4DF},{0x6BBD, 0xD9E2},{0x6BBF, 0xB7B5},{0x6BC0, 0xB7B4},
+ {0x6BC3, 0xE269},{0x6BC4, 0xE26A},{0x6BC5, 0xBCDD},{0x6BC6, 0xBCDE},{0x6BC7, 0xE9E5},{0x6BC8, 0xE9E4},{0x6BC9, 0xEFE9},{0x6BCA, 0xF7E3},
+ {0x6BCB, 0xA4F0},{0x6BCC, 0xC960},{0x6BCD, 0xA5C0},{0x6BCF, 0xA843},{0x6BD0, 0xCB48},{0x6BD2, 0xAC72},{0x6BD3, 0xB7B6},{0x6BD4, 0xA4F1},
+ {0x6BD6, 0xCF68},{0x6BD7, 0xAC73},{0x6BD8, 0xCF69},{0x6BDA, 0xC0D5},{0x6BDB, 0xA4F2},{0x6BDE, 0xCCEC},{0x6BE0, 0xCF6A},{0x6BE2, 0xD242},
+ {0x6BE3, 0xD241},{0x6BE4, 0xD1FE},{0x6BE6, 0xD1FD},{0x6BE7, 0xD243},{0x6BE8, 0xD240},{0x6BEB, 0xB240},{0x6BEC, 0xB241},{0x6BEF, 0xB4E0},
+ {0x6BF0, 0xD9E3},{0x6BF2, 0xD9E4},{0x6BF3, 0xD9E5},{0x6BF7, 0xDE41},{0x6BF8, 0xDE42},{0x6BF9, 0xDE40},{0x6BFB, 0xDDFD},{0x6BFC, 0xDDFE},
+ {0x6BFD, 0xB7B7},{0x6BFE, 0xE26B},{0x6BFF, 0xE5F7},{0x6C00, 0xE5F6},{0x6C01, 0xE5F5},{0x6C02, 0xE5F8},{0x6C03, 0xE9E7},{0x6C04, 0xE9E6},
+ {0x6C05, 0xBEFB},{0x6C06, 0xE9E8},{0x6C08, 0xC0D6},{0x6C09, 0xED4D},{0x6C0B, 0xEFEA},{0x6C0C, 0xF25B},{0x6C0D, 0xF6E7},{0x6C0F, 0xA4F3},
+ {0x6C10, 0xA5C2},{0x6C11, 0xA5C1},{0x6C13, 0xAA5D},{0x6C14, 0xC961},{0x6C15, 0xC97E},{0x6C16, 0xA6BB},{0x6C18, 0xC9F7},{0x6C19, 0xCB49},
+ {0x6C1A, 0xCB4A},{0x6C1B, 0xAA5E},{0x6C1D, 0xCCED},{0x6C1F, 0xAC74},{0x6C20, 0xCF6B},{0x6C21, 0xCF6C},{0x6C23, 0xAEF0},{0x6C24, 0xAEF4},
+ {0x6C25, 0xD244},{0x6C26, 0xAEF3},{0x6C27, 0xAEF1},{0x6C28, 0xAEF2},{0x6C2A, 0xD5DF},{0x6C2B, 0xB242},{0x6C2C, 0xB4E3},{0x6C2E, 0xB4E1},
+ {0x6C2F, 0xB4E2},{0x6C30, 0xD9E6},{0x6C33, 0xBA72},{0x6C34, 0xA4F4},{0x6C36, 0xC9A1},{0x6C38, 0xA5C3},{0x6C3B, 0xC9A4},{0x6C3E, 0xA5C6},
+ {0x6C3F, 0xC9A3},{0x6C40, 0xA5C5},{0x6C41, 0xA5C4},{0x6C42, 0xA844},{0x6C43, 0xC9A2},{0x6C46, 0xC9F8},{0x6C4A, 0xC9FC},{0x6C4B, 0xC9FE},
+ {0x6C4C, 0xCA40},{0x6C4D, 0xA6C5},{0x6C4E, 0xA6C6},{0x6C4F, 0xC9FB},{0x6C50, 0xA6C1},{0x6C52, 0xC9F9},{0x6C54, 0xC9FD},{0x6C55, 0xA6C2},
+ {0x6C57, 0xA6BD},{0x6C59, 0xA6BE},{0x6C5B, 0xA6C4},{0x6C5C, 0xC9FA},{0x6C5D, 0xA6BC},{0x6C5E, 0xA845},{0x6C5F, 0xA6BF},{0x6C60, 0xA6C0},
+ {0x6C61, 0xA6C3},{0x6C65, 0xCB5B},{0x6C66, 0xCB59},{0x6C67, 0xCB4C},{0x6C68, 0xA851},{0x6C69, 0xCB53},{0x6C6A, 0xA84C},{0x6C6B, 0xCB4D},
+ {0x6C6D, 0xCB55},{0x6C6F, 0xCB52},{0x6C70, 0xA84F},{0x6C71, 0xCB51},{0x6C72, 0xA856},{0x6C73, 0xCB5A},{0x6C74, 0xA858},{0x6C76, 0xA85A},
+ {0x6C78, 0xCB4B},{0x6C7A, 0xA84D},{0x6C7B, 0xCB5C},{0x6C7D, 0xA854},{0x6C7E, 0xA857},{0x6C80, 0xCD45},{0x6C81, 0xA847},{0x6C82, 0xA85E},
+ {0x6C83, 0xA855},{0x6C84, 0xCB4E},{0x6C85, 0xA84A},{0x6C86, 0xA859},{0x6C87, 0xCB56},{0x6C88, 0xA848},{0x6C89, 0xA849},{0x6C8A, 0xCD43},
+ {0x6C8B, 0xCB4F},{0x6C8C, 0xA850},{0x6C8D, 0xA85B},{0x6C8E, 0xCB5D},{0x6C8F, 0xCB50},{0x6C90, 0xA84E},{0x6C92, 0xA853},{0x6C93, 0xCCEE},
+ {0x6C94, 0xA85C},{0x6C95, 0xCB57},{0x6C96, 0xA852},{0x6C98, 0xA85D},{0x6C99, 0xA846},{0x6C9A, 0xCB54},{0x6C9B, 0xA84B},{0x6C9C, 0xCB58},
+ {0x6C9D, 0xCD44},{0x6CAB, 0xAA6A},{0x6CAC, 0xAA7A},{0x6CAD, 0xCCF5},{0x6CAE, 0xAA71},{0x6CB0, 0xCD4B},{0x6CB1, 0xAA62},{0x6CB3, 0xAA65},
+ {0x6CB4, 0xCD42},{0x6CB6, 0xCCF3},{0x6CB7, 0xCCF7},{0x6CB8, 0xAA6D},{0x6CB9, 0xAA6F},{0x6CBA, 0xCCFA},{0x6CBB, 0xAA76},{0x6CBC, 0xAA68},
+ {0x6CBD, 0xAA66},{0x6CBE, 0xAA67},{0x6CBF, 0xAA75},{0x6CC0, 0xCD47},{0x6CC1, 0xAA70},{0x6CC2, 0xCCF9},{0x6CC3, 0xCCFB},{0x6CC4, 0xAA6E},
+ {0x6CC5, 0xAA73},{0x6CC6, 0xCCFC},{0x6CC7, 0xCD4A},{0x6CC9, 0xAC75},{0x6CCA, 0xAA79},{0x6CCC, 0xAA63},{0x6CCD, 0xCD49},{0x6CCF, 0xCD4D},
+ {0x6CD0, 0xCCF8},{0x6CD1, 0xCD4F},{0x6CD2, 0xCD40},{0x6CD3, 0xAA6C},{0x6CD4, 0xCCF4},{0x6CD5, 0xAA6B},{0x6CD6, 0xAA7D},{0x6CD7, 0xAA72},
+ {0x6CD9, 0xCCF2},{0x6CDA, 0xCF75},{0x6CDB, 0xAA78},{0x6CDC, 0xAA7C},{0x6CDD, 0xCD41},{0x6CDE, 0xCD46},{0x6CE0, 0xAA7E},{0x6CE1, 0xAA77},
+ {0x6CE2, 0xAA69},{0x6CE3, 0xAA5F},{0x6CE5, 0xAA64},{0x6CE7, 0xCCF6},{0x6CE8, 0xAA60},{0x6CE9, 0xCD4E},{0x6CEB, 0xCCF0},{0x6CEC, 0xCCEF},
+ {0x6CED, 0xCCFD},{0x6CEE, 0xCCF1},{0x6CEF, 0xAA7B},{0x6CF0, 0xAEF5},{0x6CF1, 0xAA74},{0x6CF2, 0xCCFE},{0x6CF3, 0xAA61},{0x6CF5, 0xACA6},
+ {0x6CF9, 0xCD4C},{0x6D00, 0xCF7C},{0x6D01, 0xCFA1},{0x6D03, 0xCFA4},{0x6D04, 0xCF77},{0x6D07, 0xCFA7},{0x6D08, 0xCFAA},{0x6D09, 0xCFAC},
+ {0x6D0A, 0xCF74},{0x6D0B, 0xAC76},{0x6D0C, 0xAC7B},{0x6D0D, 0xD249},{0x6D0E, 0xACAD},{0x6D0F, 0xCFA5},{0x6D10, 0xCFAD},{0x6D11, 0xCF7B},
+ {0x6D12, 0xCF73},{0x6D16, 0xD264},{0x6D17, 0xAC7E},{0x6D18, 0xCFA2},{0x6D19, 0xCF78},{0x6D1A, 0xCF7A},{0x6D1B, 0xACA5},{0x6D1D, 0xCF7D},
+ {0x6D1E, 0xAC7D},{0x6D1F, 0xCF70},{0x6D20, 0xCFA8},{0x6D22, 0xCFAB},{0x6D25, 0xAC7A},{0x6D27, 0xACA8},{0x6D28, 0xCF6D},{0x6D29, 0xACAA},
+ {0x6D2A, 0xAC78},{0x6D2B, 0xACAE},{0x6D2C, 0xCFA9},{0x6D2D, 0xCF6F},{0x6D2E, 0xACAB},{0x6D2F, 0xD25E},{0x6D30, 0xCD48},{0x6D31, 0xAC7C},
+ {0x6D32, 0xAC77},{0x6D33, 0xCF76},{0x6D34, 0xCF6E},{0x6D35, 0xACAC},{0x6D36, 0xACA4},{0x6D37, 0xCFA3},{0x6D38, 0xACA9},{0x6D39, 0xACA7},
+ {0x6D3A, 0xCF79},{0x6D3B, 0xACA1},{0x6D3C, 0xCF71},{0x6D3D, 0xACA2},{0x6D3E, 0xACA3},{0x6D3F, 0xCF72},{0x6D40, 0xCFA6},{0x6D41, 0xAC79},
+ {0x6D42, 0xCF7E},{0x6D58, 0xD24C},{0x6D59, 0xAEFD},{0x6D5A, 0xAF43},{0x6D5E, 0xD255},{0x6D5F, 0xD25B},{0x6D60, 0xD257},{0x6D61, 0xD24A},
+ {0x6D62, 0xD24D},{0x6D63, 0xD246},{0x6D64, 0xD247},{0x6D65, 0xAF4A},{0x6D66, 0xAEFA},{0x6D67, 0xD256},{0x6D68, 0xD25F},{0x6D69, 0xAF45},
+ {0x6D6A, 0xAEF6},{0x6D6C, 0xAF40},{0x6D6D, 0xD24E},{0x6D6E, 0xAF42},{0x6D6F, 0xD24F},{0x6D70, 0xD259},{0x6D74, 0xAF44},{0x6D75, 0xD268},
+ {0x6D76, 0xD248},{0x6D77, 0xAEFC},{0x6D78, 0xAEFB},{0x6D79, 0xAF48},{0x6D7A, 0xD245},{0x6D7B, 0xD266},{0x6D7C, 0xD25A},{0x6D7D, 0xD267},
+ {0x6D7E, 0xD261},{0x6D7F, 0xD253},{0x6D80, 0xD262},{0x6D82, 0xD25C},{0x6D83, 0xD265},{0x6D84, 0xD263},{0x6D85, 0xAF49},{0x6D86, 0xD254},
+ {0x6D87, 0xAEF9},{0x6D88, 0xAEF8},{0x6D89, 0xAF41},{0x6D8A, 0xAF47},{0x6D8B, 0xD260},{0x6D8C, 0xAF46},{0x6D8D, 0xD251},{0x6D8E, 0xB243},
+ {0x6D90, 0xD269},{0x6D91, 0xD250},{0x6D92, 0xD24B},{0x6D93, 0xAEFE},{0x6D94, 0xAF4B},{0x6D95, 0xAEF7},{0x6D97, 0xD258},{0x6D98, 0xD25D},
+ {0x6DAA, 0xB265},{0x6DAB, 0xD5E1},{0x6DAC, 0xD5E5},{0x6DAE, 0xB252},{0x6DAF, 0xB250},{0x6DB2, 0xB247},{0x6DB3, 0xD5E3},{0x6DB4, 0xD5E2},
+ {0x6DB5, 0xB25B},{0x6DB7, 0xD5E8},{0x6DB8, 0xB255},{0x6DBA, 0xD5FA},{0x6DBB, 0xD647},{0x6DBC, 0xB244},{0x6DBD, 0xD5F7},{0x6DBE, 0xD5F0},
+ {0x6DBF, 0xB267},{0x6DC0, 0xD5E0},{0x6DC2, 0xD5FC},{0x6DC4, 0xB264},{0x6DC5, 0xB258},{0x6DC6, 0xB263},{0x6DC7, 0xB24E},{0x6DC8, 0xD5EC},
+ {0x6DC9, 0xD5FE},{0x6DCA, 0xD5F6},{0x6DCB, 0xB24F},{0x6DCC, 0xB249},{0x6DCD, 0xD645},{0x6DCF, 0xD5FD},{0x6DD0, 0xD640},{0x6DD1, 0xB251},
+ {0x6DD2, 0xB259},{0x6DD3, 0xD642},{0x6DD4, 0xD5EA},{0x6DD5, 0xD5FB},{0x6DD6, 0xD5EF},{0x6DD7, 0xD644},{0x6DD8, 0xB25E},{0x6DD9, 0xB246},
+ {0x6DDA, 0xB25C},{0x6DDB, 0xD5F4},{0x6DDC, 0xD5F2},{0x6DDD, 0xD5F3},{0x6DDE, 0xB253},{0x6DDF, 0xD5EE},{0x6DE0, 0xD5ED},{0x6DE1, 0xB248},
+ {0x6DE2, 0xD5E7},{0x6DE3, 0xD646},{0x6DE4, 0xB24A},{0x6DE5, 0xD5F1},{0x6DE6, 0xB268},{0x6DE8, 0xB262},{0x6DE9, 0xD5E6},{0x6DEA, 0xB25F},
+ {0x6DEB, 0xB25D},{0x6DEC, 0xB266},{0x6DED, 0xD5F8},{0x6DEE, 0xB261},{0x6DEF, 0xD252},{0x6DF0, 0xD5F9},{0x6DF1, 0xB260},{0x6DF2, 0xD641},
+ {0x6DF3, 0xB245},{0x6DF4, 0xD5F5},{0x6DF5, 0xB257},{0x6DF6, 0xD5E9},{0x6DF7, 0xB256},{0x6DF9, 0xB254},{0x6DFA, 0xB24C},{0x6DFB, 0xB24B},
+ {0x6DFC, 0xD9E7},{0x6DFD, 0xD643},{0x6E00, 0xD5EB},{0x6E03, 0xD9FC},{0x6E05, 0xB24D},{0x6E19, 0xB541},{0x6E1A, 0xB25A},{0x6E1B, 0xB4EE},
+ {0x6E1C, 0xD9F6},{0x6E1D, 0xB4FC},{0x6E1F, 0xD9EA},{0x6E20, 0xB4EB},{0x6E21, 0xB4E7},{0x6E22, 0xDA49},{0x6E23, 0xB4ED},{0x6E24, 0xB4F1},
+ {0x6E25, 0xB4EC},{0x6E26, 0xB4F5},{0x6E27, 0xDA4D},{0x6E28, 0xDA44},{0x6E2B, 0xD9F1},{0x6E2C, 0xB4FA},{0x6E2D, 0xB4F4},{0x6E2E, 0xD9FD},
+ {0x6E2F, 0xB4E4},{0x6E30, 0xDA4A},{0x6E31, 0xDA43},{0x6E32, 0xB4E8},{0x6E33, 0xD9F7},{0x6E34, 0xB4F7},{0x6E35, 0xDA55},{0x6E36, 0xDA56},
+ {0x6E38, 0xB4E5},{0x6E39, 0xDA48},{0x6E3A, 0xB4F9},{0x6E3B, 0xD9FB},{0x6E3C, 0xD9ED},{0x6E3D, 0xD9EE},{0x6E3E, 0xB4FD},{0x6E3F, 0xD9F2},
+ {0x6E40, 0xD9F9},{0x6E41, 0xD9F3},{0x6E43, 0xB4FB},{0x6E44, 0xB544},{0x6E45, 0xD9EF},{0x6E46, 0xD9E8},{0x6E47, 0xD9E9},{0x6E49, 0xD9EB},
+ {0x6E4A, 0xB4EA},{0x6E4B, 0xD9F8},{0x6E4D, 0xB4F8},{0x6E4E, 0xB542},{0x6E51, 0xD9FA},{0x6E52, 0xDA53},{0x6E53, 0xDA4B},{0x6E54, 0xB4E6},
+ {0x6E55, 0xDA51},{0x6E56, 0xB4F2},{0x6E58, 0xB4F0},{0x6E5A, 0xDA57},{0x6E5B, 0xB4EF},{0x6E5C, 0xDA41},{0x6E5D, 0xD9F4},{0x6E5E, 0xD9FE},
+ {0x6E5F, 0xB547},{0x6E60, 0xDA45},{0x6E61, 0xDA42},{0x6E62, 0xD9F0},{0x6E63, 0xB543},{0x6E64, 0xDA4F},{0x6E65, 0xDA4C},{0x6E66, 0xDA54},
+ {0x6E67, 0xB4E9},{0x6E68, 0xDA40},{0x6E69, 0xB546},{0x6E6B, 0xDA47},{0x6E6E, 0xB4F3},{0x6E6F, 0xB4F6},{0x6E71, 0xDA46},{0x6E72, 0xB545},
+ {0x6E73, 0xD9F5},{0x6E74, 0xD5E4},{0x6E77, 0xDA50},{0x6E78, 0xDA4E},{0x6E79, 0xDA52},{0x6E88, 0xD9EC},{0x6E89, 0xB540},{0x6E8D, 0xDE61},
+ {0x6E8E, 0xDE60},{0x6E8F, 0xDE46},{0x6E90, 0xB7BD},{0x6E92, 0xDE5F},{0x6E93, 0xDE49},{0x6E94, 0xDE4A},{0x6E96, 0xB7C7},{0x6E97, 0xDE68},
+ {0x6E98, 0xB7C2},{0x6E99, 0xDE5E},{0x6E9B, 0xDE43},{0x6E9C, 0xB7C8},{0x6E9D, 0xB7BE},{0x6E9E, 0xDE52},{0x6E9F, 0xDE48},{0x6EA0, 0xDE4B},
+ {0x6EA1, 0xDE63},{0x6EA2, 0xB7B8},{0x6EA3, 0xDE6A},{0x6EA4, 0xDE62},{0x6EA5, 0xB7C1},{0x6EA6, 0xDE57},{0x6EA7, 0xB7CC},{0x6EAA, 0xB7CB},
+ {0x6EAB, 0xB7C5},{0x6EAE, 0xDE69},{0x6EAF, 0xB7B9},{0x6EB0, 0xDE55},{0x6EB1, 0xDE4C},{0x6EB2, 0xDE59},{0x6EB3, 0xDE65},{0x6EB4, 0xB7CD},
+ {0x6EB6, 0xB7BB},{0x6EB7, 0xDE54},{0x6EB9, 0xDE4D},{0x6EBA, 0xB7C4},{0x6EBC, 0xB7C3},{0x6EBD, 0xDE50},{0x6EBE, 0xDE5A},{0x6EBF, 0xDE64},
+ {0x6EC0, 0xDE47},{0x6EC1, 0xDE51},{0x6EC2, 0xB7BC},{0x6EC3, 0xDE5B},{0x6EC4, 0xB7C9},{0x6EC5, 0xB7C0},{0x6EC6, 0xDE4E},{0x6EC7, 0xB7BF},
+ {0x6EC8, 0xDE45},{0x6EC9, 0xDE53},{0x6ECA, 0xDE67},{0x6ECB, 0xB4FE},{0x6ECC, 0xBAB0},{0x6ECD, 0xDE56},{0x6ECE, 0xE26C},{0x6ECF, 0xDE58},
+ {0x6ED0, 0xDE66},{0x6ED1, 0xB7C6},{0x6ED2, 0xDE4F},{0x6ED3, 0xB7BA},{0x6ED4, 0xB7CA},{0x6ED5, 0xBCF0},{0x6ED6, 0xDE44},{0x6ED8, 0xDE5D},
+ {0x6EDC, 0xDE5C},{0x6EEB, 0xE2AA},{0x6EEC, 0xBAAD},{0x6EED, 0xE27D},{0x6EEE, 0xE2A4},{0x6EEF, 0xBAA2},{0x6EF1, 0xE26E},{0x6EF2, 0xBAAF},
+ {0x6EF4, 0xBA77},{0x6EF5, 0xE26D},{0x6EF6, 0xE2B0},{0x6EF7, 0xBAB1},{0x6EF8, 0xE271},{0x6EF9, 0xE2A3},{0x6EFB, 0xE273},{0x6EFC, 0xE2B3},
+ {0x6EFD, 0xE2AF},{0x6EFE, 0xBA75},{0x6EFF, 0xBAA1},{0x6F00, 0xE653},{0x6F01, 0xBAAE},{0x6F02, 0xBA7D},{0x6F03, 0xE26F},{0x6F05, 0xE2AE},
+ {0x6F06, 0xBAA3},{0x6F07, 0xE2AB},{0x6F08, 0xE2B8},{0x6F09, 0xE275},{0x6F0A, 0xE27E},{0x6F0D, 0xE2B6},{0x6F0E, 0xE2AC},{0x6F0F, 0xBA7C},
+ {0x6F12, 0xE27C},{0x6F13, 0xBA76},{0x6F14, 0xBA74},{0x6F15, 0xBAA8},{0x6F18, 0xE27A},{0x6F19, 0xE277},{0x6F1A, 0xE278},{0x6F1C, 0xE2B2},
+ {0x6F1E, 0xE2B7},{0x6F1F, 0xE2B5},{0x6F20, 0xBA7A},{0x6F21, 0xE2B9},{0x6F22, 0xBA7E},{0x6F23, 0xBAA7},{0x6F25, 0xE270},{0x6F26, 0xE5FA},
+ {0x6F27, 0xE279},{0x6F29, 0xBA78},{0x6F2A, 0xBAAC},{0x6F2B, 0xBAA9},{0x6F2C, 0xBA7B},{0x6F2D, 0xE2A5},{0x6F2E, 0xE274},{0x6F2F, 0xBAAA},
+ {0x6F30, 0xE2A7},{0x6F31, 0xBAA4},{0x6F32, 0xBAA6},{0x6F33, 0xBA73},{0x6F35, 0xE2A9},{0x6F36, 0xE2A1},{0x6F37, 0xE272},{0x6F38, 0xBAA5},
+ {0x6F39, 0xE2B1},{0x6F3A, 0xE2B4},{0x6F3B, 0xE27B},{0x6F3C, 0xE2A8},{0x6F3E, 0xBA79},{0x6F3F, 0xBCDF},{0x6F40, 0xE2A6},{0x6F41, 0xE5F9},
+ {0x6F43, 0xE2AD},{0x6F4E, 0xE276},{0x6F4F, 0xE644},{0x6F50, 0xE64E},{0x6F51, 0xBCE2},{0x6F52, 0xE64D},{0x6F53, 0xE659},{0x6F54, 0xBCE4},
+ {0x6F55, 0xE64B},{0x6F57, 0xE64F},{0x6F58, 0xBCEF},{0x6F5A, 0xE646},{0x6F5B, 0xBCE7},{0x6F5D, 0xE652},{0x6F5E, 0xE9F0},{0x6F5F, 0xBCF3},
+ {0x6F60, 0xBCF2},{0x6F61, 0xE654},{0x6F62, 0xE643},{0x6F63, 0xE65E},{0x6F64, 0xBCED},{0x6F66, 0xBCE3},{0x6F67, 0xE657},{0x6F69, 0xE65B},
+ {0x6F6A, 0xE660},{0x6F6B, 0xE655},{0x6F6C, 0xE649},{0x6F6D, 0xBCE6},{0x6F6E, 0xBCE9},{0x6F6F, 0xBCF1},{0x6F70, 0xBCEC},{0x6F72, 0xE64C},
+ {0x6F73, 0xE2A2},{0x6F76, 0xE648},{0x6F77, 0xE65F},{0x6F78, 0xBCE8},{0x6F7A, 0xBCEB},{0x6F7B, 0xE661},{0x6F7C, 0xBCE0},{0x6F7D, 0xE656},
+ {0x6F7E, 0xE5FB},{0x6F7F, 0xE65C},{0x6F80, 0xC0DF},{0x6F82, 0xE64A},{0x6F84, 0xBCE1},{0x6F85, 0xE645},{0x6F86, 0xBCE5},{0x6F87, 0xE5FC},
+ {0x6F88, 0xBAAB},{0x6F89, 0xE641},{0x6F8B, 0xE65A},{0x6F8C, 0xE642},{0x6F8D, 0xE640},{0x6F8E, 0xBCEA},{0x6F90, 0xE658},{0x6F92, 0xE5FE},
+ {0x6F93, 0xE651},{0x6F94, 0xE650},{0x6F95, 0xE65D},{0x6F96, 0xE647},{0x6F97, 0xBCEE},{0x6F9E, 0xE9F3},{0x6FA0, 0xBF49},{0x6FA1, 0xBEFE},
+ {0x6FA2, 0xEA40},{0x6FA3, 0xE9EB},{0x6FA4, 0xBF41},{0x6FA5, 0xE9F7},{0x6FA6, 0xBF48},{0x6FA7, 0xBF43},{0x6FA8, 0xE9F5},{0x6FA9, 0xED4F},
+ {0x6FAA, 0xE9FB},{0x6FAB, 0xEA42},{0x6FAC, 0xE9FA},{0x6FAD, 0xE9E9},{0x6FAE, 0xE9F8},{0x6FAF, 0xEA44},{0x6FB0, 0xEA46},{0x6FB1, 0xBEFD},
+ {0x6FB2, 0xEA45},{0x6FB3, 0xBF44},{0x6FB4, 0xBF4A},{0x6FB6, 0xBF47},{0x6FB8, 0xE9FE},{0x6FB9, 0xBF46},{0x6FBA, 0xE9F9},{0x6FBC, 0xE9ED},
+ {0x6FBD, 0xE9F2},{0x6FBF, 0xE9FD},{0x6FC0, 0xBF45},{0x6FC1, 0xBF42},{0x6FC2, 0xBEFC},{0x6FC3, 0xBF40},{0x6FC4, 0xE9F1},{0x6FC6, 0xE5FD},
+ {0x6FC7, 0xE9EC},{0x6FC8, 0xE9EF},{0x6FC9, 0xEA41},{0x6FCA, 0xE9F4},{0x6FCB, 0xE9EA},{0x6FCC, 0xED4E},{0x6FCD, 0xEA43},{0x6FCE, 0xE9EE},
+ {0x6FCF, 0xE9FC},{0x6FD4, 0xED51},{0x6FD5, 0xC0E3},{0x6FD8, 0xC0D7},{0x6FDB, 0xC0DB},{0x6FDC, 0xED53},{0x6FDD, 0xED59},{0x6FDE, 0xED57},
+ {0x6FDF, 0xC0D9},{0x6FE0, 0xC0DA},{0x6FE1, 0xC0E1},{0x6FE2, 0xED5A},{0x6FE3, 0xED52},{0x6FE4, 0xC0DC},{0x6FE6, 0xED56},{0x6FE7, 0xED55},
+ {0x6FE8, 0xED5B},{0x6FE9, 0xC0E2},{0x6FEB, 0xC0DD},{0x6FEC, 0xC0E0},{0x6FED, 0xED54},{0x6FEE, 0xC0E4},{0x6FEF, 0xC0DE},{0x6FF0, 0xC0E5},
+ {0x6FF1, 0xC0D8},{0x6FF2, 0xED58},{0x6FF4, 0xED50},{0x6FF7, 0xEFF7},{0x6FFA, 0xC271},{0x6FFB, 0xEFF4},{0x6FFC, 0xEFF6},{0x6FFE, 0xC26F},
+ {0x6FFF, 0xEFF2},{0x7000, 0xEFF3},{0x7001, 0xEFEE},{0x7004, 0xE9F6},{0x7005, 0xEFEF},{0x7006, 0xC270},{0x7007, 0xEFEB},{0x7009, 0xC26D},
+ {0x700A, 0xEFF8},{0x700B, 0xC26E},{0x700C, 0xEFEC},{0x700D, 0xEFED},{0x700E, 0xEFF1},{0x700F, 0xC273},{0x7011, 0xC272},{0x7014, 0xEFF0},
+ {0x7015, 0xC378},{0x7016, 0xF25F},{0x7017, 0xF265},{0x7018, 0xC379},{0x7019, 0xF25C},{0x701A, 0xC376},{0x701B, 0xC373},{0x701C, 0xF267},
+ {0x701D, 0xC377},{0x701F, 0xC374},{0x7020, 0xF25E},{0x7021, 0xF261},{0x7022, 0xF262},{0x7023, 0xF263},{0x7024, 0xF266},{0x7026, 0xEFF5},
+ {0x7027, 0xF25D},{0x7028, 0xC375},{0x7029, 0xF264},{0x702A, 0xF268},{0x702B, 0xF260},{0x702F, 0xF45D},{0x7030, 0xC46A},{0x7031, 0xF460},
+ {0x7032, 0xC46B},{0x7033, 0xF468},{0x7034, 0xF45F},{0x7035, 0xF45C},{0x7037, 0xF45E},{0x7038, 0xF462},{0x7039, 0xF465},{0x703A, 0xF464},
+ {0x703B, 0xF467},{0x703C, 0xF45B},{0x703E, 0xC469},{0x703F, 0xF463},{0x7040, 0xF466},{0x7041, 0xF469},{0x7042, 0xF461},{0x7043, 0xF5D3},
+ {0x7044, 0xF5D4},{0x7045, 0xF5D8},{0x7046, 0xF5D9},{0x7048, 0xF5D6},{0x7049, 0xF5D7},{0x704A, 0xF5D5},{0x704C, 0xC4E9},{0x7051, 0xC578},
+ {0x7052, 0xF6EB},{0x7055, 0xF6E8},{0x7056, 0xF6E9},{0x7057, 0xF6EA},{0x7058, 0xC579},{0x705A, 0xF7E5},{0x705B, 0xF7E4},{0x705D, 0xF8AF},
+ {0x705E, 0xC5F4},{0x705F, 0xF8AD},{0x7060, 0xF8B0},{0x7061, 0xF8AE},{0x7062, 0xF8F5},{0x7063, 0xC657},{0x7064, 0xC665},{0x7065, 0xF9A3},
+ {0x7066, 0xF96C},{0x7068, 0xF9A2},{0x7069, 0xF9D0},{0x706A, 0xF9D1},{0x706B, 0xA4F5},{0x7070, 0xA6C7},{0x7071, 0xCA41},{0x7074, 0xCB5E},
+ {0x7076, 0xA85F},{0x7078, 0xA862},{0x707A, 0xCB5F},{0x707C, 0xA860},{0x707D, 0xA861},{0x7082, 0xCD58},{0x7083, 0xCD5A},{0x7084, 0xCD55},
+ {0x7085, 0xCD52},{0x7086, 0xCD54},{0x708A, 0xAAA4},{0x708E, 0xAAA2},{0x7091, 0xCD56},{0x7092, 0xAAA3},{0x7093, 0xCD53},{0x7094, 0xCD50},
+ {0x7095, 0xAAA1},{0x7096, 0xCD57},{0x7098, 0xCD51},{0x7099, 0xAAA5},{0x709A, 0xCD59},{0x709F, 0xCFAF},{0x70A1, 0xCFB3},{0x70A4, 0xACB7},
+ {0x70A9, 0xCFB6},{0x70AB, 0xACAF},{0x70AC, 0xACB2},{0x70AD, 0xACB4},{0x70AE, 0xACB6},{0x70AF, 0xACB3},{0x70B0, 0xCFB2},{0x70B1, 0xCFB1},
+ {0x70B3, 0xACB1},{0x70B4, 0xCFB4},{0x70B5, 0xCFB5},{0x70B7, 0xCFAE},{0x70B8, 0xACB5},{0x70BA, 0xACB0},{0x70BE, 0xCFB0},{0x70C5, 0xD277},
+ {0x70C6, 0xD278},{0x70C7, 0xD279},{0x70C8, 0xAF50},{0x70CA, 0xAF4C},{0x70CB, 0xD26E},{0x70CD, 0xD276},{0x70CE, 0xD27B},{0x70CF, 0xAF51},
+ {0x70D1, 0xD26C},{0x70D2, 0xD272},{0x70D3, 0xD26B},{0x70D4, 0xD275},{0x70D7, 0xD271},{0x70D8, 0xAF4D},{0x70D9, 0xAF4F},{0x70DA, 0xD27A},
+ {0x70DC, 0xD26A},{0x70DD, 0xD26D},{0x70DE, 0xD273},{0x70E0, 0xD274},{0x70E1, 0xD27C},{0x70E2, 0xD270},{0x70E4, 0xAF4E},{0x70EF, 0xB26D},
+ {0x70F0, 0xD64E},{0x70F3, 0xD650},{0x70F4, 0xD64C},{0x70F6, 0xD658},{0x70F7, 0xD64A},{0x70F8, 0xD657},{0x70F9, 0xB269},{0x70FA, 0xD648},
+ {0x70FB, 0xDA5B},{0x70FC, 0xD652},{0x70FD, 0xB26C},{0x70FF, 0xD653},{0x7100, 0xD656},{0x7102, 0xD65A},{0x7104, 0xD64F},{0x7106, 0xD654},
+ {0x7109, 0xB26A},{0x710A, 0xB26B},{0x710B, 0xD659},{0x710C, 0xD64D},{0x710D, 0xD649},{0x710E, 0xD65B},{0x7110, 0xD651},{0x7113, 0xD655},
+ {0x7117, 0xD64B},{0x7119, 0xB548},{0x711A, 0xB549},{0x711B, 0xDA65},{0x711C, 0xB54F},{0x711E, 0xDA59},{0x711F, 0xDA62},{0x7120, 0xDA58},
+ {0x7121, 0xB54C},{0x7122, 0xDA60},{0x7123, 0xDA5E},{0x7125, 0xDA5F},{0x7126, 0xB54A},{0x7128, 0xDA63},{0x712E, 0xDA5C},{0x712F, 0xDA5A},
+ {0x7130, 0xB54B},{0x7131, 0xDA5D},{0x7132, 0xDA61},{0x7136, 0xB54D},{0x713A, 0xDA64},{0x7141, 0xDE70},{0x7142, 0xDE77},{0x7143, 0xDE79},
+ {0x7144, 0xDEA1},{0x7146, 0xB7DA},{0x7147, 0xDE6B},{0x7149, 0xB7D2},{0x714B, 0xDE7A},{0x714C, 0xB7D7},{0x714D, 0xDEA2},{0x714E, 0xB7CE},
+ {0x7150, 0xDE7D},{0x7152, 0xDE6D},{0x7153, 0xDE7E},{0x7154, 0xDE6C},{0x7156, 0xB7DC},{0x7158, 0xDE78},{0x7159, 0xB7CF},{0x715A, 0xDEA3},
+ {0x715C, 0xB7D4},{0x715D, 0xDE71},{0x715E, 0xB7D9},{0x715F, 0xDE7C},{0x7160, 0xDE6F},{0x7161, 0xDE76},{0x7162, 0xDE72},{0x7163, 0xDE6E},
+ {0x7164, 0xB7D1},{0x7165, 0xB7D8},{0x7166, 0xB7D6},{0x7167, 0xB7D3},{0x7168, 0xB7DB},{0x7169, 0xB7D0},{0x716A, 0xDE75},{0x716C, 0xB7D5},
+ {0x716E, 0xB54E},{0x7170, 0xDE7B},{0x7172, 0xDE73},{0x7178, 0xDE74},{0x717B, 0xE2C1},{0x717D, 0xBAB4},{0x7180, 0xE2BD},{0x7181, 0xE2C3},
+ {0x7182, 0xE2BF},{0x7184, 0xBAB6},{0x7185, 0xE2BE},{0x7186, 0xE2C2},{0x7187, 0xE2BA},{0x7189, 0xE2BC},{0x718A, 0xBAB5},{0x718F, 0xE2C0},
+ {0x7190, 0xE2BB},{0x7192, 0xBAB7},{0x7194, 0xBAB2},{0x7197, 0xE2C4},{0x7199, 0xBAB3},{0x719A, 0xE667},{0x719B, 0xE664},{0x719C, 0xE670},
+ {0x719D, 0xE66A},{0x719E, 0xE66C},{0x719F, 0xBCF4},{0x71A0, 0xE666},{0x71A1, 0xE66E},{0x71A4, 0xE66D},{0x71A5, 0xE66B},{0x71A7, 0xE671},
+ {0x71A8, 0xBCF7},{0x71A9, 0xE668},{0x71AA, 0xE66F},{0x71AC, 0xBCF5},{0x71AF, 0xE663},{0x71B0, 0xE665},{0x71B1, 0xBCF6},{0x71B2, 0xE662},
+ {0x71B3, 0xE672},{0x71B5, 0xE669},{0x71B8, 0xEA4A},{0x71B9, 0xBF51},{0x71BC, 0xEA55},{0x71BD, 0xEA53},{0x71BE, 0xBF4B},{0x71BF, 0xEA49},
+ {0x71C0, 0xEA4C},{0x71C1, 0xEA4D},{0x71C2, 0xEA48},{0x71C3, 0xBF55},{0x71C4, 0xBF56},{0x71C5, 0xEA47},{0x71C6, 0xEA56},{0x71C7, 0xEA51},
+ {0x71C8, 0xBF4F},{0x71C9, 0xBF4C},{0x71CA, 0xEA50},{0x71CB, 0xEA4E},{0x71CE, 0xBF52},{0x71CF, 0xEA52},{0x71D0, 0xBF4D},{0x71D2, 0xBF4E},
+ {0x71D4, 0xEA4F},{0x71D5, 0xBF50},{0x71D6, 0xEA4B},{0x71D8, 0xEA54},{0x71D9, 0xBF53},{0x71DA, 0xEA57},{0x71DB, 0xEA58},{0x71DC, 0xBF54},
+ {0x71DF, 0xC0E7},{0x71E0, 0xC0EE},{0x71E1, 0xED5C},{0x71E2, 0xED62},{0x71E4, 0xED60},{0x71E5, 0xC0EA},{0x71E6, 0xC0E9},{0x71E7, 0xC0E6},
+ {0x71E8, 0xED5E},{0x71EC, 0xC0EC},{0x71ED, 0xC0EB},{0x71EE, 0xC0E8},{0x71F0, 0xED61},{0x71F1, 0xED5D},{0x71F2, 0xED5F},{0x71F4, 0xC0ED},
+ {0x71F8, 0xC277},{0x71F9, 0xEFFB},{0x71FB, 0xC274},{0x71FC, 0xC275},{0x71FD, 0xEFFD},{0x71FE, 0xC276},{0x71FF, 0xEFFA},{0x7201, 0xEFF9},
+ {0x7202, 0xF26C},{0x7203, 0xEFFC},{0x7205, 0xF26D},{0x7206, 0xC37A},{0x7207, 0xF26B},{0x720A, 0xF26A},{0x720C, 0xF269},{0x720D, 0xC37B},
+ {0x7210, 0xC46C},{0x7213, 0xF46A},{0x7214, 0xF46B},{0x7219, 0xF5DC},{0x721A, 0xF5DB},{0x721B, 0xC4EA},{0x721D, 0xF5DA},{0x721E, 0xF6EC},
+ {0x721F, 0xF6ED},{0x7222, 0xF7E6},{0x7223, 0xF8B1},{0x7226, 0xF8F6},{0x7227, 0xF9BC},{0x7228, 0xC679},{0x7229, 0xF9C6},{0x722A, 0xA4F6},
+ {0x722C, 0xAAA6},{0x722D, 0xAAA7},{0x7230, 0xACB8},{0x7235, 0xC0EF},{0x7236, 0xA4F7},{0x7238, 0xAAA8},{0x7239, 0xAF52},{0x723A, 0xB7DD},
+ {0x723B, 0xA4F8},{0x723D, 0xB26E},{0x723E, 0xBAB8},{0x723F, 0xC962},{0x7241, 0xCFB7},{0x7242, 0xD27D},{0x7244, 0xE2C5},{0x7246, 0xC0F0},
+ {0x7247, 0xA4F9},{0x7248, 0xAAA9},{0x7249, 0xCFB8},{0x724A, 0xCFB9},{0x724B, 0xDA66},{0x724C, 0xB550},{0x724F, 0xDEA4},{0x7252, 0xB7DE},
+ {0x7253, 0xE2C6},{0x7256, 0xBCF8},{0x7258, 0xC37C},{0x7259, 0xA4FA},{0x725A, 0xDA67},{0x725B, 0xA4FB},{0x725D, 0xA6C9},{0x725E, 0xCA42},
+ {0x725F, 0xA6C8},{0x7260, 0xA865},{0x7261, 0xA864},{0x7262, 0xA863},{0x7263, 0xCB60},{0x7267, 0xAAAA},{0x7269, 0xAAAB},{0x726A, 0xCD5B},
+ {0x726C, 0xCFBA},{0x726E, 0xCFBD},{0x726F, 0xACBA},{0x7270, 0xCFBB},{0x7272, 0xACB9},{0x7273, 0xCFBC},{0x7274, 0xACBB},{0x7276, 0xD2A2},
+ {0x7277, 0xD2A1},{0x7278, 0xD27E},{0x7279, 0xAF53},{0x727B, 0xD65D},{0x727C, 0xD65E},{0x727D, 0xB26F},{0x727E, 0xD65C},{0x727F, 0xD65F},
+ {0x7280, 0xB552},{0x7281, 0xB270},{0x7284, 0xB551},{0x7285, 0xDA6B},{0x7286, 0xDA6A},{0x7288, 0xDA68},{0x7289, 0xDA69},{0x728B, 0xDA6C},
+ {0x728C, 0xDEA6},{0x728D, 0xDEA5},{0x728E, 0xDEA9},{0x7290, 0xDEA8},{0x7291, 0xDEA7},{0x7292, 0xBAB9},{0x7293, 0xE2C9},{0x7295, 0xE2C8},
+ {0x7296, 0xBABA},{0x7297, 0xE2C7},{0x7298, 0xE673},{0x729A, 0xE674},{0x729B, 0xBCF9},{0x729D, 0xEA59},{0x729E, 0xEA5A},{0x72A1, 0xF272},
+ {0x72A2, 0xC37D},{0x72A3, 0xF271},{0x72A4, 0xF270},{0x72A5, 0xF26E},{0x72A6, 0xF26F},{0x72A7, 0xC4EB},{0x72A8, 0xF46C},{0x72A9, 0xF6EE},
+ {0x72AA, 0xF8F7},{0x72AC, 0xA4FC},{0x72AE, 0xC9A5},{0x72AF, 0xA5C7},{0x72B0, 0xC9A6},{0x72B4, 0xCA43},{0x72B5, 0xCA44},{0x72BA, 0xCB66},
+ {0x72BD, 0xCB62},{0x72BF, 0xCB61},{0x72C0, 0xAAAC},{0x72C1, 0xCB65},{0x72C2, 0xA867},{0x72C3, 0xCB63},{0x72C4, 0xA866},{0x72C5, 0xCB67},
+ {0x72C6, 0xCB64},{0x72C9, 0xCD5F},{0x72CA, 0xCFBE},{0x72CB, 0xCD5D},{0x72CC, 0xCD64},{0x72CE, 0xAAAD},{0x72D0, 0xAAB0},{0x72D1, 0xCD65},
+ {0x72D2, 0xCD61},{0x72D4, 0xCD62},{0x72D6, 0xCD5C},{0x72D7, 0xAAAF},{0x72D8, 0xCD5E},{0x72D9, 0xAAAE},{0x72DA, 0xCD63},{0x72DC, 0xCD60},
+ {0x72DF, 0xCFC2},{0x72E0, 0xACBD},{0x72E1, 0xACBE},{0x72E3, 0xCFC5},{0x72E4, 0xCFBF},{0x72E6, 0xCFC4},{0x72E8, 0xCFC0},{0x72E9, 0xACBC},
+ {0x72EA, 0xCFC3},{0x72EB, 0xCFC1},{0x72F3, 0xD2A8},{0x72F4, 0xD2A5},{0x72F6, 0xD2A7},{0x72F7, 0xAF58},{0x72F8, 0xAF57},{0x72F9, 0xAF55},
+ {0x72FA, 0xD2A4},{0x72FB, 0xD2A9},{0x72FC, 0xAF54},{0x72FD, 0xAF56},{0x72FE, 0xD2A6},{0x72FF, 0xD667},{0x7300, 0xD2A3},{0x7301, 0xD2AA},
+ {0x7307, 0xD662},{0x7308, 0xD666},{0x730A, 0xD665},{0x730B, 0xDA6E},{0x730C, 0xDA79},{0x730F, 0xD668},{0x7311, 0xD663},{0x7312, 0xDA6D},
+ {0x7313, 0xB274},{0x7316, 0xB273},{0x7317, 0xD661},{0x7318, 0xD664},{0x7319, 0xB275},{0x731B, 0xB272},{0x731C, 0xB271},{0x731D, 0xD660},
+ {0x731E, 0xD669},{0x7322, 0xDA70},{0x7323, 0xDA77},{0x7325, 0xB554},{0x7326, 0xDA76},{0x7327, 0xDA73},{0x7329, 0xB556},{0x732D, 0xDA75},
+ {0x7330, 0xDA6F},{0x7331, 0xDA71},{0x7332, 0xDA74},{0x7333, 0xDA72},{0x7334, 0xB555},{0x7335, 0xDA78},{0x7336, 0xB553},{0x7337, 0xB7DF},
+ {0x733A, 0xDEAD},{0x733B, 0xDEAC},{0x733C, 0xDEAA},{0x733E, 0xB7E2},{0x733F, 0xB7E1},{0x7340, 0xDEAE},{0x7342, 0xDEAB},{0x7343, 0xE2CA},
+ {0x7344, 0xBABB},{0x7345, 0xB7E0},{0x7349, 0xDEB0},{0x734A, 0xDEAF},{0x734C, 0xE2CD},{0x734D, 0xE2CB},{0x734E, 0xBCFA},{0x7350, 0xBABC},
+ {0x7351, 0xE2CC},{0x7352, 0xE676},{0x7357, 0xBCFB},{0x7358, 0xE675},{0x7359, 0xE67E},{0x735A, 0xE67D},{0x735B, 0xE67B},{0x735D, 0xE67A},
+ {0x735E, 0xE677},{0x735F, 0xE678},{0x7360, 0xE679},{0x7361, 0xE67C},{0x7362, 0xE6A1},{0x7365, 0xEA5F},{0x7366, 0xEA5C},{0x7367, 0xEA5D},
+ {0x7368, 0xBF57},{0x7369, 0xEA5B},{0x736A, 0xEA61},{0x736B, 0xEA60},{0x736C, 0xEA5E},{0x736E, 0xED64},{0x736F, 0xED65},{0x7370, 0xC0F1},
+ {0x7372, 0xC0F2},{0x7373, 0xED63},{0x7375, 0xC279},{0x7376, 0xEFFE},{0x7377, 0xC278},{0x7378, 0xC37E},{0x737A, 0xC3A1},{0x737B, 0xC46D},
+ {0x737C, 0xF46E},{0x737D, 0xF46D},{0x737E, 0xF5DD},{0x737F, 0xF6EF},{0x7380, 0xC57A},{0x7381, 0xF7E8},{0x7382, 0xF7E7},{0x7383, 0xF7E9},
+ {0x7384, 0xA5C8},{0x7385, 0xCFC6},{0x7386, 0xAF59},{0x7387, 0xB276},{0x7388, 0xD66A},{0x7389, 0xA5C9},{0x738A, 0xC9A7},{0x738B, 0xA4FD},
+ {0x738E, 0xCA45},{0x7392, 0xCB6C},{0x7393, 0xCB6A},{0x7394, 0xCB6B},{0x7395, 0xCB68},{0x7396, 0xA868},{0x7397, 0xCB69},{0x739D, 0xCD6D},
+ {0x739F, 0xAAB3},{0x73A0, 0xCD6B},{0x73A1, 0xCD67},{0x73A2, 0xCD6A},{0x73A4, 0xCD66},{0x73A5, 0xAAB5},{0x73A6, 0xCD69},{0x73A8, 0xAAB2},
+ {0x73A9, 0xAAB1},{0x73AB, 0xAAB4},{0x73AC, 0xCD6C},{0x73AD, 0xCD68},{0x73B2, 0xACC2},{0x73B3, 0xACC5},{0x73B4, 0xCFCE},{0x73B5, 0xCFCD},
+ {0x73B6, 0xCFCC},{0x73B7, 0xACBF},{0x73B8, 0xCFD5},{0x73B9, 0xCFCB},{0x73BB, 0xACC1},{0x73BC, 0xD2AF},{0x73BE, 0xCFD2},{0x73BF, 0xCFD0},
+ {0x73C0, 0xACC4},{0x73C2, 0xCFC8},{0x73C3, 0xCFD3},{0x73C5, 0xCFCA},{0x73C6, 0xCFD4},{0x73C7, 0xCFD1},{0x73C8, 0xCFC9},{0x73CA, 0xACC0},
+ {0x73CB, 0xCFD6},{0x73CC, 0xCFC7},{0x73CD, 0xACC3},{0x73D2, 0xD2B4},{0x73D3, 0xD2AB},{0x73D4, 0xD2B6},{0x73D6, 0xD2AE},{0x73D7, 0xD2B9},
+ {0x73D8, 0xD2BA},{0x73D9, 0xD2AC},{0x73DA, 0xD2B8},{0x73DB, 0xD2B5},{0x73DC, 0xD2B3},{0x73DD, 0xD2B7},{0x73DE, 0xAF5F},{0x73E0, 0xAF5D},
+ {0x73E3, 0xD2B1},{0x73E5, 0xD2AD},{0x73E7, 0xD2B0},{0x73E8, 0xD2BB},{0x73E9, 0xD2B2},{0x73EA, 0xAF5E},{0x73EB, 0xCFCF},{0x73ED, 0xAF5A},
+ {0x73EE, 0xAF5C},{0x73F4, 0xD678},{0x73F5, 0xD66D},{0x73F6, 0xD66B},{0x73F8, 0xD66C},{0x73FA, 0xD673},{0x73FC, 0xD674},{0x73FD, 0xD670},
+ {0x73FE, 0xB27B},{0x73FF, 0xD675},{0x7400, 0xD672},{0x7401, 0xD66F},{0x7403, 0xB279},{0x7404, 0xD66E},{0x7405, 0xB277},{0x7406, 0xB27A},
+ {0x7407, 0xD671},{0x7408, 0xD679},{0x7409, 0xAF5B},{0x740A, 0xB278},{0x740B, 0xD677},{0x740C, 0xD676},{0x740D, 0xB27C},{0x7416, 0xDA7E},
+ {0x741A, 0xDAA1},{0x741B, 0xB560},{0x741D, 0xDAA7},{0x7420, 0xDAA9},{0x7421, 0xDAA2},{0x7422, 0xB55A},{0x7423, 0xDAA6},{0x7424, 0xDAA5},
+ {0x7425, 0xB55B},{0x7426, 0xB561},{0x7428, 0xB562},{0x7429, 0xDAA8},{0x742A, 0xB558},{0x742B, 0xDA7D},{0x742C, 0xDA7B},{0x742D, 0xDAA3},
+ {0x742E, 0xDA7A},{0x742F, 0xB55F},{0x7430, 0xDA7C},{0x7431, 0xDAA4},{0x7432, 0xDAAA},{0x7433, 0xB559},{0x7434, 0xB55E},{0x7435, 0xB55C},
+ {0x7436, 0xB55D},{0x743A, 0xB557},{0x743F, 0xB7E9},{0x7440, 0xDEB7},{0x7441, 0xB7E8},{0x7442, 0xDEBB},{0x7444, 0xDEB1},{0x7446, 0xDEBC},
+ {0x744A, 0xDEB2},{0x744B, 0xDEB3},{0x744D, 0xDEBD},{0x744E, 0xDEBA},{0x744F, 0xDEB8},{0x7450, 0xDEB9},{0x7451, 0xDEB5},{0x7452, 0xDEB4},
+ {0x7454, 0xDEBE},{0x7455, 0xB7E5},{0x7457, 0xDEB6},{0x7459, 0xB7EA},{0x745A, 0xB7E4},{0x745B, 0xB7EB},{0x745C, 0xB7EC},{0x745E, 0xB7E7},
+ {0x745F, 0xB7E6},{0x7462, 0xE2CE},{0x7463, 0xBABE},{0x7464, 0xBABD},{0x7467, 0xE2D3},{0x7469, 0xBCFC},{0x746A, 0xBABF},{0x746D, 0xBAC1},
+ {0x746E, 0xE2D4},{0x746F, 0xB7E3},{0x7470, 0xBAC0},{0x7471, 0xE2D0},{0x7472, 0xE2D2},{0x7473, 0xE2CF},{0x7475, 0xE2D1},{0x7479, 0xE6AB},
+ {0x747C, 0xE6AA},{0x747D, 0xE6A7},{0x747E, 0xBD40},{0x747F, 0xEA62},{0x7480, 0xBD41},{0x7481, 0xE6A6},{0x7483, 0xBCFE},{0x7485, 0xE6A8},
+ {0x7486, 0xE6A5},{0x7487, 0xE6A2},{0x7488, 0xE6A9},{0x7489, 0xE6A3},{0x748A, 0xE6A4},{0x748B, 0xBCFD},{0x7490, 0xED69},{0x7492, 0xEA66},
+ {0x7494, 0xEA65},{0x7495, 0xEA67},{0x7497, 0xED66},{0x7498, 0xBF5A},{0x749A, 0xEA63},{0x749C, 0xBF58},{0x749E, 0xBF5C},{0x749F, 0xBF5B},
+ {0x74A0, 0xEA64},{0x74A1, 0xEA68},{0x74A3, 0xBF59},{0x74A5, 0xED6D},{0x74A6, 0xC0F5},{0x74A7, 0xC27A},{0x74A8, 0xC0F6},{0x74A9, 0xC0F3},
+ {0x74AA, 0xED6A},{0x74AB, 0xED68},{0x74AD, 0xED6B},{0x74AF, 0xED6E},{0x74B0, 0xC0F4},{0x74B1, 0xED6C},{0x74B2, 0xED67},{0x74B5, 0xF042},
+ {0x74B6, 0xF045},{0x74B7, 0xF275},{0x74B8, 0xF040},{0x74BA, 0xF46F},{0x74BB, 0xF046},{0x74BD, 0xC3A2},{0x74BE, 0xF044},{0x74BF, 0xC27B},
+ {0x74C0, 0xF041},{0x74C1, 0xF043},{0x74C2, 0xF047},{0x74C3, 0xF276},{0x74C5, 0xF274},{0x74CA, 0xC3A3},{0x74CB, 0xF273},{0x74CF, 0xC46E},
+ {0x74D4, 0xC4ED},{0x74D5, 0xF6F1},{0x74D6, 0xC4EC},{0x74D7, 0xF6F3},{0x74D8, 0xF6F0},{0x74D9, 0xF6F2},{0x74DA, 0xC5D0},{0x74DB, 0xF8B2},
+ {0x74DC, 0xA5CA},{0x74DD, 0xCD6E},{0x74DE, 0xD2BC},{0x74DF, 0xD2BD},{0x74E0, 0xB27D},{0x74E1, 0xDEBF},{0x74E2, 0xBF5D},{0x74E3, 0xC3A4},
+ {0x74E4, 0xC57B},{0x74E5, 0xF8B3},{0x74E6, 0xA5CB},{0x74E8, 0xCD6F},{0x74E9, 0xA260},{0x74EC, 0xCFD7},{0x74EE, 0xCFD8},{0x74F4, 0xD2BE},
+ {0x74F5, 0xD2BF},{0x74F6, 0xB27E},{0x74F7, 0xB2A1},{0x74FB, 0xDAAB},{0x74FD, 0xDEC2},{0x74FE, 0xDEC1},{0x74FF, 0xDEC0},{0x7500, 0xE2D5},
+ {0x7502, 0xE2D6},{0x7503, 0xE2D7},{0x7504, 0xBAC2},{0x7507, 0xE6AD},{0x7508, 0xE6AC},{0x750B, 0xEA69},{0x750C, 0xBF5E},{0x750D, 0xBF5F},
+ {0x750F, 0xED72},{0x7510, 0xED6F},{0x7511, 0xED70},{0x7512, 0xED71},{0x7513, 0xF049},{0x7514, 0xF048},{0x7515, 0xC27C},{0x7516, 0xF277},
+ {0x7517, 0xF5DE},{0x7518, 0xA5CC},{0x751A, 0xACC6},{0x751C, 0xB2A2},{0x751D, 0xDEC3},{0x751F, 0xA5CD},{0x7521, 0xD2C0},{0x7522, 0xB2A3},
+ {0x7525, 0xB563},{0x7526, 0xB564},{0x7528, 0xA5CE},{0x7529, 0xA5CF},{0x752A, 0xCA46},{0x752B, 0xA86A},{0x752C, 0xA869},{0x752D, 0xACC7},
+ {0x752E, 0xCFD9},{0x752F, 0xDAAC},{0x7530, 0xA5D0},{0x7531, 0xA5D1},{0x7532, 0xA5D2},{0x7533, 0xA5D3},{0x7537, 0xA86B},{0x7538, 0xA86C},
+ {0x7539, 0xCB6E},{0x753A, 0xCB6D},{0x753D, 0xAAB6},{0x753E, 0xCD72},{0x753F, 0xCD70},{0x7540, 0xCD71},{0x7547, 0xCFDA},{0x7548, 0xCFDB},
+ {0x754B, 0xACCB},{0x754C, 0xACC9},{0x754E, 0xACCA},{0x754F, 0xACC8},{0x7554, 0xAF60},{0x7559, 0xAF64},{0x755A, 0xAF63},{0x755B, 0xD2C1},
+ {0x755C, 0xAF62},{0x755D, 0xAF61},{0x755F, 0xD2C2},{0x7562, 0xB2A6},{0x7563, 0xD67B},{0x7564, 0xD67A},{0x7565, 0xB2A4},{0x7566, 0xB2A5},
+ {0x756A, 0xB566},{0x756B, 0xB565},{0x756C, 0xDAAE},{0x756F, 0xDAAD},{0x7570, 0xB2A7},{0x7576, 0xB7ED},{0x7577, 0xDEC5},{0x7578, 0xB7EE},
+ {0x7579, 0xDEC4},{0x757D, 0xE2D8},{0x757E, 0xE6AE},{0x757F, 0xBD42},{0x7580, 0xEA6A},{0x7584, 0xED73},{0x7586, 0xC3A6},{0x7587, 0xC3A5},
+ {0x758A, 0xC57C},{0x758B, 0xA5D4},{0x758C, 0xCD73},{0x758F, 0xB2A8},{0x7590, 0xE2D9},{0x7591, 0xBAC3},{0x7594, 0xCB6F},{0x7595, 0xCB70},
+ {0x7598, 0xCD74},{0x7599, 0xAAB8},{0x759A, 0xAAB9},{0x759D, 0xAAB7},{0x75A2, 0xACCF},{0x75A3, 0xACD0},{0x75A4, 0xACCD},{0x75A5, 0xACCE},
+ {0x75A7, 0xCFDC},{0x75AA, 0xCFDD},{0x75AB, 0xACCC},{0x75B0, 0xD2C3},{0x75B2, 0xAF68},{0x75B3, 0xAF69},{0x75B5, 0xB2AB},{0x75B6, 0xD2C9},
+ {0x75B8, 0xAF6E},{0x75B9, 0xAF6C},{0x75BA, 0xD2CA},{0x75BB, 0xD2C5},{0x75BC, 0xAF6B},{0x75BD, 0xAF6A},{0x75BE, 0xAF65},{0x75BF, 0xD2C8},
+ {0x75C0, 0xD2C7},{0x75C1, 0xD2C4},{0x75C2, 0xAF6D},{0x75C4, 0xD2C6},{0x75C5, 0xAF66},{0x75C7, 0xAF67},{0x75CA, 0xB2AC},{0x75CB, 0xD6A1},
+ {0x75CC, 0xD6A2},{0x75CD, 0xB2AD},{0x75CE, 0xD67C},{0x75CF, 0xD67E},{0x75D0, 0xD6A4},{0x75D1, 0xD6A3},{0x75D2, 0xD67D},{0x75D4, 0xB2A9},
+ {0x75D5, 0xB2AA},{0x75D7, 0xDAB6},{0x75D8, 0xB56B},{0x75D9, 0xB56A},{0x75DA, 0xDAB0},{0x75DB, 0xB568},{0x75DD, 0xDAB3},{0x75DE, 0xB56C},
+ {0x75DF, 0xDAB4},{0x75E0, 0xB56D},{0x75E1, 0xDAB1},{0x75E2, 0xB567},{0x75E3, 0xB569},{0x75E4, 0xDAB5},{0x75E6, 0xDAB2},{0x75E7, 0xDAAF},
+ {0x75ED, 0xDED2},{0x75EF, 0xDEC7},{0x75F0, 0xB7F0},{0x75F1, 0xB7F3},{0x75F2, 0xB7F2},{0x75F3, 0xB7F7},{0x75F4, 0xB7F6},{0x75F5, 0xDED3},
+ {0x75F6, 0xDED1},{0x75F7, 0xDECA},{0x75F8, 0xDECE},{0x75F9, 0xDECD},{0x75FA, 0xB7F4},{0x75FB, 0xDED0},{0x75FC, 0xDECC},{0x75FD, 0xDED4},
+ {0x75FE, 0xDECB},{0x75FF, 0xB7F5},{0x7600, 0xB7EF},{0x7601, 0xB7F1},{0x7603, 0xDEC9},{0x7608, 0xE2DB},{0x7609, 0xBAC7},{0x760A, 0xE2DF},
+ {0x760B, 0xBAC6},{0x760C, 0xE2DC},{0x760D, 0xBAC5},{0x760F, 0xDEC8},{0x7610, 0xDECF},{0x7611, 0xE2DE},{0x7613, 0xBAC8},{0x7614, 0xE2E0},
+ {0x7615, 0xE2DD},{0x7616, 0xE2DA},{0x7619, 0xE6B1},{0x761A, 0xE6B5},{0x761B, 0xE6B7},{0x761C, 0xE6B3},{0x761D, 0xE6B2},{0x761E, 0xE6B0},
+ {0x761F, 0xBD45},{0x7620, 0xBD43},{0x7621, 0xBD48},{0x7622, 0xBD49},{0x7623, 0xE6B4},{0x7624, 0xBD46},{0x7625, 0xE6AF},{0x7626, 0xBD47},
+ {0x7627, 0xBAC4},{0x7628, 0xE6B6},{0x7629, 0xBD44},{0x762D, 0xEA6C},{0x762F, 0xEA6B},{0x7630, 0xEA73},{0x7631, 0xEA6D},{0x7632, 0xEA72},
+ {0x7633, 0xEA6F},{0x7634, 0xBF60},{0x7635, 0xEA71},{0x7638, 0xBF61},{0x763A, 0xBF62},{0x763C, 0xEA70},{0x763D, 0xEA6E},{0x7642, 0xC0F8},
+ {0x7643, 0xED74},{0x7646, 0xC0F7},{0x7647, 0xED77},{0x7648, 0xED75},{0x7649, 0xED76},{0x764C, 0xC0F9},{0x7650, 0xF04D},{0x7652, 0xC2A1},
+ {0x7653, 0xF04E},{0x7656, 0xC27D},{0x7657, 0xF04F},{0x7658, 0xC27E},{0x7659, 0xF04C},{0x765A, 0xF050},{0x765C, 0xF04A},{0x765F, 0xC3A7},
+ {0x7660, 0xF278},{0x7661, 0xC3A8},{0x7662, 0xC46F},{0x7664, 0xF04B},{0x7665, 0xC470},{0x7669, 0xC4EE},{0x766A, 0xF5DF},{0x766C, 0xC57E},
+ {0x766D, 0xF6F4},{0x766E, 0xC57D},{0x7670, 0xF7EA},{0x7671, 0xC5F5},{0x7672, 0xC5F6},{0x7675, 0xF9CC},{0x7678, 0xACD1},{0x7679, 0xCFDE},
+ {0x767B, 0xB56E},{0x767C, 0xB56F},{0x767D, 0xA5D5},{0x767E, 0xA6CA},{0x767F, 0xCA47},{0x7681, 0xCB71},{0x7682, 0xA86D},{0x7684, 0xAABA},
+ {0x7686, 0xACD2},{0x7687, 0xACD3},{0x7688, 0xACD4},{0x7689, 0xD6A6},{0x768A, 0xD2CB},{0x768B, 0xAF6F},{0x768E, 0xB2AE},{0x768F, 0xD6A5},
+ {0x7692, 0xDAB8},{0x7693, 0xB571},{0x7695, 0xDAB7},{0x7696, 0xB570},{0x7699, 0xDED5},{0x769A, 0xBD4A},{0x769B, 0xE6BB},{0x769C, 0xE6B8},
+ {0x769D, 0xE6B9},{0x769E, 0xE6BA},{0x76A4, 0xED78},{0x76A6, 0xF051},{0x76AA, 0xF471},{0x76AB, 0xF470},{0x76AD, 0xF6F5},{0x76AE, 0xA5D6},
+ {0x76AF, 0xCD75},{0x76B0, 0xAF70},{0x76B4, 0xB572},{0x76B5, 0xDED6},{0x76B8, 0xE2E1},{0x76BA, 0xBD4B},{0x76BB, 0xEA74},{0x76BD, 0xF052},
+ {0x76BE, 0xF472},{0x76BF, 0xA5D7},{0x76C2, 0xAABB},{0x76C3, 0xACD7},{0x76C4, 0xCFDF},{0x76C5, 0xACD8},{0x76C6, 0xACD6},{0x76C8, 0xACD5},
+ {0x76C9, 0xD2CC},{0x76CA, 0xAF71},{0x76CD, 0xAF72},{0x76CE, 0xAF73},{0x76D2, 0xB2B0},{0x76D3, 0xD6A7},{0x76D4, 0xB2AF},{0x76DA, 0xDAB9},
+ {0x76DB, 0xB2B1},{0x76DC, 0xB573},{0x76DD, 0xDED7},{0x76DE, 0xB7F8},{0x76DF, 0xB7F9},{0x76E1, 0xBAC9},{0x76E3, 0xBACA},{0x76E4, 0xBD4C},
+ {0x76E5, 0xBF64},{0x76E6, 0xEA75},{0x76E7, 0xBF63},{0x76E9, 0xED79},{0x76EA, 0xC0FA},{0x76EC, 0xF053},{0x76ED, 0xF473},{0x76EE, 0xA5D8},
+ {0x76EF, 0xA86E},{0x76F0, 0xCD78},{0x76F1, 0xCD77},{0x76F2, 0xAABC},{0x76F3, 0xCD76},{0x76F4, 0xAABD},{0x76F5, 0xCD79},{0x76F7, 0xCFE5},
+ {0x76F8, 0xACDB},{0x76F9, 0xACDA},{0x76FA, 0xCFE7},{0x76FB, 0xCFE6},{0x76FC, 0xACDF},{0x76FE, 0xACDE},{0x7701, 0xACD9},{0x7703, 0xCFE1},
+ {0x7704, 0xCFE2},{0x7705, 0xCFE3},{0x7707, 0xACE0},{0x7708, 0xCFE0},{0x7709, 0xACDC},{0x770A, 0xCFE4},{0x770B, 0xACDD},{0x7710, 0xD2CF},
+ {0x7711, 0xD2D3},{0x7712, 0xD2D1},{0x7713, 0xD2D0},{0x7715, 0xD2D4},{0x7719, 0xD2D5},{0x771A, 0xD2D6},{0x771B, 0xD2CE},{0x771D, 0xD2CD},
+ {0x771F, 0xAF75},{0x7720, 0xAF76},{0x7722, 0xD2D7},{0x7723, 0xD2D2},{0x7725, 0xD6B0},{0x7727, 0xD2D8},{0x7728, 0xAF77},{0x7729, 0xAF74},
+ {0x772D, 0xD6AA},{0x772F, 0xD6A9},{0x7731, 0xD6AB},{0x7732, 0xD6AC},{0x7733, 0xD6AE},{0x7734, 0xD6AD},{0x7735, 0xD6B2},{0x7736, 0xB2B5},
+ {0x7737, 0xB2B2},{0x7738, 0xB2B6},{0x7739, 0xD6A8},{0x773A, 0xB2B7},{0x773B, 0xD6B1},{0x773C, 0xB2B4},{0x773D, 0xD6AF},{0x773E, 0xB2B3},
+ {0x7744, 0xDABC},{0x7745, 0xDABE},{0x7746, 0xDABA},{0x7747, 0xDABB},{0x774A, 0xDABF},{0x774B, 0xDAC1},{0x774C, 0xDAC2},{0x774D, 0xDABD},
+ {0x774E, 0xDAC0},{0x774F, 0xB574},{0x7752, 0xDEDB},{0x7754, 0xDEE0},{0x7755, 0xDED8},{0x7756, 0xDEDC},{0x7759, 0xDEE1},{0x775A, 0xDEDD},
+ {0x775B, 0xB7FA},{0x775C, 0xB843},{0x775E, 0xB7FD},{0x775F, 0xDED9},{0x7760, 0xDEDA},{0x7761, 0xBACE},{0x7762, 0xB846},{0x7763, 0xB7FE},
+ {0x7765, 0xB844},{0x7766, 0xB7FC},{0x7767, 0xDEDF},{0x7768, 0xB845},{0x7769, 0xDEDE},{0x776A, 0xB841},{0x776B, 0xB7FB},{0x776C, 0xB842},
+ {0x776D, 0xDEE2},{0x776E, 0xE2E6},{0x776F, 0xE2E8},{0x7779, 0xB840},{0x777C, 0xE2E3},{0x777D, 0xBACC},{0x777E, 0xE2E9},{0x777F, 0xBACD},
+ {0x7780, 0xE2E7},{0x7781, 0xE2E2},{0x7782, 0xE2E5},{0x7783, 0xE2EA},{0x7784, 0xBACB},{0x7785, 0xE2E4},{0x7787, 0xBD4E},{0x7788, 0xE6BF},
+ {0x7789, 0xE6BE},{0x778B, 0xBD51},{0x778C, 0xBD4F},{0x778D, 0xE6BC},{0x778E, 0xBD4D},{0x778F, 0xE6BD},{0x7791, 0xBD50},{0x7795, 0xEA7D},
+ {0x7797, 0xEAA1},{0x7799, 0xEA7E},{0x779A, 0xEA76},{0x779B, 0xEA7A},{0x779C, 0xEA79},{0x779D, 0xEA77},{0x779E, 0xBF66},{0x779F, 0xBF67},
+ {0x77A0, 0xBF65},{0x77A1, 0xEA78},{0x77A2, 0xEA7B},{0x77A3, 0xEA7C},{0x77A5, 0xBF68},{0x77A7, 0xC140},{0x77A8, 0xEDA3},{0x77AA, 0xC0FC},
+ {0x77AB, 0xED7B},{0x77AC, 0xC0FE},{0x77AD, 0xC141},{0x77B0, 0xC0FD},{0x77B1, 0xEDA2},{0x77B2, 0xED7C},{0x77B3, 0xC0FB},{0x77B4, 0xEDA1},
+ {0x77B5, 0xED7A},{0x77B6, 0xED7E},{0x77B7, 0xED7D},{0x77BA, 0xF055},{0x77BB, 0xC2A4},{0x77BC, 0xC2A5},{0x77BD, 0xC2A2},{0x77BF, 0xC2A3},
+ {0x77C2, 0xF054},{0x77C4, 0xF27B},{0x77C7, 0xC3A9},{0x77C9, 0xF279},{0x77CA, 0xF27A},{0x77CC, 0xF474},{0x77CD, 0xF477},{0x77CE, 0xF475},
+ {0x77CF, 0xF476},{0x77D0, 0xF5E0},{0x77D3, 0xC4EF},{0x77D4, 0xF7EB},{0x77D5, 0xF8B4},{0x77D7, 0xC5F7},{0x77D8, 0xF8F8},{0x77D9, 0xF8F9},
+ {0x77DA, 0xC666},{0x77DB, 0xA5D9},{0x77DC, 0xACE1},{0x77DE, 0xDAC3},{0x77E0, 0xDEE3},{0x77E2, 0xA5DA},{0x77E3, 0xA86F},{0x77E5, 0xAABE},
+ {0x77E7, 0xCFE8},{0x77E8, 0xCFE9},{0x77E9, 0xAF78},{0x77EC, 0xDAC4},{0x77ED, 0xB575},{0x77EE, 0xB847},{0x77EF, 0xC142},{0x77F0, 0xEDA4},
+ {0x77F1, 0xF27C},{0x77F2, 0xF478},{0x77F3, 0xA5DB},{0x77F7, 0xCDA1},{0x77F8, 0xCD7A},{0x77F9, 0xCD7C},{0x77FA, 0xCD7E},{0x77FB, 0xCD7D},
+ {0x77FC, 0xCD7B},{0x77FD, 0xAABF},{0x7802, 0xACE2},{0x7803, 0xCFF2},{0x7805, 0xCFED},{0x7806, 0xCFEA},{0x7809, 0xCFF1},{0x780C, 0xACE4},
+ {0x780D, 0xACE5},{0x780E, 0xCFF0},{0x780F, 0xCFEF},{0x7810, 0xCFEE},{0x7811, 0xCFEB},{0x7812, 0xCFEC},{0x7813, 0xCFF3},{0x7814, 0xACE3},
+ {0x781D, 0xAF7C},{0x781F, 0xAFA4},{0x7820, 0xAFA3},{0x7821, 0xD2E1},{0x7822, 0xD2DB},{0x7823, 0xD2D9},{0x7825, 0xAFA1},{0x7826, 0xD6B9},
+ {0x7827, 0xAF7A},{0x7828, 0xD2DE},{0x7829, 0xD2E2},{0x782A, 0xD2E4},{0x782B, 0xD2E0},{0x782C, 0xD2DA},{0x782D, 0xAFA2},{0x782E, 0xD2DF},
+ {0x782F, 0xD2DD},{0x7830, 0xAF79},{0x7831, 0xD2E5},{0x7832, 0xAFA5},{0x7833, 0xD2E3},{0x7834, 0xAF7D},{0x7835, 0xD2DC},{0x7837, 0xAF7E},
+ {0x7838, 0xAF7B},{0x7843, 0xB2B9},{0x7845, 0xD6BA},{0x7848, 0xD6B3},{0x7849, 0xD6B5},{0x784A, 0xD6B7},{0x784C, 0xD6B8},{0x784D, 0xD6B6},
+ {0x784E, 0xB2BA},{0x7850, 0xD6BB},{0x7852, 0xD6B4},{0x785C, 0xDAC8},{0x785D, 0xB576},{0x785E, 0xDAD0},{0x7860, 0xDAC5},{0x7862, 0xDAD1},
+ {0x7864, 0xDAC6},{0x7865, 0xDAC7},{0x7868, 0xDACF},{0x7869, 0xDACE},{0x786A, 0xDACB},{0x786B, 0xB2B8},{0x786C, 0xB577},{0x786D, 0xDAC9},
+ {0x786E, 0xDACC},{0x786F, 0xB578},{0x7870, 0xDACD},{0x7871, 0xDACA},{0x7879, 0xDEEE},{0x787B, 0xDEF2},{0x787C, 0xB84E},{0x787E, 0xE2F0},
+ {0x787F, 0xB851},{0x7880, 0xDEF0},{0x7883, 0xDEED},{0x7884, 0xDEE8},{0x7885, 0xDEEA},{0x7886, 0xDEEB},{0x7887, 0xDEE4},{0x7889, 0xB84D},
+ {0x788C, 0xB84C},{0x788E, 0xB848},{0x788F, 0xDEE7},{0x7891, 0xB84F},{0x7893, 0xB850},{0x7894, 0xDEE6},{0x7895, 0xDEE9},{0x7896, 0xDEF1},
+ {0x7897, 0xB84A},{0x7898, 0xB84B},{0x7899, 0xDEEF},{0x789A, 0xDEE5},{0x789E, 0xE2F2},{0x789F, 0xBAD0},{0x78A0, 0xE2F4},{0x78A1, 0xDEEC},
+ {0x78A2, 0xE2F6},{0x78A3, 0xBAD4},{0x78A4, 0xE2F7},{0x78A5, 0xE2F3},{0x78A7, 0xBAD1},{0x78A8, 0xE2EF},{0x78A9, 0xBAD3},{0x78AA, 0xE2EC},
+ {0x78AB, 0xE2F1},{0x78AC, 0xE2F5},{0x78AD, 0xE2EE},{0x78B0, 0xB849},{0x78B2, 0xE2EB},{0x78B3, 0xBAD2},{0x78B4, 0xE2ED},{0x78BA, 0xBD54},
+ {0x78BB, 0xE6C1},{0x78BC, 0xBD58},{0x78BE, 0xBD56},{0x78C1, 0xBACF},{0x78C3, 0xE6C8},{0x78C4, 0xE6C9},{0x78C5, 0xBD53},{0x78C8, 0xE6C7},
+ {0x78C9, 0xE6CA},{0x78CA, 0xBD55},{0x78CB, 0xBD52},{0x78CC, 0xE6C3},{0x78CD, 0xE6C0},{0x78CE, 0xE6C5},{0x78CF, 0xE6C2},{0x78D0, 0xBD59},
+ {0x78D1, 0xE6C4},{0x78D4, 0xE6C6},{0x78D5, 0xBD57},{0x78DA, 0xBF6A},{0x78DB, 0xEAA8},{0x78DD, 0xEAA2},{0x78DE, 0xEAA6},{0x78DF, 0xEAAC},
+ {0x78E0, 0xEAAD},{0x78E1, 0xEAA9},{0x78E2, 0xEAAA},{0x78E3, 0xEAA7},{0x78E5, 0xEAA4},{0x78E7, 0xBF6C},{0x78E8, 0xBF69},{0x78E9, 0xEAA3},
+ {0x78EA, 0xEAA5},{0x78EC, 0xBF6B},{0x78ED, 0xEAAB},{0x78EF, 0xC146},{0x78F2, 0xEDAA},{0x78F3, 0xEDA5},{0x78F4, 0xC145},{0x78F7, 0xC143},
+ {0x78F9, 0xEDAC},{0x78FA, 0xC144},{0x78FB, 0xEDA8},{0x78FC, 0xEDA9},{0x78FD, 0xEDA6},{0x78FE, 0xEDAD},{0x78FF, 0xF056},{0x7901, 0xC147},
+ {0x7902, 0xEDA7},{0x7904, 0xEDAE},{0x7905, 0xEDAB},{0x7909, 0xF05A},{0x790C, 0xF057},{0x790E, 0xC2A6},{0x7910, 0xF05B},{0x7911, 0xF05D},
+ {0x7912, 0xF05C},{0x7913, 0xF058},{0x7914, 0xF059},{0x7917, 0xF2A3},{0x7919, 0xC3AA},{0x791B, 0xF27E},{0x791C, 0xF2A2},{0x791D, 0xF27D},
+ {0x791E, 0xF2A4},{0x7921, 0xF2A1},{0x7923, 0xF47A},{0x7924, 0xF47D},{0x7925, 0xF479},{0x7926, 0xC471},{0x7927, 0xF47B},{0x7928, 0xF47C},
+ {0x7929, 0xF47E},{0x792A, 0xC472},{0x792B, 0xC474},{0x792C, 0xC473},{0x792D, 0xF5E1},{0x792F, 0xF5E3},{0x7931, 0xF5E2},{0x7935, 0xF6F6},
+ {0x7938, 0xF8B5},{0x7939, 0xF8FA},{0x793A, 0xA5DC},{0x793D, 0xCB72},{0x793E, 0xAAC0},{0x793F, 0xCDA3},{0x7940, 0xAAC1},{0x7941, 0xAAC2},
+ {0x7942, 0xCDA2},{0x7944, 0xCFF8},{0x7945, 0xCFF7},{0x7946, 0xACE6},{0x7947, 0xACE9},{0x7948, 0xACE8},{0x7949, 0xACE7},{0x794A, 0xCFF4},
+ {0x794B, 0xCFF6},{0x794C, 0xCFF5},{0x794F, 0xD2E8},{0x7950, 0xAFA7},{0x7951, 0xD2EC},{0x7952, 0xD2EB},{0x7953, 0xD2EA},{0x7954, 0xD2E6},
+ {0x7955, 0xAFA6},{0x7956, 0xAFAA},{0x7957, 0xAFAD},{0x795A, 0xAFAE},{0x795B, 0xD2E7},{0x795C, 0xD2E9},{0x795D, 0xAFAC},{0x795E, 0xAFAB},
+ {0x795F, 0xAFA9},{0x7960, 0xAFA8},{0x7961, 0xD6C2},{0x7963, 0xD6C0},{0x7964, 0xD6BC},{0x7965, 0xB2BB},{0x7967, 0xD6BD},{0x7968, 0xB2BC},
+ {0x7969, 0xD6BE},{0x796A, 0xD6BF},{0x796B, 0xD6C1},{0x796D, 0xB2BD},{0x7970, 0xDAD5},{0x7972, 0xDAD4},{0x7973, 0xDAD3},{0x7974, 0xDAD2},
+ {0x7979, 0xDEF6},{0x797A, 0xB852},{0x797C, 0xDEF3},{0x797D, 0xDEF5},{0x797F, 0xB853},{0x7981, 0xB854},{0x7982, 0xDEF4},{0x7988, 0xE341},
+ {0x798A, 0xE2F9},{0x798B, 0xE2FA},{0x798D, 0xBAD7},{0x798E, 0xBAD5},{0x798F, 0xBAD6},{0x7990, 0xE343},{0x7992, 0xE342},{0x7993, 0xE2FE},
+ {0x7994, 0xE2FD},{0x7995, 0xE2FC},{0x7996, 0xE2FB},{0x7997, 0xE340},{0x7998, 0xE2F8},{0x799A, 0xE6CB},{0x799B, 0xE6D0},{0x799C, 0xE6CE},
+ {0x79A0, 0xE6CD},{0x79A1, 0xE6CC},{0x79A2, 0xE6CF},{0x79A4, 0xEAAE},{0x79A6, 0xBF6D},{0x79A7, 0xC148},{0x79A8, 0xEDB0},{0x79AA, 0xC149},
+ {0x79AB, 0xEDAF},{0x79AC, 0xF05F},{0x79AD, 0xF05E},{0x79AE, 0xC2A7},{0x79B0, 0xF2A5},{0x79B1, 0xC3AB},{0x79B2, 0xF4A1},{0x79B3, 0xC5A1},
+ {0x79B4, 0xF6F7},{0x79B6, 0xF8B7},{0x79B7, 0xF8B6},{0x79B8, 0xC9A8},{0x79B9, 0xACEA},{0x79BA, 0xACEB},{0x79BB, 0xD6C3},{0x79BD, 0xB856},
+ {0x79BE, 0xA5DD},{0x79BF, 0xA872},{0x79C0, 0xA871},{0x79C1, 0xA870},{0x79C5, 0xCDA4},{0x79C8, 0xAAC4},{0x79C9, 0xAAC3},{0x79CB, 0xACEE},
+ {0x79CD, 0xCFFA},{0x79CE, 0xCFFD},{0x79CF, 0xCFFB},{0x79D1, 0xACEC},{0x79D2, 0xACED},{0x79D5, 0xCFF9},{0x79D6, 0xCFFC},{0x79D8, 0xAFB5},
+ {0x79DC, 0xD2F3},{0x79DD, 0xD2F5},{0x79DE, 0xD2F4},{0x79DF, 0xAFB2},{0x79E0, 0xD2EF},{0x79E3, 0xAFB0},{0x79E4, 0xAFAF},{0x79E6, 0xAFB3},
+ {0x79E7, 0xAFB1},{0x79E9, 0xAFB4},{0x79EA, 0xD2F2},{0x79EB, 0xD2ED},{0x79EC, 0xD2EE},{0x79ED, 0xD2F1},{0x79EE, 0xD2F0},{0x79F6, 0xD6C6},
+ {0x79F7, 0xD6C7},{0x79F8, 0xD6C5},{0x79FA, 0xD6C4},{0x79FB, 0xB2BE},{0x7A00, 0xB57D},{0x7A02, 0xDAD6},{0x7A03, 0xDAD8},{0x7A04, 0xDADA},
+ {0x7A05, 0xB57C},{0x7A08, 0xB57A},{0x7A0A, 0xDAD7},{0x7A0B, 0xB57B},{0x7A0C, 0xDAD9},{0x7A0D, 0xB579},{0x7A10, 0xDF41},{0x7A11, 0xDEF7},
+ {0x7A12, 0xDEFA},{0x7A13, 0xDEFE},{0x7A14, 0xB85A},{0x7A15, 0xDEFC},{0x7A17, 0xDEFB},{0x7A18, 0xDEF8},{0x7A19, 0xDEF9},{0x7A1A, 0xB858},
+ {0x7A1B, 0xDF40},{0x7A1C, 0xB857},{0x7A1E, 0xB85C},{0x7A1F, 0xB85B},{0x7A20, 0xB859},{0x7A22, 0xDEFD},{0x7A26, 0xE349},{0x7A28, 0xE348},
+ {0x7A2B, 0xE344},{0x7A2E, 0xBAD8},{0x7A2F, 0xE347},{0x7A30, 0xE346},{0x7A31, 0xBAD9},{0x7A37, 0xBD5E},{0x7A39, 0xE6D2},{0x7A3B, 0xBD5F},
+ {0x7A3C, 0xBD5B},{0x7A3D, 0xBD5D},{0x7A3F, 0xBD5A},{0x7A40, 0xBD5C},{0x7A44, 0xEAAF},{0x7A46, 0xBF70},{0x7A47, 0xEAB1},{0x7A48, 0xEAB0},
+ {0x7A4A, 0xE345},{0x7A4B, 0xBF72},{0x7A4C, 0xBF71},{0x7A4D, 0xBF6E},{0x7A4E, 0xBF6F},{0x7A54, 0xEDB5},{0x7A56, 0xEDB3},{0x7A57, 0xC14A},
+ {0x7A58, 0xEDB4},{0x7A5A, 0xEDB6},{0x7A5B, 0xEDB2},{0x7A5C, 0xEDB1},{0x7A5F, 0xF060},{0x7A60, 0xC2AA},{0x7A61, 0xC2A8},{0x7A62, 0xC2A9},
+ {0x7A67, 0xF2A6},{0x7A68, 0xF2A7},{0x7A69, 0xC3AD},{0x7A6B, 0xC3AC},{0x7A6C, 0xF4A3},{0x7A6D, 0xF4A4},{0x7A6E, 0xF4A2},{0x7A70, 0xF6F8},
+ {0x7A71, 0xF6F9},{0x7A74, 0xA5DE},{0x7A75, 0xCA48},{0x7A76, 0xA873},{0x7A78, 0xCDA5},{0x7A79, 0xAAC6},{0x7A7A, 0xAAC5},{0x7A7B, 0xCDA6},
+ {0x7A7E, 0xD040},{0x7A7F, 0xACEF},{0x7A80, 0xCFFE},{0x7A81, 0xACF0},{0x7A84, 0xAFB6},{0x7A85, 0xD2F8},{0x7A86, 0xD2F6},{0x7A87, 0xD2FC},
+ {0x7A88, 0xAFB7},{0x7A89, 0xD2F7},{0x7A8A, 0xD2FB},{0x7A8B, 0xD2F9},{0x7A8C, 0xD2FA},{0x7A8F, 0xD6C8},{0x7A90, 0xD6CA},{0x7A92, 0xB2BF},
+ {0x7A94, 0xD6C9},{0x7A95, 0xB2C0},{0x7A96, 0xB5A2},{0x7A97, 0xB5A1},{0x7A98, 0xB57E},{0x7A99, 0xDADB},{0x7A9E, 0xDF44},{0x7A9F, 0xB85D},
+ {0x7AA0, 0xB85E},{0x7AA2, 0xDF43},{0x7AA3, 0xDF42},{0x7AA8, 0xE34A},{0x7AA9, 0xBADB},{0x7AAA, 0xBADA},{0x7AAB, 0xE34B},{0x7AAC, 0xE34C},
+ {0x7AAE, 0xBD61},{0x7AAF, 0xBD60},{0x7AB1, 0xEAB5},{0x7AB2, 0xE6D3},{0x7AB3, 0xE6D5},{0x7AB4, 0xE6D4},{0x7AB5, 0xEAB4},{0x7AB6, 0xEAB2},
+ {0x7AB7, 0xEAB6},{0x7AB8, 0xEAB3},{0x7ABA, 0xBF73},{0x7ABE, 0xEDB7},{0x7ABF, 0xC14B},{0x7AC0, 0xEDB8},{0x7AC1, 0xEDB9},{0x7AC4, 0xC2AB},
+ {0x7AC5, 0xC2AC},{0x7AC7, 0xC475},{0x7ACA, 0xC5D1},{0x7ACB, 0xA5DF},{0x7AD1, 0xD041},{0x7AD8, 0xD2FD},{0x7AD9, 0xAFB8},{0x7ADF, 0xB3BA},
+ {0x7AE0, 0xB3B9},{0x7AE3, 0xB5A4},{0x7AE4, 0xDADD},{0x7AE5, 0xB5A3},{0x7AE6, 0xDADC},{0x7AEB, 0xDF45},{0x7AED, 0xBADC},{0x7AEE, 0xE34D},
+ {0x7AEF, 0xBADD},{0x7AF6, 0xC476},{0x7AF7, 0xF4A5},{0x7AF9, 0xA6CB},{0x7AFA, 0xAAC7},{0x7AFB, 0xCDA7},{0x7AFD, 0xACF2},{0x7AFF, 0xACF1},
+ {0x7B00, 0xD042},{0x7B01, 0xD043},{0x7B04, 0xD340},{0x7B05, 0xD342},{0x7B06, 0xAFB9},{0x7B08, 0xD344},{0x7B09, 0xD347},{0x7B0A, 0xD345},
+ {0x7B0E, 0xD346},{0x7B0F, 0xD343},{0x7B10, 0xD2FE},{0x7B11, 0xAFBA},{0x7B12, 0xD348},{0x7B13, 0xD341},{0x7B18, 0xD6D3},{0x7B19, 0xB2C6},
+ {0x7B1A, 0xD6DC},{0x7B1B, 0xB2C3},{0x7B1D, 0xD6D5},{0x7B1E, 0xB2C7},{0x7B20, 0xB2C1},{0x7B22, 0xD6D0},{0x7B23, 0xD6DD},{0x7B24, 0xD6D1},
+ {0x7B25, 0xD6CE},{0x7B26, 0xB2C5},{0x7B28, 0xB2C2},{0x7B2A, 0xD6D4},{0x7B2B, 0xD6D7},{0x7B2C, 0xB2C4},{0x7B2D, 0xD6D8},{0x7B2E, 0xB2C8},
+ {0x7B2F, 0xD6D9},{0x7B30, 0xD6CF},{0x7B31, 0xD6D6},{0x7B32, 0xD6DA},{0x7B33, 0xD6D2},{0x7B34, 0xD6CD},{0x7B35, 0xD6CB},{0x7B38, 0xD6DB},
+ {0x7B3B, 0xDADF},{0x7B40, 0xDAE4},{0x7B44, 0xDAE0},{0x7B45, 0xDAE6},{0x7B46, 0xB5A7},{0x7B47, 0xD6CC},{0x7B48, 0xDAE1},{0x7B49, 0xB5A5},
+ {0x7B4A, 0xDADE},{0x7B4B, 0xB5AC},{0x7B4C, 0xDAE2},{0x7B4D, 0xB5AB},{0x7B4E, 0xDAE3},{0x7B4F, 0xB5AD},{0x7B50, 0xB5A8},{0x7B51, 0xB5AE},
+ {0x7B52, 0xB5A9},{0x7B54, 0xB5AA},{0x7B56, 0xB5A6},{0x7B58, 0xDAE5},{0x7B60, 0xB861},{0x7B61, 0xDF50},{0x7B63, 0xDF53},{0x7B64, 0xDF47},
+ {0x7B65, 0xDF4C},{0x7B66, 0xDF46},{0x7B67, 0xB863},{0x7B69, 0xDF4A},{0x7B6D, 0xDF48},{0x7B6E, 0xB862},{0x7B70, 0xDF4F},{0x7B71, 0xDF4E},
+ {0x7B72, 0xDF4B},{0x7B73, 0xDF4D},{0x7B74, 0xDF49},{0x7B75, 0xBAE1},{0x7B76, 0xDF52},{0x7B77, 0xB85F},{0x7B78, 0xDF51},{0x7B82, 0xE35D},
+ {0x7B84, 0xBAE8},{0x7B85, 0xE358},{0x7B87, 0xBAE7},{0x7B88, 0xE34E},{0x7B8A, 0xE350},{0x7B8B, 0xBAE0},{0x7B8C, 0xE355},{0x7B8D, 0xE354},
+ {0x7B8E, 0xE357},{0x7B8F, 0xBAE5},{0x7B90, 0xE352},{0x7B91, 0xE351},{0x7B94, 0xBAE4},{0x7B95, 0xBADF},{0x7B96, 0xE353},{0x7B97, 0xBAE2},
+ {0x7B98, 0xE359},{0x7B99, 0xE35B},{0x7B9B, 0xE356},{0x7B9C, 0xE34F},{0x7B9D, 0xBAE3},{0x7BA0, 0xBD69},{0x7BA1, 0xBADE},{0x7BA4, 0xE35C},
+ {0x7BAC, 0xE6D9},{0x7BAD, 0xBD62},{0x7BAF, 0xE6DB},{0x7BB1, 0xBD63},{0x7BB4, 0xBD65},{0x7BB5, 0xE6DE},{0x7BB7, 0xE6D6},{0x7BB8, 0xBAE6},
+ {0x7BB9, 0xE6DC},{0x7BBE, 0xE6D8},{0x7BC0, 0xB860},{0x7BC1, 0xBD68},{0x7BC4, 0xBD64},{0x7BC6, 0xBD66},{0x7BC7, 0xBD67},{0x7BC9, 0xBF76},
+ {0x7BCA, 0xE6DD},{0x7BCB, 0xE6D7},{0x7BCC, 0xBD6A},{0x7BCE, 0xE6DA},{0x7BD4, 0xEAC0},{0x7BD5, 0xEABB},{0x7BD8, 0xEAC5},{0x7BD9, 0xBF74},
+ {0x7BDA, 0xEABD},{0x7BDB, 0xBF78},{0x7BDC, 0xEAC3},{0x7BDD, 0xEABA},{0x7BDE, 0xEAB7},{0x7BDF, 0xEAC6},{0x7BE0, 0xC151},{0x7BE1, 0xBF79},
+ {0x7BE2, 0xEAC2},{0x7BE3, 0xEAB8},{0x7BE4, 0xBF77},{0x7BE5, 0xEABC},{0x7BE6, 0xBF7B},{0x7BE7, 0xEAB9},{0x7BE8, 0xEABE},{0x7BE9, 0xBF7A},
+ {0x7BEA, 0xEAC1},{0x7BEB, 0xEAC4},{0x7BF0, 0xEDCB},{0x7BF1, 0xEDCC},{0x7BF2, 0xEDBC},{0x7BF3, 0xEDC3},{0x7BF4, 0xEDC1},{0x7BF7, 0xC14F},
+ {0x7BF8, 0xEDC8},{0x7BF9, 0xEABF},{0x7BFB, 0xEDBF},{0x7BFD, 0xEDC9},{0x7BFE, 0xC14E},{0x7BFF, 0xEDBE},{0x7C00, 0xEDBD},{0x7C01, 0xEDC7},
+ {0x7C02, 0xEDC4},{0x7C03, 0xEDC6},{0x7C05, 0xEDBA},{0x7C06, 0xEDCA},{0x7C07, 0xC14C},{0x7C09, 0xEDC5},{0x7C0A, 0xEDCE},{0x7C0B, 0xEDC2},
+ {0x7C0C, 0xC150},{0x7C0D, 0xC14D},{0x7C0E, 0xEDC0},{0x7C0F, 0xEDBB},{0x7C10, 0xEDCD},{0x7C11, 0xBF75},{0x7C19, 0xF063},{0x7C1C, 0xF061},
+ {0x7C1D, 0xF067},{0x7C1E, 0xC2B0},{0x7C1F, 0xF065},{0x7C20, 0xF064},{0x7C21, 0xC2B2},{0x7C22, 0xF06A},{0x7C23, 0xC2B1},{0x7C25, 0xF06B},
+ {0x7C26, 0xF068},{0x7C27, 0xC2AE},{0x7C28, 0xF069},{0x7C29, 0xF062},{0x7C2A, 0xC2AF},{0x7C2B, 0xC2AD},{0x7C2C, 0xF2AB},{0x7C2D, 0xF066},
+ {0x7C30, 0xF06C},{0x7C33, 0xF2A8},{0x7C37, 0xC3B2},{0x7C38, 0xC3B0},{0x7C39, 0xF2AA},{0x7C3B, 0xF2AC},{0x7C3C, 0xF2A9},{0x7C3D, 0xC3B1},
+ {0x7C3E, 0xC3AE},{0x7C3F, 0xC3AF},{0x7C40, 0xC3B3},{0x7C43, 0xC478},{0x7C45, 0xF4AA},{0x7C47, 0xF4A9},{0x7C48, 0xF4A7},{0x7C49, 0xF4A6},
+ {0x7C4A, 0xF4A8},{0x7C4C, 0xC477},{0x7C4D, 0xC479},{0x7C50, 0xC4F0},{0x7C53, 0xF5E5},{0x7C54, 0xF5E4},{0x7C57, 0xF6FA},{0x7C59, 0xF6FC},
+ {0x7C5A, 0xF6FE},{0x7C5B, 0xF6FD},{0x7C5C, 0xF6FB},{0x7C5F, 0xC5A3},{0x7C60, 0xC5A2},{0x7C63, 0xC5D3},{0x7C64, 0xC5D2},{0x7C65, 0xC5D4},
+ {0x7C66, 0xF7ED},{0x7C67, 0xF7EC},{0x7C69, 0xF8FB},{0x7C6A, 0xF8B8},{0x7C6B, 0xF8FC},{0x7C6C, 0xC658},{0x7C6E, 0xC659},{0x7C6F, 0xF96D},
+ {0x7C72, 0xC67E},{0x7C73, 0xA6CC},{0x7C75, 0xCDA8},{0x7C78, 0xD045},{0x7C79, 0xD046},{0x7C7A, 0xD044},{0x7C7D, 0xACF3},{0x7C7F, 0xD047},
+ {0x7C80, 0xD048},{0x7C81, 0xD049},{0x7C84, 0xD349},{0x7C85, 0xD34F},{0x7C88, 0xD34D},{0x7C89, 0xAFBB},{0x7C8A, 0xD34B},{0x7C8C, 0xD34C},
+ {0x7C8D, 0xD34E},{0x7C91, 0xD34A},{0x7C92, 0xB2C9},{0x7C94, 0xD6DE},{0x7C95, 0xB2CB},{0x7C96, 0xD6E0},{0x7C97, 0xB2CA},{0x7C98, 0xD6DF},
+ {0x7C9E, 0xDAE8},{0x7C9F, 0xB5AF},{0x7CA1, 0xDAEA},{0x7CA2, 0xDAE7},{0x7CA3, 0xD6E1},{0x7CA5, 0xB5B0},{0x7CA8, 0xDAE9},{0x7CAF, 0xDF56},
+ {0x7CB1, 0xB864},{0x7CB2, 0xDF54},{0x7CB3, 0xB865},{0x7CB4, 0xDF55},{0x7CB5, 0xB866},{0x7CB9, 0xBAE9},{0x7CBA, 0xE361},{0x7CBB, 0xE35E},
+ {0x7CBC, 0xE360},{0x7CBD, 0xBAEA},{0x7CBE, 0xBAEB},{0x7CBF, 0xE35F},{0x7CC5, 0xE6DF},{0x7CC8, 0xE6E0},{0x7CCA, 0xBD6B},{0x7CCB, 0xE6E2},
+ {0x7CCC, 0xE6E1},{0x7CCE, 0xA261},{0x7CD0, 0xEACA},{0x7CD1, 0xEACB},{0x7CD2, 0xEAC7},{0x7CD4, 0xEAC8},{0x7CD5, 0xBF7C},{0x7CD6, 0xBF7D},
+ {0x7CD7, 0xEAC9},{0x7CD9, 0xC157},{0x7CDC, 0xC153},{0x7CDD, 0xC158},{0x7CDE, 0xC154},{0x7CDF, 0xC156},{0x7CE0, 0xC152},{0x7CE2, 0xC155},
+ {0x7CE7, 0xC2B3},{0x7CE8, 0xEDCF},{0x7CEA, 0xF2AE},{0x7CEC, 0xF2AD},{0x7CEE, 0xF4AB},{0x7CEF, 0xC47A},{0x7CF0, 0xC47B},{0x7CF1, 0xF741},
+ {0x7CF2, 0xF5E6},{0x7CF4, 0xF740},{0x7CF6, 0xF8FD},{0x7CF7, 0xF9A4},{0x7CF8, 0xA6CD},{0x7CFB, 0xA874},{0x7CFD, 0xCDA9},{0x7CFE, 0xAAC8},
+ {0x7D00, 0xACF6},{0x7D01, 0xD04C},{0x7D02, 0xACF4},{0x7D03, 0xD04A},{0x7D04, 0xACF9},{0x7D05, 0xACF5},{0x7D06, 0xACFA},{0x7D07, 0xACF8},
+ {0x7D08, 0xD04B},{0x7D09, 0xACF7},{0x7D0A, 0xAFBF},{0x7D0B, 0xAFBE},{0x7D0C, 0xD35A},{0x7D0D, 0xAFC7},{0x7D0E, 0xD353},{0x7D0F, 0xD359},
+ {0x7D10, 0xAFC3},{0x7D11, 0xD352},{0x7D12, 0xD358},{0x7D13, 0xD356},{0x7D14, 0xAFC2},{0x7D15, 0xAFC4},{0x7D16, 0xD355},{0x7D17, 0xAFBD},
+ {0x7D18, 0xD354},{0x7D19, 0xAFC8},{0x7D1A, 0xAFC5},{0x7D1B, 0xAFC9},{0x7D1C, 0xAFC6},{0x7D1D, 0xD351},{0x7D1E, 0xD350},{0x7D1F, 0xD357},
+ {0x7D20, 0xAFC0},{0x7D21, 0xAFBC},{0x7D22, 0xAFC1},{0x7D28, 0xD6F0},{0x7D29, 0xD6E9},{0x7D2B, 0xB5B5},{0x7D2C, 0xD6E8},{0x7D2E, 0xB2CF},
+ {0x7D2F, 0xB2D6},{0x7D30, 0xB2D3},{0x7D31, 0xB2D9},{0x7D32, 0xB2D8},{0x7D33, 0xB2D4},{0x7D35, 0xD6E2},{0x7D36, 0xD6E5},{0x7D38, 0xD6E4},
+ {0x7D39, 0xB2D0},{0x7D3A, 0xD6E6},{0x7D3B, 0xD6EF},{0x7D3C, 0xB2D1},{0x7D3D, 0xD6E3},{0x7D3E, 0xD6EC},{0x7D3F, 0xD6ED},{0x7D40, 0xB2D2},
+ {0x7D41, 0xD6EA},{0x7D42, 0xB2D7},{0x7D43, 0xB2CD},{0x7D44, 0xB2D5},{0x7D45, 0xD6E7},{0x7D46, 0xB2CC},{0x7D47, 0xD6EB},{0x7D4A, 0xD6EE},
+ {0x7D4E, 0xDAFB},{0x7D4F, 0xDAF2},{0x7D50, 0xB5B2},{0x7D51, 0xDAF9},{0x7D52, 0xDAF6},{0x7D53, 0xDAEE},{0x7D54, 0xDAF7},{0x7D55, 0xB5B4},
+ {0x7D56, 0xDAEF},{0x7D58, 0xDAEB},{0x7D5B, 0xB86C},{0x7D5C, 0xDAF4},{0x7D5E, 0xB5B1},{0x7D5F, 0xDAFA},{0x7D61, 0xB5B8},{0x7D62, 0xB5BA},
+ {0x7D63, 0xDAED},{0x7D66, 0xB5B9},{0x7D67, 0xDAF0},{0x7D68, 0xB5B3},{0x7D69, 0xDAF8},{0x7D6A, 0xDAF1},{0x7D6B, 0xDAF5},{0x7D6D, 0xDAF3},
+ {0x7D6E, 0xB5B6},{0x7D6F, 0xDAEC},{0x7D70, 0xB5BB},{0x7D71, 0xB2CE},{0x7D72, 0xB5B7},{0x7D73, 0xB5BC},{0x7D79, 0xB868},{0x7D7A, 0xDF5D},
+ {0x7D7B, 0xDF5F},{0x7D7C, 0xDF61},{0x7D7D, 0xDF65},{0x7D7F, 0xDF5B},{0x7D80, 0xDF59},{0x7D81, 0xB86A},{0x7D83, 0xDF60},{0x7D84, 0xDF64},
+ {0x7D85, 0xDF5C},{0x7D86, 0xDF58},{0x7D88, 0xDF57},{0x7D8C, 0xDF62},{0x7D8D, 0xDF5A},{0x7D8E, 0xDF5E},{0x7D8F, 0xB86B},{0x7D91, 0xB869},
+ {0x7D92, 0xDF66},{0x7D93, 0xB867},{0x7D94, 0xDF63},{0x7D96, 0xE372},{0x7D9C, 0xBAEE},{0x7D9D, 0xE36A},{0x7D9E, 0xBD78},{0x7D9F, 0xE374},
+ {0x7DA0, 0xBAF1},{0x7DA1, 0xE378},{0x7DA2, 0xBAF7},{0x7DA3, 0xE365},{0x7DA6, 0xE375},{0x7DA7, 0xE362},{0x7DA9, 0xE377},{0x7DAA, 0xE366},
+ {0x7DAC, 0xBAFE},{0x7DAD, 0xBAFB},{0x7DAE, 0xE376},{0x7DAF, 0xE370},{0x7DB0, 0xBAED},{0x7DB1, 0xBAF5},{0x7DB2, 0xBAF4},{0x7DB4, 0xBAF3},
+ {0x7DB5, 0xBAF9},{0x7DB7, 0xE363},{0x7DB8, 0xBAFA},{0x7DB9, 0xE371},{0x7DBA, 0xBAF6},{0x7DBB, 0xBAEC},{0x7DBC, 0xE373},{0x7DBD, 0xBAEF},
+ {0x7DBE, 0xBAF0},{0x7DBF, 0xBAF8},{0x7DC0, 0xE368},{0x7DC1, 0xE367},{0x7DC2, 0xE364},{0x7DC4, 0xE36C},{0x7DC5, 0xE369},{0x7DC6, 0xE36D},
+ {0x7DC7, 0xBAFD},{0x7DC9, 0xE379},{0x7DCA, 0xBAF2},{0x7DCB, 0xE36E},{0x7DCC, 0xE36F},{0x7DCE, 0xE36B},{0x7DD2, 0xBAFC},{0x7DD7, 0xE6E7},
+ {0x7DD8, 0xBD70},{0x7DD9, 0xBD79},{0x7DDA, 0xBD75},{0x7DDB, 0xE6E4},{0x7DDD, 0xBD72},{0x7DDE, 0xBD76},{0x7DDF, 0xE6F0},{0x7DE0, 0xBD6C},
+ {0x7DE1, 0xE6E8},{0x7DE3, 0xBD74},{0x7DE6, 0xE6EB},{0x7DE7, 0xE6E6},{0x7DE8, 0xBD73},{0x7DE9, 0xBD77},{0x7DEA, 0xE6E5},{0x7DEC, 0xBD71},
+ {0x7DEE, 0xE6EF},{0x7DEF, 0xBD6E},{0x7DF0, 0xE6EE},{0x7DF1, 0xE6ED},{0x7DF2, 0xBD7A},{0x7DF3, 0xE572},{0x7DF4, 0xBD6D},{0x7DF6, 0xE6EC},
+ {0x7DF7, 0xE6E3},{0x7DF9, 0xBD7B},{0x7DFA, 0xE6EA},{0x7DFB, 0xBD6F},{0x7E03, 0xE6E9},{0x7E08, 0xBFA2},{0x7E09, 0xBFA7},{0x7E0A, 0xBF7E},
+ {0x7E0B, 0xEAD8},{0x7E0C, 0xEACF},{0x7E0D, 0xEADB},{0x7E0E, 0xEAD3},{0x7E0F, 0xEAD9},{0x7E10, 0xBFA8},{0x7E11, 0xBFA1},{0x7E12, 0xEACC},
+ {0x7E13, 0xEAD2},{0x7E14, 0xEADC},{0x7E15, 0xEAD5},{0x7E16, 0xEADA},{0x7E17, 0xEACE},{0x7E1A, 0xEAD6},{0x7E1B, 0xBFA3},{0x7E1C, 0xEAD4},
+ {0x7E1D, 0xBFA6},{0x7E1E, 0xBFA5},{0x7E1F, 0xEAD0},{0x7E20, 0xEAD1},{0x7E21, 0xEACD},{0x7E22, 0xEAD7},{0x7E23, 0xBFA4},{0x7E24, 0xEADE},
+ {0x7E25, 0xEADD},{0x7E29, 0xEDDA},{0x7E2A, 0xEDD6},{0x7E2B, 0xC15F},{0x7E2D, 0xEDD0},{0x7E2E, 0xC159},{0x7E2F, 0xC169},{0x7E30, 0xEDDC},
+ {0x7E31, 0xC161},{0x7E32, 0xC15D},{0x7E33, 0xEDD3},{0x7E34, 0xC164},{0x7E35, 0xC167},{0x7E36, 0xEDDE},{0x7E37, 0xC15C},{0x7E38, 0xEDD5},
+ {0x7E39, 0xC165},{0x7E3A, 0xEDE0},{0x7E3B, 0xEDDD},{0x7E3C, 0xEDD1},{0x7E3D, 0xC160},{0x7E3E, 0xC15A},{0x7E3F, 0xC168},{0x7E40, 0xEDD8},
+ {0x7E41, 0xC163},{0x7E42, 0xEDD2},{0x7E43, 0xC15E},{0x7E44, 0xEDDF},{0x7E45, 0xC162},{0x7E46, 0xC15B},{0x7E47, 0xEDD9},{0x7E48, 0xC166},
+ {0x7E49, 0xEDD7},{0x7E4C, 0xEDDB},{0x7E50, 0xF06E},{0x7E51, 0xF074},{0x7E52, 0xC2B9},{0x7E53, 0xF077},{0x7E54, 0xC2B4},{0x7E55, 0xC2B5},
+ {0x7E56, 0xF06F},{0x7E57, 0xF076},{0x7E58, 0xF071},{0x7E59, 0xC2BA},{0x7E5A, 0xC2B7},{0x7E5C, 0xF06D},{0x7E5E, 0xC2B6},{0x7E5F, 0xF073},
+ {0x7E60, 0xF075},{0x7E61, 0xC2B8},{0x7E62, 0xF072},{0x7E63, 0xF070},{0x7E68, 0xF2B8},{0x7E69, 0xC3B7},{0x7E6A, 0xC3B8},{0x7E6B, 0xC3B4},
+ {0x7E6D, 0xC3B5},{0x7E6F, 0xF2B4},{0x7E70, 0xF2B2},{0x7E72, 0xF2B6},{0x7E73, 0xC3BA},{0x7E74, 0xF2B7},{0x7E75, 0xF2B0},{0x7E76, 0xF2AF},
+ {0x7E77, 0xF2B3},{0x7E78, 0xF2B1},{0x7E79, 0xC3B6},{0x7E7A, 0xF2B5},{0x7E7B, 0xF4AC},{0x7E7C, 0xC47E},{0x7E7D, 0xC47D},{0x7E7E, 0xF4AD},
+ {0x7E80, 0xF4AF},{0x7E81, 0xF4AE},{0x7E82, 0xC4A1},{0x7E86, 0xF5EB},{0x7E87, 0xF5E8},{0x7E88, 0xF5E9},{0x7E8A, 0xF5E7},{0x7E8B, 0xF5EA},
+ {0x7E8C, 0xC4F2},{0x7E8D, 0xF5EC},{0x7E8F, 0xC4F1},{0x7E91, 0xF742},{0x7E93, 0xC5D5},{0x7E94, 0xC5D7},{0x7E95, 0xF7EE},{0x7E96, 0xC5D6},
+ {0x7E97, 0xF8B9},{0x7E98, 0xF940},{0x7E99, 0xF942},{0x7E9A, 0xF8FE},{0x7E9B, 0xF941},{0x7E9C, 0xC66C},{0x7F36, 0xA6CE},{0x7F38, 0xACFB},
+ {0x7F39, 0xD26F},{0x7F3A, 0xAFCA},{0x7F3D, 0xB2DA},{0x7F3E, 0xDAFC},{0x7F3F, 0xDAFD},{0x7F43, 0xEADF},{0x7F44, 0xC16A},{0x7F45, 0xEDE1},
+ {0x7F48, 0xC2BB},{0x7F4A, 0xF2BA},{0x7F4B, 0xF2B9},{0x7F4C, 0xC4A2},{0x7F4D, 0xF5ED},{0x7F4F, 0xF743},{0x7F50, 0xC5F8},{0x7F51, 0xCA49},
+ {0x7F54, 0xAAC9},{0x7F55, 0xA875},{0x7F58, 0xD04D},{0x7F5B, 0xD360},{0x7F5C, 0xD35B},{0x7F5D, 0xD35F},{0x7F5E, 0xD35D},{0x7F5F, 0xAFCB},
+ {0x7F60, 0xD35E},{0x7F61, 0xD35C},{0x7F63, 0xD6F1},{0x7F65, 0xDAFE},{0x7F66, 0xDB40},{0x7F67, 0xDF69},{0x7F68, 0xDF6A},{0x7F69, 0xB86E},
+ {0x7F6A, 0xB86F},{0x7F6B, 0xDF68},{0x7F6C, 0xDF6B},{0x7F6D, 0xDF67},{0x7F6E, 0xB86D},{0x7F70, 0xBB40},{0x7F72, 0xB870},{0x7F73, 0xE37A},
+ {0x7F75, 0xBD7C},{0x7F76, 0xE6F1},{0x7F77, 0xBD7D},{0x7F79, 0xBFA9},{0x7F7A, 0xEAE2},{0x7F7B, 0xEAE0},{0x7F7C, 0xEAE1},{0x7F7D, 0xEDE4},
+ {0x7F7E, 0xEDE3},{0x7F7F, 0xEDE2},{0x7F83, 0xF2BB},{0x7F85, 0xC3B9},{0x7F86, 0xF2BC},{0x7F87, 0xF744},{0x7F88, 0xC5F9},{0x7F89, 0xF8BA},
+ {0x7F8A, 0xA6CF},{0x7F8B, 0xAACB},{0x7F8C, 0xAACA},{0x7F8D, 0xD04F},{0x7F8E, 0xACFC},{0x7F91, 0xD04E},{0x7F92, 0xD362},{0x7F94, 0xAFCC},
+ {0x7F95, 0xD6F2},{0x7F96, 0xD361},{0x7F9A, 0xB2DC},{0x7F9B, 0xD6F5},{0x7F9C, 0xD6F3},{0x7F9D, 0xD6F4},{0x7F9E, 0xB2DB},{0x7FA0, 0xDB42},
+ {0x7FA1, 0xDB43},{0x7FA2, 0xDB41},{0x7FA4, 0xB873},{0x7FA5, 0xDF6D},{0x7FA6, 0xDF6C},{0x7FA7, 0xDF6E},{0x7FA8, 0xB872},{0x7FA9, 0xB871},
+ {0x7FAC, 0xE6F2},{0x7FAD, 0xE6F4},{0x7FAF, 0xBD7E},{0x7FB0, 0xE6F3},{0x7FB1, 0xEAE3},{0x7FB2, 0xBFAA},{0x7FB3, 0xF079},{0x7FB5, 0xF078},
+ {0x7FB6, 0xC3BB},{0x7FB7, 0xF2BD},{0x7FB8, 0xC3BD},{0x7FB9, 0xC3BC},{0x7FBA, 0xF4B0},{0x7FBB, 0xF5EE},{0x7FBC, 0xC4F3},{0x7FBD, 0xA6D0},
+ {0x7FBE, 0xD050},{0x7FBF, 0xACFD},{0x7FC0, 0xD365},{0x7FC1, 0xAFCE},{0x7FC2, 0xD364},{0x7FC3, 0xD363},{0x7FC5, 0xAFCD},{0x7FC7, 0xD6FB},
+ {0x7FC9, 0xD6FD},{0x7FCA, 0xD6F6},{0x7FCB, 0xD6F7},{0x7FCC, 0xB2DD},{0x7FCD, 0xD6F8},{0x7FCE, 0xB2DE},{0x7FCF, 0xD6FC},{0x7FD0, 0xD6F9},
+ {0x7FD1, 0xD6FA},{0x7FD2, 0xB2DF},{0x7FD4, 0xB5BE},{0x7FD5, 0xB5BF},{0x7FD7, 0xDB44},{0x7FDB, 0xDF6F},{0x7FDC, 0xDF70},{0x7FDE, 0xE37E},
+ {0x7FDF, 0xBB43},{0x7FE0, 0xBB41},{0x7FE1, 0xBB42},{0x7FE2, 0xE37B},{0x7FE3, 0xE37C},{0x7FE5, 0xE37D},{0x7FE6, 0xE6F9},{0x7FE8, 0xE6FA},
+ {0x7FE9, 0xBDA1},{0x7FEA, 0xE6F7},{0x7FEB, 0xE6F6},{0x7FEC, 0xE6F8},{0x7FED, 0xE6F5},{0x7FEE, 0xBFAD},{0x7FEF, 0xEAE4},{0x7FF0, 0xBFAB},
+ {0x7FF1, 0xBFAC},{0x7FF2, 0xEDE6},{0x7FF3, 0xC16B},{0x7FF4, 0xEDE5},{0x7FF5, 0xEFA8},{0x7FF7, 0xF07A},{0x7FF8, 0xF07B},{0x7FF9, 0xC2BC},
+ {0x7FFB, 0xC2BD},{0x7FFC, 0xC16C},{0x7FFD, 0xF2BE},{0x7FFE, 0xF2BF},{0x7FFF, 0xF4B1},{0x8000, 0xC4A3},{0x8001, 0xA6D1},{0x8003, 0xA6D2},
+ {0x8004, 0xACFE},{0x8005, 0xAACC},{0x8006, 0xAFCF},{0x8007, 0xD051},{0x800B, 0xB5C0},{0x800C, 0xA6D3},{0x800D, 0xAD41},{0x800E, 0xD052},
+ {0x800F, 0xD053},{0x8010, 0xAD40},{0x8011, 0xAD42},{0x8012, 0xA6D4},{0x8014, 0xD054},{0x8015, 0xAFD1},{0x8016, 0xD366},{0x8017, 0xAFD3},
+ {0x8018, 0xAFD0},{0x8019, 0xAFD2},{0x801B, 0xD741},{0x801C, 0xB2E0},{0x801E, 0xD740},{0x801F, 0xD6FE},{0x8021, 0xDF71},{0x8024, 0xE3A1},
+ {0x8026, 0xBDA2},{0x8028, 0xBFAE},{0x8029, 0xEAE6},{0x802A, 0xEAE5},{0x802C, 0xEDE7},{0x8030, 0xF5EF},{0x8033, 0xA6D5},{0x8034, 0xCB73},
+ {0x8035, 0xCDAA},{0x8036, 0xAD43},{0x8037, 0xD055},{0x8039, 0xD368},{0x803D, 0xAFD4},{0x803E, 0xD367},{0x803F, 0xAFD5},{0x8043, 0xD743},
+ {0x8046, 0xB2E2},{0x8047, 0xD742},{0x8048, 0xD744},{0x804A, 0xB2E1},{0x804F, 0xDB46},{0x8050, 0xDB47},{0x8051, 0xDB45},{0x8052, 0xB5C1},
+ {0x8056, 0xB874},{0x8058, 0xB875},{0x805A, 0xBB45},{0x805C, 0xE3A3},{0x805D, 0xE3A2},{0x805E, 0xBB44},{0x8064, 0xE6FB},{0x8067, 0xE6FC},
+ {0x806C, 0xEAE7},{0x806F, 0xC170},{0x8070, 0xC16F},{0x8071, 0xC16D},{0x8072, 0xC16E},{0x8073, 0xC171},{0x8075, 0xF07C},{0x8076, 0xC2BF},
+ {0x8077, 0xC2BE},{0x8078, 0xF2C0},{0x8079, 0xF4B2},{0x807D, 0xC5A5},{0x807E, 0xC5A4},{0x807F, 0xA6D6},{0x8082, 0xD1FB},{0x8084, 0xB877},
+ {0x8085, 0xB5C2},{0x8086, 0xB876},{0x8087, 0xBB46},{0x8089, 0xA6D7},{0x808A, 0xC9A9},{0x808B, 0xA6D8},{0x808C, 0xA6D9},{0x808F, 0xCDAB},
+ {0x8090, 0xCB76},{0x8092, 0xCB77},{0x8093, 0xA877},{0x8095, 0xCB74},{0x8096, 0xA876},{0x8098, 0xA879},{0x8099, 0xCB75},{0x809A, 0xA87B},
+ {0x809B, 0xA87A},{0x809C, 0xCB78},{0x809D, 0xA878},{0x80A1, 0xAAD1},{0x80A2, 0xAACF},{0x80A3, 0xCDAD},{0x80A5, 0xAACE},{0x80A9, 0xAAD3},
+ {0x80AA, 0xAAD5},{0x80AB, 0xAAD2},{0x80AD, 0xCDB0},{0x80AE, 0xCDAC},{0x80AF, 0xAAD6},{0x80B1, 0xAAD0},{0x80B2, 0xA87C},{0x80B4, 0xAAD4},
+ {0x80B5, 0xCDAF},{0x80B8, 0xCDAE},{0x80BA, 0xAACD},{0x80C2, 0xD05B},{0x80C3, 0xAD47},{0x80C4, 0xAD48},{0x80C5, 0xD05D},{0x80C7, 0xD057},
+ {0x80C8, 0xD05A},{0x80C9, 0xD063},{0x80CA, 0xD061},{0x80CC, 0xAD49},{0x80CD, 0xD067},{0x80CE, 0xAD4C},{0x80CF, 0xD064},{0x80D0, 0xD05C},
+ {0x80D1, 0xD059},{0x80D4, 0xDB49},{0x80D5, 0xD062},{0x80D6, 0xAD44},{0x80D7, 0xD065},{0x80D8, 0xD056},{0x80D9, 0xD05F},{0x80DA, 0xAD46},
+ {0x80DB, 0xAD4B},{0x80DC, 0xD060},{0x80DD, 0xAD4F},{0x80DE, 0xAD4D},{0x80E0, 0xD058},{0x80E1, 0xAD4A},{0x80E3, 0xD05E},{0x80E4, 0xAD4E},
+ {0x80E5, 0xAD45},{0x80E6, 0xD066},{0x80ED, 0xAFDA},{0x80EF, 0xAFE3},{0x80F0, 0xAFD8},{0x80F1, 0xAFD6},{0x80F2, 0xD36A},{0x80F3, 0xAFDE},
+ {0x80F4, 0xAFDB},{0x80F5, 0xD36C},{0x80F8, 0xAFDD},{0x80F9, 0xD36B},{0x80FA, 0xD369},{0x80FB, 0xD36E},{0x80FC, 0xAFE2},{0x80FD, 0xAFE0},
+ {0x80FE, 0xDB48},{0x8100, 0xD36F},{0x8101, 0xD36D},{0x8102, 0xAFD7},{0x8105, 0xAFD9},{0x8106, 0xAFDC},{0x8108, 0xAFDF},{0x810A, 0xAFE1},
+ {0x8115, 0xD74E},{0x8116, 0xB2E4},{0x8118, 0xD745},{0x8119, 0xD747},{0x811B, 0xD748},{0x811D, 0xD750},{0x811E, 0xD74C},{0x811F, 0xD74A},
+ {0x8121, 0xD74D},{0x8122, 0xD751},{0x8123, 0xB2E5},{0x8124, 0xB2E9},{0x8125, 0xD746},{0x8127, 0xD74F},{0x8129, 0xB2E7},{0x812B, 0xB2E6},
+ {0x812C, 0xD74B},{0x812D, 0xD749},{0x812F, 0xB2E3},{0x8130, 0xB2E8},{0x8139, 0xB5C8},{0x813A, 0xDB51},{0x813D, 0xDB4F},{0x813E, 0xB5CA},
+ {0x8143, 0xDB4A},{0x8144, 0xDFA1},{0x8146, 0xB5C9},{0x8147, 0xDB4E},{0x814A, 0xDB4B},{0x814B, 0xB5C5},{0x814C, 0xB5CB},{0x814D, 0xDB50},
+ {0x814E, 0xB5C7},{0x814F, 0xDB4D},{0x8150, 0xBB47},{0x8151, 0xB5C6},{0x8152, 0xDB4C},{0x8153, 0xB5CC},{0x8154, 0xB5C4},{0x8155, 0xB5C3},
+ {0x815B, 0xDF77},{0x815C, 0xDF75},{0x815E, 0xDF7B},{0x8160, 0xDF73},{0x8161, 0xDFA2},{0x8162, 0xDF78},{0x8164, 0xDF72},{0x8165, 0xB87B},
+ {0x8166, 0xB8A3},{0x8167, 0xDF7D},{0x8169, 0xDF76},{0x816B, 0xB87E},{0x816E, 0xB87C},{0x816F, 0xDF7E},{0x8170, 0xB879},{0x8171, 0xB878},
+ {0x8172, 0xDF79},{0x8173, 0xB87D},{0x8174, 0xB5CD},{0x8176, 0xDF7C},{0x8177, 0xDF74},{0x8178, 0xB87A},{0x8179, 0xB8A1},{0x817A, 0xB8A2},
+ {0x817F, 0xBB4C},{0x8180, 0xBB48},{0x8182, 0xBB4D},{0x8183, 0xE3A6},{0x8186, 0xE3A5},{0x8187, 0xE3A7},{0x8188, 0xBB4A},{0x8189, 0xE3A4},
+ {0x818A, 0xBB4B},{0x818B, 0xE3AA},{0x818C, 0xE3A9},{0x818D, 0xE3A8},{0x818F, 0xBB49},{0x8195, 0xE741},{0x8197, 0xE744},{0x8198, 0xBDA8},
+ {0x8199, 0xE743},{0x819A, 0xBDA7},{0x819B, 0xBDA3},{0x819C, 0xBDA4},{0x819D, 0xBDA5},{0x819E, 0xE740},{0x819F, 0xE6FE},{0x81A0, 0xBDA6},
+ {0x81A2, 0xE742},{0x81A3, 0xE6FD},{0x81A6, 0xEAE9},{0x81A7, 0xEAF3},{0x81A8, 0xBFB1},{0x81A9, 0xBFB0},{0x81AB, 0xEAED},{0x81AC, 0xEAEF},
+ {0x81AE, 0xEAEA},{0x81B0, 0xEAEE},{0x81B1, 0xEAE8},{0x81B2, 0xEAF1},{0x81B3, 0xBFAF},{0x81B4, 0xEAF0},{0x81B5, 0xEAEC},{0x81B7, 0xEAF2},
+ {0x81B9, 0xEAEB},{0x81BA, 0xC174},{0x81BB, 0xEDE8},{0x81BC, 0xEDEE},{0x81BD, 0xC178},{0x81BE, 0xC17A},{0x81BF, 0xC177},{0x81C0, 0xC176},
+ {0x81C2, 0xC175},{0x81C3, 0xC173},{0x81C4, 0xEDE9},{0x81C5, 0xEDEC},{0x81C6, 0xC172},{0x81C7, 0xEDED},{0x81C9, 0xC179},{0x81CA, 0xEDEB},
+ {0x81CC, 0xEDEA},{0x81CD, 0xC2C0},{0x81CF, 0xC2C1},{0x81D0, 0xF0A1},{0x81D1, 0xF07D},{0x81D2, 0xF07E},{0x81D5, 0xF2C2},{0x81D7, 0xF2C1},
+ {0x81D8, 0xC3BE},{0x81D9, 0xF4B4},{0x81DA, 0xC4A4},{0x81DB, 0xF4B3},{0x81DD, 0xF5F0},{0x81DE, 0xF745},{0x81DF, 0xC5A6},{0x81E0, 0xF943},
+ {0x81E1, 0xF944},{0x81E2, 0xC5D8},{0x81E3, 0xA6DA},{0x81E5, 0xAAD7},{0x81E6, 0xDB52},{0x81E7, 0xBB4E},{0x81E8, 0xC17B},{0x81E9, 0xEDEF},
+ {0x81EA, 0xA6DB},{0x81EC, 0xAFE5},{0x81ED, 0xAFE4},{0x81EE, 0xDB53},{0x81F2, 0xEAF4},{0x81F3, 0xA6DC},{0x81F4, 0xAD50},{0x81F7, 0xDB54},
+ {0x81F8, 0xDB55},{0x81F9, 0xDB56},{0x81FA, 0xBB4F},{0x81FB, 0xBFB2},{0x81FC, 0xA6DD},{0x81FE, 0xAAD8},{0x81FF, 0xD068},{0x8200, 0xAFE6},
+ {0x8201, 0xD370},{0x8202, 0xB2EA},{0x8204, 0xDB57},{0x8205, 0xB8A4},{0x8207, 0xBB50},{0x8208, 0xBFB3},{0x8209, 0xC17C},{0x820A, 0xC2C2},
+ {0x820B, 0xF4B5},{0x820C, 0xA6DE},{0x820D, 0xAAD9},{0x8210, 0xAFE7},{0x8211, 0xD752},{0x8212, 0xB5CE},{0x8214, 0xBB51},{0x8215, 0xE3AB},
+ {0x8216, 0xE745},{0x821B, 0xA6DF},{0x821C, 0xB5CF},{0x821D, 0xDFA3},{0x821E, 0xBB52},{0x821F, 0xA6E0},{0x8220, 0xCDB1},{0x8221, 0xD069},
+ {0x8222, 0xAD51},{0x8225, 0xD372},{0x8228, 0xAFEA},{0x822A, 0xAFE8},{0x822B, 0xAFE9},{0x822C, 0xAFEB},{0x822F, 0xD371},{0x8232, 0xD757},
+ {0x8233, 0xD754},{0x8234, 0xD756},{0x8235, 0xB2EB},{0x8236, 0xB2ED},{0x8237, 0xB2EC},{0x8238, 0xD753},{0x8239, 0xB2EE},{0x823A, 0xD755},
+ {0x823C, 0xDB58},{0x823D, 0xDB59},{0x823F, 0xDB5A},{0x8240, 0xDFA6},{0x8242, 0xDFA7},{0x8244, 0xDFA5},{0x8245, 0xDFA8},{0x8247, 0xB8A5},
+ {0x8249, 0xDFA4},{0x824B, 0xBB53},{0x824E, 0xE74A},{0x824F, 0xE746},{0x8250, 0xE749},{0x8251, 0xE74B},{0x8252, 0xE748},{0x8253, 0xE747},
+ {0x8255, 0xEAF5},{0x8256, 0xEAF6},{0x8257, 0xEAF7},{0x8258, 0xBFB4},{0x8259, 0xBFB5},{0x825A, 0xEDF1},{0x825B, 0xEDF0},{0x825C, 0xEDF2},
+ {0x825E, 0xF0A3},{0x825F, 0xF0A2},{0x8261, 0xF2C4},{0x8263, 0xF2C5},{0x8264, 0xF2C3},{0x8266, 0xC4A5},{0x8268, 0xF4B6},{0x8269, 0xF4B7},
+ {0x826B, 0xF746},{0x826C, 0xF7EF},{0x826D, 0xF8BB},{0x826E, 0xA6E1},{0x826F, 0xA87D},{0x8271, 0xC17D},{0x8272, 0xA6E2},{0x8274, 0xD758},
+ {0x8275, 0xDB5B},{0x8277, 0xC641},{0x8278, 0xCA4A},{0x827C, 0xCA4B},{0x827D, 0xCA4D},{0x827E, 0xA6E3},{0x827F, 0xCA4E},{0x8280, 0xCA4C},
+ {0x8283, 0xCBA2},{0x8284, 0xCBA3},{0x8285, 0xCB7B},{0x828A, 0xCBA1},{0x828B, 0xA8A1},{0x828D, 0xA8A2},{0x828E, 0xCB7C},{0x828F, 0xCB7A},
+ {0x8290, 0xCB79},{0x8291, 0xCB7D},{0x8292, 0xA87E},{0x8293, 0xCB7E},{0x8294, 0xD06A},{0x8298, 0xCDB6},{0x8299, 0xAADC},{0x829A, 0xCDB5},
+ {0x829B, 0xCDB7},{0x829D, 0xAADB},{0x829E, 0xCDBC},{0x829F, 0xAADF},{0x82A0, 0xCDB2},{0x82A1, 0xCDC0},{0x82A2, 0xCDC6},{0x82A3, 0xAAE6},
+ {0x82A4, 0xCDC3},{0x82A5, 0xAAE3},{0x82A7, 0xCDB9},{0x82A8, 0xCDBF},{0x82A9, 0xCDC1},{0x82AB, 0xCDB4},{0x82AC, 0xAAE2},{0x82AD, 0xAADD},
+ {0x82AE, 0xCDBA},{0x82AF, 0xAAE4},{0x82B0, 0xAAE7},{0x82B1, 0xAAE1},{0x82B3, 0xAADA},{0x82B4, 0xCDBE},{0x82B5, 0xCDB8},{0x82B6, 0xCDC5},
+ {0x82B7, 0xAAE9},{0x82B8, 0xAAE5},{0x82B9, 0xAAE0},{0x82BA, 0xCDBD},{0x82BB, 0xAFEC},{0x82BC, 0xCDBB},{0x82BD, 0xAADE},{0x82BE, 0xAAE8},
+ {0x82C0, 0xCDB3},{0x82C2, 0xCDC2},{0x82C3, 0xCDC4},{0x82D1, 0xAD62},{0x82D2, 0xAD5C},{0x82D3, 0xAD64},{0x82D4, 0xAD61},{0x82D5, 0xD071},
+ {0x82D6, 0xD074},{0x82D7, 0xAD5D},{0x82D9, 0xD06B},{0x82DB, 0xAD56},{0x82DC, 0xAD60},{0x82DE, 0xAD63},{0x82DF, 0xAD65},{0x82E0, 0xD0A2},
+ {0x82E1, 0xD077},{0x82E3, 0xAD55},{0x82E4, 0xD0A1},{0x82E5, 0xAD59},{0x82E6, 0xAD57},{0x82E7, 0xAD52},{0x82E8, 0xD06F},{0x82EA, 0xD07E},
+ {0x82EB, 0xD073},{0x82EC, 0xD076},{0x82ED, 0xD0A5},{0x82EF, 0xAD66},{0x82F0, 0xD07D},{0x82F1, 0xAD5E},{0x82F2, 0xD078},{0x82F3, 0xD0A4},
+ {0x82F4, 0xD075},{0x82F5, 0xD079},{0x82F6, 0xD07C},{0x82F9, 0xD06D},{0x82FA, 0xD0A3},{0x82FB, 0xD07B},{0x82FE, 0xD06C},{0x8300, 0xD070},
+ {0x8301, 0xAD5F},{0x8302, 0xAD5A},{0x8303, 0xAD53},{0x8304, 0xAD58},{0x8305, 0xAD54},{0x8306, 0xAD67},{0x8307, 0xD06E},{0x8308, 0xD3A5},
+ {0x8309, 0xAD5B},{0x830C, 0xD07A},{0x830D, 0xCE41},{0x8316, 0xD3A8},{0x8317, 0xAFFA},{0x8319, 0xD376},{0x831B, 0xD3A3},{0x831C, 0xD37D},
+ {0x831E, 0xD3B2},{0x8320, 0xD3AA},{0x8322, 0xD37E},{0x8324, 0xD3A9},{0x8325, 0xD378},{0x8326, 0xD37C},{0x8327, 0xD3B5},{0x8328, 0xAFFD},
+ {0x8329, 0xD3AD},{0x832A, 0xD3A4},{0x832B, 0xAFED},{0x832C, 0xD3B3},{0x832D, 0xD374},{0x832F, 0xD3AC},{0x8331, 0xAFFC},{0x8332, 0xAFF7},
+ {0x8333, 0xD373},{0x8334, 0xAFF5},{0x8335, 0xAFF4},{0x8336, 0xAFF9},{0x8337, 0xD3AB},{0x8338, 0xAFF1},{0x8339, 0xAFF8},{0x833A, 0xD072},
+ {0x833B, 0xDB5C},{0x833C, 0xD3A6},{0x833F, 0xD37A},{0x8340, 0xAFFB},{0x8341, 0xD37B},{0x8342, 0xD3A1},{0x8343, 0xAFFE},{0x8344, 0xD375},
+ {0x8345, 0xD3AF},{0x8347, 0xD3AE},{0x8348, 0xD3B6},{0x8349, 0xAFF3},{0x834A, 0xAFF0},{0x834B, 0xD3B4},{0x834C, 0xD3B0},{0x834D, 0xD3A7},
+ {0x834E, 0xD3A2},{0x834F, 0xAFF6},{0x8350, 0xAFF2},{0x8351, 0xD377},{0x8352, 0xAFEE},{0x8353, 0xD3B1},{0x8354, 0xAFEF},{0x8356, 0xD379},
+ {0x8373, 0xD75E},{0x8374, 0xD760},{0x8375, 0xD765},{0x8376, 0xD779},{0x8377, 0xB2FC},{0x8378, 0xB2F2},{0x837A, 0xD75D},{0x837B, 0xB2FD},
+ {0x837C, 0xB2FE},{0x837D, 0xD768},{0x837E, 0xD76F},{0x837F, 0xD775},{0x8381, 0xD762},{0x8383, 0xD769},{0x8386, 0xB340},{0x8387, 0xD777},
+ {0x8388, 0xD772},{0x8389, 0xB2FA},{0x838A, 0xB2F8},{0x838B, 0xD76E},{0x838C, 0xD76A},{0x838D, 0xD75C},{0x838E, 0xB2EF},{0x838F, 0xD761},
+ {0x8390, 0xD759},{0x8392, 0xB2F7},{0x8393, 0xB2F9},{0x8394, 0xD766},{0x8395, 0xD763},{0x8396, 0xB2F4},{0x8397, 0xD773},{0x8398, 0xB2F1},
+ {0x8399, 0xD764},{0x839A, 0xD77A},{0x839B, 0xD76C},{0x839D, 0xD76B},{0x839E, 0xB2F0},{0x83A0, 0xB2FB},{0x83A2, 0xB2F3},{0x83A3, 0xD75A},
+ {0x83A4, 0xD75F},{0x83A5, 0xD770},{0x83A6, 0xD776},{0x83A7, 0xB341},{0x83A8, 0xD75B},{0x83A9, 0xD767},{0x83AA, 0xD76D},{0x83AB, 0xB2F6},
+ {0x83AE, 0xD778},{0x83AF, 0xD771},{0x83B0, 0xD774},{0x83BD, 0xB2F5},{0x83BF, 0xDB6C},{0x83C0, 0xDB60},{0x83C1, 0xB5D7},{0x83C2, 0xDB7D},
+ {0x83C3, 0xDBA7},{0x83C4, 0xDBAA},{0x83C5, 0xB5D5},{0x83C6, 0xDB68},{0x83C7, 0xDBA3},{0x83C8, 0xDB69},{0x83C9, 0xDB77},{0x83CA, 0xB5E2},
+ {0x83CB, 0xDB73},{0x83CC, 0xB5DF},{0x83CE, 0xDB74},{0x83CF, 0xDB5D},{0x83D1, 0xDBA4},{0x83D4, 0xB5E8},{0x83D5, 0xDBA1},{0x83D6, 0xDB75},
+ {0x83D7, 0xDBAC},{0x83D8, 0xDB70},{0x83D9, 0xDFC8},{0x83DB, 0xDBAF},{0x83DC, 0xB5E6},{0x83DD, 0xDB6E},{0x83DE, 0xDB7A},{0x83DF, 0xB5E9},
+ {0x83E0, 0xB5D4},{0x83E1, 0xDB72},{0x83E2, 0xDBAD},{0x83E3, 0xDB6B},{0x83E4, 0xDB64},{0x83E5, 0xDB6F},{0x83E7, 0xDB63},{0x83E8, 0xDB61},
+ {0x83E9, 0xB5D0},{0x83EA, 0xDBA5},{0x83EB, 0xDB6A},{0x83EC, 0xDBA8},{0x83EE, 0xDBA9},{0x83EF, 0xB5D8},{0x83F0, 0xB5DD},{0x83F1, 0xB5D9},
+ {0x83F2, 0xB5E1},{0x83F3, 0xDB7E},{0x83F4, 0xB5DA},{0x83F5, 0xDB76},{0x83F6, 0xDB66},{0x83F8, 0xB5D2},{0x83F9, 0xDB5E},{0x83FA, 0xDBA2},
+ {0x83FB, 0xDBAB},{0x83FC, 0xDB65},{0x83FD, 0xB5E0},{0x83FE, 0xDBB0},{0x83FF, 0xDB71},{0x8401, 0xDB6D},{0x8403, 0xB5D1},{0x8404, 0xB5E5},
+ {0x8406, 0xDB7C},{0x8407, 0xB5E7},{0x8409, 0xDB78},{0x840A, 0xB5DC},{0x840B, 0xB5D6},{0x840C, 0xB5DE},{0x840D, 0xB5D3},{0x840E, 0xB5E4},
+ {0x840F, 0xDB79},{0x8410, 0xDB67},{0x8411, 0xDB7B},{0x8412, 0xDB62},{0x8413, 0xDBA6},{0x841B, 0xDBAE},{0x8423, 0xDB5F},{0x8429, 0xDFC7},
+ {0x842B, 0xDFDD},{0x842C, 0xB855},{0x842D, 0xDFCC},{0x842F, 0xDFCA},{0x8430, 0xDFB5},{0x8431, 0xB8A9},{0x8432, 0xDFC5},{0x8433, 0xDFD9},
+ {0x8434, 0xDFC1},{0x8435, 0xB8B1},{0x8436, 0xDFD8},{0x8437, 0xDFBF},{0x8438, 0xB5E3},{0x8439, 0xDFCF},{0x843A, 0xDFC0},{0x843B, 0xDFD6},
+ {0x843C, 0xB8B0},{0x843D, 0xB8A8},{0x843F, 0xDFAA},{0x8440, 0xDFB2},{0x8442, 0xDFCB},{0x8443, 0xDFC3},{0x8444, 0xDFDC},{0x8445, 0xDFC6},
+ {0x8446, 0xB8B6},{0x8447, 0xDFD7},{0x8449, 0xB8AD},{0x844B, 0xDFC9},{0x844C, 0xDFD1},{0x844D, 0xDFB6},{0x844E, 0xDFD0},{0x8450, 0xDFE1},
+ {0x8451, 0xDFB1},{0x8452, 0xDFD2},{0x8454, 0xDFDF},{0x8456, 0xDFAB},{0x8457, 0xB5DB},{0x8459, 0xDFB9},{0x845A, 0xDFB8},{0x845B, 0xB8AF},
+ {0x845D, 0xDFBC},{0x845E, 0xDFBE},{0x845F, 0xDFCD},{0x8460, 0xDFDE},{0x8461, 0xB8B2},{0x8463, 0xB8B3},{0x8465, 0xDFB0},{0x8466, 0xB8AB},
+ {0x8467, 0xDFB4},{0x8468, 0xDFDA},{0x8469, 0xB8B4},{0x846B, 0xB8AC},{0x846C, 0xB8AE},{0x846D, 0xB8B5},{0x846E, 0xDFE0},{0x846F, 0xDFD3},
+ {0x8470, 0xDFCE},{0x8473, 0xDFBB},{0x8474, 0xDFBA},{0x8475, 0xB8AA},{0x8476, 0xDFAC},{0x8477, 0xB8A7},{0x8478, 0xDFC4},{0x8479, 0xDFAD},
+ {0x847A, 0xDFC2},{0x847D, 0xDFB7},{0x847E, 0xDFDB},{0x8482, 0xB8A6},{0x8486, 0xDFB3},{0x848D, 0xDFAF},{0x848E, 0xDFD5},{0x848F, 0xDFAE},
+ {0x8490, 0xBB60},{0x8491, 0xE3D3},{0x8494, 0xE3C2},{0x8497, 0xE3AC},{0x8498, 0xE3CA},{0x8499, 0xBB58},{0x849A, 0xE3BB},{0x849B, 0xE3C5},
+ {0x849C, 0xBB5B},{0x849D, 0xE3BE},{0x849E, 0xBB59},{0x849F, 0xE3AF},{0x84A0, 0xE3CD},{0x84A1, 0xE3AE},{0x84A2, 0xE3C1},{0x84A4, 0xE3AD},
+ {0x84A7, 0xE3BF},{0x84A8, 0xE3C8},{0x84A9, 0xE3C6},{0x84AA, 0xE3BA},{0x84AB, 0xE3B5},{0x84AC, 0xE3B3},{0x84AE, 0xE3B4},{0x84AF, 0xE3C7},
+ {0x84B0, 0xE3D2},{0x84B1, 0xE3BC},{0x84B2, 0xBB5A},{0x84B4, 0xE3B7},{0x84B6, 0xE3CB},{0x84B8, 0xBB5D},{0x84B9, 0xE3B6},{0x84BA, 0xE3B0},
+ {0x84BB, 0xE3C0},{0x84BC, 0xBB61},{0x84BF, 0xBB55},{0x84C0, 0xBB5E},{0x84C1, 0xE3B8},{0x84C2, 0xE3B2},{0x84C4, 0xBB57},{0x84C5, 0xDFD4},
+ {0x84C6, 0xBB56},{0x84C7, 0xE3C3},{0x84C9, 0xBB54},{0x84CA, 0xBB63},{0x84CB, 0xBB5C},{0x84CC, 0xE3C4},{0x84CD, 0xE3B9},{0x84CE, 0xE3B1},
+ {0x84CF, 0xE3CC},{0x84D0, 0xE3BD},{0x84D1, 0xBB62},{0x84D2, 0xE3D0},{0x84D3, 0xBB5F},{0x84D4, 0xE3CF},{0x84D6, 0xE3C9},{0x84D7, 0xE3CE},
+ {0x84DB, 0xE3D1},{0x84E7, 0xE773},{0x84E8, 0xE774},{0x84E9, 0xE767},{0x84EA, 0xE766},{0x84EB, 0xE762},{0x84EC, 0xBDB4},{0x84EE, 0xBDAC},
+ {0x84EF, 0xE776},{0x84F0, 0xE775},{0x84F1, 0xDFA9},{0x84F2, 0xE75F},{0x84F3, 0xE763},{0x84F4, 0xE75D},{0x84F6, 0xE770},{0x84F7, 0xE761},
+ {0x84F9, 0xE777},{0x84FA, 0xE75A},{0x84FB, 0xE758},{0x84FC, 0xE764},{0x84FD, 0xE76E},{0x84FE, 0xE769},{0x84FF, 0xBDB6},{0x8500, 0xE74F},
+ {0x8502, 0xE76D},{0x8506, 0xBDB7},{0x8507, 0xDFBD},{0x8508, 0xE75B},{0x8509, 0xE752},{0x850A, 0xE755},{0x850B, 0xE77B},{0x850C, 0xE75C},
+ {0x850D, 0xE753},{0x850E, 0xE751},{0x850F, 0xE74E},{0x8511, 0xBDB0},{0x8512, 0xE765},{0x8513, 0xBDAF},{0x8514, 0xBDB3},{0x8515, 0xE760},
+ {0x8516, 0xE768},{0x8517, 0xBDA9},{0x8518, 0xE778},{0x8519, 0xE77C},{0x851A, 0xBDAB},{0x851C, 0xE757},{0x851D, 0xE76B},{0x851E, 0xE76F},
+ {0x851F, 0xE754},{0x8520, 0xE779},{0x8521, 0xBDB2},{0x8523, 0xBDB1},{0x8524, 0xE74C},{0x8525, 0xBDB5},{0x8526, 0xE772},{0x8527, 0xE756},
+ {0x8528, 0xE76A},{0x8529, 0xE750},{0x852A, 0xE75E},{0x852B, 0xE759},{0x852C, 0xBDAD},{0x852D, 0xBDAE},{0x852E, 0xE76C},{0x852F, 0xE77D},
+ {0x8530, 0xE77A},{0x8531, 0xE771},{0x853B, 0xE74D},{0x853D, 0xBDAA},{0x853E, 0xEB49},{0x8540, 0xEB40},{0x8541, 0xEB43},{0x8543, 0xBFBB},
+ {0x8544, 0xEB45},{0x8545, 0xEAF9},{0x8546, 0xEB41},{0x8547, 0xEB47},{0x8548, 0xBFB8},{0x8549, 0xBFBC},{0x854A, 0xBFB6},{0x854D, 0xEAFB},
+ {0x854E, 0xEB4C},{0x8551, 0xEB46},{0x8553, 0xEAFC},{0x8554, 0xEB55},{0x8555, 0xEB4F},{0x8556, 0xEAF8},{0x8557, 0xEE46},{0x8558, 0xEAFE},
+ {0x8559, 0xBFB7},{0x855B, 0xEB4A},{0x855D, 0xEB54},{0x855E, 0xBFBF},{0x8560, 0xEB51},{0x8561, 0xEAFD},{0x8562, 0xEB44},{0x8563, 0xEB48},
+ {0x8564, 0xEB42},{0x8565, 0xEB56},{0x8566, 0xEB53},{0x8567, 0xEB50},{0x8568, 0xBFB9},{0x8569, 0xBFBA},{0x856A, 0xBFBE},{0x856B, 0xEAFA},
+ {0x856C, 0xEB57},{0x856D, 0xBFBD},{0x856E, 0xEB4D},{0x8571, 0xEB4B},{0x8575, 0xEB4E},{0x8576, 0xEE53},{0x8577, 0xEE40},{0x8578, 0xEE45},
+ {0x8579, 0xEE52},{0x857A, 0xEE44},{0x857B, 0xEDFB},{0x857C, 0xEE41},{0x857E, 0xC1A2},{0x8580, 0xEDF4},{0x8581, 0xEE4D},{0x8582, 0xEE4F},
+ {0x8583, 0xEDF3},{0x8584, 0xC1A1},{0x8585, 0xEE51},{0x8586, 0xEE49},{0x8587, 0xC1A8},{0x8588, 0xEE50},{0x8589, 0xEE42},{0x858A, 0xC1AA},
+ {0x858B, 0xEDF9},{0x858C, 0xEB52},{0x858D, 0xEE4A},{0x858E, 0xEE47},{0x858F, 0xEDF5},{0x8590, 0xEE55},{0x8591, 0xC1A4},{0x8594, 0xC1A5},
+ {0x8595, 0xEDF7},{0x8596, 0xEE48},{0x8598, 0xEE54},{0x8599, 0xEE4B},{0x859A, 0xEDFD},{0x859B, 0xC1A7},{0x859C, 0xC1A3},{0x859D, 0xEE4C},
+ {0x859E, 0xEDFE},{0x859F, 0xEE56},{0x85A0, 0xEDF8},{0x85A1, 0xEE43},{0x85A2, 0xEE4E},{0x85A3, 0xEDFA},{0x85A4, 0xEDFC},{0x85A6, 0xC2CB},
+ {0x85A7, 0xEDF6},{0x85A8, 0xC1A9},{0x85A9, 0xC2C4},{0x85AA, 0xC17E},{0x85AF, 0xC1A6},{0x85B0, 0xC2C8},{0x85B1, 0xF0B3},{0x85B3, 0xF0A9},
+ {0x85B4, 0xF0A4},{0x85B5, 0xF0AA},{0x85B6, 0xF0B4},{0x85B7, 0xF0B8},{0x85B8, 0xF0B7},{0x85B9, 0xC2CA},{0x85BA, 0xC2C9},{0x85BD, 0xF0AB},
+ {0x85BE, 0xF0B9},{0x85BF, 0xF0AE},{0x85C0, 0xF0A6},{0x85C2, 0xF0A8},{0x85C3, 0xF0A7},{0x85C4, 0xF0AD},{0x85C5, 0xF0B2},{0x85C6, 0xF0A5},
+ {0x85C7, 0xF0AC},{0x85C8, 0xF0B1},{0x85C9, 0xC2C7},{0x85CB, 0xF0AF},{0x85CD, 0xC2C5},{0x85CE, 0xF0B0},{0x85CF, 0xC2C3},{0x85D0, 0xC2C6},
+ {0x85D1, 0xF2D5},{0x85D2, 0xF0B5},{0x85D5, 0xC3C2},{0x85D7, 0xF2CD},{0x85D8, 0xF2D1},{0x85D9, 0xF2C9},{0x85DA, 0xF2CC},{0x85DC, 0xF2D4},
+ {0x85DD, 0xC3C0},{0x85DE, 0xF2D9},{0x85DF, 0xF2D2},{0x85E1, 0xF2CA},{0x85E2, 0xF2DA},{0x85E3, 0xF2D3},{0x85E4, 0xC3C3},{0x85E5, 0xC3C4},
+ {0x85E6, 0xF2D7},{0x85E8, 0xF2CB},{0x85E9, 0xC3BF},{0x85EA, 0xC3C1},{0x85EB, 0xF2C6},{0x85EC, 0xF2CE},{0x85ED, 0xF2C8},{0x85EF, 0xF2D8},
+ {0x85F0, 0xF2D6},{0x85F1, 0xF2C7},{0x85F2, 0xF2CF},{0x85F6, 0xF4BE},{0x85F7, 0xC3C5},{0x85F8, 0xF2D0},{0x85F9, 0xC4A7},{0x85FA, 0xC4A9},
+ {0x85FB, 0xC4A6},{0x85FD, 0xF4C3},{0x85FE, 0xF4BB},{0x85FF, 0xF4B9},{0x8600, 0xF4BD},{0x8601, 0xF4BA},{0x8604, 0xF4BF},{0x8605, 0xF4C1},
+ {0x8606, 0xC4AA},{0x8607, 0xC4AC},{0x8609, 0xF4C0},{0x860A, 0xC4AD},{0x860B, 0xC4AB},{0x860C, 0xF4C2},{0x8611, 0xC4A8},{0x8617, 0xC4F4},
+ {0x8618, 0xF5F1},{0x8619, 0xF5F7},{0x861A, 0xC4F6},{0x861B, 0xF4BC},{0x861C, 0xF5F6},{0x861E, 0xF5FD},{0x861F, 0xF5F4},{0x8620, 0xF5FB},
+ {0x8621, 0xF5FA},{0x8622, 0xF4B8},{0x8623, 0xF5F5},{0x8624, 0xF0B6},{0x8625, 0xF5FE},{0x8626, 0xF5F3},{0x8627, 0xF5F8},{0x8629, 0xF5FC},
+ {0x862A, 0xF5F2},{0x862C, 0xF74A},{0x862D, 0xC4F5},{0x862E, 0xF5F9},{0x8631, 0xF7F4},{0x8632, 0xF74B},{0x8633, 0xF749},{0x8634, 0xF747},
+ {0x8635, 0xF748},{0x8636, 0xF74C},{0x8638, 0xC5D9},{0x8639, 0xF7F2},{0x863A, 0xF7F0},{0x863B, 0xF7F5},{0x863C, 0xF7F3},{0x863E, 0xF7F6},
+ {0x863F, 0xC5DA},{0x8640, 0xF7F1},{0x8643, 0xF8BC},{0x8646, 0xF945},{0x8647, 0xF946},{0x8648, 0xF947},{0x864B, 0xF9C7},{0x864C, 0xF9BD},
+ {0x864D, 0xCA4F},{0x864E, 0xAAEA},{0x8650, 0xAD68},{0x8652, 0xD3B8},{0x8653, 0xD3B7},{0x8654, 0xB040},{0x8655, 0xB342},{0x8656, 0xD77C},
+ {0x8659, 0xD77B},{0x865B, 0xB5EA},{0x865C, 0xB8B8},{0x865E, 0xB8B7},{0x865F, 0xB8B9},{0x8661, 0xE3D4},{0x8662, 0xE77E},{0x8663, 0xEB58},
+ {0x8664, 0xEB5A},{0x8665, 0xEB59},{0x8667, 0xC1AB},{0x8668, 0xEE57},{0x8669, 0xF0BA},{0x866A, 0xF9A5},{0x866B, 0xA6E4},{0x866D, 0xCDC9},
+ {0x866E, 0xCDCA},{0x866F, 0xCDC8},{0x8670, 0xCDC7},{0x8671, 0xAAEB},{0x8673, 0xD0A9},{0x8674, 0xD0A7},{0x8677, 0xD0A6},{0x8679, 0xAD69},
+ {0x867A, 0xAD6B},{0x867B, 0xAD6A},{0x867C, 0xD0A8},{0x8685, 0xD3C4},{0x8686, 0xD3C1},{0x8687, 0xD3BF},{0x868A, 0xB041},{0x868B, 0xD3C2},
+ {0x868C, 0xB046},{0x868D, 0xD3BC},{0x868E, 0xD3CB},{0x8690, 0xD3CD},{0x8691, 0xD3BD},{0x8693, 0xB043},{0x8694, 0xD3CE},{0x8695, 0xD3C9},
+ {0x8696, 0xD3BB},{0x8697, 0xD3C0},{0x8698, 0xD3CA},{0x8699, 0xD3C6},{0x869A, 0xD3C3},{0x869C, 0xB048},{0x869D, 0xD3CC},{0x869E, 0xD3BE},
+ {0x86A1, 0xD3C7},{0x86A2, 0xD3B9},{0x86A3, 0xB047},{0x86A4, 0xB044},{0x86A5, 0xD3C5},{0x86A7, 0xD3C8},{0x86A8, 0xD3BA},{0x86A9, 0xB045},
+ {0x86AA, 0xB042},{0x86AF, 0xB34C},{0x86B0, 0xD7A5},{0x86B1, 0xB34B},{0x86B3, 0xD7A8},{0x86B4, 0xD7AB},{0x86B5, 0xB348},{0x86B6, 0xB346},
+ {0x86B7, 0xD77E},{0x86B8, 0xD7A9},{0x86B9, 0xD7A7},{0x86BA, 0xD7A4},{0x86BB, 0xD7AC},{0x86BC, 0xD7AD},{0x86BD, 0xD7AF},{0x86BE, 0xD7B0},
+ {0x86BF, 0xD77D},{0x86C0, 0xB345},{0x86C1, 0xD7A2},{0x86C2, 0xD7A1},{0x86C3, 0xD7AE},{0x86C4, 0xB347},{0x86C5, 0xD7A3},{0x86C6, 0xB349},
+ {0x86C7, 0xB344},{0x86C8, 0xD7A6},{0x86C9, 0xB34D},{0x86CB, 0xB34A},{0x86CC, 0xD7AA},{0x86D0, 0xB5F1},{0x86D1, 0xDBBF},{0x86D3, 0xDBB4},
+ {0x86D4, 0xB5EE},{0x86D6, 0xDFE7},{0x86D7, 0xDBBD},{0x86D8, 0xDBB1},{0x86D9, 0xB5EC},{0x86DA, 0xDBB6},{0x86DB, 0xB5EF},{0x86DC, 0xDBBA},
+ {0x86DD, 0xDBB8},{0x86DE, 0xB5F2},{0x86DF, 0xB5EB},{0x86E2, 0xDBB2},{0x86E3, 0xDBB5},{0x86E4, 0xB5F0},{0x86E6, 0xDBB3},{0x86E8, 0xDBBE},
+ {0x86E9, 0xDBBC},{0x86EA, 0xDBB7},{0x86EB, 0xDBB9},{0x86EC, 0xDBBB},{0x86ED, 0xB5ED},{0x86F5, 0xDFE8},{0x86F6, 0xDFEE},{0x86F7, 0xDFE4},
+ {0x86F8, 0xDFEA},{0x86F9, 0xB8BA},{0x86FA, 0xDFE6},{0x86FB, 0xB8C0},{0x86FE, 0xB8BF},{0x8700, 0xB8BE},{0x8701, 0xDFED},{0x8702, 0xB8C1},
+ {0x8703, 0xB8C2},{0x8704, 0xDFE3},{0x8705, 0xDFF0},{0x8706, 0xB8C3},{0x8707, 0xB8BD},{0x8708, 0xB8BC},{0x8709, 0xDFEC},{0x870A, 0xB8C4},
+ {0x870B, 0xDFE2},{0x870C, 0xDFE5},{0x870D, 0xDFEF},{0x870E, 0xDFEB},{0x8711, 0xE3F4},{0x8712, 0xE3E9},{0x8713, 0xB8BB},{0x8718, 0xBB6A},
+ {0x8719, 0xE3DD},{0x871A, 0xE3F2},{0x871B, 0xE3DE},{0x871C, 0xBB65},{0x871E, 0xE3DB},{0x8720, 0xE3E4},{0x8721, 0xE3DC},{0x8722, 0xBB67},
+ {0x8723, 0xE3D6},{0x8724, 0xE3F1},{0x8725, 0xBB68},{0x8726, 0xE3EE},{0x8727, 0xE3EF},{0x8728, 0xE3D7},{0x8729, 0xBB6D},{0x872A, 0xE3E6},
+ {0x872C, 0xE3E0},{0x872D, 0xE3E7},{0x872E, 0xE3DA},{0x8730, 0xE3F3},{0x8731, 0xE3EB},{0x8732, 0xE3E5},{0x8733, 0xE3D5},{0x8734, 0xBB69},
+ {0x8735, 0xE3EC},{0x8737, 0xBB6C},{0x8738, 0xE3F0},{0x873A, 0xE3EA},{0x873B, 0xBB66},{0x873C, 0xE3E8},{0x873E, 0xE3E2},{0x873F, 0xBB64},
+ {0x8740, 0xE3D9},{0x8741, 0xE3E1},{0x8742, 0xE3ED},{0x8743, 0xE3DF},{0x8746, 0xE3E3},{0x874C, 0xBDC1},{0x874D, 0xDFE9},{0x874E, 0xE7B2},
+ {0x874F, 0xE7BB},{0x8750, 0xE7B1},{0x8751, 0xE7AD},{0x8752, 0xE7AA},{0x8753, 0xBDC2},{0x8754, 0xE7A8},{0x8755, 0xBB6B},{0x8756, 0xE7A1},
+ {0x8757, 0xBDC0},{0x8758, 0xE7A7},{0x8759, 0xBDBF},{0x875A, 0xE7AC},{0x875B, 0xE7A9},{0x875C, 0xE7B9},{0x875D, 0xE7B4},{0x875E, 0xE7AE},
+ {0x875F, 0xE7B3},{0x8760, 0xBDBB},{0x8761, 0xE7AB},{0x8762, 0xE7BE},{0x8763, 0xE7A2},{0x8764, 0xE7A3},{0x8765, 0xE7BA},{0x8766, 0xBDBC},
+ {0x8767, 0xE7BF},{0x8768, 0xBDBE},{0x8769, 0xE7C0},{0x876A, 0xE7B0},{0x876B, 0xE3D8},{0x876C, 0xE7B6},{0x876D, 0xE7AF},{0x876E, 0xE7B8},
+ {0x876F, 0xE7B5},{0x8773, 0xE7A6},{0x8774, 0xBDB9},{0x8775, 0xE7BD},{0x8776, 0xBDBA},{0x8777, 0xE7A4},{0x8778, 0xBDBD},{0x8779, 0xEB64},
+ {0x877A, 0xE7B7},{0x877B, 0xE7BC},{0x8781, 0xEB61},{0x8782, 0xBDB8},{0x8783, 0xBFC0},{0x8784, 0xEB6B},{0x8785, 0xEB67},{0x8787, 0xEB65},
+ {0x8788, 0xEB60},{0x8789, 0xEB6F},{0x878D, 0xBFC4},{0x878F, 0xEB5C},{0x8790, 0xEB68},{0x8791, 0xEB69},{0x8792, 0xEB5F},{0x8793, 0xEB5E},
+ {0x8794, 0xEB6C},{0x8796, 0xEB62},{0x8797, 0xEB5D},{0x8798, 0xEB63},{0x879A, 0xEB6E},{0x879B, 0xEB5B},{0x879C, 0xEB6D},{0x879D, 0xEB6A},
+ {0x879E, 0xBFC2},{0x879F, 0xBFC1},{0x87A2, 0xBFC3},{0x87A3, 0xEB66},{0x87A4, 0xF0CB},{0x87AA, 0xEE59},{0x87AB, 0xC1B1},{0x87AC, 0xEE5D},
+ {0x87AD, 0xEE5A},{0x87AE, 0xEE61},{0x87AF, 0xEE67},{0x87B0, 0xEE5C},{0x87B2, 0xEE70},{0x87B3, 0xC1AE},{0x87B4, 0xEE6A},{0x87B5, 0xEE5F},
+ {0x87B6, 0xEE6B},{0x87B7, 0xEE66},{0x87B8, 0xEE6D},{0x87B9, 0xEE5E},{0x87BA, 0xC1B3},{0x87BB, 0xC1B2},{0x87BC, 0xEE60},{0x87BD, 0xEE6E},
+ {0x87BE, 0xEE58},{0x87BF, 0xEE6C},{0x87C0, 0xC1AC},{0x87C2, 0xEE64},{0x87C3, 0xEE63},{0x87C4, 0xEE68},{0x87C5, 0xEE5B},{0x87C6, 0xC1B0},
+ {0x87C8, 0xC1B4},{0x87C9, 0xEE62},{0x87CA, 0xEE69},{0x87CB, 0xC1B5},{0x87CC, 0xEE65},{0x87D1, 0xC1AD},{0x87D2, 0xC1AF},{0x87D3, 0xF0C7},
+ {0x87D4, 0xF0C5},{0x87D7, 0xF0CC},{0x87D8, 0xF0C9},{0x87D9, 0xF0CD},{0x87DB, 0xF0BE},{0x87DC, 0xF0C6},{0x87DD, 0xF0D1},{0x87DE, 0xEE6F},
+ {0x87DF, 0xF0C2},{0x87E0, 0xC2CF},{0x87E1, 0xE7A5},{0x87E2, 0xF0BD},{0x87E3, 0xF0CA},{0x87E4, 0xF0C4},{0x87E5, 0xF0C1},{0x87E6, 0xF0BC},
+ {0x87E7, 0xF0BB},{0x87E8, 0xF0D0},{0x87EA, 0xF0C0},{0x87EB, 0xF0BF},{0x87EC, 0xC2CD},{0x87ED, 0xF0C8},{0x87EF, 0xC2CC},{0x87F2, 0xC2CE},
+ {0x87F3, 0xF0C3},{0x87F4, 0xF0CF},{0x87F6, 0xF2DE},{0x87F7, 0xF2DF},{0x87F9, 0xC3C9},{0x87FA, 0xF2DC},{0x87FB, 0xC3C6},{0x87FC, 0xF2E4},
+ {0x87FE, 0xC3CA},{0x87FF, 0xF2E6},{0x8800, 0xF2DB},{0x8801, 0xF0CE},{0x8802, 0xF2E8},{0x8803, 0xF2DD},{0x8805, 0xC3C7},{0x8806, 0xF2E3},
+ {0x8808, 0xF2E5},{0x8809, 0xF2E0},{0x880A, 0xF2E7},{0x880B, 0xF2E2},{0x880C, 0xF2E1},{0x880D, 0xC3C8},{0x8810, 0xF4C5},{0x8811, 0xF4C6},
+ {0x8813, 0xF4C8},{0x8814, 0xC4AE},{0x8815, 0xC4AF},{0x8816, 0xF4C9},{0x8817, 0xF4C7},{0x8819, 0xF4C4},{0x881B, 0xF642},{0x881C, 0xF645},
+ {0x881D, 0xF641},{0x881F, 0xC4FA},{0x8820, 0xF643},{0x8821, 0xC4F9},{0x8822, 0xC4F8},{0x8823, 0xC4F7},{0x8824, 0xF644},{0x8825, 0xF751},
+ {0x8826, 0xF74F},{0x8828, 0xF74E},{0x8829, 0xF640},{0x882A, 0xF750},{0x882B, 0xF646},{0x882C, 0xF74D},{0x882E, 0xF7F9},{0x882F, 0xF7D7},
+ {0x8830, 0xF7F7},{0x8831, 0xC5DB},{0x8832, 0xF7F8},{0x8833, 0xF7FA},{0x8835, 0xF8BF},{0x8836, 0xC5FA},{0x8837, 0xF8BE},{0x8838, 0xF8BD},
+ {0x8839, 0xC5FB},{0x883B, 0xC65A},{0x883C, 0xF96E},{0x883D, 0xF9A7},{0x883E, 0xF9A6},{0x883F, 0xF9A8},{0x8840, 0xA6E5},{0x8841, 0xD0AA},
+ {0x8843, 0xD3CF},{0x8844, 0xD3D0},{0x8848, 0xDBC0},{0x884A, 0xF647},{0x884B, 0xF8C0},{0x884C, 0xA6E6},{0x884D, 0xAD6C},{0x884E, 0xD0AB},
+ {0x8852, 0xD7B1},{0x8853, 0xB34E},{0x8855, 0xDBC2},{0x8856, 0xDBC1},{0x8857, 0xB5F3},{0x8859, 0xB8C5},{0x885A, 0xE7C1},{0x885B, 0xBDC3},
+ {0x885D, 0xBDC4},{0x8861, 0xBFC5},{0x8862, 0xC5FC},{0x8863, 0xA6E7},{0x8867, 0xD0AC},{0x8868, 0xAAED},{0x8869, 0xD0AE},{0x886A, 0xD0AD},
+ {0x886B, 0xAD6D},{0x886D, 0xD3D1},{0x886F, 0xD3D8},{0x8870, 0xB049},{0x8871, 0xD3D6},{0x8872, 0xD3D4},{0x8874, 0xD3DB},{0x8875, 0xD3D2},
+ {0x8876, 0xD3D3},{0x8877, 0xB04A},{0x8879, 0xB04E},{0x887C, 0xD3DC},{0x887D, 0xB04D},{0x887E, 0xD3DA},{0x887F, 0xD3D7},{0x8880, 0xD3D5},
+ {0x8881, 0xB04B},{0x8882, 0xB04C},{0x8883, 0xD3D9},{0x8888, 0xB350},{0x8889, 0xD7B2},{0x888B, 0xB355},{0x888C, 0xD7C2},{0x888D, 0xB354},
+ {0x888E, 0xD7C4},{0x8891, 0xD7B8},{0x8892, 0xB352},{0x8893, 0xD7C3},{0x8895, 0xD7B3},{0x8896, 0xB353},{0x8897, 0xD7BF},{0x8898, 0xD7BB},
+ {0x8899, 0xD7BD},{0x889A, 0xD7B7},{0x889B, 0xD7BE},{0x889E, 0xB34F},{0x889F, 0xD7BA},{0x88A1, 0xD7B9},{0x88A2, 0xD7B5},{0x88A4, 0xD7C0},
+ {0x88A7, 0xD7BC},{0x88A8, 0xD7B4},{0x88AA, 0xD7B6},{0x88AB, 0xB351},{0x88AC, 0xD7C1},{0x88B1, 0xB5F6},{0x88B2, 0xDBCD},{0x88B6, 0xDBC9},
+ {0x88B7, 0xDBCB},{0x88B8, 0xDBC6},{0x88B9, 0xDBC5},{0x88BA, 0xDBC3},{0x88BC, 0xDBCA},{0x88BD, 0xDBCC},{0x88BE, 0xDBC8},{0x88C0, 0xDBC7},
+ {0x88C1, 0xB5F4},{0x88C2, 0xB5F5},{0x88C9, 0xDBCF},{0x88CA, 0xB8CD},{0x88CB, 0xDFF2},{0x88CC, 0xDFF8},{0x88CD, 0xDFF3},{0x88CE, 0xDFF4},
+ {0x88D0, 0xDFF9},{0x88D2, 0xB8CF},{0x88D4, 0xB8C7},{0x88D5, 0xB8CE},{0x88D6, 0xDFF1},{0x88D7, 0xDBC4},{0x88D8, 0xB8CA},{0x88D9, 0xB8C8},
+ {0x88DA, 0xDFF7},{0x88DB, 0xDFF6},{0x88DC, 0xB8C9},{0x88DD, 0xB8CB},{0x88DE, 0xDFF5},{0x88DF, 0xB8C6},{0x88E1, 0xB8CC},{0x88E7, 0xE3F6},
+ {0x88E8, 0xBB74},{0x88EB, 0xE442},{0x88EC, 0xE441},{0x88EE, 0xE3FB},{0x88EF, 0xBB76},{0x88F0, 0xE440},{0x88F1, 0xE3F7},{0x88F2, 0xE3F8},
+ {0x88F3, 0xBB6E},{0x88F4, 0xBB70},{0x88F6, 0xE3FD},{0x88F7, 0xE3F5},{0x88F8, 0xBB72},{0x88F9, 0xBB71},{0x88FA, 0xE3F9},{0x88FB, 0xE3FE},
+ {0x88FC, 0xE3FC},{0x88FD, 0xBB73},{0x88FE, 0xE3FA},{0x8901, 0xDBCE},{0x8902, 0xBB6F},{0x8905, 0xE7C2},{0x8906, 0xE7C9},{0x8907, 0xBDC6},
+ {0x8909, 0xE7CD},{0x890A, 0xBDCA},{0x890B, 0xE7C5},{0x890C, 0xE7C3},{0x890E, 0xE7CC},{0x8910, 0xBDC5},{0x8911, 0xE7CB},{0x8912, 0xBDC7},
+ {0x8913, 0xBDC8},{0x8914, 0xE7C4},{0x8915, 0xBDC9},{0x8916, 0xE7CA},{0x8917, 0xE7C6},{0x8918, 0xE7C7},{0x8919, 0xE7C8},{0x891A, 0xBB75},
+ {0x891E, 0xEB70},{0x891F, 0xEB7C},{0x8921, 0xBFCA},{0x8922, 0xEB77},{0x8923, 0xEB79},{0x8925, 0xBFC8},{0x8926, 0xEB71},{0x8927, 0xEB75},
+ {0x8929, 0xEB78},{0x892A, 0xBFC6},{0x892B, 0xBFC9},{0x892C, 0xEB7B},{0x892D, 0xEB73},{0x892E, 0xEB74},{0x892F, 0xEB7A},{0x8930, 0xEB72},
+ {0x8931, 0xEB76},{0x8932, 0xBFC7},{0x8933, 0xEE72},{0x8935, 0xEE71},{0x8936, 0xC1B7},{0x8937, 0xEE77},{0x8938, 0xC1B9},{0x893B, 0xC1B6},
+ {0x893C, 0xEE73},{0x893D, 0xC1BA},{0x893E, 0xEE74},{0x8941, 0xEE75},{0x8942, 0xEE78},{0x8944, 0xC1B8},{0x8946, 0xF0D6},{0x8949, 0xF0D9},
+ {0x894B, 0xF0D3},{0x894C, 0xF0D5},{0x894F, 0xF0D4},{0x8950, 0xF0D7},{0x8951, 0xF0D8},{0x8952, 0xEE76},{0x8953, 0xF0D2},{0x8956, 0xC3CD},
+ {0x8957, 0xF2EC},{0x8958, 0xF2EF},{0x8959, 0xF2F1},{0x895A, 0xF2EA},{0x895B, 0xF2EB},{0x895C, 0xF2EE},{0x895D, 0xF2F0},{0x895E, 0xC3CE},
+ {0x895F, 0xC3CC},{0x8960, 0xC3CB},{0x8961, 0xF2ED},{0x8962, 0xF2E9},{0x8963, 0xF4CA},{0x8964, 0xC4B0},{0x8966, 0xF4CB},{0x8969, 0xF649},
+ {0x896A, 0xC4FB},{0x896B, 0xF64B},{0x896C, 0xC4FC},{0x896D, 0xF648},{0x896E, 0xF64A},{0x896F, 0xC5A8},{0x8971, 0xF752},{0x8972, 0xC5A7},
+ {0x8973, 0xF7FD},{0x8974, 0xF7FC},{0x8976, 0xF7FB},{0x8979, 0xF948},{0x897A, 0xF949},{0x897B, 0xF94B},{0x897C, 0xF94A},{0x897E, 0xCA50},
+ {0x897F, 0xA6E8},{0x8981, 0xAD6E},{0x8982, 0xD7C5},{0x8983, 0xB5F7},{0x8985, 0xDFFA},{0x8986, 0xC2D0},{0x8988, 0xF2F2},{0x898B, 0xA8A3},
+ {0x898F, 0xB357},{0x8993, 0xB356},{0x8995, 0xDBD0},{0x8996, 0xB5F8},{0x8997, 0xDBD2},{0x8998, 0xDBD1},{0x899B, 0xDFFB},{0x899C, 0xB8D0},
+ {0x899D, 0xE443},{0x899E, 0xE446},{0x899F, 0xE445},{0x89A1, 0xE444},{0x89A2, 0xE7CE},{0x89A3, 0xE7D0},{0x89A4, 0xE7CF},{0x89A6, 0xBFCC},
+ {0x89AA, 0xBFCB},{0x89AC, 0xC1BB},{0x89AD, 0xEE79},{0x89AE, 0xEE7B},{0x89AF, 0xEE7A},{0x89B2, 0xC2D1},{0x89B6, 0xF2F4},{0x89B7, 0xF2F3},
+ {0x89B9, 0xF4CC},{0x89BA, 0xC4B1},{0x89BD, 0xC4FD},{0x89BE, 0xF754},{0x89BF, 0xF753},{0x89C0, 0xC65B},{0x89D2, 0xA8A4},{0x89D3, 0xD0AF},
+ {0x89D4, 0xAD6F},{0x89D5, 0xD7C8},{0x89D6, 0xD7C6},{0x89D9, 0xD7C7},{0x89DA, 0xDBD4},{0x89DB, 0xDBD5},{0x89DC, 0xE043},{0x89DD, 0xDBD3},
+ {0x89DF, 0xDFFC},{0x89E0, 0xE041},{0x89E1, 0xE040},{0x89E2, 0xE042},{0x89E3, 0xB8D1},{0x89E4, 0xDFFE},{0x89E5, 0xDFFD},{0x89E6, 0xE044},
+ {0x89E8, 0xE449},{0x89E9, 0xE447},{0x89EB, 0xE448},{0x89EC, 0xE7D3},{0x89ED, 0xE7D1},{0x89F0, 0xE7D2},{0x89F1, 0xEB7D},{0x89F2, 0xEE7C},
+ {0x89F3, 0xEE7D},{0x89F4, 0xC2D2},{0x89F6, 0xF2F5},{0x89F7, 0xF4CD},{0x89F8, 0xC4B2},{0x89FA, 0xF64C},{0x89FB, 0xF755},{0x89FC, 0xC5A9},
+ {0x89FE, 0xF7FE},{0x89FF, 0xF94C},{0x8A00, 0xA8A5},{0x8A02, 0xAD71},{0x8A03, 0xAD72},{0x8A04, 0xD0B0},{0x8A07, 0xD0B1},{0x8A08, 0xAD70},
+ {0x8A0A, 0xB054},{0x8A0C, 0xB052},{0x8A0E, 0xB051},{0x8A0F, 0xB058},{0x8A10, 0xB050},{0x8A11, 0xB059},{0x8A12, 0xD3DD},{0x8A13, 0xB056},
+ {0x8A15, 0xB053},{0x8A16, 0xB057},{0x8A17, 0xB055},{0x8A18, 0xB04F},{0x8A1B, 0xB35F},{0x8A1D, 0xB359},{0x8A1E, 0xD7CC},{0x8A1F, 0xB35E},
+ {0x8A22, 0xB360},{0x8A23, 0xB35A},{0x8A25, 0xB35B},{0x8A27, 0xD7CA},{0x8A2A, 0xB358},{0x8A2C, 0xD7CB},{0x8A2D, 0xB35D},{0x8A30, 0xD7C9},
+ {0x8A31, 0xB35C},{0x8A34, 0xB644},{0x8A36, 0xB646},{0x8A39, 0xDBD8},{0x8A3A, 0xB645},{0x8A3B, 0xB5F9},{0x8A3C, 0xB5FD},{0x8A3E, 0xB8E4},
+ {0x8A3F, 0xE049},{0x8A40, 0xDBDA},{0x8A41, 0xB5FE},{0x8A44, 0xDBDD},{0x8A45, 0xDBDE},{0x8A46, 0xB643},{0x8A48, 0xDBE0},{0x8A4A, 0xDBE2},
+ {0x8A4C, 0xDBE3},{0x8A4D, 0xDBD7},{0x8A4E, 0xDBD6},{0x8A4F, 0xDBE4},{0x8A50, 0xB642},{0x8A51, 0xDBE1},{0x8A52, 0xDBDF},{0x8A54, 0xB640},
+ {0x8A55, 0xB5FB},{0x8A56, 0xB647},{0x8A57, 0xDBDB},{0x8A58, 0xDBDC},{0x8A59, 0xDBD9},{0x8A5B, 0xB641},{0x8A5E, 0xB5FC},{0x8A60, 0xB5FA},
+ {0x8A61, 0xE048},{0x8A62, 0xB8DF},{0x8A63, 0xB8DA},{0x8A66, 0xB8D5},{0x8A68, 0xB8E5},{0x8A69, 0xB8D6},{0x8A6B, 0xB8D2},{0x8A6C, 0xB8E1},
+ {0x8A6D, 0xB8DE},{0x8A6E, 0xB8E0},{0x8A70, 0xB8D7},{0x8A71, 0xB8DC},{0x8A72, 0xB8D3},{0x8A73, 0xB8D4},{0x8A74, 0xE050},{0x8A75, 0xE04D},
+ {0x8A76, 0xE045},{0x8A77, 0xE04A},{0x8A79, 0xB8E2},{0x8A7A, 0xE051},{0x8A7B, 0xB8E3},{0x8A7C, 0xB8D9},{0x8A7F, 0xE047},{0x8A81, 0xE04F},
+ {0x8A82, 0xE04B},{0x8A83, 0xE04E},{0x8A84, 0xE04C},{0x8A85, 0xB8DD},{0x8A86, 0xE046},{0x8A87, 0xB8D8},{0x8A8B, 0xE44C},{0x8A8C, 0xBB78},
+ {0x8A8D, 0xBB7B},{0x8A8F, 0xE44E},{0x8A91, 0xBBA5},{0x8A92, 0xE44D},{0x8A93, 0xBB7D},{0x8A95, 0xBDCF},{0x8A96, 0xE44F},{0x8A98, 0xBBA4},
+ {0x8A99, 0xE44B},{0x8A9A, 0xBBA6},{0x8A9E, 0xBB79},{0x8AA0, 0xB8DB},{0x8AA1, 0xBB7C},{0x8AA3, 0xBB7A},{0x8AA4, 0xBB7E},{0x8AA5, 0xBBA2},
+ {0x8AA6, 0xBB77},{0x8AA7, 0xBBA7},{0x8AA8, 0xBBA3},{0x8AAA, 0xBBA1},{0x8AAB, 0xE44A},{0x8AB0, 0xBDD6},{0x8AB2, 0xBDD2},{0x8AB6, 0xBDD9},
+ {0x8AB8, 0xE7D6},{0x8AB9, 0xBDDA},{0x8ABA, 0xE7E2},{0x8ABB, 0xE7DB},{0x8ABC, 0xBDCB},{0x8ABD, 0xE7E3},{0x8ABE, 0xE7DD},{0x8ABF, 0xBDD5},
+ {0x8AC0, 0xE7DE},{0x8AC2, 0xBDD4},{0x8AC3, 0xE7E1},{0x8AC4, 0xBDCE},{0x8AC5, 0xE7DF},{0x8AC6, 0xE7D5},{0x8AC7, 0xBDCD},{0x8AC8, 0xEBAA},
+ {0x8AC9, 0xBDD3},{0x8ACB, 0xBDD0},{0x8ACD, 0xBDD8},{0x8ACF, 0xE7D4},{0x8AD1, 0xE7D8},{0x8AD2, 0xBDCC},{0x8AD3, 0xE7D7},{0x8AD4, 0xE7D9},
+ {0x8AD5, 0xE7DA},{0x8AD6, 0xBDD7},{0x8AD7, 0xE7DC},{0x8AD8, 0xE7E0},{0x8AD9, 0xE7E4},{0x8ADB, 0xBDDB},{0x8ADC, 0xBFD2},{0x8ADD, 0xEBA5},
+ {0x8ADE, 0xEBAB},{0x8ADF, 0xEBA8},{0x8AE0, 0xEB7E},{0x8AE1, 0xEBAC},{0x8AE2, 0xEBA1},{0x8AE4, 0xEBA7},{0x8AE6, 0xBFCD},{0x8AE7, 0xBFD3},
+ {0x8AE8, 0xEBAD},{0x8AEB, 0xBFCF},{0x8AED, 0xBFD9},{0x8AEE, 0xBFD4},{0x8AEF, 0xEBAF},{0x8AF0, 0xEBA9},{0x8AF1, 0xBFD0},{0x8AF2, 0xEBA2},
+ {0x8AF3, 0xBFDA},{0x8AF4, 0xEBA3},{0x8AF5, 0xEBA4},{0x8AF6, 0xBFDB},{0x8AF7, 0xBFD8},{0x8AF8, 0xBDD1},{0x8AFA, 0xBFCE},{0x8AFB, 0xEBB0},
+ {0x8AFC, 0xBFDC},{0x8AFE, 0xBFD5},{0x8AFF, 0xEBAE},{0x8B00, 0xBFD1},{0x8B01, 0xBFD6},{0x8B02, 0xBFD7},{0x8B04, 0xC1C3},{0x8B05, 0xEEA4},
+ {0x8B06, 0xEEAD},{0x8B07, 0xEEAA},{0x8B08, 0xEEAC},{0x8B0A, 0xC1C0},{0x8B0B, 0xEEA5},{0x8B0D, 0xEEAB},{0x8B0E, 0xC1BC},{0x8B0F, 0xEEA7},
+ {0x8B10, 0xC1C4},{0x8B11, 0xEEA3},{0x8B12, 0xEEA8},{0x8B13, 0xEEAF},{0x8B14, 0xEBA6},{0x8B15, 0xEEA9},{0x8B16, 0xEEA2},{0x8B17, 0xC1BD},
+ {0x8B18, 0xEEA1},{0x8B19, 0xC1BE},{0x8B1A, 0xEEB0},{0x8B1B, 0xC1BF},{0x8B1C, 0xEEAE},{0x8B1D, 0xC1C2},{0x8B1E, 0xEE7E},{0x8B20, 0xC1C1},
+ {0x8B22, 0xEEA6},{0x8B23, 0xF0DC},{0x8B24, 0xF0EA},{0x8B25, 0xF0E5},{0x8B26, 0xF0E7},{0x8B27, 0xF0DB},{0x8B28, 0xC2D3},{0x8B2A, 0xF0DA},
+ {0x8B2B, 0xC2D6},{0x8B2C, 0xC2D5},{0x8B2E, 0xF0E9},{0x8B2F, 0xF0E1},{0x8B30, 0xF0DE},{0x8B31, 0xF0E4},{0x8B33, 0xF0DD},{0x8B35, 0xF0DF},
+ {0x8B36, 0xF0E8},{0x8B37, 0xF0E6},{0x8B39, 0xC2D4},{0x8B3A, 0xF0ED},{0x8B3B, 0xF0EB},{0x8B3C, 0xF0E2},{0x8B3D, 0xF0EC},{0x8B3E, 0xF0E3},
+ {0x8B40, 0xF2F9},{0x8B41, 0xC3CF},{0x8B42, 0xF341},{0x8B45, 0xF64F},{0x8B46, 0xC3D6},{0x8B47, 0xF0E0},{0x8B48, 0xF2F7},{0x8B49, 0xC3D2},
+ {0x8B4A, 0xF2F8},{0x8B4B, 0xF2FD},{0x8B4E, 0xC3D4},{0x8B4F, 0xC3D5},{0x8B50, 0xF2F6},{0x8B51, 0xF340},{0x8B52, 0xF342},{0x8B53, 0xF2FA},
+ {0x8B54, 0xF2FC},{0x8B55, 0xF2FE},{0x8B56, 0xF2FB},{0x8B57, 0xF343},{0x8B58, 0xC3D1},{0x8B59, 0xC3D7},{0x8B5A, 0xC3D3},{0x8B5C, 0xC3D0},
+ {0x8B5D, 0xF4D0},{0x8B5F, 0xC4B7},{0x8B60, 0xF4CE},{0x8B63, 0xF4D2},{0x8B65, 0xF4D3},{0x8B66, 0xC4B5},{0x8B67, 0xF4D4},{0x8B68, 0xF4D1},
+ {0x8B6A, 0xF4CF},{0x8B6B, 0xC4B8},{0x8B6C, 0xC4B4},{0x8B6D, 0xF4D5},{0x8B6F, 0xC4B6},{0x8B70, 0xC4B3},{0x8B74, 0xC4FE},{0x8B77, 0xC540},
+ {0x8B78, 0xF64E},{0x8B79, 0xF64D},{0x8B7A, 0xF650},{0x8B7B, 0xF651},{0x8B7D, 0xC541},{0x8B7E, 0xF756},{0x8B7F, 0xF75B},{0x8B80, 0xC5AA},
+ {0x8B82, 0xF758},{0x8B84, 0xF757},{0x8B85, 0xF75A},{0x8B86, 0xF759},{0x8B88, 0xF843},{0x8B8A, 0xC5DC},{0x8B8B, 0xF842},{0x8B8C, 0xF840},
+ {0x8B8E, 0xF841},{0x8B92, 0xC5FE},{0x8B93, 0xC5FD},{0x8B94, 0xF8C1},{0x8B95, 0xF8C2},{0x8B96, 0xC640},{0x8B98, 0xF94D},{0x8B99, 0xF94E},
+ {0x8B9A, 0xC667},{0x8B9C, 0xC66D},{0x8B9E, 0xF9A9},{0x8B9F, 0xF9C8},{0x8C37, 0xA8A6},{0x8C39, 0xD7CD},{0x8C3B, 0xD7CE},{0x8C3C, 0xE052},
+ {0x8C3D, 0xE450},{0x8C3E, 0xE7E5},{0x8C3F, 0xC1C6},{0x8C41, 0xC1C5},{0x8C42, 0xF0EE},{0x8C43, 0xF344},{0x8C45, 0xF844},{0x8C46, 0xA8A7},
+ {0x8C47, 0xD3DE},{0x8C48, 0xB05A},{0x8C49, 0xB361},{0x8C4A, 0xE054},{0x8C4B, 0xE053},{0x8C4C, 0xBDDC},{0x8C4D, 0xE7E6},{0x8C4E, 0xBDDD},
+ {0x8C4F, 0xEEB1},{0x8C50, 0xC2D7},{0x8C54, 0xC676},{0x8C55, 0xA8A8},{0x8C56, 0xCDCB},{0x8C57, 0xD3DF},{0x8C5A, 0xB362},{0x8C5C, 0xD7CF},
+ {0x8C5D, 0xD7D0},{0x8C5F, 0xDBE5},{0x8C61, 0xB648},{0x8C62, 0xB8E6},{0x8C64, 0xE056},{0x8C65, 0xE055},{0x8C66, 0xE057},{0x8C68, 0xE451},
+ {0x8C69, 0xE452},{0x8C6A, 0xBBA8},{0x8C6B, 0xBFDD},{0x8C6C, 0xBDDE},{0x8C6D, 0xBFDE},{0x8C6F, 0xEEB5},{0x8C70, 0xEEB2},{0x8C71, 0xEEB4},
+ {0x8C72, 0xEEB3},{0x8C73, 0xC1C7},{0x8C75, 0xF0EF},{0x8C76, 0xF346},{0x8C77, 0xF345},{0x8C78, 0xCBA4},{0x8C79, 0xB05C},{0x8C7A, 0xB05B},
+ {0x8C7B, 0xD3E0},{0x8C7D, 0xD7D1},{0x8C80, 0xDBE7},{0x8C81, 0xDBE6},{0x8C82, 0xB649},{0x8C84, 0xE059},{0x8C85, 0xE05A},{0x8C86, 0xE058},
+ {0x8C89, 0xB8E8},{0x8C8A, 0xB8E7},{0x8C8C, 0xBBAA},{0x8C8D, 0xBBA9},{0x8C8F, 0xE7E7},{0x8C90, 0xEBB3},{0x8C91, 0xEBB1},{0x8C92, 0xEBB2},
+ {0x8C93, 0xBFDF},{0x8C94, 0xEEB7},{0x8C95, 0xEEB6},{0x8C97, 0xF0F2},{0x8C98, 0xF0F1},{0x8C99, 0xF0F0},{0x8C9A, 0xF347},{0x8C9C, 0xF9AA},
+ {0x8C9D, 0xA8A9},{0x8C9E, 0xAD73},{0x8CA0, 0xAD74},{0x8CA1, 0xB05D},{0x8CA2, 0xB05E},{0x8CA3, 0xD3E2},{0x8CA4, 0xD3E1},{0x8CA5, 0xD7D2},
+ {0x8CA7, 0xB368},{0x8CA8, 0xB366},{0x8CA9, 0xB363},{0x8CAA, 0xB367},{0x8CAB, 0xB365},{0x8CAC, 0xB364},{0x8CAF, 0xB64A},{0x8CB0, 0xDBEA},
+ {0x8CB2, 0xB8ED},{0x8CB3, 0xB64C},{0x8CB4, 0xB651},{0x8CB5, 0xDBEC},{0x8CB6, 0xB653},{0x8CB7, 0xB652},{0x8CB8, 0xB655},{0x8CB9, 0xDBEB},
+ {0x8CBA, 0xDBE8},{0x8CBB, 0xB64F},{0x8CBC, 0xB64B},{0x8CBD, 0xB64D},{0x8CBE, 0xDBE9},{0x8CBF, 0xB654},{0x8CC0, 0xB650},{0x8CC1, 0xB64E},
+ {0x8CC2, 0xB8EF},{0x8CC3, 0xB8EE},{0x8CC4, 0xB8EC},{0x8CC5, 0xB8F0},{0x8CC7, 0xB8EA},{0x8CC8, 0xB8EB},{0x8CCA, 0xB8E9},{0x8CCC, 0xE05B},
+ {0x8CCF, 0xE454},{0x8CD1, 0xBBAC},{0x8CD2, 0xBBAD},{0x8CD3, 0xBBAB},{0x8CD5, 0xE453},{0x8CD7, 0xE455},{0x8CD9, 0xE7EA},{0x8CDA, 0xE7EC},
+ {0x8CDC, 0xBDE7},{0x8CDD, 0xE7ED},{0x8CDE, 0xBDE0},{0x8CDF, 0xE7E9},{0x8CE0, 0xBDDF},{0x8CE1, 0xBDE9},{0x8CE2, 0xBDE5},{0x8CE3, 0xBDE6},
+ {0x8CE4, 0xBDE2},{0x8CE5, 0xE7E8},{0x8CE6, 0xBDE1},{0x8CE7, 0xE7EE},{0x8CE8, 0xE7EB},{0x8CEA, 0xBDE8},{0x8CEC, 0xBDE3},{0x8CED, 0xBDE4},
+ {0x8CEE, 0xEBB5},{0x8CF0, 0xEBB7},{0x8CF1, 0xEBB6},{0x8CF3, 0xEBB8},{0x8CF4, 0xBFE0},{0x8CF5, 0xEBB4},{0x8CF8, 0xC1CB},{0x8CF9, 0xEEB8},
+ {0x8CFA, 0xC1C8},{0x8CFB, 0xC1CC},{0x8CFC, 0xC1CA},{0x8CFD, 0xC1C9},{0x8CFE, 0xF0F3},{0x8D00, 0xF0F6},{0x8D02, 0xF0F5},{0x8D04, 0xF0F4},
+ {0x8D05, 0xC2D8},{0x8D06, 0xF348},{0x8D07, 0xF349},{0x8D08, 0xC3D8},{0x8D09, 0xF34A},{0x8D0A, 0xC3D9},{0x8D0D, 0xC4BA},{0x8D0F, 0xC4B9},
+ {0x8D10, 0xF652},{0x8D13, 0xC542},{0x8D14, 0xF653},{0x8D15, 0xF75C},{0x8D16, 0xC5AB},{0x8D17, 0xC5AC},{0x8D19, 0xF845},{0x8D1B, 0xC642},
+ {0x8D64, 0xA8AA},{0x8D66, 0xB36A},{0x8D67, 0xB369},{0x8D68, 0xE05C},{0x8D69, 0xE05D},{0x8D6B, 0xBBAE},{0x8D6C, 0xEBB9},{0x8D6D, 0xBDEA},
+ {0x8D6E, 0xEBBA},{0x8D6F, 0xEEB9},{0x8D70, 0xA8AB},{0x8D72, 0xD0B2},{0x8D73, 0xAD76},{0x8D74, 0xAD75},{0x8D76, 0xD3E3},{0x8D77, 0xB05F},
+ {0x8D78, 0xD3E4},{0x8D79, 0xD7D5},{0x8D7B, 0xD7D4},{0x8D7D, 0xD7D3},{0x8D80, 0xDBEE},{0x8D81, 0xB658},{0x8D84, 0xDBED},{0x8D85, 0xB657},
+ {0x8D89, 0xDBEF},{0x8D8A, 0xB656},{0x8D8C, 0xE05F},{0x8D8D, 0xE062},{0x8D8E, 0xE060},{0x8D8F, 0xE061},{0x8D90, 0xE065},{0x8D91, 0xE05E},
+ {0x8D92, 0xE066},{0x8D93, 0xE063},{0x8D94, 0xE064},{0x8D95, 0xBBB0},{0x8D96, 0xE456},{0x8D99, 0xBBAF},{0x8D9B, 0xE7F2},{0x8D9C, 0xE7F0},
+ {0x8D9F, 0xBDEB},{0x8DA0, 0xE7EF},{0x8DA1, 0xE7F1},{0x8DA3, 0xBDEC},{0x8DA5, 0xEBBB},{0x8DA7, 0xEBBC},{0x8DA8, 0xC1CD},{0x8DAA, 0xF34C},
+ {0x8DAB, 0xF34E},{0x8DAC, 0xF34B},{0x8DAD, 0xF34D},{0x8DAE, 0xF4D6},{0x8DAF, 0xF654},{0x8DB2, 0xF96F},{0x8DB3, 0xA8AC},{0x8DB4, 0xAD77},
+ {0x8DB5, 0xD3E5},{0x8DB6, 0xD3E7},{0x8DB7, 0xD3E6},{0x8DB9, 0xD7D8},{0x8DBA, 0xB36C},{0x8DBC, 0xD7D6},{0x8DBE, 0xB36B},{0x8DBF, 0xD7D9},
+ {0x8DC1, 0xD7DA},{0x8DC2, 0xD7D7},{0x8DC5, 0xDBFB},{0x8DC6, 0xB660},{0x8DC7, 0xDBF3},{0x8DC8, 0xDBF9},{0x8DCB, 0xB65B},{0x8DCC, 0xB65E},
+ {0x8DCD, 0xDBF2},{0x8DCE, 0xB659},{0x8DCF, 0xDBF6},{0x8DD0, 0xE06C},{0x8DD1, 0xB65D},{0x8DD3, 0xDBF1},{0x8DD5, 0xDBF7},{0x8DD6, 0xDBF4},
+ {0x8DD7, 0xDBFA},{0x8DD8, 0xDBF0},{0x8DD9, 0xDBF8},{0x8DDA, 0xB65C},{0x8DDB, 0xB65F},{0x8DDC, 0xDBF5},{0x8DDD, 0xB65A},{0x8DDF, 0xB8F2},
+ {0x8DE0, 0xE068},{0x8DE1, 0xB8F1},{0x8DE2, 0xE06F},{0x8DE3, 0xE06E},{0x8DE4, 0xB8F8},{0x8DE6, 0xB8F9},{0x8DE7, 0xE070},{0x8DE8, 0xB8F3},
+ {0x8DE9, 0xE06D},{0x8DEA, 0xB8F7},{0x8DEB, 0xE072},{0x8DEC, 0xE069},{0x8DEE, 0xE06B},{0x8DEF, 0xB8F4},{0x8DF0, 0xE067},{0x8DF1, 0xE06A},
+ {0x8DF2, 0xE071},{0x8DF3, 0xB8F5},{0x8DF4, 0xE073},{0x8DFA, 0xB8F6},{0x8DFC, 0xBBB1},{0x8DFD, 0xE45B},{0x8DFE, 0xE461},{0x8DFF, 0xE459},
+ {0x8E00, 0xE462},{0x8E02, 0xE458},{0x8E03, 0xE45D},{0x8E04, 0xE463},{0x8E05, 0xE460},{0x8E06, 0xE45F},{0x8E07, 0xE45E},{0x8E09, 0xE457},
+ {0x8E0A, 0xE45C},{0x8E0D, 0xE45A},{0x8E0F, 0xBDF1},{0x8E10, 0xBDEE},{0x8E11, 0xE7FB},{0x8E12, 0xE841},{0x8E13, 0xE843},{0x8E14, 0xE840},
+ {0x8E15, 0xE7F8},{0x8E16, 0xE7FA},{0x8E17, 0xE845},{0x8E18, 0xE842},{0x8E19, 0xE7FC},{0x8E1A, 0xE846},{0x8E1B, 0xE7F9},{0x8E1C, 0xE844},
+ {0x8E1D, 0xBDEF},{0x8E1E, 0xBDF5},{0x8E1F, 0xBDF3},{0x8E20, 0xE7F3},{0x8E21, 0xBDF4},{0x8E22, 0xBDF0},{0x8E23, 0xE7F4},{0x8E24, 0xE7F6},
+ {0x8E25, 0xE7F5},{0x8E26, 0xE7FD},{0x8E27, 0xE7FE},{0x8E29, 0xBDF2},{0x8E2B, 0xBDED},{0x8E2E, 0xE7F7},{0x8E30, 0xEBC6},{0x8E31, 0xBFE2},
+ {0x8E33, 0xEBBD},{0x8E34, 0xBFE3},{0x8E35, 0xBFE6},{0x8E36, 0xEBC2},{0x8E38, 0xEBBF},{0x8E39, 0xBFE5},{0x8E3C, 0xEBC3},{0x8E3D, 0xEBC4},
+ {0x8E3E, 0xEBBE},{0x8E3F, 0xEBC7},{0x8E40, 0xEBC0},{0x8E41, 0xEBC5},{0x8E42, 0xBFE4},{0x8E44, 0xBFE1},{0x8E45, 0xEBC1},{0x8E47, 0xEEBF},
+ {0x8E48, 0xC1D0},{0x8E49, 0xC1CE},{0x8E4A, 0xC1D1},{0x8E4B, 0xC1CF},{0x8E4C, 0xEEBE},{0x8E4D, 0xEEBB},{0x8E4E, 0xEEBA},{0x8E50, 0xEEBD},
+ {0x8E53, 0xEEBC},{0x8E54, 0xF145},{0x8E55, 0xC2DE},{0x8E56, 0xF0FB},{0x8E57, 0xF0FA},{0x8E59, 0xC2D9},{0x8E5A, 0xF141},{0x8E5B, 0xF140},
+ {0x8E5C, 0xF0F7},{0x8E5D, 0xF143},{0x8E5E, 0xF0FC},{0x8E5F, 0xC2DD},{0x8E60, 0xF0F9},{0x8E61, 0xF142},{0x8E62, 0xF0F8},{0x8E63, 0xC2DA},
+ {0x8E64, 0xC2DC},{0x8E65, 0xF0FD},{0x8E66, 0xC2DB},{0x8E67, 0xF0FE},{0x8E69, 0xF144},{0x8E6A, 0xF352},{0x8E6C, 0xC3DE},{0x8E6D, 0xF34F},
+ {0x8E6F, 0xF353},{0x8E72, 0xC3DB},{0x8E73, 0xF351},{0x8E74, 0xC3E0},{0x8E76, 0xC3DD},{0x8E78, 0xF350},{0x8E7A, 0xC3DF},{0x8E7B, 0xF354},
+ {0x8E7C, 0xC3DA},{0x8E81, 0xC4BC},{0x8E82, 0xC4BE},{0x8E84, 0xF4D9},{0x8E85, 0xC4BD},{0x8E86, 0xF4D7},{0x8E87, 0xC3DC},{0x8E88, 0xF4D8},
+ {0x8E89, 0xC4BB},{0x8E8A, 0xC543},{0x8E8B, 0xC545},{0x8E8C, 0xF656},{0x8E8D, 0xC544},{0x8E8E, 0xF655},{0x8E90, 0xF761},{0x8E91, 0xC5AD},
+ {0x8E92, 0xF760},{0x8E93, 0xC5AE},{0x8E94, 0xF75E},{0x8E95, 0xF75D},{0x8E96, 0xF762},{0x8E97, 0xF763},{0x8E98, 0xF846},{0x8E9A, 0xF75F},
+ {0x8E9D, 0xF8C6},{0x8E9E, 0xF8C3},{0x8E9F, 0xF8C4},{0x8EA0, 0xF8C5},{0x8EA1, 0xC65C},{0x8EA3, 0xF951},{0x8EA4, 0xF950},{0x8EA5, 0xF94F},
+ {0x8EA6, 0xF970},{0x8EA8, 0xF9BE},{0x8EA9, 0xF9AB},{0x8EAA, 0xC66E},{0x8EAB, 0xA8AD},{0x8EAC, 0xB060},{0x8EB2, 0xB8FA},{0x8EBA, 0xBDF6},
+ {0x8EBD, 0xEBC8},{0x8EC0, 0xC2DF},{0x8EC2, 0xF355},{0x8EC9, 0xF9AC},{0x8ECA, 0xA8AE},{0x8ECB, 0xAAEE},{0x8ECC, 0xAD79},{0x8ECD, 0xAD78},
+ {0x8ECF, 0xB063},{0x8ED1, 0xD3E8},{0x8ED2, 0xB061},{0x8ED3, 0xD3E9},{0x8ED4, 0xB062},{0x8ED7, 0xD7DF},{0x8ED8, 0xD7DB},{0x8EDB, 0xB36D},
+ {0x8EDC, 0xD7DE},{0x8EDD, 0xD7DD},{0x8EDE, 0xD7DC},{0x8EDF, 0xB36E},{0x8EE0, 0xD7E0},{0x8EE1, 0xD7E1},{0x8EE5, 0xDC43},{0x8EE6, 0xDC41},
+ {0x8EE7, 0xDC45},{0x8EE8, 0xDC46},{0x8EE9, 0xDC4C},{0x8EEB, 0xDC48},{0x8EEC, 0xDC4A},{0x8EEE, 0xDC42},{0x8EEF, 0xDBFC},{0x8EF1, 0xDC49},
+ {0x8EF4, 0xDC4B},{0x8EF5, 0xDC44},{0x8EF6, 0xDC47},{0x8EF7, 0xDBFD},{0x8EF8, 0xB662},{0x8EF9, 0xDC40},{0x8EFA, 0xDBFE},{0x8EFB, 0xB661},
+ {0x8EFC, 0xB663},{0x8EFE, 0xB8FD},{0x8EFF, 0xE075},{0x8F00, 0xE077},{0x8F01, 0xE076},{0x8F02, 0xE07B},{0x8F03, 0xB8FB},{0x8F05, 0xE078},
+ {0x8F06, 0xE074},{0x8F07, 0xE079},{0x8F08, 0xE07A},{0x8F09, 0xB8FC},{0x8F0A, 0xB8FE},{0x8F0B, 0xE07C},{0x8F0D, 0xE467},{0x8F0E, 0xE466},
+ {0x8F10, 0xE464},{0x8F11, 0xE465},{0x8F12, 0xBBB3},{0x8F13, 0xBBB5},{0x8F14, 0xBBB2},{0x8F15, 0xBBB4},{0x8F16, 0xE84D},{0x8F17, 0xE84E},
+ {0x8F18, 0xE849},{0x8F1A, 0xE84A},{0x8F1B, 0xBDF8},{0x8F1C, 0xBDFD},{0x8F1D, 0xBDF7},{0x8F1E, 0xBDFE},{0x8F1F, 0xBDF9},{0x8F20, 0xE84B},
+ {0x8F23, 0xE84C},{0x8F24, 0xE848},{0x8F25, 0xBE40},{0x8F26, 0xBDFB},{0x8F29, 0xBDFA},{0x8F2A, 0xBDFC},{0x8F2C, 0xE847},{0x8F2E, 0xEBCA},
+ {0x8F2F, 0xBFE8},{0x8F32, 0xEBCC},{0x8F33, 0xBFEA},{0x8F34, 0xEBCF},{0x8F35, 0xEBCB},{0x8F36, 0xEBC9},{0x8F37, 0xEBCE},{0x8F38, 0xBFE9},
+ {0x8F39, 0xEBCD},{0x8F3B, 0xBFE7},{0x8F3E, 0xC1D3},{0x8F3F, 0xC1D6},{0x8F40, 0xEEC1},{0x8F42, 0xC1D4},{0x8F43, 0xEEC0},{0x8F44, 0xC1D2},
+ {0x8F45, 0xC1D5},{0x8F46, 0xF146},{0x8F47, 0xF147},{0x8F48, 0xF148},{0x8F49, 0xC2E0},{0x8F4B, 0xF149},{0x8F4D, 0xC2E1},{0x8F4E, 0xC3E2},
+ {0x8F4F, 0xF358},{0x8F50, 0xF359},{0x8F51, 0xF357},{0x8F52, 0xF356},{0x8F53, 0xF35A},{0x8F54, 0xC3E1},{0x8F55, 0xF4DD},{0x8F56, 0xF4DB},
+ {0x8F57, 0xF4DC},{0x8F58, 0xF4DE},{0x8F59, 0xF4DA},{0x8F5A, 0xF4DF},{0x8F5B, 0xF658},{0x8F5D, 0xF659},{0x8F5E, 0xF657},{0x8F5F, 0xC546},
+ {0x8F60, 0xF764},{0x8F61, 0xC5AF},{0x8F62, 0xF765},{0x8F63, 0xF848},{0x8F64, 0xF847},{0x8F9B, 0xA8AF},{0x8F9C, 0xB664},{0x8F9F, 0xB940},
+ {0x8FA3, 0xBBB6},{0x8FA6, 0xBFEC},{0x8FA8, 0xBFEB},{0x8FAD, 0xC3E3},{0x8FAE, 0xC47C},{0x8FAF, 0xC547},{0x8FB0, 0xA8B0},{0x8FB1, 0xB064},
+ {0x8FB2, 0xB941},{0x8FB4, 0xF35B},{0x8FBF, 0xCBA6},{0x8FC2, 0xA8B1},{0x8FC4, 0xA8B4},{0x8FC5, 0xA8B3},{0x8FC6, 0xA8B2},{0x8FC9, 0xCBA5},
+ {0x8FCB, 0xCDCD},{0x8FCD, 0xCDCF},{0x8FCE, 0xAAEF},{0x8FD1, 0xAAF1},{0x8FD2, 0xCDCC},{0x8FD3, 0xCDCE},{0x8FD4, 0xAAF0},{0x8FD5, 0xCDD1},
+ {0x8FD6, 0xCDD0},{0x8FD7, 0xCDD2},{0x8FE0, 0xD0B6},{0x8FE1, 0xD0B4},{0x8FE2, 0xAD7C},{0x8FE3, 0xD0B3},{0x8FE4, 0xADA3},{0x8FE5, 0xAD7E},
+ {0x8FE6, 0xAD7B},{0x8FE8, 0xADA4},{0x8FEA, 0xAD7D},{0x8FEB, 0xADA2},{0x8FED, 0xADA1},{0x8FEE, 0xD0B5},{0x8FF0, 0xAD7A},{0x8FF4, 0xB06A},
+ {0x8FF5, 0xD3EB},{0x8FF6, 0xD3F1},{0x8FF7, 0xB067},{0x8FF8, 0xB06E},{0x8FFA, 0xB069},{0x8FFB, 0xD3EE},{0x8FFC, 0xD3F0},{0x8FFD, 0xB06C},
+ {0x8FFE, 0xD3EA},{0x8FFF, 0xD3ED},{0x9000, 0xB068},{0x9001, 0xB065},{0x9002, 0xD3EC},{0x9003, 0xB06B},{0x9004, 0xD3EF},{0x9005, 0xB06D},
+ {0x9006, 0xB066},{0x900B, 0xD7E3},{0x900C, 0xD7E6},{0x900D, 0xB370},{0x900F, 0xB37A},{0x9010, 0xB376},{0x9011, 0xD7E4},{0x9014, 0xB37E},
+ {0x9015, 0xB377},{0x9016, 0xB37C},{0x9017, 0xB372},{0x9019, 0xB36F},{0x901A, 0xB371},{0x901B, 0xB37D},{0x901C, 0xD7E5},{0x901D, 0xB375},
+ {0x901E, 0xB378},{0x901F, 0xB374},{0x9020, 0xB379},{0x9021, 0xD7E7},{0x9022, 0xB37B},{0x9023, 0xB373},{0x9024, 0xD7E2},{0x902D, 0xDC4D},
+ {0x902E, 0xB665},{0x902F, 0xDC4F},{0x9031, 0xB667},{0x9032, 0xB669},{0x9034, 0xDC4E},{0x9035, 0xB666},{0x9036, 0xB66A},{0x9038, 0xB668},
+ {0x903C, 0xB947},{0x903D, 0xE0A3},{0x903E, 0xB94F},{0x903F, 0xE07E},{0x9041, 0xB950},{0x9042, 0xB945},{0x9044, 0xE0A1},{0x9047, 0xB94A},
+ {0x9049, 0xE0A2},{0x904A, 0xB943},{0x904B, 0xB942},{0x904D, 0xB94D},{0x904E, 0xB94C},{0x904F, 0xB94B},{0x9050, 0xB949},{0x9051, 0xB94E},
+ {0x9052, 0xE07D},{0x9053, 0xB944},{0x9054, 0xB946},{0x9055, 0xB948},{0x9058, 0xBBB8},{0x9059, 0xBBBB},{0x905B, 0xBBBF},{0x905C, 0xBBB9},
+ {0x905D, 0xBBBE},{0x905E, 0xBBBC},{0x9060, 0xBBB7},{0x9062, 0xBBBD},{0x9063, 0xBBBA},{0x9067, 0xE852},{0x9068, 0xBE43},{0x9069, 0xBE41},
+ {0x906B, 0xE853},{0x906D, 0xBE44},{0x906E, 0xBE42},{0x906F, 0xE851},{0x9070, 0xE850},{0x9072, 0xBFF0},{0x9073, 0xE84F},{0x9074, 0xBFEE},
+ {0x9075, 0xBFED},{0x9076, 0xEBD0},{0x9077, 0xBE45},{0x9078, 0xBFEF},{0x9079, 0xEBD1},{0x907A, 0xBFF2},{0x907B, 0xEBD2},{0x907C, 0xBFF1},
+ {0x907D, 0xC1D8},{0x907E, 0xEEC3},{0x907F, 0xC1D7},{0x9080, 0xC1DC},{0x9081, 0xC1DA},{0x9082, 0xC1DB},{0x9083, 0xC2E3},{0x9084, 0xC1D9},
+ {0x9085, 0xEEC2},{0x9086, 0xEBD3},{0x9087, 0xC2E2},{0x9088, 0xC2E4},{0x908A, 0xC3E4},{0x908B, 0xC3E5},{0x908D, 0xF4E0},{0x908F, 0xC5DE},
+ {0x9090, 0xC5DD},{0x9091, 0xA8B6},{0x9094, 0xCA55},{0x9095, 0xB06F},{0x9097, 0xCA52},{0x9098, 0xCA53},{0x9099, 0xCA51},{0x909B, 0xCA54},
+ {0x909E, 0xCBAA},{0x909F, 0xCBA7},{0x90A0, 0xCBAC},{0x90A1, 0xCBA8},{0x90A2, 0xA8B7},{0x90A3, 0xA8BA},{0x90A5, 0xCBA9},{0x90A6, 0xA8B9},
+ {0x90A7, 0xCBAB},{0x90AA, 0xA8B8},{0x90AF, 0xCDD5},{0x90B0, 0xCDD7},{0x90B1, 0xAAF4},{0x90B2, 0xCDD3},{0x90B3, 0xCDD6},{0x90B4, 0xCDD4},
+ {0x90B5, 0xAAF2},{0x90B6, 0xAAF5},{0x90B8, 0xAAF3},{0x90BD, 0xD0B8},{0x90BE, 0xD0BC},{0x90BF, 0xD0B9},{0x90C1, 0xADA7},{0x90C3, 0xADA8},
+ {0x90C5, 0xD0BB},{0x90C7, 0xD0BD},{0x90C8, 0xD0BF},{0x90CA, 0xADA5},{0x90CB, 0xD0BE},{0x90CE, 0xADA6},{0x90D4, 0xD7EE},{0x90D5, 0xD0BA},
+ {0x90D6, 0xD3F2},{0x90D7, 0xD3FB},{0x90D8, 0xD3F9},{0x90D9, 0xD3F4},{0x90DA, 0xD3F5},{0x90DB, 0xD3FA},{0x90DC, 0xD3FC},{0x90DD, 0xB071},
+ {0x90DF, 0xD3F7},{0x90E0, 0xD3F3},{0x90E1, 0xB070},{0x90E2, 0xB072},{0x90E3, 0xD3F6},{0x90E4, 0xD3FD},{0x90E5, 0xD3F8},{0x90E8, 0xB3A1},
+ {0x90E9, 0xD7F1},{0x90EA, 0xD7E9},{0x90EB, 0xD7EF},{0x90EC, 0xD7F0},{0x90ED, 0xB3A2},{0x90EF, 0xD7E8},{0x90F0, 0xD7EA},{0x90F1, 0xD0B7},
+ {0x90F2, 0xD7EC},{0x90F3, 0xD7ED},{0x90F4, 0xD7EB},{0x90F5, 0xB66C},{0x90F9, 0xDC56},{0x90FA, 0xEBD4},{0x90FB, 0xDC57},{0x90FC, 0xDC54},
+ {0x90FD, 0xB3A3},{0x90FE, 0xB66E},{0x90FF, 0xDC53},{0x9100, 0xDC59},{0x9101, 0xDC58},{0x9102, 0xB66B},{0x9103, 0xDC5C},{0x9104, 0xDC52},
+ {0x9105, 0xDC5B},{0x9106, 0xDC50},{0x9107, 0xDC5A},{0x9108, 0xDC55},{0x9109, 0xB66D},{0x910B, 0xE0AA},{0x910D, 0xE0A5},{0x910E, 0xE0AB},
+ {0x910F, 0xE0A6},{0x9110, 0xE0A4},{0x9111, 0xE0A7},{0x9112, 0xB951},{0x9114, 0xE0A9},{0x9116, 0xE0A8},{0x9117, 0xB952},{0x9118, 0xBBC1},
+ {0x9119, 0xBBC0},{0x911A, 0xE46E},{0x911B, 0xE471},{0x911C, 0xE469},{0x911D, 0xE46D},{0x911E, 0xBBC2},{0x911F, 0xE46C},{0x9120, 0xE46A},
+ {0x9121, 0xE470},{0x9122, 0xE46B},{0x9123, 0xE468},{0x9124, 0xE46F},{0x9126, 0xE859},{0x9127, 0xBE48},{0x9128, 0xF14A},{0x9129, 0xE856},
+ {0x912A, 0xE857},{0x912B, 0xE855},{0x912C, 0xDC51},{0x912D, 0xBE47},{0x912E, 0xE85A},{0x912F, 0xE854},{0x9130, 0xBE46},{0x9131, 0xBE49},
+ {0x9132, 0xE858},{0x9133, 0xEBD5},{0x9134, 0xBFF3},{0x9135, 0xEBD6},{0x9136, 0xEBD7},{0x9138, 0xEEC4},{0x9139, 0xC1DD},{0x913A, 0xF14B},
+ {0x913B, 0xF14C},{0x913E, 0xF14D},{0x913F, 0xF35D},{0x9140, 0xF35C},{0x9141, 0xF4E2},{0x9143, 0xF4E1},{0x9144, 0xF65B},{0x9145, 0xF65C},
+ {0x9146, 0xF65A},{0x9147, 0xF766},{0x9148, 0xC5B0},{0x9149, 0xA8BB},{0x914A, 0xADAA},{0x914B, 0xADA9},{0x914C, 0xB075},{0x914D, 0xB074},
+ {0x914E, 0xD440},{0x914F, 0xD441},{0x9150, 0xD3FE},{0x9152, 0xB073},{0x9153, 0xD7F5},{0x9155, 0xD7F6},{0x9156, 0xD7F2},{0x9157, 0xB3A4},
+ {0x9158, 0xD7F3},{0x915A, 0xD7F4},{0x915F, 0xDC5F},{0x9160, 0xDC61},{0x9161, 0xDC5D},{0x9162, 0xDC60},{0x9163, 0xB66F},{0x9164, 0xDC5E},
+ {0x9165, 0xB670},{0x9168, 0xDD73},{0x9169, 0xB955},{0x916A, 0xB954},{0x916C, 0xB953},{0x916E, 0xE0AC},{0x916F, 0xE0AD},{0x9172, 0xE473},
+ {0x9173, 0xE475},{0x9174, 0xBBC6},{0x9175, 0xBBC3},{0x9177, 0xBBC5},{0x9178, 0xBBC4},{0x9179, 0xE474},{0x917A, 0xE472},{0x9180, 0xE861},
+ {0x9181, 0xE85E},{0x9182, 0xE85F},{0x9183, 0xBE4D},{0x9184, 0xE860},{0x9185, 0xE85B},{0x9186, 0xE85C},{0x9187, 0xBE4A},{0x9189, 0xBE4B},
+ {0x918A, 0xE85D},{0x918B, 0xBE4C},{0x918D, 0xEBDB},{0x918F, 0xEBDC},{0x9190, 0xEBD9},{0x9191, 0xEBDA},{0x9192, 0xBFF4},{0x9193, 0xEBD8},
+ {0x9199, 0xEEC8},{0x919A, 0xEEC5},{0x919B, 0xEEC7},{0x919C, 0xC1E0},{0x919D, 0xEECB},{0x919E, 0xC1DF},{0x919F, 0xEEC9},{0x91A0, 0xEECC},
+ {0x91A1, 0xEECA},{0x91A2, 0xEEC6},{0x91A3, 0xC1DE},{0x91A5, 0xF14F},{0x91A7, 0xF150},{0x91A8, 0xF14E},{0x91AA, 0xF152},{0x91AB, 0xC2E5},
+ {0x91AC, 0xC2E6},{0x91AD, 0xF35F},{0x91AE, 0xC3E7},{0x91AF, 0xF151},{0x91B0, 0xF35E},{0x91B1, 0xC3E6},{0x91B2, 0xF4E5},{0x91B3, 0xF4E6},
+ {0x91B4, 0xC4BF},{0x91B5, 0xF4E4},{0x91B7, 0xF4E3},{0x91B9, 0xF65D},{0x91BA, 0xC548},{0x91BC, 0xF849},{0x91BD, 0xF8C8},{0x91BE, 0xF8C7},
+ {0x91C0, 0xC643},{0x91C1, 0xC65D},{0x91C2, 0xF8C9},{0x91C3, 0xF971},{0x91C5, 0xC66F},{0x91C6, 0xA8BC},{0x91C7, 0xAAF6},{0x91C9, 0xB956},
+ {0x91CB, 0xC4C0},{0x91CC, 0xA8BD},{0x91CD, 0xADAB},{0x91CE, 0xB3A5},{0x91CF, 0xB671},{0x91D0, 0xC2E7},{0x91D1, 0xAAF7},{0x91D3, 0xD0C1},
+ {0x91D4, 0xD0C0},{0x91D5, 0xD442},{0x91D7, 0xB078},{0x91D8, 0xB076},{0x91D9, 0xB07A},{0x91DA, 0xD444},{0x91DC, 0xB079},{0x91DD, 0xB077},
+ {0x91E2, 0xD443},{0x91E3, 0xB3A8},{0x91E4, 0xD7FC},{0x91E6, 0xB3A7},{0x91E7, 0xB3A9},{0x91E8, 0xD842},{0x91E9, 0xB3AB},{0x91EA, 0xD7FE},
+ {0x91EB, 0xD840},{0x91EC, 0xD7F7},{0x91ED, 0xB3AA},{0x91EE, 0xD843},{0x91F1, 0xD7F9},{0x91F3, 0xD7FA},{0x91F4, 0xD7F8},{0x91F5, 0xB3A6},
+ {0x91F7, 0xD841},{0x91F8, 0xD7FB},{0x91F9, 0xD7FD},{0x91FD, 0xDC6D},{0x91FF, 0xDC6C},{0x9200, 0xDC6A},{0x9201, 0xDC62},{0x9202, 0xDC71},
+ {0x9203, 0xDC65},{0x9204, 0xDC6F},{0x9205, 0xDC76},{0x9206, 0xDC6E},{0x9207, 0xB679},{0x9209, 0xB675},{0x920A, 0xDC63},{0x920C, 0xDC69},
+ {0x920D, 0xB677},{0x920F, 0xDC68},{0x9210, 0xB678},{0x9211, 0xB67A},{0x9212, 0xDC6B},{0x9214, 0xB672},{0x9215, 0xB673},{0x9216, 0xDC77},
+ {0x9217, 0xDC75},{0x9219, 0xDC74},{0x921A, 0xDC66},{0x921C, 0xDC72},{0x921E, 0xB676},{0x9223, 0xB674},{0x9224, 0xDC73},{0x9225, 0xDC64},
+ {0x9226, 0xDC67},{0x9227, 0xDC70},{0x922D, 0xE4BA},{0x922E, 0xE0B7},{0x9230, 0xE0B0},{0x9231, 0xE0C3},{0x9232, 0xE0CC},{0x9233, 0xE0B3},
+ {0x9234, 0xB961},{0x9236, 0xE0C0},{0x9237, 0xB957},{0x9238, 0xB959},{0x9239, 0xB965},{0x923A, 0xE0B1},{0x923D, 0xB95A},{0x923E, 0xB95C},
+ {0x923F, 0xB966},{0x9240, 0xB95B},{0x9245, 0xB964},{0x9246, 0xE0B9},{0x9248, 0xE0AE},{0x9249, 0xB962},{0x924A, 0xE0B8},{0x924B, 0xB95E},
+ {0x924C, 0xE0CA},{0x924D, 0xB963},{0x924E, 0xE0C8},{0x924F, 0xE0BC},{0x9250, 0xE0C6},{0x9251, 0xB960},{0x9252, 0xE0AF},{0x9253, 0xE0C9},
+ {0x9254, 0xE0C4},{0x9256, 0xE0CB},{0x9257, 0xB958},{0x925A, 0xB967},{0x925B, 0xB95D},{0x925E, 0xE0B5},{0x9260, 0xE0BD},{0x9261, 0xE0C1},
+ {0x9263, 0xE0C5},{0x9264, 0xB95F},{0x9265, 0xE0B4},{0x9266, 0xE0B2},{0x9267, 0xE0BE},{0x926C, 0xE0BB},{0x926D, 0xE0BA},{0x926F, 0xE0BF},
+ {0x9270, 0xE0C2},{0x9272, 0xE0C7},{0x9276, 0xE478},{0x9278, 0xBBC7},{0x9279, 0xE4A4},{0x927A, 0xE47A},{0x927B, 0xBBCC},{0x927C, 0xBBD0},
+ {0x927D, 0xE4AD},{0x927E, 0xE4B5},{0x927F, 0xE4A6},{0x9280, 0xBBC8},{0x9282, 0xE4AA},{0x9283, 0xE0B6},{0x9285, 0xBBC9},{0x9286, 0xE4B1},
+ {0x9287, 0xE4B6},{0x9288, 0xE4AE},{0x928A, 0xE4B0},{0x928B, 0xE4B9},{0x928C, 0xE4B2},{0x928D, 0xE47E},{0x928E, 0xE4A9},{0x9291, 0xBBD1},
+ {0x9293, 0xBBCD},{0x9294, 0xE47C},{0x9295, 0xE4AB},{0x9296, 0xBBCB},{0x9297, 0xE4A5},{0x9298, 0xBBCA},{0x9299, 0xE4B3},{0x929A, 0xE4A2},
+ {0x929B, 0xE479},{0x929C, 0xBBCE},{0x929D, 0xE4B8},{0x92A0, 0xE47B},{0x92A1, 0xE4AF},{0x92A2, 0xE4AC},{0x92A3, 0xE4A7},{0x92A4, 0xE477},
+ {0x92A5, 0xE476},{0x92A6, 0xE4A1},{0x92A7, 0xE4B4},{0x92A8, 0xBBCF},{0x92A9, 0xE4B7},{0x92AA, 0xE47D},{0x92AB, 0xE4A3},{0x92AC, 0xBE52},
+ {0x92B2, 0xBE5A},{0x92B3, 0xBE55},{0x92B4, 0xE8A4},{0x92B5, 0xE8A1},{0x92B6, 0xE867},{0x92B7, 0xBE50},{0x92BB, 0xBE4F},{0x92BC, 0xBE56},
+ {0x92C0, 0xE865},{0x92C1, 0xBE54},{0x92C2, 0xE871},{0x92C3, 0xE863},{0x92C4, 0xE864},{0x92C5, 0xBE4E},{0x92C6, 0xE8A3},{0x92C7, 0xBE58},
+ {0x92C8, 0xE874},{0x92C9, 0xE879},{0x92CA, 0xE873},{0x92CB, 0xEBEE},{0x92CC, 0xE86F},{0x92CD, 0xE877},{0x92CE, 0xE875},{0x92CF, 0xE868},
+ {0x92D0, 0xE862},{0x92D1, 0xE87D},{0x92D2, 0xBE57},{0x92D3, 0xE87E},{0x92D5, 0xE878},{0x92D7, 0xE86D},{0x92D8, 0xE86B},{0x92D9, 0xE866},
+ {0x92DD, 0xE86E},{0x92DE, 0xE87B},{0x92DF, 0xE86A},{0x92E0, 0xE87A},{0x92E1, 0xE8A2},{0x92E4, 0xBE53},{0x92E6, 0xE876},{0x92E7, 0xE87C},
+ {0x92E8, 0xE872},{0x92E9, 0xE86C},{0x92EA, 0xBE51},{0x92EE, 0xE4A8},{0x92EF, 0xE870},{0x92F0, 0xBE59},{0x92F1, 0xE869},{0x92F7, 0xEBF4},
+ {0x92F8, 0xBFF7},{0x92F9, 0xEBF3},{0x92FA, 0xEBF0},{0x92FB, 0xEC44},{0x92FC, 0xBFFB},{0x92FE, 0xEC41},{0x92FF, 0xEBF8},{0x9300, 0xEC43},
+ {0x9301, 0xEBE9},{0x9302, 0xEBF6},{0x9304, 0xBFFD},{0x9306, 0xEBE1},{0x9308, 0xEBDF},{0x9309, 0xEC42},{0x930B, 0xEC40},{0x930C, 0xEBFE},
+ {0x930D, 0xEBED},{0x930E, 0xEBEC},{0x930F, 0xEBE2},{0x9310, 0xC040},{0x9312, 0xEBE8},{0x9313, 0xEBF2},{0x9314, 0xEBFD},{0x9315, 0xC043},
+ {0x9316, 0xEC45},{0x9318, 0xC1E8},{0x9319, 0xC045},{0x931A, 0xBFFE},{0x931B, 0xEBE6},{0x931D, 0xEBEF},{0x931E, 0xEBDE},{0x931F, 0xEBE0},
+ {0x9320, 0xBFF5},{0x9321, 0xC042},{0x9322, 0xBFFA},{0x9323, 0xEBE7},{0x9324, 0xEBF7},{0x9325, 0xEBF1},{0x9326, 0xC041},{0x9327, 0xEBDD},
+ {0x9328, 0xC1E3},{0x9329, 0xEBF9},{0x932A, 0xEBFC},{0x932B, 0xBFFC},{0x932D, 0xEBEB},{0x932E, 0xC044},{0x932F, 0xBFF9},{0x9333, 0xBFF8},
+ {0x9334, 0xEBF5},{0x9335, 0xEBFB},{0x9336, 0xBFF6},{0x9338, 0xEBE4},{0x9339, 0xEBFA},{0x933C, 0xEBE5},{0x9346, 0xEBEA},{0x9347, 0xEED2},
+ {0x9349, 0xEED7},{0x934A, 0xC1E5},{0x934B, 0xC1E7},{0x934C, 0xEEDD},{0x934D, 0xC1E1},{0x934E, 0xEEEC},{0x934F, 0xEEE3},{0x9350, 0xEED8},
+ {0x9351, 0xEED9},{0x9352, 0xEEE2},{0x9354, 0xC1EE},{0x9355, 0xEEE1},{0x9356, 0xEED1},{0x9357, 0xEEE0},{0x9358, 0xEED4},{0x9359, 0xEEED},
+ {0x935A, 0xC1ED},{0x935B, 0xC1EB},{0x935C, 0xEED5},{0x935E, 0xEEE8},{0x9360, 0xEEDA},{0x9361, 0xEEE7},{0x9363, 0xEEE9},{0x9364, 0xEED0},
+ {0x9365, 0xC1E6},{0x9367, 0xEEEA},{0x936A, 0xEEDE},{0x936C, 0xC1EA},{0x936D, 0xEEDB},{0x9370, 0xC1EC},{0x9371, 0xEEE4},{0x9375, 0xC1E4},
+ {0x9376, 0xEED6},{0x9377, 0xEEE5},{0x9379, 0xEEDF},{0x937A, 0xEBE3},{0x937B, 0xEEE6},{0x937C, 0xEED3},{0x937E, 0xC1E9},{0x9380, 0xEEEB},
+ {0x9382, 0xC1E2},{0x9383, 0xEECE},{0x9388, 0xF160},{0x9389, 0xF159},{0x938A, 0xC2E9},{0x938C, 0xF154},{0x938D, 0xF163},{0x938E, 0xF15B},
+ {0x938F, 0xEEDC},{0x9391, 0xF165},{0x9392, 0xF155},{0x9394, 0xC2E8},{0x9395, 0xF15F},{0x9396, 0xC2EA},{0x9397, 0xC2F2},{0x9398, 0xC2F0},
+ {0x9399, 0xF161},{0x939A, 0xC2F1},{0x939B, 0xF157},{0x939D, 0xF158},{0x939E, 0xF15D},{0x939F, 0xF162},{0x93A1, 0xEECD},{0x93A2, 0xC2EB},
+ {0x93A3, 0xF16A},{0x93A4, 0xF167},{0x93A5, 0xF16B},{0x93A6, 0xF15E},{0x93A7, 0xF15A},{0x93A8, 0xF168},{0x93A9, 0xF36A},{0x93AA, 0xF15C},
+ {0x93AC, 0xC2EE},{0x93AE, 0xC2ED},{0x93AF, 0xEECF},{0x93B0, 0xC2EF},{0x93B1, 0xF164},{0x93B2, 0xF166},{0x93B3, 0xC2EC},{0x93B4, 0xF169},
+ {0x93B5, 0xF153},{0x93B7, 0xF156},{0x93C0, 0xF373},{0x93C2, 0xF363},{0x93C3, 0xC3EB},{0x93C4, 0xF371},{0x93C7, 0xF361},{0x93C8, 0xC3EC},
+ {0x93CA, 0xF36C},{0x93CC, 0xF368},{0x93CD, 0xC3F1},{0x93CE, 0xF372},{0x93CF, 0xF362},{0x93D0, 0xF365},{0x93D1, 0xC3E9},{0x93D2, 0xF374},
+ {0x93D4, 0xF36D},{0x93D5, 0xF370},{0x93D6, 0xC3EF},{0x93D7, 0xC3F4},{0x93D8, 0xC3F2},{0x93D9, 0xF369},{0x93DA, 0xF364},{0x93DC, 0xC3ED},
+ {0x93DD, 0xC3EE},{0x93DE, 0xF360},{0x93DF, 0xC3EA},{0x93E1, 0xC3E8},{0x93E2, 0xC3F0},{0x93E3, 0xF36F},{0x93E4, 0xC3F3},{0x93E6, 0xF36B},
+ {0x93E7, 0xF375},{0x93E8, 0xC3F5},{0x93EC, 0xF367},{0x93EE, 0xF36E},{0x93F5, 0xF4F3},{0x93F6, 0xF542},{0x93F7, 0xF4F5},{0x93F8, 0xF4FC},
+ {0x93F9, 0xF366},{0x93FA, 0xF4FA},{0x93FB, 0xF4E9},{0x93FC, 0xF540},{0x93FD, 0xC4C3},{0x93FE, 0xF4ED},{0x93FF, 0xF4FE},{0x9400, 0xF4F4},
+ {0x9403, 0xC4C2},{0x9406, 0xF544},{0x9407, 0xF4F6},{0x9409, 0xF4FB},{0x940A, 0xF4FD},{0x940B, 0xF4E7},{0x940C, 0xF541},{0x940D, 0xF4F2},
+ {0x940E, 0xF4F7},{0x940F, 0xF4EB},{0x9410, 0xF4EF},{0x9411, 0xF543},{0x9412, 0xF4F9},{0x9413, 0xF4E8},{0x9414, 0xF4EC},{0x9415, 0xF4EE},
+ {0x9416, 0xF4F8},{0x9418, 0xC4C1},{0x9419, 0xF4F1},{0x9420, 0xF4EA},{0x9428, 0xF4F0},{0x9429, 0xF661},{0x942A, 0xF666},{0x942B, 0xC54F},
+ {0x942C, 0xF668},{0x942E, 0xC549},{0x9430, 0xF664},{0x9431, 0xF66A},{0x9432, 0xC54E},{0x9433, 0xC54A},{0x9435, 0xC54B},{0x9436, 0xF660},
+ {0x9437, 0xF667},{0x9438, 0xC54D},{0x9439, 0xF665},{0x943A, 0xC54C},{0x943B, 0xF65F},{0x943C, 0xF663},{0x943D, 0xF662},{0x943F, 0xF65E},
+ {0x9440, 0xF669},{0x9444, 0xC5B1},{0x9445, 0xF76D},{0x9446, 0xF770},{0x9447, 0xF76C},{0x9448, 0xF76E},{0x9449, 0xF76F},{0x944A, 0xF769},
+ {0x944B, 0xF76A},{0x944C, 0xF767},{0x944F, 0xF76B},{0x9450, 0xF768},{0x9451, 0xC5B2},{0x9452, 0xC5B3},{0x9455, 0xF84B},{0x9457, 0xF84D},
+ {0x945D, 0xF84C},{0x945E, 0xF84E},{0x9460, 0xC5E0},{0x9462, 0xF84A},{0x9463, 0xC5DF},{0x9464, 0xC5E1},{0x9468, 0xF8CB},{0x9469, 0xF8CC},
+ {0x946A, 0xC644},{0x946B, 0xF8CA},{0x946D, 0xF953},{0x946E, 0xF952},{0x946F, 0xF954},{0x9470, 0xC65F},{0x9471, 0xF955},{0x9472, 0xC65E},
+ {0x9473, 0xF956},{0x9474, 0xF972},{0x9475, 0xF975},{0x9476, 0xF974},{0x9477, 0xC668},{0x9478, 0xF973},{0x947C, 0xC672},{0x947D, 0xC670},
+ {0x947E, 0xC671},{0x947F, 0xC677},{0x9480, 0xF9C0},{0x9481, 0xF9C1},{0x9482, 0xF9BF},{0x9483, 0xF9C9},{0x9577, 0xAAF8},{0x957A, 0xD844},
+ {0x957B, 0xDC78},{0x957C, 0xE8A5},{0x957D, 0xF376},{0x9580, 0xAAF9},{0x9582, 0xADAC},{0x9583, 0xB07B},{0x9586, 0xD845},{0x9588, 0xD846},
+ {0x9589, 0xB3AC},{0x958B, 0xB67D},{0x958C, 0xDC7A},{0x958D, 0xDC79},{0x958E, 0xB6A3},{0x958F, 0xB67C},{0x9590, 0xDC7B},{0x9591, 0xB67E},
+ {0x9592, 0xB6A2},{0x9593, 0xB6A1},{0x9594, 0xB67B},{0x9598, 0xB968},{0x959B, 0xE0D0},{0x959C, 0xE0CE},{0x959E, 0xE0CF},{0x959F, 0xE0CD},
+ {0x95A1, 0xBBD2},{0x95A3, 0xBBD5},{0x95A4, 0xBBD7},{0x95A5, 0xBBD6},{0x95A8, 0xBBD3},{0x95A9, 0xBBD4},{0x95AB, 0xE8A7},{0x95AC, 0xE8A6},
+ {0x95AD, 0xBE5B},{0x95AE, 0xE8A8},{0x95B0, 0xE8A9},{0x95B1, 0xBE5C},{0x95B5, 0xEC4D},{0x95B6, 0xEC4B},{0x95B7, 0xEEF3},{0x95B9, 0xEC49},
+ {0x95BA, 0xEC4A},{0x95BB, 0xC046},{0x95BC, 0xEC46},{0x95BD, 0xEC4E},{0x95BE, 0xEC48},{0x95BF, 0xEC4C},{0x95C0, 0xEEEF},{0x95C3, 0xEEF1},
+ {0x95C5, 0xEEF2},{0x95C6, 0xC1F3},{0x95C7, 0xEEEE},{0x95C8, 0xC1F2},{0x95C9, 0xEEF0},{0x95CA, 0xC1EF},{0x95CB, 0xC1F0},{0x95CC, 0xC1F1},
+ {0x95CD, 0xEC47},{0x95D0, 0xC2F5},{0x95D1, 0xF16E},{0x95D2, 0xF16C},{0x95D3, 0xF16D},{0x95D4, 0xC2F3},{0x95D5, 0xC2F6},{0x95D6, 0xC2F4},
+ {0x95DA, 0xF377},{0x95DB, 0xF378},{0x95DC, 0xC3F6},{0x95DE, 0xF545},{0x95DF, 0xF547},{0x95E0, 0xF546},{0x95E1, 0xC4C4},{0x95E2, 0xC550},
+ {0x95E3, 0xF66D},{0x95E4, 0xF66C},{0x95E5, 0xF66B},{0x961C, 0xAAFA},{0x961E, 0xC9AA},{0x9620, 0xCA58},{0x9621, 0xA6E9},{0x9622, 0xCA56},
+ {0x9623, 0xCA59},{0x9624, 0xCA57},{0x9628, 0xCBAE},{0x962A, 0xA8C1},{0x962C, 0xA8C2},{0x962D, 0xCBB0},{0x962E, 0xA8BF},{0x962F, 0xCBAF},
+ {0x9630, 0xCBAD},{0x9631, 0xA8C0},{0x9632, 0xA8BE},{0x9639, 0xCDD8},{0x963A, 0xCDDB},{0x963B, 0xAAFD},{0x963C, 0xCDDA},{0x963D, 0xCDD9},
+ {0x963F, 0xAAFC},{0x9640, 0xAAFB},{0x9642, 0xAB40},{0x9643, 0xCDDC},{0x9644, 0xAAFE},{0x964A, 0xD0C6},{0x964B, 0xADAE},{0x964C, 0xADAF},
+ {0x964D, 0xADB0},{0x964E, 0xD0C7},{0x964F, 0xD0C3},{0x9650, 0xADAD},{0x9651, 0xD0C4},{0x9653, 0xD0C5},{0x9654, 0xD0C2},{0x9658, 0xB0A4},
+ {0x965B, 0xB0A1},{0x965C, 0xD445},{0x965D, 0xB0A2},{0x965E, 0xB0A5},{0x965F, 0xD446},{0x9661, 0xB07E},{0x9662, 0xB07C},{0x9663, 0xB07D},
+ {0x9664, 0xB0A3},{0x966A, 0xB3AD},{0x966B, 0xD849},{0x966C, 0xB3B5},{0x966D, 0xD848},{0x966F, 0xD84B},{0x9670, 0xB3B1},{0x9671, 0xD84A},
+ {0x9672, 0xB6AB},{0x9673, 0xB3AF},{0x9674, 0xB3B2},{0x9675, 0xB3AE},{0x9676, 0xB3B3},{0x9677, 0xB3B4},{0x9678, 0xB3B0},{0x967C, 0xD847},
+ {0x967D, 0xB6A7},{0x967E, 0xDC7D},{0x9680, 0xDCA3},{0x9683, 0xDCA2},{0x9684, 0xB6AC},{0x9685, 0xB6A8},{0x9686, 0xB6A9},{0x9687, 0xDC7C},
+ {0x9688, 0xDC7E},{0x9689, 0xDCA1},{0x968A, 0xB6A4},{0x968B, 0xB6A6},{0x968D, 0xB6AA},{0x968E, 0xB6A5},{0x9691, 0xE0D3},{0x9692, 0xE0D1},
+ {0x9693, 0xE0D2},{0x9694, 0xB96A},{0x9695, 0xB96B},{0x9697, 0xE0D4},{0x9698, 0xB969},{0x9699, 0xBBD8},{0x969B, 0xBBDA},{0x969C, 0xBBD9},
+ {0x969E, 0xE4BB},{0x96A1, 0xE4BC},{0x96A2, 0xE8AB},{0x96A4, 0xE8AA},{0x96A7, 0xC047},{0x96A8, 0xC048},{0x96A9, 0xEC4F},{0x96AA, 0xC049},
+ {0x96AC, 0xEEF6},{0x96AE, 0xEEF4},{0x96B0, 0xEEF5},{0x96B1, 0xC1F4},{0x96B3, 0xF16F},{0x96B4, 0xC3F7},{0x96B8, 0xC1F5},{0x96B9, 0xAB41},
+ {0x96BB, 0xB0A6},{0x96BC, 0xD447},{0x96BF, 0xD84C},{0x96C0, 0xB3B6},{0x96C1, 0xB6AD},{0x96C2, 0xDCA4},{0x96C3, 0xDCA6},{0x96C4, 0xB6AF},
+ {0x96C5, 0xB6AE},{0x96C6, 0xB6B0},{0x96C7, 0xB6B1},{0x96C8, 0xDCA5},{0x96C9, 0xB96E},{0x96CA, 0xB96F},{0x96CB, 0xB96D},{0x96CC, 0xBBDB},
+ {0x96CD, 0xB96C},{0x96CE, 0xE0D5},{0x96D2, 0xBBDC},{0x96D3, 0xE8AC},{0x96D4, 0xEC50},{0x96D5, 0xC04A},{0x96D6, 0xC1F6},{0x96D7, 0xF170},
+ {0x96D8, 0xF174},{0x96D9, 0xC2F9},{0x96DA, 0xF171},{0x96DB, 0xC2FA},{0x96DC, 0xC2F8},{0x96DD, 0xF175},{0x96DE, 0xC2FB},{0x96DF, 0xF173},
+ {0x96E1, 0xF379},{0x96E2, 0xC2F7},{0x96E3, 0xC3F8},{0x96E5, 0xF8CD},{0x96E8, 0xAB42},{0x96E9, 0xB3B8},{0x96EA, 0xB3B7},{0x96EF, 0xB6B2},
+ {0x96F0, 0xDCA8},{0x96F1, 0xDCA7},{0x96F2, 0xB6B3},{0x96F5, 0xE0D9},{0x96F6, 0xB973},{0x96F7, 0xB970},{0x96F8, 0xE0D8},{0x96F9, 0xB972},
+ {0x96FA, 0xE0D6},{0x96FB, 0xB971},{0x96FD, 0xE0D7},{0x96FF, 0xE4BD},{0x9700, 0xBBDD},{0x9702, 0xE8AF},{0x9704, 0xBE5D},{0x9705, 0xE8AD},
+ {0x9706, 0xBE5E},{0x9707, 0xBE5F},{0x9708, 0xE8AE},{0x9709, 0xBE60},{0x970B, 0xEC51},{0x970D, 0xC04E},{0x970E, 0xC04B},{0x970F, 0xC050},
+ {0x9710, 0xEC53},{0x9711, 0xC04C},{0x9712, 0xEC52},{0x9713, 0xC04F},{0x9716, 0xC04D},{0x9718, 0xEEF9},{0x9719, 0xEEFB},{0x971C, 0xC1F7},
+ {0x971D, 0xEEFA},{0x971E, 0xC1F8},{0x971F, 0xEEF8},{0x9720, 0xEEF7},{0x9722, 0xF177},{0x9723, 0xF176},{0x9724, 0xC2FC},{0x9725, 0xF178},
+ {0x9726, 0xF37E},{0x9727, 0xC3FA},{0x9728, 0xF37D},{0x9729, 0xF37A},{0x972A, 0xC3F9},{0x972B, 0xF37B},{0x972C, 0xF37C},{0x972E, 0xF548},
+ {0x972F, 0xF549},{0x9730, 0xC4C5},{0x9732, 0xC553},{0x9735, 0xF66E},{0x9738, 0xC551},{0x9739, 0xC552},{0x973A, 0xF66F},{0x973D, 0xC5B4},
+ {0x973E, 0xC5B5},{0x973F, 0xF771},{0x9742, 0xC645},{0x9743, 0xF8CF},{0x9744, 0xC647},{0x9746, 0xF8CE},{0x9747, 0xF8D0},{0x9748, 0xC646},
+ {0x9749, 0xF957},{0x974B, 0xF9AD},{0x9752, 0xAB43},{0x9756, 0xB974},{0x9758, 0xE4BE},{0x975A, 0xE8B0},{0x975B, 0xC051},{0x975C, 0xC052},
+ {0x975E, 0xAB44},{0x9760, 0xBE61},{0x9761, 0xC3FB},{0x9762, 0xADB1},{0x9766, 0xC053},{0x9768, 0xC5E2},{0x9769, 0xADB2},{0x976A, 0xD84D},
+ {0x976C, 0xDCA9},{0x976E, 0xDCAB},{0x9770, 0xDCAA},{0x9772, 0xE0DD},{0x9773, 0xE0DA},{0x9774, 0xB975},{0x9776, 0xB976},{0x9777, 0xE0DB},
+ {0x9778, 0xE0DC},{0x977A, 0xE4C0},{0x977B, 0xE4C5},{0x977C, 0xBBDE},{0x977D, 0xE4BF},{0x977E, 0xE4C1},{0x977F, 0xE4C8},{0x9780, 0xE4C3},
+ {0x9781, 0xE4C7},{0x9782, 0xE4C4},{0x9783, 0xE4C2},{0x9784, 0xE4C6},{0x9785, 0xBBDF},{0x9788, 0xE8B3},{0x978A, 0xE8B1},{0x978B, 0xBE63},
+ {0x978D, 0xBE62},{0x978E, 0xE8B2},{0x978F, 0xBE64},{0x9794, 0xEC56},{0x9797, 0xEC55},{0x9798, 0xC054},{0x9799, 0xEC54},{0x979A, 0xEEFC},
+ {0x979C, 0xEEFE},{0x979D, 0xEF41},{0x979E, 0xEF40},{0x97A0, 0xC1F9},{0x97A1, 0xEEFD},{0x97A2, 0xF1A1},{0x97A3, 0xC2FD},{0x97A4, 0xF17D},
+ {0x97A5, 0xF1A2},{0x97A6, 0xC2FE},{0x97A8, 0xF17B},{0x97AA, 0xF17E},{0x97AB, 0xF17C},{0x97AC, 0xF179},{0x97AD, 0xC340},{0x97AE, 0xF17A},
+ {0x97B3, 0xF3A1},{0x97B6, 0xF3A3},{0x97B7, 0xF3A2},{0x97B9, 0xF54A},{0x97BB, 0xF54B},{0x97BF, 0xF670},{0x97C1, 0xC5B7},{0x97C3, 0xC5B6},
+ {0x97C4, 0xF84F},{0x97C5, 0xF850},{0x97C6, 0xC648},{0x97C7, 0xF8D1},{0x97C9, 0xC669},{0x97CB, 0xADB3},{0x97CC, 0xB6B4},{0x97CD, 0xE4CA},
+ {0x97CE, 0xE4C9},{0x97CF, 0xE8B5},{0x97D0, 0xE8B4},{0x97D3, 0xC1FA},{0x97D4, 0xEF43},{0x97D5, 0xEF42},{0x97D6, 0xF1A5},{0x97D7, 0xF1A3},
+ {0x97D8, 0xF1A6},{0x97D9, 0xF1A4},{0x97DC, 0xC3FC},{0x97DD, 0xF3A4},{0x97DE, 0xF3A5},{0x97DF, 0xF3A6},{0x97E1, 0xF671},{0x97E3, 0xF772},
+ {0x97E5, 0xF8D2},{0x97ED, 0xADB4},{0x97F0, 0xEC57},{0x97F1, 0xEF44},{0x97F3, 0xADB5},{0x97F6, 0xBBE0},{0x97F8, 0xEC58},{0x97F9, 0xC341},
+ {0x97FA, 0xF1A7},{0x97FB, 0xC3FD},{0x97FD, 0xF54C},{0x97FE, 0xF54D},{0x97FF, 0xC554},{0x9800, 0xF851},{0x9801, 0xADB6},{0x9802, 0xB3BB},
+ {0x9803, 0xB3BC},{0x9804, 0xD84E},{0x9805, 0xB6B5},{0x9806, 0xB6B6},{0x9807, 0xDCAC},{0x9808, 0xB6B7},{0x980A, 0xB97A},{0x980C, 0xB97C},
+ {0x980D, 0xE0DF},{0x980E, 0xE0E0},{0x980F, 0xE0DE},{0x9810, 0xB977},{0x9811, 0xB978},{0x9812, 0xB97B},{0x9813, 0xB979},{0x9816, 0xE4CB},
+ {0x9817, 0xBBE1},{0x9818, 0xBBE2},{0x981B, 0xE8BC},{0x981C, 0xBE67},{0x981D, 0xE8B7},{0x981E, 0xE8B6},{0x9820, 0xE8BB},{0x9821, 0xBE65},
+ {0x9824, 0xC05B},{0x9826, 0xE8B8},{0x9827, 0xE8BD},{0x9828, 0xE8BA},{0x9829, 0xE8B9},{0x982B, 0xBE66},{0x982D, 0xC059},{0x982F, 0xEC5A},
+ {0x9830, 0xC055},{0x9832, 0xEC5B},{0x9835, 0xEC59},{0x9837, 0xC058},{0x9838, 0xC056},{0x9839, 0xC05A},{0x983B, 0xC057},{0x9841, 0xEF45},
+ {0x9843, 0xEF4A},{0x9844, 0xEF46},{0x9845, 0xEF49},{0x9846, 0xC1FB},{0x9848, 0xEDD4},{0x9849, 0xEF48},{0x984A, 0xEF47},{0x984C, 0xC344},
+ {0x984D, 0xC342},{0x984E, 0xC345},{0x984F, 0xC343},{0x9850, 0xF1A8},{0x9851, 0xF1A9},{0x9852, 0xF1AA},{0x9853, 0xC346},{0x9857, 0xF3AA},
+ {0x9858, 0xC440},{0x9859, 0xF3A8},{0x985B, 0xC441},{0x985C, 0xF3A7},{0x985D, 0xF3A9},{0x985E, 0xC3FE},{0x985F, 0xF551},{0x9860, 0xF54E},
+ {0x9862, 0xF54F},{0x9863, 0xF550},{0x9864, 0xF672},{0x9865, 0xC556},{0x9867, 0xC555},{0x9869, 0xF774},{0x986A, 0xF773},{0x986B, 0xC5B8},
+ {0x986F, 0xC5E3},{0x9870, 0xC649},{0x9871, 0xC660},{0x9872, 0xF958},{0x9873, 0xF9AE},{0x9874, 0xF9AF},{0x98A8, 0xADB7},{0x98A9, 0xDCAD},
+ {0x98AC, 0xE0E1},{0x98AD, 0xE4CC},{0x98AE, 0xE4CD},{0x98AF, 0xBBE3},{0x98B1, 0xBBE4},{0x98B2, 0xE8BE},{0x98B3, 0xBE68},{0x98B6, 0xC1FC},
+ {0x98B8, 0xF1AB},{0x98BA, 0xC347},{0x98BB, 0xF3AD},{0x98BC, 0xC442},{0x98BD, 0xF3AC},{0x98BE, 0xF3AE},{0x98BF, 0xF3AB},{0x98C0, 0xF675},
+ {0x98C1, 0xF552},{0x98C2, 0xF553},{0x98C4, 0xC4C6},{0x98C6, 0xF674},{0x98C9, 0xF673},{0x98CB, 0xF775},{0x98CC, 0xF9B0},{0x98DB, 0xADB8},
+ {0x98DF, 0xADB9},{0x98E2, 0xB0A7},{0x98E3, 0xD448},{0x98E5, 0xD84F},{0x98E7, 0xB6B8},{0x98E9, 0xB6BB},{0x98EA, 0xB6B9},{0x98EB, 0xDCAE},
+ {0x98ED, 0xB6BD},{0x98EF, 0xB6BA},{0x98F2, 0xB6BC},{0x98F4, 0xB97E},{0x98F6, 0xE0E2},{0x98F9, 0xE0E3},{0x98FA, 0xE8C0},{0x98FC, 0xB97D},
+ {0x98FD, 0xB9A1},{0x98FE, 0xB9A2},{0x9900, 0xE4CF},{0x9902, 0xE4CE},{0x9903, 0xBBE5},{0x9905, 0xBBE6},{0x9907, 0xE4D0},{0x9908, 0xE8BF},
+ {0x9909, 0xBBE8},{0x990A, 0xBE69},{0x990C, 0xBBE7},{0x9910, 0xC05C},{0x9911, 0xE8C1},{0x9912, 0xBE6B},{0x9913, 0xBE6A},{0x9914, 0xE8C2},
+ {0x9915, 0xE8C5},{0x9916, 0xE8C3},{0x9917, 0xE8C4},{0x9918, 0xBE6C},{0x991A, 0xC061},{0x991B, 0xC05F},{0x991E, 0xC05E},{0x991F, 0xEC5D},
+ {0x9921, 0xC060},{0x9924, 0xEC5C},{0x9925, 0xEF4B},{0x9927, 0xEC5E},{0x9928, 0xC05D},{0x9929, 0xEC5F},{0x992A, 0xEF4E},{0x992B, 0xEF4C},
+ {0x992C, 0xEF4D},{0x992D, 0xEF52},{0x992E, 0xC34B},{0x992F, 0xEF51},{0x9930, 0xEF54},{0x9931, 0xEF53},{0x9932, 0xEF50},{0x9933, 0xEF4F},
+ {0x9935, 0xC1FD},{0x993A, 0xF1AE},{0x993C, 0xF1AD},{0x993D, 0xC34A},{0x993E, 0xC348},{0x993F, 0xC349},{0x9941, 0xF1AC},{0x9943, 0xF3B1},
+ {0x9945, 0xC443},{0x9947, 0xF3B0},{0x9948, 0xF3AF},{0x9949, 0xC444},{0x994B, 0xF558},{0x994C, 0xF557},{0x994E, 0xF555},{0x9950, 0xF554},
+ {0x9951, 0xC4C8},{0x9952, 0xC4C7},{0x9953, 0xF559},{0x9954, 0xF776},{0x9955, 0xC5B9},{0x9956, 0xF677},{0x9957, 0xC557},{0x9958, 0xF676},
+ {0x9959, 0xF556},{0x995B, 0xF777},{0x995C, 0xC5E4},{0x995E, 0xC661},{0x995F, 0xF959},{0x9961, 0xF9B1},{0x9996, 0xADBA},{0x9997, 0xD850},
+ {0x9998, 0xEF55},{0x9999, 0xADBB},{0x999C, 0xE4D2},{0x999D, 0xE4D1},{0x999E, 0xEC60},{0x99A1, 0xEF57},{0x99A3, 0xEF56},{0x99A5, 0xC34C},
+ {0x99A6, 0xF3B2},{0x99A7, 0xF3B3},{0x99A8, 0xC4C9},{0x99AB, 0xF9B2},{0x99AC, 0xB0A8},{0x99AD, 0xB6BF},{0x99AE, 0xB6BE},{0x99AF, 0xE0E4},
+ {0x99B0, 0xE0E6},{0x99B1, 0xB9A4},{0x99B2, 0xE0E5},{0x99B3, 0xB9A3},{0x99B4, 0xB9A5},{0x99B5, 0xE0E7},{0x99B9, 0xE4D4},{0x99BA, 0xE4D6},
+ {0x99BB, 0xE4D5},{0x99BD, 0xE4D8},{0x99C1, 0xBBE9},{0x99C2, 0xE4D7},{0x99C3, 0xE4D3},{0x99C7, 0xE4D9},{0x99C9, 0xE8CC},{0x99CB, 0xE8CF},
+ {0x99CC, 0xE8D1},{0x99CD, 0xE8C7},{0x99CE, 0xE8CB},{0x99CF, 0xE8C8},{0x99D0, 0xBE6E},{0x99D1, 0xBE71},{0x99D2, 0xBE73},{0x99D3, 0xE8C9},
+ {0x99D4, 0xE8CA},{0x99D5, 0xBE72},{0x99D6, 0xE8CD},{0x99D7, 0xE8D0},{0x99D8, 0xE8CE},{0x99D9, 0xBE74},{0x99DB, 0xBE70},{0x99DC, 0xE8C6},
+ {0x99DD, 0xBE6D},{0x99DF, 0xBE6F},{0x99E2, 0xC063},{0x99E3, 0xEC66},{0x99E4, 0xEC64},{0x99E5, 0xEC63},{0x99E7, 0xEC69},{0x99E9, 0xEC68},
+ {0x99EA, 0xEC67},{0x99EC, 0xEC62},{0x99ED, 0xC062},{0x99EE, 0xEC61},{0x99F0, 0xEC65},{0x99F1, 0xC064},{0x99F4, 0xEF5A},{0x99F6, 0xEF5E},
+ {0x99F7, 0xEF5B},{0x99F8, 0xEF5D},{0x99F9, 0xEF5C},{0x99FA, 0xEF59},{0x99FB, 0xEF5F},{0x99FC, 0xEF62},{0x99FD, 0xEF60},{0x99FE, 0xEF61},
+ {0x99FF, 0xC240},{0x9A01, 0xC1FE},{0x9A02, 0xEF58},{0x9A03, 0xEF63},{0x9A04, 0xF1B3},{0x9A05, 0xF1B6},{0x9A06, 0xF1B8},{0x9A07, 0xF1B7},
+ {0x9A09, 0xF1B1},{0x9A0A, 0xF1B5},{0x9A0B, 0xF1B0},{0x9A0D, 0xF1B2},{0x9A0E, 0xC34D},{0x9A0F, 0xF1AF},{0x9A11, 0xF1B4},{0x9A14, 0xF3C0},
+ {0x9A15, 0xF3B5},{0x9A16, 0xC445},{0x9A19, 0xC446},{0x9A1A, 0xF3B4},{0x9A1B, 0xF3B9},{0x9A1C, 0xF3BF},{0x9A1D, 0xF3B7},{0x9A1E, 0xF3BE},
+ {0x9A20, 0xF3BB},{0x9A22, 0xF3BA},{0x9A23, 0xF3BD},{0x9A24, 0xF3B8},{0x9A25, 0xF3B6},{0x9A27, 0xF3BC},{0x9A29, 0xF560},{0x9A2A, 0xF55E},
+ {0x9A2B, 0xC4CA},{0x9A2C, 0xF55D},{0x9A2D, 0xF563},{0x9A2E, 0xF561},{0x9A30, 0xC4CB},{0x9A31, 0xF55C},{0x9A32, 0xF55A},{0x9A34, 0xF55B},
+ {0x9A35, 0xC4CD},{0x9A36, 0xF55F},{0x9A37, 0xC4CC},{0x9A38, 0xF562},{0x9A39, 0xF678},{0x9A3A, 0xF67E},{0x9A3D, 0xF679},{0x9A3E, 0xC55B},
+ {0x9A3F, 0xF6A1},{0x9A40, 0xC55A},{0x9A41, 0xF67D},{0x9A42, 0xF67C},{0x9A43, 0xC559},{0x9A44, 0xF67B},{0x9A45, 0xC558},{0x9A46, 0xF67A},
+ {0x9A48, 0xF77D},{0x9A49, 0xF7A1},{0x9A4A, 0xF77E},{0x9A4C, 0xF77B},{0x9A4D, 0xC5BB},{0x9A4E, 0xF778},{0x9A4F, 0xF77C},{0x9A50, 0xF7A3},
+ {0x9A52, 0xF7A2},{0x9A53, 0xF779},{0x9A54, 0xF77A},{0x9A55, 0xC5BA},{0x9A56, 0xF852},{0x9A57, 0xC5E7},{0x9A59, 0xF853},{0x9A5A, 0xC5E5},
+ {0x9A5B, 0xC5E6},{0x9A5E, 0xF8D3},{0x9A5F, 0xC64A},{0x9A60, 0xF976},{0x9A62, 0xC66A},{0x9A64, 0xF9B3},{0x9A65, 0xC66B},{0x9A66, 0xF9B4},
+ {0x9A67, 0xF9B5},{0x9A68, 0xF9C3},{0x9A69, 0xF9C2},{0x9A6A, 0xC67A},{0x9A6B, 0xF9CD},{0x9AA8, 0xB0A9},{0x9AAB, 0xE0E9},{0x9AAD, 0xE0E8},
+ {0x9AAF, 0xBBEA},{0x9AB0, 0xBBEB},{0x9AB1, 0xE4DA},{0x9AB3, 0xE8D2},{0x9AB4, 0xEC6C},{0x9AB7, 0xBE75},{0x9AB8, 0xC065},{0x9AB9, 0xEC6A},
+ {0x9ABB, 0xEC6D},{0x9ABC, 0xC066},{0x9ABE, 0xEF64},{0x9ABF, 0xEC6B},{0x9AC0, 0xF1B9},{0x9AC1, 0xC34E},{0x9AC2, 0xF3C1},{0x9AC6, 0xF566},
+ {0x9AC7, 0xF564},{0x9ACA, 0xF565},{0x9ACD, 0xF6A2},{0x9ACF, 0xC55C},{0x9AD0, 0xF7A4},{0x9AD1, 0xC5EA},{0x9AD2, 0xC5BC},{0x9AD3, 0xC5E8},
+ {0x9AD4, 0xC5E9},{0x9AD5, 0xF8D4},{0x9AD6, 0xC662},{0x9AD8, 0xB0AA},{0x9ADC, 0xF1BA},{0x9ADF, 0xD449},{0x9AE1, 0xB9A6},{0x9AE3, 0xE4DB},
+ {0x9AE6, 0xBBEC},{0x9AE7, 0xE4DC},{0x9AEB, 0xE8D4},{0x9AEC, 0xE8D3},{0x9AED, 0xC068},{0x9AEE, 0xBE76},{0x9AEF, 0xBE77},{0x9AF1, 0xE8D7},
+ {0x9AF2, 0xE8D6},{0x9AF3, 0xE8D5},{0x9AF6, 0xEC6E},{0x9AF7, 0xEC71},{0x9AF9, 0xEC70},{0x9AFA, 0xEC6F},{0x9AFB, 0xC067},{0x9AFC, 0xEF68},
+ {0x9AFD, 0xEF66},{0x9AFE, 0xEF65},{0x9B01, 0xEF67},{0x9B03, 0xC34F},{0x9B04, 0xF1BC},{0x9B05, 0xF1BD},{0x9B06, 0xC350},{0x9B08, 0xF1BB},
+ {0x9B0A, 0xF3C3},{0x9B0B, 0xF3C2},{0x9B0C, 0xF3C5},{0x9B0D, 0xC447},{0x9B0E, 0xF3C4},{0x9B10, 0xF567},{0x9B11, 0xF569},{0x9B12, 0xF568},
+ {0x9B15, 0xF6A3},{0x9B16, 0xF6A6},{0x9B17, 0xF6A4},{0x9B18, 0xF6A5},{0x9B19, 0xF7A5},{0x9B1A, 0xC5BD},{0x9B1E, 0xF854},{0x9B1F, 0xF855},
+ {0x9B20, 0xF856},{0x9B22, 0xC64B},{0x9B23, 0xC663},{0x9B24, 0xF9B6},{0x9B25, 0xB0AB},{0x9B27, 0xBE78},{0x9B28, 0xC069},{0x9B29, 0xF1BE},
+ {0x9B2B, 0xF7A6},{0x9B2E, 0xF9C4},{0x9B2F, 0xD44A},{0x9B31, 0xC67B},{0x9B32, 0xB0AC},{0x9B33, 0xEC72},{0x9B35, 0xF1BF},{0x9B37, 0xF3C6},
+ {0x9B3A, 0xF6A7},{0x9B3B, 0xF7A7},{0x9B3C, 0xB0AD},{0x9B3E, 0xE4DD},{0x9B3F, 0xE4DE},{0x9B41, 0xBBED},{0x9B42, 0xBBEE},{0x9B43, 0xE8D9},
+ {0x9B44, 0xBE7A},{0x9B45, 0xBE79},{0x9B46, 0xE8D8},{0x9B48, 0xEF69},{0x9B4A, 0xF1C0},{0x9B4B, 0xF1C2},{0x9B4C, 0xF1C1},{0x9B4D, 0xC353},
+ {0x9B4E, 0xC352},{0x9B4F, 0xC351},{0x9B51, 0xC55E},{0x9B52, 0xF6A8},{0x9B54, 0xC55D},{0x9B55, 0xF7A9},{0x9B56, 0xF7A8},{0x9B58, 0xC64C},
+ {0x9B59, 0xF8D5},{0x9B5A, 0xB3BD},{0x9B5B, 0xE0EA},{0x9B5F, 0xE4E1},{0x9B60, 0xE4DF},{0x9B61, 0xE4E0},{0x9B64, 0xE8E2},{0x9B66, 0xE8DD},
+ {0x9B67, 0xE8DA},{0x9B68, 0xE8E1},{0x9B6C, 0xE8E3},{0x9B6F, 0xBE7C},{0x9B70, 0xE8E0},{0x9B71, 0xE8DC},{0x9B74, 0xE8DB},{0x9B75, 0xE8DF},
+ {0x9B76, 0xE8DE},{0x9B77, 0xBE7B},{0x9B7A, 0xEC7D},{0x9B7B, 0xEC78},{0x9B7C, 0xEC76},{0x9B7D, 0xECA1},{0x9B7E, 0xEC77},{0x9B80, 0xEC73},
+ {0x9B82, 0xEC79},{0x9B85, 0xEC74},{0x9B86, 0xEF72},{0x9B87, 0xEC75},{0x9B88, 0xECA2},{0x9B90, 0xEC7C},{0x9B91, 0xC06A},{0x9B92, 0xEC7B},
+ {0x9B93, 0xEC7A},{0x9B95, 0xEC7E},{0x9B9A, 0xEF6A},{0x9B9B, 0xEF6D},{0x9B9E, 0xEF6C},{0x9BA0, 0xEF74},{0x9BA1, 0xEF6F},{0x9BA2, 0xEF73},
+ {0x9BA4, 0xEF71},{0x9BA5, 0xEF70},{0x9BA6, 0xEF6E},{0x9BA8, 0xEF6B},{0x9BAA, 0xC243},{0x9BAB, 0xC242},{0x9BAD, 0xC244},{0x9BAE, 0xC241},
+ {0x9BAF, 0xEF75},{0x9BB5, 0xF1C8},{0x9BB6, 0xF1CB},{0x9BB8, 0xF1C9},{0x9BB9, 0xF1CD},{0x9BBD, 0xF1CE},{0x9BBF, 0xF1C6},{0x9BC0, 0xC358},
+ {0x9BC1, 0xF1C7},{0x9BC3, 0xF1C5},{0x9BC4, 0xF1CC},{0x9BC6, 0xF1C4},{0x9BC7, 0xF1C3},{0x9BC8, 0xC357},{0x9BC9, 0xC355},{0x9BCA, 0xC354},
+ {0x9BD3, 0xF1CA},{0x9BD4, 0xF3CF},{0x9BD5, 0xF3D5},{0x9BD6, 0xC44A},{0x9BD7, 0xF3D0},{0x9BD9, 0xF3D3},{0x9BDA, 0xF3D7},{0x9BDB, 0xC44B},
+ {0x9BDC, 0xF3D2},{0x9BDE, 0xF3CA},{0x9BE0, 0xF3C9},{0x9BE1, 0xF3D6},{0x9BE2, 0xF3CD},{0x9BE4, 0xF3CB},{0x9BE5, 0xF3D4},{0x9BE6, 0xF3CC},
+ {0x9BE7, 0xC449},{0x9BE8, 0xC448},{0x9BEA, 0xF3C7},{0x9BEB, 0xF3C8},{0x9BEC, 0xF3D1},{0x9BF0, 0xF3CE},{0x9BF7, 0xF56C},{0x9BF8, 0xF56F},
+ {0x9BFD, 0xC356},{0x9C05, 0xF56D},{0x9C06, 0xF573},{0x9C07, 0xF571},{0x9C08, 0xF56B},{0x9C09, 0xF576},{0x9C0B, 0xF56A},{0x9C0D, 0xC4CF},
+ {0x9C0E, 0xF572},{0x9C12, 0xF56E},{0x9C13, 0xC4CE},{0x9C14, 0xF575},{0x9C17, 0xF574},{0x9C1C, 0xF6AB},{0x9C1D, 0xF6AA},{0x9C21, 0xF6B1},
+ {0x9C23, 0xF6AD},{0x9C24, 0xF6B0},{0x9C25, 0xC560},{0x9C28, 0xF6AE},{0x9C29, 0xF6AF},{0x9C2B, 0xF6A9},{0x9C2C, 0xF6AC},{0x9C2D, 0xC55F},
+ {0x9C31, 0xC5BF},{0x9C32, 0xF7B4},{0x9C33, 0xF7AF},{0x9C34, 0xF7B3},{0x9C36, 0xF7B6},{0x9C37, 0xF7B2},{0x9C39, 0xF7AE},{0x9C3B, 0xC5C1},
+ {0x9C3C, 0xF7B1},{0x9C3D, 0xF7B5},{0x9C3E, 0xC5C0},{0x9C3F, 0xF7AC},{0x9C40, 0xF570},{0x9C41, 0xF7B0},{0x9C44, 0xF7AD},{0x9C46, 0xF7AA},
+ {0x9C48, 0xF7AB},{0x9C49, 0xC5BE},{0x9C4A, 0xF85A},{0x9C4B, 0xF85C},{0x9C4C, 0xF85F},{0x9C4D, 0xF85B},{0x9C4E, 0xF860},{0x9C50, 0xF859},
+ {0x9C52, 0xF857},{0x9C54, 0xC5EB},{0x9C55, 0xF85D},{0x9C56, 0xC5ED},{0x9C57, 0xC5EC},{0x9C58, 0xF858},{0x9C59, 0xF85E},{0x9C5E, 0xF8DA},
+ {0x9C5F, 0xC64D},{0x9C60, 0xF8DB},{0x9C62, 0xF8D9},{0x9C63, 0xF8D6},{0x9C66, 0xF8D8},{0x9C67, 0xF8D7},{0x9C68, 0xF95A},{0x9C6D, 0xF95C},
+ {0x9C6E, 0xF95B},{0x9C71, 0xF979},{0x9C73, 0xF978},{0x9C74, 0xF977},{0x9C75, 0xF97A},{0x9C77, 0xC673},{0x9C78, 0xC674},{0x9C79, 0xF9CA},
+ {0x9C7A, 0xF9CE},{0x9CE5, 0xB3BE},{0x9CE6, 0xDCAF},{0x9CE7, 0xE0ED},{0x9CE9, 0xB9A7},{0x9CEA, 0xE0EB},{0x9CED, 0xE0EC},{0x9CF1, 0xE4E2},
+ {0x9CF2, 0xE4E3},{0x9CF3, 0xBBF1},{0x9CF4, 0xBBEF},{0x9CF5, 0xE4E4},{0x9CF6, 0xBBF0},{0x9CF7, 0xE8E8},{0x9CF9, 0xE8EB},{0x9CFA, 0xE8E5},
+ {0x9CFB, 0xE8EC},{0x9CFC, 0xE8E4},{0x9CFD, 0xE8E6},{0x9CFF, 0xE8E7},{0x9D00, 0xE8EA},{0x9D03, 0xBEA1},{0x9D04, 0xE8EF},{0x9D05, 0xE8EE},
+ {0x9D06, 0xBE7D},{0x9D07, 0xE8E9},{0x9D08, 0xE8ED},{0x9D09, 0xBE7E},{0x9D10, 0xECAC},{0x9D12, 0xC06F},{0x9D14, 0xECA7},{0x9D15, 0xC06B},
+ {0x9D17, 0xECA4},{0x9D18, 0xECAA},{0x9D19, 0xECAD},{0x9D1B, 0xC070},{0x9D1D, 0xECA9},{0x9D1E, 0xECA6},{0x9D1F, 0xECAE},{0x9D20, 0xECA5},
+ {0x9D22, 0xECAB},{0x9D23, 0xC06C},{0x9D25, 0xECA3},{0x9D26, 0xC06D},{0x9D28, 0xC06E},{0x9D29, 0xECA8},{0x9D2D, 0xEFA9},{0x9D2E, 0xEF7A},
+ {0x9D2F, 0xEF7B},{0x9D30, 0xEF7E},{0x9D31, 0xEF7C},{0x9D33, 0xEF76},{0x9D36, 0xEF79},{0x9D37, 0xEFA5},{0x9D38, 0xEF7D},{0x9D3B, 0xC245},
+ {0x9D3D, 0xEFA7},{0x9D3E, 0xEFA4},{0x9D3F, 0xC246},{0x9D40, 0xEFA6},{0x9D41, 0xEF77},{0x9D42, 0xEFA2},{0x9D43, 0xEFA3},{0x9D45, 0xEFA1},
+ {0x9D4A, 0xF1D2},{0x9D4B, 0xF1D4},{0x9D4C, 0xF1D7},{0x9D4F, 0xF1D1},{0x9D51, 0xC359},{0x9D52, 0xF1D9},{0x9D53, 0xF1D0},{0x9D54, 0xF1DA},
+ {0x9D56, 0xF1D6},{0x9D57, 0xF1D8},{0x9D58, 0xF1DC},{0x9D59, 0xF1D5},{0x9D5A, 0xF1DD},{0x9D5B, 0xF1D3},{0x9D5C, 0xF1CF},{0x9D5D, 0xC35A},
+ {0x9D5F, 0xF1DB},{0x9D60, 0xC35B},{0x9D61, 0xC44D},{0x9D67, 0xEF78},{0x9D68, 0xF3F1},{0x9D69, 0xF3E8},{0x9D6A, 0xC44F},{0x9D6B, 0xF3E4},
+ {0x9D6C, 0xC450},{0x9D6F, 0xF3ED},{0x9D70, 0xF3E7},{0x9D71, 0xF3DD},{0x9D72, 0xC44E},{0x9D73, 0xF3EA},{0x9D74, 0xF3E5},{0x9D75, 0xF3E6},
+ {0x9D77, 0xF3D8},{0x9D78, 0xF3DF},{0x9D79, 0xF3EE},{0x9D7B, 0xF3EB},{0x9D7D, 0xF3E3},{0x9D7F, 0xF3EF},{0x9D80, 0xF3DE},{0x9D81, 0xF3D9},
+ {0x9D82, 0xF3EC},{0x9D84, 0xF3DB},{0x9D85, 0xF3E9},{0x9D86, 0xF3E0},{0x9D87, 0xF3F0},{0x9D88, 0xF3DC},{0x9D89, 0xC44C},{0x9D8A, 0xF3DA},
+ {0x9D8B, 0xF3E1},{0x9D8C, 0xF3E2},{0x9D90, 0xF57D},{0x9D92, 0xF57B},{0x9D94, 0xF5A2},{0x9D96, 0xF5AE},{0x9D97, 0xF5A5},{0x9D98, 0xF57C},
+ {0x9D99, 0xF578},{0x9D9A, 0xF5A7},{0x9D9B, 0xF57E},{0x9D9C, 0xF5A3},{0x9D9D, 0xF57A},{0x9D9E, 0xF5AA},{0x9D9F, 0xF577},{0x9DA0, 0xF5A1},
+ {0x9DA1, 0xF5A6},{0x9DA2, 0xF5A8},{0x9DA3, 0xF5AB},{0x9DA4, 0xF579},{0x9DA6, 0xF5AF},{0x9DA7, 0xF5B0},{0x9DA8, 0xF5A9},{0x9DA9, 0xF5AD},
+ {0x9DAA, 0xF5A4},{0x9DAC, 0xF6C1},{0x9DAD, 0xF6C4},{0x9DAF, 0xC561},{0x9DB1, 0xF6C3},{0x9DB2, 0xF6C8},{0x9DB3, 0xF6C6},{0x9DB4, 0xC562},
+ {0x9DB5, 0xF6BD},{0x9DB6, 0xF6B3},{0x9DB7, 0xF6B2},{0x9DB8, 0xC564},{0x9DB9, 0xF6BF},{0x9DBA, 0xF6C0},{0x9DBB, 0xF6BC},{0x9DBC, 0xF6B4},
+ {0x9DBE, 0xF6B9},{0x9DBF, 0xF5AC},{0x9DC1, 0xF6B5},{0x9DC2, 0xC563},{0x9DC3, 0xF6BB},{0x9DC5, 0xF6BA},{0x9DC7, 0xF6B6},{0x9DC8, 0xF6C2},
+ {0x9DCA, 0xF6B7},{0x9DCB, 0xF7BB},{0x9DCC, 0xF6C5},{0x9DCD, 0xF6C7},{0x9DCE, 0xF6BE},{0x9DCF, 0xF6B8},{0x9DD0, 0xF7BC},{0x9DD1, 0xF7BE},
+ {0x9DD2, 0xF7B8},{0x9DD3, 0xC5C2},{0x9DD5, 0xF7C5},{0x9DD6, 0xF7C3},{0x9DD7, 0xC5C3},{0x9DD8, 0xF7C2},{0x9DD9, 0xF7C1},{0x9DDA, 0xF7BA},
+ {0x9DDB, 0xF7B7},{0x9DDC, 0xF7BD},{0x9DDD, 0xF7C6},{0x9DDE, 0xF7B9},{0x9DDF, 0xF7BF},{0x9DE1, 0xF869},{0x9DE2, 0xF86E},{0x9DE3, 0xF864},
+ {0x9DE4, 0xF867},{0x9DE5, 0xC5EE},{0x9DE6, 0xF86B},{0x9DE8, 0xF872},{0x9DE9, 0xF7C0},{0x9DEB, 0xF865},{0x9DEC, 0xF86F},{0x9DED, 0xF873},
+ {0x9DEE, 0xF86A},{0x9DEF, 0xF863},{0x9DF0, 0xF86D},{0x9DF2, 0xF86C},{0x9DF3, 0xF871},{0x9DF4, 0xF870},{0x9DF5, 0xF7C4},{0x9DF6, 0xF868},
+ {0x9DF7, 0xF862},{0x9DF8, 0xF866},{0x9DF9, 0xC64E},{0x9DFA, 0xC64F},{0x9DFB, 0xF861},{0x9DFD, 0xF8E6},{0x9DFE, 0xF8DD},{0x9DFF, 0xF8E5},
+ {0x9E00, 0xF8E2},{0x9E01, 0xF8E3},{0x9E02, 0xF8DC},{0x9E03, 0xF8DF},{0x9E04, 0xF8E7},{0x9E05, 0xF8E1},{0x9E06, 0xF8E0},{0x9E07, 0xF8DE},
+ {0x9E09, 0xF8E4},{0x9E0B, 0xF95D},{0x9E0D, 0xF95E},{0x9E0F, 0xF960},{0x9E10, 0xF95F},{0x9E11, 0xF962},{0x9E12, 0xF961},{0x9E13, 0xF97C},
+ {0x9E14, 0xF97B},{0x9E15, 0xF9B7},{0x9E17, 0xF9B8},{0x9E19, 0xF9C5},{0x9E1A, 0xC678},{0x9E1B, 0xC67C},{0x9E1D, 0xF9CF},{0x9E1E, 0xC67D},
+ {0x9E75, 0xB3BF},{0x9E79, 0xC4D0},{0x9E7A, 0xF6C9},{0x9E7C, 0xC650},{0x9E7D, 0xC651},{0x9E7F, 0xB3C0},{0x9E80, 0xE0EE},{0x9E82, 0xB9A8},
+ {0x9E83, 0xE8F0},{0x9E86, 0xECB0},{0x9E87, 0xECB1},{0x9E88, 0xECAF},{0x9E89, 0xEFAB},{0x9E8A, 0xEFAA},{0x9E8B, 0xC247},{0x9E8C, 0xF1DF},
+ {0x9E8D, 0xEFAC},{0x9E8E, 0xF1DE},{0x9E91, 0xF3F3},{0x9E92, 0xC451},{0x9E93, 0xC453},{0x9E94, 0xF3F2},{0x9E97, 0xC452},{0x9E99, 0xF5B1},
+ {0x9E9A, 0xF5B3},{0x9E9B, 0xF5B2},{0x9E9C, 0xF6CA},{0x9E9D, 0xC565},{0x9E9F, 0xC5EF},{0x9EA0, 0xF8E8},{0x9EA1, 0xF963},{0x9EA4, 0xF9D2},
+ {0x9EA5, 0xB3C1},{0x9EA7, 0xE4E5},{0x9EA9, 0xBEA2},{0x9EAD, 0xECB3},{0x9EAE, 0xECB2},{0x9EB0, 0xEFAD},{0x9EB4, 0xC454},{0x9EB5, 0xC4D1},
+ {0x9EB6, 0xF7C7},{0x9EB7, 0xF9CB},{0x9EBB, 0xB3C2},{0x9EBC, 0xBBF2},{0x9EBE, 0xBEA3},{0x9EC0, 0xF3F4},{0x9EC2, 0xF874},{0x9EC3, 0xB6C0},
+ {0x9EC8, 0xEFAE},{0x9ECC, 0xC664},{0x9ECD, 0xB6C1},{0x9ECE, 0xBEA4},{0x9ECF, 0xC248},{0x9ED0, 0xF875},{0x9ED1, 0xB6C2},{0x9ED3, 0xE8F1},
+ {0x9ED4, 0xC072},{0x9ED5, 0xECB4},{0x9ED6, 0xECB5},{0x9ED8, 0xC071},{0x9EDA, 0xEFAF},{0x9EDB, 0xC24C},{0x9EDC, 0xC24A},{0x9EDD, 0xC24B},
+ {0x9EDE, 0xC249},{0x9EDF, 0xF1E0},{0x9EE0, 0xC35C},{0x9EE4, 0xF5B5},{0x9EE5, 0xF5B4},{0x9EE6, 0xF5B7},{0x9EE7, 0xF5B6},{0x9EE8, 0xC4D2},
+ {0x9EEB, 0xF6CB},{0x9EED, 0xF6CD},{0x9EEE, 0xF6CC},{0x9EEF, 0xC566},{0x9EF0, 0xF7C8},{0x9EF2, 0xF876},{0x9EF3, 0xF877},{0x9EF4, 0xC5F0},
+ {0x9EF5, 0xF964},{0x9EF6, 0xF97D},{0x9EF7, 0xC675},{0x9EF9, 0xDCB0},{0x9EFA, 0xECB6},{0x9EFB, 0xEFB0},{0x9EFC, 0xF3F5},{0x9EFD, 0xE0EF},
+ {0x9EFF, 0xEFB1},{0x9F00, 0xF1E2},{0x9F01, 0xF1E1},{0x9F06, 0xF878},{0x9F07, 0xC652},{0x9F09, 0xF965},{0x9F0A, 0xF97E},{0x9F0E, 0xB9A9},
+ {0x9F0F, 0xE8F2},{0x9F10, 0xE8F3},{0x9F12, 0xECB7},{0x9F13, 0xB9AA},{0x9F15, 0xC35D},{0x9F16, 0xF1E3},{0x9F18, 0xF6CF},{0x9F19, 0xC567},
+ {0x9F1A, 0xF6D0},{0x9F1B, 0xF6CE},{0x9F1C, 0xF879},{0x9F1E, 0xF8E9},{0x9F20, 0xB9AB},{0x9F22, 0xEFB4},{0x9F23, 0xEFB3},{0x9F24, 0xEFB2},
+ {0x9F25, 0xF1E4},{0x9F28, 0xF1E8},{0x9F29, 0xF1E7},{0x9F2A, 0xF1E6},{0x9F2B, 0xF1E5},{0x9F2C, 0xC35E},{0x9F2D, 0xF3F6},{0x9F2E, 0xF5B9},
+ {0x9F2F, 0xC4D3},{0x9F30, 0xF5B8},{0x9F31, 0xF6D1},{0x9F32, 0xF7CB},{0x9F33, 0xF7CA},{0x9F34, 0xC5C4},{0x9F35, 0xF7C9},{0x9F36, 0xF87C},
+ {0x9F37, 0xF87B},{0x9F38, 0xF87A},{0x9F3B, 0xBBF3},{0x9F3D, 0xECB8},{0x9F3E, 0xC24D},{0x9F40, 0xF3F7},{0x9F41, 0xF3F8},{0x9F42, 0xF7CC},
+ {0x9F43, 0xF87D},{0x9F46, 0xF8EA},{0x9F47, 0xF966},{0x9F48, 0xF9B9},{0x9F49, 0xF9D4},{0x9F4A, 0xBBF4},{0x9F4B, 0xC24E},{0x9F4C, 0xF1E9},
+ {0x9F4D, 0xF3F9},{0x9F4E, 0xF6D2},{0x9F4F, 0xF87E},{0x9F52, 0xBEA6},{0x9F54, 0xEFB5},{0x9F55, 0xF1EA},{0x9F56, 0xF3FA},{0x9F57, 0xF3FB},
+ {0x9F58, 0xF3FC},{0x9F59, 0xF5BE},{0x9F5B, 0xF5BA},{0x9F5C, 0xC568},{0x9F5D, 0xF5BD},{0x9F5E, 0xF5BC},{0x9F5F, 0xC4D4},{0x9F60, 0xF5BB},
+ {0x9F61, 0xC4D6},{0x9F63, 0xC4D5},{0x9F64, 0xF6D4},{0x9F65, 0xF6D3},{0x9F66, 0xC569},{0x9F67, 0xC56A},{0x9F6A, 0xC5C6},{0x9F6B, 0xF7CD},
+ {0x9F6C, 0xC5C5},{0x9F6E, 0xF8A3},{0x9F6F, 0xF8A4},{0x9F70, 0xF8A2},{0x9F71, 0xF8A1},{0x9F72, 0xC654},{0x9F74, 0xF8EB},{0x9F75, 0xF8EC},
+ {0x9F76, 0xF8ED},{0x9F77, 0xC653},{0x9F78, 0xF967},{0x9F79, 0xF96A},{0x9F7A, 0xF969},{0x9F7B, 0xF968},{0x9F7E, 0xF9D3},{0x9F8D, 0xC073},
+ {0x9F90, 0xC365},{0x9F91, 0xF5BF},{0x9F92, 0xF6D5},{0x9F94, 0xC5C7},{0x9F95, 0xF7CE},{0x9F98, 0xF9D5},{0x9F9C, 0xC074},{0x9FA0, 0xEFB6},
+ {0x9FA2, 0xF7CF},{0x9FA4, 0xF9A1},{0xFA0C, 0xC94A},{0xFA0D, 0xDDFC},{0xFE30, 0xA14A},{0xFE31, 0xA157},{0xFE33, 0xA159},{0xFE34, 0xA15B},
+ {0xFE35, 0xA15F},{0xFE36, 0xA160},{0xFE37, 0xA163},{0xFE38, 0xA164},{0xFE39, 0xA167},{0xFE3A, 0xA168},{0xFE3B, 0xA16B},{0xFE3C, 0xA16C},
+ {0xFE3D, 0xA16F},{0xFE3E, 0xA170},{0xFE3F, 0xA173},{0xFE40, 0xA174},{0xFE41, 0xA177},{0xFE42, 0xA178},{0xFE43, 0xA17B},{0xFE44, 0xA17C},
+ {0xFE49, 0xA1C6},{0xFE4A, 0xA1C7},{0xFE4B, 0xA1CA},{0xFE4C, 0xA1CB},{0xFE4D, 0xA1C8},{0xFE4E, 0xA1C9},{0xFE4F, 0xA15C},{0xFE50, 0xA14D},
+ {0xFE52, 0xA14F},{0xFE54, 0xA151},{0xFE55, 0xA152},{0xFE56, 0xA153},{0xFE57, 0xA154},{0xFE59, 0xA17D},{0xFE5A, 0xA17E},{0xFE5B, 0xA1A1},
+ {0xFE5C, 0xA1A2},{0xFE5D, 0xA1A3},{0xFE5E, 0xA1A4},{0xFE5F, 0xA1CC},{0xFE60, 0xA1CD},{0xFE61, 0xA1CE},{0xFE62, 0xA1DE},{0xFE63, 0xA1DF},
+ {0xFE64, 0xA1E0},{0xFE65, 0xA1E1},{0xFE66, 0xA1E2},{0xFE69, 0xA24C},{0xFE6A, 0xA24D},{0xFE6B, 0xA24E},{0xFF01, 0xA149},{0xFF03, 0xA1AD},
+ {0xFF04, 0xA243},{0xFF05, 0xA248},{0xFF06, 0xA1AE},{0xFF08, 0xA15D},{0xFF09, 0xA15E},{0xFF0A, 0xA1AF},{0xFF0B, 0xA1CF},{0xFF0C, 0xA141},
+ {0xFF0D, 0xA1D0},{0xFF0E, 0xA144},{0xFF0F, 0xA241},{0xFF10, 0xA2AF},{0xFF11, 0xA2B0},{0xFF12, 0xA2B1},{0xFF13, 0xA2B2},{0xFF14, 0xA2B3},
+ {0xFF15, 0xA2B4},{0xFF16, 0xA2B5},{0xFF17, 0xA2B6},{0xFF18, 0xA2B7},{0xFF19, 0xA2B8},{0xFF1A, 0xA147},{0xFF1B, 0xA146},{0xFF1C, 0xA1D5},
+ {0xFF1D, 0xA1D7},{0xFF1E, 0xA1D6},{0xFF1F, 0xA148},{0xFF20, 0xA249},{0xFF21, 0xA2CF},{0xFF22, 0xA2D0},{0xFF23, 0xA2D1},{0xFF24, 0xA2D2},
+ {0xFF25, 0xA2D3},{0xFF26, 0xA2D4},{0xFF27, 0xA2D5},{0xFF28, 0xA2D6},{0xFF29, 0xA2D7},{0xFF2A, 0xA2D8},{0xFF2B, 0xA2D9},{0xFF2C, 0xA2DA},
+ {0xFF2D, 0xA2DB},{0xFF2E, 0xA2DC},{0xFF2F, 0xA2DD},{0xFF30, 0xA2DE},{0xFF31, 0xA2DF},{0xFF32, 0xA2E0},{0xFF33, 0xA2E1},{0xFF34, 0xA2E2},
+ {0xFF35, 0xA2E3},{0xFF36, 0xA2E4},{0xFF37, 0xA2E5},{0xFF38, 0xA2E6},{0xFF39, 0xA2E7},{0xFF3A, 0xA2E8},{0xFF3C, 0xA242},{0xFF3F, 0xA1C4},
+ {0xFF41, 0xA2E9},{0xFF42, 0xA2EA},{0xFF43, 0xA2EB},{0xFF44, 0xA2EC},{0xFF45, 0xA2ED},{0xFF46, 0xA2EE},{0xFF47, 0xA2EF},{0xFF48, 0xA2F0},
+ {0xFF49, 0xA2F1},{0xFF4A, 0xA2F2},{0xFF4B, 0xA2F3},{0xFF4C, 0xA2F4},{0xFF4D, 0xA2F5},{0xFF4E, 0xA2F6},{0xFF4F, 0xA2F7},{0xFF50, 0xA2F8},
+ {0xFF51, 0xA2F9},{0xFF52, 0xA2FA},{0xFF53, 0xA2FB},{0xFF54, 0xA2FC},{0xFF55, 0xA2FD},{0xFF56, 0xA2FE},{0xFF57, 0xA340},{0xFF58, 0xA341},
+ {0xFF59, 0xA342},{0xFF5A, 0xA343},{0xFF5B, 0xA161},{0xFF5C, 0xA155},{0xFF5D, 0xA162},{0xFF64, 0xA14E}
+};
diff --git a/vcl/source/fontsubset/u2johab.inc b/vcl/source/fontsubset/u2johab.inc
new file mode 100644
index 000000000000..ae07cc571fb8
--- /dev/null
+++ b/vcl/source/fontsubset/u2johab.inc
@@ -0,0 +1,2175 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: u2johab.inc,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+sal_uInt16pair xlat_1_6[17141] = {
+ {0x0020, 0x0020},{0x0021, 0x0021},{0x0022, 0x0022},{0x0023, 0x0023},{0x0024, 0x0024},{0x0025, 0x0025},{0x0026, 0x0026},{0x0027, 0x0027},
+ {0x0028, 0x0028},{0x0029, 0x0029},{0x002A, 0x002A},{0x002B, 0x002B},{0x002C, 0x002C},{0x002D, 0x002D},{0x002E, 0x002E},{0x002F, 0x002F},
+ {0x0030, 0x0030},{0x0031, 0x0031},{0x0032, 0x0032},{0x0033, 0x0033},{0x0034, 0x0034},{0x0035, 0x0035},{0x0036, 0x0036},{0x0037, 0x0037},
+ {0x0038, 0x0038},{0x0039, 0x0039},{0x003A, 0x003A},{0x003B, 0x003B},{0x003C, 0x003C},{0x003D, 0x003D},{0x003E, 0x003E},{0x003F, 0x003F},
+ {0x0040, 0x0040},{0x0041, 0x0041},{0x0042, 0x0042},{0x0043, 0x0043},{0x0044, 0x0044},{0x0045, 0x0045},{0x0046, 0x0046},{0x0047, 0x0047},
+ {0x0048, 0x0048},{0x0049, 0x0049},{0x004A, 0x004A},{0x004B, 0x004B},{0x004C, 0x004C},{0x004D, 0x004D},{0x004E, 0x004E},{0x004F, 0x004F},
+ {0x0050, 0x0050},{0x0051, 0x0051},{0x0052, 0x0052},{0x0053, 0x0053},{0x0054, 0x0054},{0x0055, 0x0055},{0x0056, 0x0056},{0x0057, 0x0057},
+ {0x0058, 0x0058},{0x0059, 0x0059},{0x005A, 0x005A},{0x005B, 0x005B},{0x005C, 0x005C},{0x005D, 0x005D},{0x005E, 0x005E},{0x005F, 0x005F},
+ {0x0060, 0x0060},{0x0061, 0x0061},{0x0062, 0x0062},{0x0063, 0x0063},{0x0064, 0x0064},{0x0065, 0x0065},{0x0066, 0x0066},{0x0067, 0x0067},
+ {0x0068, 0x0068},{0x0069, 0x0069},{0x006A, 0x006A},{0x006B, 0x006B},{0x006C, 0x006C},{0x006D, 0x006D},{0x006E, 0x006E},{0x006F, 0x006F},
+ {0x0070, 0x0070},{0x0071, 0x0071},{0x0072, 0x0072},{0x0073, 0x0073},{0x0074, 0x0074},{0x0075, 0x0075},{0x0076, 0x0076},{0x0077, 0x0077},
+ {0x0078, 0x0078},{0x0079, 0x0079},{0x007A, 0x007A},{0x007B, 0x007B},{0x007C, 0x007C},{0x007D, 0x007D},{0x007E, 0x007E},{0x00A1, 0xA2AE},
+ {0x00A4, 0xA2B4},{0x00A7, 0xA1D7},{0x00A8, 0xA1A7},{0x00AA, 0xA8A3},{0x00AD, 0xA1A9},{0x00B0, 0xA1C6},{0x00B1, 0xA1BE},{0x00B2, 0xA9F7},
+ {0x00B3, 0xA9F8},{0x00B4, 0xA2A5},{0x00B6, 0xA2D2},{0x00B7, 0xA1A4},{0x00B8, 0xA2AC},{0x00B9, 0xA9F6},{0x00BA, 0xA8AC},{0x00BC, 0xA8F9},
+ {0x00BD, 0xA8F6},{0x00BE, 0xA8FA},{0x00BF, 0xA2AF},{0x00C6, 0xA8A1},{0x00D0, 0xA8A2},{0x00D7, 0xA1BF},{0x00D8, 0xA8AA},{0x00DE, 0xA8AD},
+ {0x00DF, 0xA9AC},{0x00E6, 0xA9A1},{0x00F0, 0xA9A3},{0x00F7, 0xA1C0},{0x00F8, 0xA9AA},{0x00FE, 0xA9AD},{0x0111, 0xA9A2},{0x0126, 0xA8A4},
+ {0x0127, 0xA9A4},{0x0131, 0xA9A5},{0x0132, 0xA8A6},{0x0133, 0xA9A6},{0x0138, 0xA9A7},{0x013F, 0xA8A8},{0x0140, 0xA9A8},{0x0141, 0xA8A9},
+ {0x0142, 0xA9A9},{0x0149, 0xA9B0},{0x014A, 0xA8AF},{0x014B, 0xA9AF},{0x0152, 0xA8AB},{0x0153, 0xA9AB},{0x0166, 0xA8AE},{0x0167, 0xA9AE},
+ {0x02C7, 0xA2A7},{0x02D0, 0xA2B0},{0x02D8, 0xA2A8},{0x02D9, 0xA2AB},{0x02DA, 0xA2AA},{0x02DB, 0xA2AD},{0x02DD, 0xA2A9},{0x0391, 0xA5C1},
+ {0x0392, 0xA5C2},{0x0393, 0xA5C3},{0x0394, 0xA5C4},{0x0395, 0xA5C5},{0x0396, 0xA5C6},{0x0397, 0xA5C7},{0x0398, 0xA5C8},{0x0399, 0xA5C9},
+ {0x039A, 0xA5CA},{0x039B, 0xA5CB},{0x039C, 0xA5CC},{0x039D, 0xA5CD},{0x039E, 0xA5CE},{0x039F, 0xA5CF},{0x03A0, 0xA5D0},{0x03A1, 0xA5D1},
+ {0x03A3, 0xA5D2},{0x03A4, 0xA5D3},{0x03A5, 0xA5D4},{0x03A6, 0xA5D5},{0x03A7, 0xA5D6},{0x03A8, 0xA5D7},{0x03A9, 0xA5D8},{0x03B1, 0xA5E1},
+ {0x03B2, 0xA5E2},{0x03B3, 0xA5E3},{0x03B4, 0xA5E4},{0x03B5, 0xA5E5},{0x03B6, 0xA5E6},{0x03B7, 0xA5E7},{0x03B8, 0xA5E8},{0x03B9, 0xA5E9},
+ {0x03BA, 0xA5EA},{0x03BB, 0xA5EB},{0x03BC, 0xA5EC},{0x03BD, 0xA5ED},{0x03BE, 0xA5EE},{0x03BF, 0xA5EF},{0x03C0, 0xA5F0},{0x03C1, 0xA5F1},
+ {0x03C3, 0xA5F2},{0x03C4, 0xA5F3},{0x03C5, 0xA5F4},{0x03C6, 0xA5F5},{0x03C7, 0xA5F6},{0x03C8, 0xA5F7},{0x03C9, 0xA5F8},{0x0401, 0xACA7},
+ {0x0410, 0xACA1},{0x0411, 0xACA2},{0x0412, 0xACA3},{0x0413, 0xACA4},{0x0414, 0xACA5},{0x0415, 0xACA6},{0x0416, 0xACA8},{0x0417, 0xACA9},
+ {0x0418, 0xACAA},{0x0419, 0xACAB},{0x041A, 0xACAC},{0x041B, 0xACAD},{0x041C, 0xACAE},{0x041D, 0xACAF},{0x041E, 0xACB0},{0x041F, 0xACB1},
+ {0x0420, 0xACB2},{0x0421, 0xACB3},{0x0422, 0xACB4},{0x0423, 0xACB5},{0x0424, 0xACB6},{0x0425, 0xACB7},{0x0426, 0xACB8},{0x0427, 0xACB9},
+ {0x0428, 0xACBA},{0x0429, 0xACBB},{0x042A, 0xACBC},{0x042B, 0xACBD},{0x042C, 0xACBE},{0x042D, 0xACBF},{0x042E, 0xACC0},{0x042F, 0xACC1},
+ {0x0430, 0xACD1},{0x0431, 0xACD2},{0x0432, 0xACD3},{0x0433, 0xACD4},{0x0434, 0xACD5},{0x0435, 0xACD6},{0x0436, 0xACD8},{0x0437, 0xACD9},
+ {0x0438, 0xACDA},{0x0439, 0xACDB},{0x043A, 0xACDC},{0x043B, 0xACDD},{0x043C, 0xACDE},{0x043D, 0xACDF},{0x043E, 0xACE0},{0x043F, 0xACE1},
+ {0x0440, 0xACE2},{0x0441, 0xACE3},{0x0442, 0xACE4},{0x0443, 0xACE5},{0x0444, 0xACE6},{0x0445, 0xACE7},{0x0446, 0xACE8},{0x0447, 0xACE9},
+ {0x0448, 0xACEA},{0x0449, 0xACEB},{0x044A, 0xACEC},{0x044B, 0xACED},{0x044C, 0xACEE},{0x044D, 0xACEF},{0x044E, 0xACF0},{0x044F, 0xACF1},
+ {0x0451, 0xACD7},{0x2015, 0xA1AA},{0x2018, 0xA1AE},{0x2019, 0xA1AF},{0x201C, 0xA1B0},{0x201D, 0xA1B1},{0x2020, 0xA2D3},{0x2021, 0xA2D4},
+ {0x2025, 0xA1A5},{0x2026, 0xA1A6},{0x2030, 0xA2B6},{0x2032, 0xA1C7},{0x2033, 0xA1C8},{0x203B, 0xA1D8},{0x2074, 0xA9F9},{0x207F, 0xA9FA},
+ {0x2081, 0xA9FB},{0x2082, 0xA9FC},{0x2083, 0xA9FD},{0x2084, 0xA9FE},{0x2103, 0xA1C9},{0x2109, 0xA2B5},{0x2113, 0xA7A4},{0x2116, 0xA2E0},
+ {0x2121, 0xA2E5},{0x2122, 0xA2E2},{0x2126, 0xA7D9},{0x212B, 0xA1CA},{0x2153, 0xA8F7},{0x2154, 0xA8F8},{0x215B, 0xA8FB},{0x215C, 0xA8FC},
+ {0x215D, 0xA8FD},{0x215E, 0xA8FE},{0x2160, 0xA5B0},{0x2161, 0xA5B1},{0x2162, 0xA5B2},{0x2163, 0xA5B3},{0x2164, 0xA5B4},{0x2165, 0xA5B5},
+ {0x2166, 0xA5B6},{0x2167, 0xA5B7},{0x2168, 0xA5B8},{0x2169, 0xA5B9},{0x2170, 0xA5A1},{0x2171, 0xA5A2},{0x2172, 0xA5A3},{0x2173, 0xA5A4},
+ {0x2174, 0xA5A5},{0x2175, 0xA5A6},{0x2176, 0xA5A7},{0x2177, 0xA5A8},{0x2178, 0xA5A9},{0x2179, 0xA5AA},{0x2190, 0xA1E7},{0x2191, 0xA1E8},
+ {0x2192, 0xA1E6},{0x2193, 0xA1E9},{0x2194, 0xA1EA},{0x2195, 0xA2D5},{0x2196, 0xA2D8},{0x2197, 0xA2D6},{0x2198, 0xA2D9},{0x2199, 0xA2D7},
+ {0x21D2, 0xA2A1},{0x21D4, 0xA2A2},{0x2200, 0xA2A3},{0x2202, 0xA1D3},{0x2203, 0xA2A4},{0x2207, 0xA1D4},{0x2208, 0xA1F4},{0x220B, 0xA1F5},
+ {0x220F, 0xA2B3},{0x2211, 0xA2B2},{0x221A, 0xA1EE},{0x221D, 0xA1F0},{0x221E, 0xA1C4},{0x2220, 0xA1D0},{0x2225, 0xA1AB},{0x2227, 0xA1FC},
+ {0x2228, 0xA1FD},{0x2229, 0xA1FB},{0x222A, 0xA1FA},{0x222B, 0xA1F2},{0x222C, 0xA1F3},{0x222E, 0xA2B1},{0x2234, 0xA1C5},{0x2235, 0xA1F1},
+ {0x223C, 0xA1AD},{0x223D, 0xA1EF},{0x2252, 0xA1D6},{0x2260, 0xA1C1},{0x2261, 0xA1D5},{0x2264, 0xA1C2},{0x2265, 0xA1C3},{0x226A, 0xA1EC},
+ {0x226B, 0xA1ED},{0x2282, 0xA1F8},{0x2283, 0xA1F9},{0x2286, 0xA1F6},{0x2287, 0xA1F7},{0x2299, 0xA2C1},{0x22A5, 0xA1D1},{0x2312, 0xA1D2},
+ {0x2460, 0xA8E7},{0x2461, 0xA8E8},{0x2462, 0xA8E9},{0x2463, 0xA8EA},{0x2464, 0xA8EB},{0x2465, 0xA8EC},{0x2466, 0xA8ED},{0x2467, 0xA8EE},
+ {0x2468, 0xA8EF},{0x2469, 0xA8F0},{0x246A, 0xA8F1},{0x246B, 0xA8F2},{0x246C, 0xA8F3},{0x246D, 0xA8F4},{0x246E, 0xA8F5},{0x2474, 0xA9E7},
+ {0x2475, 0xA9E8},{0x2476, 0xA9E9},{0x2477, 0xA9EA},{0x2478, 0xA9EB},{0x2479, 0xA9EC},{0x247A, 0xA9ED},{0x247B, 0xA9EE},{0x247C, 0xA9EF},
+ {0x247D, 0xA9F0},{0x247E, 0xA9F1},{0x247F, 0xA9F2},{0x2480, 0xA9F3},{0x2481, 0xA9F4},{0x2482, 0xA9F5},{0x249C, 0xA9CD},{0x249D, 0xA9CE},
+ {0x249E, 0xA9CF},{0x249F, 0xA9D0},{0x24A0, 0xA9D1},{0x24A1, 0xA9D2},{0x24A2, 0xA9D3},{0x24A3, 0xA9D4},{0x24A4, 0xA9D5},{0x24A5, 0xA9D6},
+ {0x24A6, 0xA9D7},{0x24A7, 0xA9D8},{0x24A8, 0xA9D9},{0x24A9, 0xA9DA},{0x24AA, 0xA9DB},{0x24AB, 0xA9DC},{0x24AC, 0xA9DD},{0x24AD, 0xA9DE},
+ {0x24AE, 0xA9DF},{0x24AF, 0xA9E0},{0x24B0, 0xA9E1},{0x24B1, 0xA9E2},{0x24B2, 0xA9E3},{0x24B3, 0xA9E4},{0x24B4, 0xA9E5},{0x24B5, 0xA9E6},
+ {0x24D0, 0xA8CD},{0x24D1, 0xA8CE},{0x24D2, 0xA8CF},{0x24D3, 0xA8D0},{0x24D4, 0xA8D1},{0x24D5, 0xA8D2},{0x24D6, 0xA8D3},{0x24D7, 0xA8D4},
+ {0x24D8, 0xA8D5},{0x24D9, 0xA8D6},{0x24DA, 0xA8D7},{0x24DB, 0xA8D8},{0x24DC, 0xA8D9},{0x24DD, 0xA8DA},{0x24DE, 0xA8DB},{0x24DF, 0xA8DC},
+ {0x24E0, 0xA8DD},{0x24E1, 0xA8DE},{0x24E2, 0xA8DF},{0x24E3, 0xA8E0},{0x24E4, 0xA8E1},{0x24E5, 0xA8E2},{0x24E6, 0xA8E3},{0x24E7, 0xA8E4},
+ {0x24E8, 0xA8E5},{0x24E9, 0xA8E6},{0x2500, 0xA6A1},{0x2501, 0xA6AC},{0x2502, 0xA6A2},{0x2503, 0xA6AD},{0x250C, 0xA6A3},{0x250D, 0xA6C8},
+ {0x250E, 0xA6C7},{0x250F, 0xA6AE},{0x2510, 0xA6A4},{0x2511, 0xA6C2},{0x2512, 0xA6C1},{0x2513, 0xA6AF},{0x2514, 0xA6A6},{0x2515, 0xA6C6},
+ {0x2516, 0xA6C5},{0x2517, 0xA6B1},{0x2518, 0xA6A5},{0x2519, 0xA6C4},{0x251A, 0xA6C3},{0x251B, 0xA6B0},{0x251C, 0xA6A7},{0x251D, 0xA6BC},
+ {0x251E, 0xA6C9},{0x251F, 0xA6CA},{0x2520, 0xA6B7},{0x2521, 0xA6CB},{0x2522, 0xA6CC},{0x2523, 0xA6B2},{0x2524, 0xA6A9},{0x2525, 0xA6BE},
+ {0x2526, 0xA6CD},{0x2527, 0xA6CE},{0x2528, 0xA6B9},{0x2529, 0xA6CF},{0x252A, 0xA6D0},{0x252B, 0xA6B4},{0x252C, 0xA6A8},{0x252D, 0xA6D1},
+ {0x252E, 0xA6D2},{0x252F, 0xA6B8},{0x2530, 0xA6BD},{0x2531, 0xA6D3},{0x2532, 0xA6D4},{0x2533, 0xA6B3},{0x2534, 0xA6AA},{0x2535, 0xA6D5},
+ {0x2536, 0xA6D6},{0x2537, 0xA6BA},{0x2538, 0xA6BF},{0x2539, 0xA6D7},{0x253A, 0xA6D8},{0x253B, 0xA6B5},{0x253C, 0xA6AB},{0x253D, 0xA6D9},
+ {0x253E, 0xA6DA},{0x253F, 0xA6BB},{0x2540, 0xA6DB},{0x2541, 0xA6DC},{0x2542, 0xA6C0},{0x2543, 0xA6DD},{0x2544, 0xA6DE},{0x2545, 0xA6DF},
+ {0x2546, 0xA6E0},{0x2547, 0xA6E1},{0x2548, 0xA6E2},{0x2549, 0xA6E3},{0x254A, 0xA6E4},{0x254B, 0xA6B6},{0x2592, 0xA2C6},{0x25A0, 0xA1E1},
+ {0x25A1, 0xA1E0},{0x25A3, 0xA2C3},{0x25A4, 0xA2C7},{0x25A5, 0xA2C8},{0x25A6, 0xA2CB},{0x25A7, 0xA2CA},{0x25A8, 0xA2C9},{0x25A9, 0xA2CC},
+ {0x25B2, 0xA1E3},{0x25B3, 0xA1E2},{0x25B6, 0xA2BA},{0x25B7, 0xA2B9},{0x25BC, 0xA1E5},{0x25BD, 0xA1E4},{0x25C0, 0xA2B8},{0x25C1, 0xA2B7},
+ {0x25C6, 0xA1DF},{0x25C7, 0xA1DE},{0x25C8, 0xA2C2},{0x25CB, 0xA1DB},{0x25CE, 0xA1DD},{0x25CF, 0xA1DC},{0x25D0, 0xA2C4},{0x25D1, 0xA2C5},
+ {0x2605, 0xA1DA},{0x2606, 0xA1D9},{0x260E, 0xA2CF},{0x260F, 0xA2CE},{0x261C, 0xA2D0},{0x261E, 0xA2D1},{0x2640, 0xA1CF},{0x2642, 0xA1CE},
+ {0x2660, 0xA2BC},{0x2661, 0xA2BD},{0x2663, 0xA2C0},{0x2664, 0xA2BB},{0x2665, 0xA2BE},{0x2667, 0xA2BF},{0x2668, 0xA2CD},{0x2669, 0xA2DB},
+ {0x266A, 0xA2DC},{0x266C, 0xA2DD},{0x266D, 0xA2DA},{0x3000, 0xA1A1},{0x3001, 0xA1A2},{0x3002, 0xA1A3},{0x3003, 0xA1A8},{0x3008, 0xA1B4},
+ {0x3009, 0xA1B5},{0x300A, 0xA1B6},{0x300B, 0xA1B7},{0x300C, 0xA1B8},{0x300D, 0xA1B9},{0x300E, 0xA1BA},{0x300F, 0xA1BB},{0x3010, 0xA1BC},
+ {0x3011, 0xA1BD},{0x3013, 0xA1EB},{0x3014, 0xA1B2},{0x3015, 0xA1B3},{0x3041, 0xAAA1},{0x3042, 0xAAA2},{0x3043, 0xAAA3},{0x3044, 0xAAA4},
+ {0x3045, 0xAAA5},{0x3046, 0xAAA6},{0x3047, 0xAAA7},{0x3048, 0xAAA8},{0x3049, 0xAAA9},{0x304A, 0xAAAA},{0x304B, 0xAAAB},{0x304C, 0xAAAC},
+ {0x304D, 0xAAAD},{0x304E, 0xAAAE},{0x304F, 0xAAAF},{0x3050, 0xAAB0},{0x3051, 0xAAB1},{0x3052, 0xAAB2},{0x3053, 0xAAB3},{0x3054, 0xAAB4},
+ {0x3055, 0xAAB5},{0x3056, 0xAAB6},{0x3057, 0xAAB7},{0x3058, 0xAAB8},{0x3059, 0xAAB9},{0x305A, 0xAABA},{0x305B, 0xAABB},{0x305C, 0xAABC},
+ {0x305D, 0xAABD},{0x305E, 0xAABE},{0x305F, 0xAABF},{0x3060, 0xAAC0},{0x3061, 0xAAC1},{0x3062, 0xAAC2},{0x3063, 0xAAC3},{0x3064, 0xAAC4},
+ {0x3065, 0xAAC5},{0x3066, 0xAAC6},{0x3067, 0xAAC7},{0x3068, 0xAAC8},{0x3069, 0xAAC9},{0x306A, 0xAACA},{0x306B, 0xAACB},{0x306C, 0xAACC},
+ {0x306D, 0xAACD},{0x306E, 0xAACE},{0x306F, 0xAACF},{0x3070, 0xAAD0},{0x3071, 0xAAD1},{0x3072, 0xAAD2},{0x3073, 0xAAD3},{0x3074, 0xAAD4},
+ {0x3075, 0xAAD5},{0x3076, 0xAAD6},{0x3077, 0xAAD7},{0x3078, 0xAAD8},{0x3079, 0xAAD9},{0x307A, 0xAADA},{0x307B, 0xAADB},{0x307C, 0xAADC},
+ {0x307D, 0xAADD},{0x307E, 0xAADE},{0x307F, 0xAADF},{0x3080, 0xAAE0},{0x3081, 0xAAE1},{0x3082, 0xAAE2},{0x3083, 0xAAE3},{0x3084, 0xAAE4},
+ {0x3085, 0xAAE5},{0x3086, 0xAAE6},{0x3087, 0xAAE7},{0x3088, 0xAAE8},{0x3089, 0xAAE9},{0x308A, 0xAAEA},{0x308B, 0xAAEB},{0x308C, 0xAAEC},
+ {0x308D, 0xAAED},{0x308E, 0xAAEE},{0x308F, 0xAAEF},{0x3090, 0xAAF0},{0x3091, 0xAAF1},{0x3092, 0xAAF2},{0x3093, 0xAAF3},{0x30A1, 0xABA1},
+ {0x30A2, 0xABA2},{0x30A3, 0xABA3},{0x30A4, 0xABA4},{0x30A5, 0xABA5},{0x30A6, 0xABA6},{0x30A7, 0xABA7},{0x30A8, 0xABA8},{0x30A9, 0xABA9},
+ {0x30AA, 0xABAA},{0x30AB, 0xABAB},{0x30AC, 0xABAC},{0x30AD, 0xABAD},{0x30AE, 0xABAE},{0x30AF, 0xABAF},{0x30B0, 0xABB0},{0x30B1, 0xABB1},
+ {0x30B2, 0xABB2},{0x30B3, 0xABB3},{0x30B4, 0xABB4},{0x30B5, 0xABB5},{0x30B6, 0xABB6},{0x30B7, 0xABB7},{0x30B8, 0xABB8},{0x30B9, 0xABB9},
+ {0x30BA, 0xABBA},{0x30BB, 0xABBB},{0x30BC, 0xABBC},{0x30BD, 0xABBD},{0x30BE, 0xABBE},{0x30BF, 0xABBF},{0x30C0, 0xABC0},{0x30C1, 0xABC1},
+ {0x30C2, 0xABC2},{0x30C3, 0xABC3},{0x30C4, 0xABC4},{0x30C5, 0xABC5},{0x30C6, 0xABC6},{0x30C7, 0xABC7},{0x30C8, 0xABC8},{0x30C9, 0xABC9},
+ {0x30CA, 0xABCA},{0x30CB, 0xABCB},{0x30CC, 0xABCC},{0x30CD, 0xABCD},{0x30CE, 0xABCE},{0x30CF, 0xABCF},{0x30D0, 0xABD0},{0x30D1, 0xABD1},
+ {0x30D2, 0xABD2},{0x30D3, 0xABD3},{0x30D4, 0xABD4},{0x30D5, 0xABD5},{0x30D6, 0xABD6},{0x30D7, 0xABD7},{0x30D8, 0xABD8},{0x30D9, 0xABD9},
+ {0x30DA, 0xABDA},{0x30DB, 0xABDB},{0x30DC, 0xABDC},{0x30DD, 0xABDD},{0x30DE, 0xABDE},{0x30DF, 0xABDF},{0x30E0, 0xABE0},{0x30E1, 0xABE1},
+ {0x30E2, 0xABE2},{0x30E3, 0xABE3},{0x30E4, 0xABE4},{0x30E5, 0xABE5},{0x30E6, 0xABE6},{0x30E7, 0xABE7},{0x30E8, 0xABE8},{0x30E9, 0xABE9},
+ {0x30EA, 0xABEA},{0x30EB, 0xABEB},{0x30EC, 0xABEC},{0x30ED, 0xABED},{0x30EE, 0xABEE},{0x30EF, 0xABEF},{0x30F0, 0xABF0},{0x30F1, 0xABF1},
+ {0x30F2, 0xABF2},{0x30F3, 0xABF3},{0x30F4, 0xABF4},{0x30F5, 0xABF5},{0x30F6, 0xABF6},{0x3131, 0xA4A1},{0x3132, 0xA4A2},{0x3133, 0xA4A3},
+ {0x3134, 0xA4A4},{0x3135, 0xA4A5},{0x3136, 0xA4A6},{0x3137, 0xA4A7},{0x3138, 0xA4A8},{0x3139, 0xA4A9},{0x313A, 0xA4AA},{0x313B, 0xA4AB},
+ {0x313C, 0xA4AC},{0x313D, 0xA4AD},{0x313E, 0xA4AE},{0x313F, 0xA4AF},{0x3140, 0xA4B0},{0x3141, 0xA4B1},{0x3142, 0xA4B2},{0x3143, 0xA4B3},
+ {0x3144, 0xA4B4},{0x3145, 0xA4B5},{0x3146, 0xA4B6},{0x3147, 0xA4B7},{0x3148, 0xA4B8},{0x3149, 0xA4B9},{0x314A, 0xA4BA},{0x314B, 0xA4BB},
+ {0x314C, 0xA4BC},{0x314D, 0xA4BD},{0x314E, 0xA4BE},{0x314F, 0xA4BF},{0x3150, 0xA4C0},{0x3151, 0xA4C1},{0x3152, 0xA4C2},{0x3153, 0xA4C3},
+ {0x3154, 0xA4C4},{0x3155, 0xA4C5},{0x3156, 0xA4C6},{0x3157, 0xA4C7},{0x3158, 0xA4C8},{0x3159, 0xA4C9},{0x315A, 0xA4CA},{0x315B, 0xA4CB},
+ {0x315C, 0xA4CC},{0x315D, 0xA4CD},{0x315E, 0xA4CE},{0x315F, 0xA4CF},{0x3160, 0xA4D0},{0x3161, 0xA4D1},{0x3162, 0xA4D2},{0x3163, 0xA4D3},
+ {0x3164, 0xA4D4},{0x3165, 0xA4D5},{0x3166, 0xA4D6},{0x3167, 0xA4D7},{0x3168, 0xA4D8},{0x3169, 0xA4D9},{0x316A, 0xA4DA},{0x316B, 0xA4DB},
+ {0x316C, 0xA4DC},{0x316D, 0xA4DD},{0x316E, 0xA4DE},{0x316F, 0xA4DF},{0x3170, 0xA4E0},{0x3171, 0xA4E1},{0x3172, 0xA4E2},{0x3173, 0xA4E3},
+ {0x3174, 0xA4E4},{0x3175, 0xA4E5},{0x3176, 0xA4E6},{0x3177, 0xA4E7},{0x3178, 0xA4E8},{0x3179, 0xA4E9},{0x317A, 0xA4EA},{0x317B, 0xA4EB},
+ {0x317C, 0xA4EC},{0x317D, 0xA4ED},{0x317E, 0xA4EE},{0x317F, 0xA4EF},{0x3180, 0xA4F0},{0x3181, 0xA4F1},{0x3182, 0xA4F2},{0x3183, 0xA4F3},
+ {0x3184, 0xA4F4},{0x3185, 0xA4F5},{0x3186, 0xA4F6},{0x3187, 0xA4F7},{0x3188, 0xA4F8},{0x3189, 0xA4F9},{0x318A, 0xA4FA},{0x318B, 0xA4FB},
+ {0x318C, 0xA4FC},{0x318D, 0xA4FD},{0x318E, 0xA4FE},{0x3200, 0xA9B1},{0x3201, 0xA9B2},{0x3202, 0xA9B3},{0x3203, 0xA9B4},{0x3204, 0xA9B5},
+ {0x3205, 0xA9B6},{0x3206, 0xA9B7},{0x3207, 0xA9B8},{0x3208, 0xA9B9},{0x3209, 0xA9BA},{0x320A, 0xA9BB},{0x320B, 0xA9BC},{0x320C, 0xA9BD},
+ {0x320D, 0xA9BE},{0x320E, 0xA9BF},{0x320F, 0xA9C0},{0x3210, 0xA9C1},{0x3211, 0xA9C2},{0x3212, 0xA9C3},{0x3213, 0xA9C4},{0x3214, 0xA9C5},
+ {0x3215, 0xA9C6},{0x3216, 0xA9C7},{0x3217, 0xA9C8},{0x3218, 0xA9C9},{0x3219, 0xA9CA},{0x321A, 0xA9CB},{0x321B, 0xA9CC},{0x321C, 0xA2DF},
+ {0x3260, 0xA8B1},{0x3261, 0xA8B2},{0x3262, 0xA8B3},{0x3263, 0xA8B4},{0x3264, 0xA8B5},{0x3265, 0xA8B6},{0x3266, 0xA8B7},{0x3267, 0xA8B8},
+ {0x3268, 0xA8B9},{0x3269, 0xA8BA},{0x326A, 0xA8BB},{0x326B, 0xA8BC},{0x326C, 0xA8BD},{0x326D, 0xA8BE},{0x326E, 0xA8BF},{0x326F, 0xA8C0},
+ {0x3270, 0xA8C1},{0x3271, 0xA8C2},{0x3272, 0xA8C3},{0x3273, 0xA8C4},{0x3274, 0xA8C5},{0x3275, 0xA8C6},{0x3276, 0xA8C7},{0x3277, 0xA8C8},
+ {0x3278, 0xA8C9},{0x3279, 0xA8CA},{0x327A, 0xA8CB},{0x327B, 0xA8CC},{0x327F, 0xA2DE},{0x3380, 0xA7C9},{0x3381, 0xA7CA},{0x3382, 0xA7CB},
+ {0x3383, 0xA7CC},{0x3384, 0xA7CD},{0x3388, 0xA7BA},{0x3389, 0xA7BB},{0x338A, 0xA7DC},{0x338B, 0xA7DD},{0x338C, 0xA7DE},{0x338D, 0xA7B6},
+ {0x338E, 0xA7B7},{0x338F, 0xA7B8},{0x3390, 0xA7D4},{0x3391, 0xA7D5},{0x3392, 0xA7D6},{0x3393, 0xA7D7},{0x3394, 0xA7D8},{0x3395, 0xA7A1},
+ {0x3396, 0xA7A2},{0x3397, 0xA7A3},{0x3398, 0xA7A5},{0x3399, 0xA7AB},{0x339A, 0xA7AC},{0x339B, 0xA7AD},{0x339C, 0xA7AE},{0x339D, 0xA7AF},
+ {0x339E, 0xA7B0},{0x339F, 0xA7B1},{0x33A0, 0xA7B2},{0x33A1, 0xA7B3},{0x33A2, 0xA7B4},{0x33A3, 0xA7A7},{0x33A4, 0xA7A8},{0x33A5, 0xA7A9},
+ {0x33A6, 0xA7AA},{0x33A7, 0xA7BD},{0x33A8, 0xA7BE},{0x33A9, 0xA7E5},{0x33AA, 0xA7E6},{0x33AB, 0xA7E7},{0x33AC, 0xA7E8},{0x33AD, 0xA7E1},
+ {0x33AE, 0xA7E2},{0x33AF, 0xA7E3},{0x33B0, 0xA7BF},{0x33B1, 0xA7C0},{0x33B2, 0xA7C1},{0x33B3, 0xA7C2},{0x33B4, 0xA7C3},{0x33B5, 0xA7C4},
+ {0x33B6, 0xA7C5},{0x33B7, 0xA7C6},{0x33B8, 0xA7C7},{0x33B9, 0xA7C8},{0x33BA, 0xA7CE},{0x33BB, 0xA7CF},{0x33BC, 0xA7D0},{0x33BD, 0xA7D1},
+ {0x33BE, 0xA7D2},{0x33BF, 0xA7D3},{0x33C0, 0xA7DA},{0x33C1, 0xA7DB},{0x33C2, 0xA2E3},{0x33C3, 0xA7EC},{0x33C4, 0xA7A6},{0x33C5, 0xA7E0},
+ {0x33C6, 0xA7EF},{0x33C7, 0xA2E1},{0x33C8, 0xA7BC},{0x33C9, 0xA7ED},{0x33CA, 0xA7B5},{0x33CF, 0xA7B9},{0x33D0, 0xA7EA},{0x33D3, 0xA7EB},
+ {0x33D6, 0xA7DF},{0x33D8, 0xA2E4},{0x33DB, 0xA7E4},{0x33DC, 0xA7EE},{0x33DD, 0xA7E9},{0x4E00, 0xECE9},{0x4E01, 0xEFCB},{0x4E03, 0xF6D2},
+ {0x4E07, 0xD8B2},{0x4E08, 0xEDDB},{0x4E09, 0xDFB2},{0x4E0A, 0xDFBE},{0x4E0B, 0xF9BB},{0x4E0D, 0xDCF4},{0x4E11, 0xF5E4},{0x4E14, 0xF3A6},
+ {0x4E15, 0xDDE0},{0x4E16, 0xE1A6},{0x4E18, 0xCEF8},{0x4E19, 0xDCB0},{0x4E1E, 0xE3AA},{0x4E2D, 0xF1E9},{0x4E32, 0xCDFA},{0x4E38, 0xFCAF},
+ {0x4E39, 0xD3A1},{0x4E3B, 0xF1AB},{0x4E42, 0xE7D1},{0x4E43, 0xD2AC},{0x4E45, 0xCEF9},{0x4E4B, 0xF1FD},{0x4E4D, 0xDEBF},{0x4E4E, 0xFBBA},
+ {0x4E4F, 0xF9B9},{0x4E56, 0xCED2},{0x4E58, 0xE3AB},{0x4E59, 0xEBE0},{0x4E5D, 0xCEFA},{0x4E5E, 0xCBF7},{0x4E5F, 0xE5A5},{0x4E6B, 0xCAE1},
+ {0x4E6D, 0xD4CC},{0x4E73, 0xEAE1},{0x4E76, 0xDCE3},{0x4E77, 0xDFAD},{0x4E7E, 0xCBEB},{0x4E82, 0xD5AF},{0x4E86, 0xD6F5},{0x4E88, 0xE5F8},
+ {0x4E8B, 0xDEC0},{0x4E8C, 0xECA3},{0x4E8E, 0xE9CD},{0x4E90, 0xEAA7},{0x4E91, 0xE9F6},{0x4E92, 0xFBBB},{0x4E94, 0xE7E9},{0x4E95, 0xEFCC},
+ {0x4E98, 0xD0E6},{0x4E9B, 0xDEC1},{0x4E9E, 0xE4AC},{0x4EA1, 0xD8CC},{0x4EA2, 0xF9F1},{0x4EA4, 0xCEDF},{0x4EA5, 0xFAA4},{0x4EA6, 0xE6B2},
+ {0x4EA8, 0xFAFB},{0x4EAB, 0xFABD},{0x4EAC, 0xCCC8},{0x4EAD, 0xEFCD},{0x4EAE, 0xD5D5},{0x4EB6, 0xD3A2},{0x4EBA, 0xECD1},{0x4EC0, 0xE4A7},
+ {0x4EC1, 0xECD2},{0x4EC4, 0xF6B1},{0x4EC7, 0xCEFB},{0x4ECA, 0xD0D1},{0x4ECB, 0xCBBF},{0x4ECD, 0xEDA4},{0x4ED4, 0xEDA8},{0x4ED5, 0xDEC2},
+ {0x4ED6, 0xF6E2},{0x4ED7, 0xEDDC},{0x4ED8, 0xDCF5},{0x4ED9, 0xE0B9},{0x4EDD, 0xD4CE},{0x4EDF, 0xF4B5},{0x4EE3, 0xD3DB},{0x4EE4, 0xD6B5},
+ {0x4EE5, 0xECA4},{0x4EF0, 0xE4E6},{0x4EF2, 0xF1EA},{0x4EF6, 0xCBEC},{0x4EF7, 0xCBC0},{0x4EFB, 0xECF2},{0x4F01, 0xD0EA},{0x4F09, 0xF9F2},
+ {0x4F0A, 0xECA5},{0x4F0B, 0xD0DF},{0x4F0D, 0xE7EA},{0x4F0E, 0xD0EB},{0x4F0F, 0xDCD1},{0x4F10, 0xDBE9},{0x4F11, 0xFDCC},{0x4F2F, 0xDBD7},
+ {0x4F34, 0xDAE1},{0x4F36, 0xD6B6},{0x4F38, 0xE3DF},{0x4F3A, 0xDEC3},{0x4F3C, 0xDEC4},{0x4F3D, 0xCAA1},{0x4F43, 0xEEEC},{0x4F46, 0xD3A3},
+ {0x4F47, 0xEEB7},{0x4F48, 0xF8CF},{0x4F4D, 0xEAC8},{0x4F4E, 0xEEB8},{0x4F4F, 0xF1AC},{0x4F50, 0xF1A5},{0x4F51, 0xE9CE},{0x4F55, 0xF9BC},
+ {0x4F59, 0xE5F9},{0x4F5A, 0xECEA},{0x4F5B, 0xDDD6},{0x4F5C, 0xEDC2},{0x4F69, 0xF8A5},{0x4F6F, 0xE5BA},{0x4F70, 0xDBD8},{0x4F73, 0xCAA2},
+ {0x4F76, 0xD1CD},{0x4F7A, 0xEEED},{0x4F7E, 0xECEB},{0x4F7F, 0xDEC5},{0x4F81, 0xE3E0},{0x4F83, 0xCAC9},{0x4F84, 0xF2E9},{0x4F86, 0xD5CE},
+ {0x4F88, 0xF6B6},{0x4F8A, 0xCEC2},{0x4F8B, 0xD6C7},{0x4F8D, 0xE3B4},{0x4F8F, 0xF1AD},{0x4F91, 0xEAE2},{0x4F96, 0xD7C2},{0x4F98, 0xF3A7},
+ {0x4F9B, 0xCDEA},{0x4F9D, 0xEBEE},{0x4FAE, 0xD9B2},{0x4FAF, 0xFDA5},{0x4FB5, 0xF6D5},{0x4FB6, 0xD5E2},{0x4FBF, 0xF8B5},{0x4FC2, 0xCCF5},
+ {0x4FC3, 0xF5B5},{0x4FC4, 0xE4AD},{0x4FC9, 0xE7EB},{0x4FCA, 0xF1D5},{0x4FCE, 0xF0BB},{0x4FD1, 0xE9B5},{0x4FD3, 0xCCC9},{0x4FD4, 0xFAD5},
+ {0x4FD7, 0xE1D4},{0x4FDA, 0xD7D6},{0x4FDD, 0xDCC1},{0x4FDF, 0xDEC6},{0x4FE0, 0xFAEF},{0x4FE1, 0xE3E1},{0x4FEE, 0xE1F3},{0x4FEF, 0xDCF6},
+ {0x4FF1, 0xCEFC},{0x4FF3, 0xDBC4},{0x4FF5, 0xF8F1},{0x4FF8, 0xDCE4},{0x4FFA, 0xE5EF},{0x5002, 0xDCB1},{0x5006, 0xD5D6},{0x5009, 0xF3DA},
+ {0x500B, 0xCBC1},{0x500D, 0xDBC3},{0x5011, 0xD9FA},{0x5012, 0xD3EE},{0x5016, 0xFAB8},{0x5019, 0xFDA6},{0x501A, 0xEBEF},{0x501C, 0xF4A6},
+ {0x501E, 0xCCCA},{0x501F, 0xF3A8},{0x5021, 0xF3DB},{0x5023, 0xDBA7},{0x5024, 0xF6B7},{0x5026, 0xCFE6},{0x5027, 0xF0F2},{0x5028, 0xCBDA},
+ {0x502A, 0xE7D2},{0x502B, 0xD7C3},{0x502C, 0xF6F0},{0x502D, 0xE8DE},{0x503B, 0xE5A6},{0x5043, 0xE5E7},{0x5047, 0xCAA3},{0x5048, 0xCCA7},
+ {0x5049, 0xEAC9},{0x504F, 0xF8B6},{0x5055, 0xFAA5},{0x505A, 0xF1AE},{0x505C, 0xEFCE},{0x5065, 0xCBED},{0x5074, 0xF6B0},{0x5075, 0xEFCF},
+ {0x5076, 0xE9CF},{0x5078, 0xF7DE},{0x5080, 0xCED3},{0x5085, 0xDCF7},{0x508D, 0xDBA8},{0x5091, 0xCBF8},{0x5098, 0xDFA1},{0x5099, 0xDDE1},
+ {0x50AC, 0xF5CA},{0x50AD, 0xE9B6},{0x50B2, 0xE7EC},{0x50B3, 0xEEEE},{0x50B5, 0xF3F0},{0x50B7, 0xDFBF},{0x50BE, 0xCCCB},{0x50C5, 0xD0C1},
+ {0x50C9, 0xF4D2},{0x50CA, 0xE0BA},{0x50CF, 0xDFC0},{0x50D1, 0xCEE0},{0x50D5, 0xDCD2},{0x50D6, 0xFDEA},{0x50DA, 0xD6F6},{0x50DE, 0xEACA},
+ {0x50E5, 0xE8E9},{0x50E7, 0xE3AC},{0x50ED, 0xF3D0},{0x50F9, 0xCAA4},{0x50FB, 0xDBF8},{0x50FF, 0xDEC7},{0x5100, 0xEBF0},{0x5101, 0xF1D6},
+ {0x5104, 0xE5E2},{0x5106, 0xCCCC},{0x5109, 0xCBFB},{0x5112, 0xEAE3},{0x511F, 0xDFC1},{0x5121, 0xD6ED},{0x512A, 0xE9D0},{0x5132, 0xEEB9},
+ {0x5137, 0xD5E3},{0x513A, 0xD1D3},{0x513C, 0xE5F0},{0x5140, 0xE8B4},{0x5141, 0xEBC3},{0x5143, 0xEAAA},{0x5144, 0xFAFC},{0x5145, 0xF5F6},
+ {0x5146, 0xF0BC},{0x5147, 0xFDD4},{0x5148, 0xE0BB},{0x5149, 0xCEC3},{0x514B, 0xD0BA},{0x514C, 0xF7BA},{0x514D, 0xD8F3},{0x514E, 0xF7CD},
+ {0x5152, 0xE4AE},{0x515C, 0xD4DF},{0x5162, 0xD0E7},{0x5165, 0xECFD},{0x5167, 0xD2AE},{0x5168, 0xEEEF},{0x5169, 0xD5D7},{0x516A, 0xEAE4},
+ {0x516B, 0xF8A2},{0x516C, 0xCDEB},{0x516D, 0xD7BF},{0x516E, 0xFBB1},{0x5171, 0xCDEC},{0x5175, 0xDCB2},{0x5176, 0xD0EC},{0x5177, 0xCEFD},
+ {0x5178, 0xEEF0},{0x517C, 0xCCC2},{0x5180, 0xD0ED},{0x5186, 0xE5F7},{0x518A, 0xF3FC},{0x518D, 0xEEA2},{0x5192, 0xD9B3},{0x5195, 0xD8F4},
+ {0x5197, 0xE9B7},{0x51A0, 0xCEAE},{0x51A5, 0xD9A2},{0x51AA, 0xD8F1},{0x51AC, 0xD4CF},{0x51B6, 0xE5A7},{0x51B7, 0xD5D2},{0x51BD, 0xD6A9},
+ {0x51C4, 0xF4A2},{0x51C6, 0xF1D7},{0x51C9, 0xD5D8},{0x51CB, 0xF0BD},{0x51CC, 0xD7D0},{0x51CD, 0xD4D0},{0x51DC, 0xD7CF},{0x51DD, 0xEBEA},
+ {0x51DE, 0xFDEB},{0x51E1, 0xDBED},{0x51F0, 0xFCC5},{0x51F1, 0xCBC2},{0x51F6, 0xFDD5},{0x51F8, 0xF4C8},{0x51F9, 0xE8EA},{0x51FA, 0xF5F3},
+ {0x51FD, 0xF9DE},{0x5200, 0xD3EF},{0x5203, 0xECD3},{0x5206, 0xDDC2},{0x5207, 0xEFB7},{0x5208, 0xE7D4},{0x520A, 0xCACA},{0x520E, 0xD9FB},
+ {0x5211, 0xFAFD},{0x5217, 0xD6AA},{0x521D, 0xF4F8},{0x5224, 0xF7F7},{0x5225, 0xDCAC},{0x5229, 0xD7D7},{0x522A, 0xDFA2},{0x522E, 0xCEBE},
+ {0x5230, 0xD3F0},{0x5236, 0xF0A4},{0x5237, 0xE1EC},{0x5238, 0xCFE7},{0x5239, 0xF3CB},{0x523A, 0xEDA9},{0x523B, 0xCABE},{0x5243, 0xF4EF},
+ {0x5247, 0xF6CE},{0x524A, 0xDEFB},{0x524B, 0xD0BB},{0x524C, 0xD5B7},{0x524D, 0xEEF1},{0x5254, 0xF4A8},{0x5256, 0xDCF8},{0x525B, 0xCBA7},
+ {0x525D, 0xDACE},{0x5261, 0xE0E6},{0x5269, 0xEDA5},{0x526A, 0xEEF2},{0x526F, 0xDCF9},{0x5272, 0xF9DC},{0x5275, 0xF3DC},{0x527D, 0xF8F2},
+ {0x527F, 0xF4F9},{0x5283, 0xFCF1},{0x5287, 0xD0BC},{0x5288, 0xDBF9},{0x5289, 0xD7B1},{0x528D, 0xCBFC},{0x5291, 0xF0A5},{0x5292, 0xCBFD},
+ {0x529B, 0xD5F4},{0x529F, 0xCDED},{0x52A0, 0xCAA5},{0x52A3, 0xD6AB},{0x52A4, 0xD0C2},{0x52A9, 0xF0BE},{0x52AA, 0xD2BD},{0x52AB, 0xCCA4},
+ {0x52BE, 0xFAB6},{0x52C1, 0xCCCD},{0x52C3, 0xDAFA},{0x52C5, 0xF6CF},{0x52C7, 0xE9B8},{0x52C9, 0xD8F5},{0x52CD, 0xCCCE},{0x52D2, 0xD7CD},
+ {0x52D5, 0xD4D1},{0x52D6, 0xE9ED},{0x52D8, 0xCAEB},{0x52D9, 0xD9E2},{0x52DB, 0xFDB2},{0x52DD, 0xE3AD},{0x52DE, 0xD6CC},{0x52DF, 0xD9B4},
+ {0x52E2, 0xE1A7},{0x52E3, 0xEED3},{0x52E4, 0xD0C3},{0x52F3, 0xFDB3},{0x52F5, 0xD5E4},{0x52F8, 0xCFE8},{0x52FA, 0xEDC3},{0x52FB, 0xD0B2},
+ {0x52FE, 0xCEFE},{0x52FF, 0xDAA8},{0x5305, 0xF8D0},{0x5308, 0xFDD6},{0x530D, 0xF8D1},{0x530F, 0xF8D2},{0x5310, 0xDCD3},{0x5315, 0xDDE2},
+ {0x5316, 0xFBF9},{0x5317, 0xDDC1},{0x5319, 0xE3B5},{0x5320, 0xEDDD},{0x5321, 0xCEC4},{0x5323, 0xCBA1},{0x532A, 0xDDE3},{0x532F, 0xFCDD},
+ {0x5339, 0xF9AF},{0x533F, 0xD2FB},{0x5340, 0xCFA1},{0x5341, 0xE4A8},{0x5343, 0xF4B6},{0x5344, 0xECFE},{0x5347, 0xE3AE},{0x5348, 0xE7ED},
+ {0x5349, 0xFDC1},{0x534A, 0xDAE2},{0x534D, 0xD8B3},{0x5351, 0xDDE4},{0x5352, 0xF0EF},{0x5353, 0xF6F1},{0x5354, 0xFAF0},{0x5357, 0xD1F5},
+ {0x535A, 0xDACF},{0x535C, 0xDCD4},{0x535E, 0xDCA6},{0x5360, 0xEFBF},{0x5366, 0xCECF},{0x5368, 0xE0D9},{0x536F, 0xD9D6},{0x5370, 0xECD4},
+ {0x5371, 0xEACB},{0x5374, 0xCABF},{0x5375, 0xD5B0},{0x5377, 0xCFE9},{0x537D, 0xF1ED},{0x537F, 0xCCCF},{0x5384, 0xE4F8},{0x5393, 0xE4ED},
+ {0x5398, 0xD7D8},{0x539A, 0xFDA7},{0x539F, 0xEAAB},{0x53A0, 0xF6B2},{0x53A5, 0xCFF0},{0x53A6, 0xF9BD},{0x53AD, 0xE6F4},{0x53BB, 0xCBDB},
+ {0x53C3, 0xF3D1},{0x53C8, 0xE9D1},{0x53C9, 0xF3A9},{0x53CA, 0xD0E0},{0x53CB, 0xE9D2},{0x53CD, 0xDAE3},{0x53D4, 0xE2D2},{0x53D6, 0xF6A2},
+ {0x53D7, 0xE1F4},{0x53DB, 0xDAE4},{0x53E1, 0xE7D5},{0x53E2, 0xF5BF},{0x53E3, 0xCFA2},{0x53E4, 0xCDAF},{0x53E5, 0xCFA3},{0x53E9, 0xCDB0},
+ {0x53EA, 0xF1FE},{0x53EB, 0xD0A3},{0x53EC, 0xE1AF},{0x53ED, 0xF8A3},{0x53EF, 0xCAA6},{0x53F0, 0xF7BB},{0x53F1, 0xF2EA},{0x53F2, 0xDEC8},
+ {0x53F3, 0xE9D3},{0x53F8, 0xDEC9},{0x5403, 0xFDDE},{0x5404, 0xCAC0},{0x5408, 0xF9EA},{0x5409, 0xD1CE},{0x540A, 0xEED4},{0x540C, 0xD4D2},
+ {0x540D, 0xD9A3},{0x540E, 0xFDA8},{0x540F, 0xD7D9},{0x5410, 0xF7CE},{0x5411, 0xFABE},{0x541B, 0xCFD6},{0x541D, 0xD7F0},{0x541F, 0xEBE1},
+ {0x5420, 0xF8C5},{0x5426, 0xDCFA},{0x5429, 0xDDC3},{0x542B, 0xF9DF},{0x5433, 0xE7EF},{0x5438, 0xFDE5},{0x5439, 0xF6A3},{0x543B, 0xD9FC},
+ {0x543C, 0xFDA9},{0x543E, 0xE7EE},{0x5442, 0xD5E5},{0x5448, 0xEFD0},{0x544A, 0xCDB1},{0x5451, 0xF7A2},{0x5468, 0xF1B2},{0x546A, 0xF1B1},
+ {0x5471, 0xCDB2},{0x5473, 0xDAAB},{0x5475, 0xCAA7},{0x547B, 0xE3E2},{0x547C, 0xFBBC},{0x547D, 0xD9A4},{0x5480, 0xEEBA},{0x5486, 0xF8D3},
+ {0x548C, 0xFBFA},{0x548E, 0xCFA4},{0x5490, 0xDCFB},{0x54A4, 0xF6E3},{0x54A8, 0xEDAA},{0x54AB, 0xF2A1},{0x54AC, 0xCEE1},{0x54B3, 0xFAA6},
+ {0x54B8, 0xF9E0},{0x54BD, 0xECD6},{0x54C0, 0xE4EE},{0x54C1, 0xF9A1},{0x54C4, 0xFBEF},{0x54C8, 0xF9EB},{0x54C9, 0xEEA3},{0x54E1, 0xEAAC},
+ {0x54E5, 0xCAA8},{0x54E8, 0xF4FA},{0x54ED, 0xCDD6},{0x54EE, 0xFCF6},{0x54F2, 0xF4C9},{0x54FA, 0xF8D4},{0x5504, 0xF8A6},{0x5506, 0xDECA},
+ {0x5507, 0xF2C6},{0x550E, 0xD7DA},{0x5510, 0xD3D0},{0x551C, 0xD8C5},{0x552F, 0xEAE6},{0x5531, 0xF3DD},{0x5535, 0xE4DA},{0x553E, 0xF6E4},
+ {0x5544, 0xF6F2},{0x5546, 0xDFC2},{0x554F, 0xD9FD},{0x5553, 0xCCF6},{0x5556, 0xD3BA},{0x555E, 0xE4AF},{0x5563, 0xF9E1},{0x557C, 0xF0A6},
+ {0x5580, 0xCBD3},{0x5584, 0xE0BC},{0x5586, 0xF4CA},{0x5587, 0xD4FA},{0x5589, 0xFDAA},{0x558A, 0xF9E2},{0x5598, 0xF4B7},{0x5599, 0xFDC2},
+ {0x559A, 0xFCB0},{0x559C, 0xFDEC},{0x559D, 0xCAE2},{0x55A7, 0xFDBD},{0x55A9, 0xEAE7},{0x55AA, 0xDFC3},{0x55AB, 0xD1D2},{0x55AC, 0xCEE2},
+ {0x55AE, 0xD3A4},{0x55C5, 0xFDAB},{0x55C7, 0xDFE0},{0x55D4, 0xF2C7},{0x55DA, 0xE7F0},{0x55DC, 0xD0EE},{0x55DF, 0xF3AA},{0x55E3, 0xDECB},
+ {0x55E4, 0xF6B8},{0x55FD, 0xE1F5},{0x55FE, 0xF1B3},{0x5606, 0xF7A3},{0x5609, 0xCAA9},{0x5614, 0xCFA5},{0x5617, 0xDFC4},{0x562F, 0xE1B0},
+ {0x5632, 0xF0BF},{0x5634, 0xF6A4},{0x5636, 0xE3B6},{0x5653, 0xFAC6},{0x5668, 0xD0EF},{0x566B, 0xFDED},{0x5674, 0xDDC4},{0x5686, 0xFCF7},
+ {0x56A5, 0xE6BF},{0x56AC, 0xDEAD},{0x56AE, 0xFABF},{0x56B4, 0xE5F1},{0x56BC, 0xEDC4},{0x56CA, 0xD2A5},{0x56CD, 0xFDEE},{0x56D1, 0xF5B6},
+ {0x56DA, 0xE1F6},{0x56DB, 0xDECC},{0x56DE, 0xFCDE},{0x56E0, 0xECD7},{0x56F0, 0xCDDD},{0x56F9, 0xD6B7},{0x56FA, 0xCDB3},{0x5703, 0xF8D5},
+ {0x5704, 0xE5D8},{0x5708, 0xCFEA},{0x570B, 0xCFD0},{0x570D, 0xEACC},{0x5712, 0xEAAE},{0x5713, 0xEAAD},{0x5716, 0xD3F1},{0x5718, 0xD3A5},
+ {0x571F, 0xF7CF},{0x5728, 0xEEA4},{0x572D, 0xD0A4},{0x5730, 0xF2A2},{0x573B, 0xD0F0},{0x5740, 0xF2A3},{0x5742, 0xF7F8},{0x5747, 0xD0B3},
+ {0x574A, 0xDBA9},{0x574D, 0xD3BB},{0x574E, 0xCAEC},{0x5750, 0xF1A6},{0x5751, 0xCBD5},{0x5761, 0xF7E7},{0x5764, 0xCDDE},{0x5766, 0xF7A4},
+ {0x576A, 0xF8C0},{0x576E, 0xD3DD},{0x5770, 0xCCD0},{0x5775, 0xCFA6},{0x577C, 0xF6F3},{0x5782, 0xE1F7},{0x5788, 0xD3DC},{0x578B, 0xFAFE},
+ {0x5793, 0xFAA7},{0x57A0, 0xEBD9},{0x57A2, 0xCFA7},{0x57A3, 0xEAAF},{0x57C3, 0xE4EF},{0x57C7, 0xE9B9},{0x57C8, 0xF1D8},{0x57CB, 0xD8D8},
+ {0x57CE, 0xE0F2},{0x57DF, 0xE6B4},{0x57E0, 0xDCFC},{0x57F0, 0xF3F1},{0x57F4, 0xE3D0},{0x57F7, 0xF2FB},{0x57F9, 0xDBC6},{0x57FA, 0xD0F1},
+ {0x57FC, 0xD0F2},{0x5800, 0xCFDC},{0x5802, 0xD3D1},{0x5805, 0xCCB1},{0x5806, 0xF7D8},{0x5808, 0xCBA8},{0x5809, 0xEBBC},{0x580A, 0xE4BE},
+ {0x581E, 0xF4DC},{0x5821, 0xDCC2},{0x5824, 0xF0A7},{0x5827, 0xE6C0},{0x582A, 0xCAED},{0x582F, 0xE8EB},{0x5830, 0xE5E8},{0x5831, 0xDCC3},
+ {0x5834, 0xEDDE},{0x5835, 0xD3F2},{0x583A, 0xCCF7},{0x584A, 0xCED4},{0x584B, 0xE7AB},{0x584F, 0xCBC3},{0x5851, 0xE1B1},{0x5854, 0xF7B2},
+ {0x5857, 0xD3F3},{0x5858, 0xD3D2},{0x585A, 0xF5C0},{0x585E, 0xDFDD},{0x5861, 0xEEF3},{0x5862, 0xE7F1},{0x5864, 0xFDB4},{0x5875, 0xF2C8},
+ {0x5879, 0xF3D2},{0x587C, 0xEEF4},{0x587E, 0xE2D3},{0x5883, 0xCCD1},{0x5885, 0xDFEA},{0x5889, 0xE9BA},{0x5893, 0xD9D7},{0x589C, 0xF5CD},
+ {0x589E, 0xF1F2},{0x589F, 0xFAC7},{0x58A8, 0xD9F8},{0x58A9, 0xD4C2},{0x58AE, 0xF6E5},{0x58B3, 0xDDC5},{0x58BA, 0xE7F2},{0x58BB, 0xEDDF},
+ {0x58BE, 0xCACB},{0x58C1, 0xDBFA},{0x58C5, 0xE8B5},{0x58C7, 0xD3A6},{0x58CE, 0xFDB5},{0x58D1, 0xF9C9},{0x58D3, 0xE4E2},{0x58D5, 0xFBBD},
+ {0x58D8, 0xD7A4},{0x58D9, 0xCEC5},{0x58DE, 0xCED5},{0x58DF, 0xD6E6},{0x58E4, 0xE5BD},{0x58EB, 0xDECD},{0x58EC, 0xECF3},{0x58EF, 0xEDE0},
+ {0x58F9, 0xECEC},{0x58FA, 0xFBBE},{0x58FB, 0xDFEB},{0x58FD, 0xE1F8},{0x590F, 0xF9BE},{0x5914, 0xD0F3},{0x5915, 0xE0AA},{0x5916, 0xE8E2},
+ {0x5919, 0xE2D4},{0x591A, 0xD2FD},{0x591C, 0xE5A8},{0x5922, 0xD9D3},{0x5927, 0xD3DE},{0x5929, 0xF4B8},{0x592A, 0xF7BC},{0x592B, 0xDCFD},
+ {0x592D, 0xE8EC},{0x592E, 0xE4E7},{0x5931, 0xE3F7},{0x5937, 0xECA8},{0x593E, 0xFAF1},{0x5944, 0xE5F2},{0x5947, 0xD0F4},{0x5948, 0xD2AF},
+ {0x5949, 0xDCE5},{0x594E, 0xD0A5},{0x594F, 0xF1B4},{0x5950, 0xFCB1},{0x5951, 0xCCF8},{0x5954, 0xDDC6},{0x5955, 0xFAD1},{0x5957, 0xF7DF},
+ {0x595A, 0xFAA8},{0x5960, 0xEEF5},{0x5962, 0xDECE},{0x5967, 0xE7F3},{0x596A, 0xF7AC},{0x596B, 0xEBC4},{0x596C, 0xEDE1},{0x596D, 0xE0AB},
+ {0x596E, 0xDDC7},{0x5973, 0xD2B3},{0x5974, 0xD2BF},{0x5978, 0xCACC},{0x597D, 0xFBBF},{0x5982, 0xE5FD},{0x5983, 0xDDE5},{0x5984, 0xD8CD},
+ {0x598A, 0xECF4},{0x5993, 0xD0F5},{0x5996, 0xE8ED},{0x5997, 0xD0D2},{0x5999, 0xD9D8},{0x59A5, 0xF6E6},{0x59A8, 0xDBAA},{0x59AC, 0xF7E0},
+ {0x59B9, 0xD8D9},{0x59BB, 0xF4A3},{0x59BE, 0xF4DD},{0x59C3, 0xEFD1},{0x59C6, 0xD9B5},{0x59C9, 0xEDAB},{0x59CB, 0xE3B7},{0x59D0, 0xEEBB},
+ {0x59D1, 0xCDB4},{0x59D3, 0xE0F3},{0x59D4, 0xEACD},{0x59D9, 0xECF5},{0x59DA, 0xE8EE},{0x59DC, 0xCBA9},{0x59DD, 0xF1AF},{0x59E6, 0xCACD},
+ {0x59E8, 0xECA9},{0x59EA, 0xF2EB},{0x59EC, 0xFDEF},{0x59EE, 0xF9F3},{0x59F8, 0xE6C1},{0x59FB, 0xECD8},{0x59FF, 0xEDAC},{0x5A01, 0xEACE},
+ {0x5A03, 0xE8DF},{0x5A11, 0xDECF},{0x5A18, 0xD2A6},{0x5A1B, 0xE7F4},{0x5A1C, 0xD1D6},{0x5A1F, 0xE6C2},{0x5A20, 0xE3E3},{0x5A25, 0xE4B0},
+ {0x5A29, 0xD8B4},{0x5A36, 0xF6A5},{0x5A3C, 0xF3DE},{0x5A41, 0xD7A5},{0x5A46, 0xF7E8},{0x5A49, 0xE8C6},{0x5A5A, 0xFBE6},{0x5A62, 0xDDE6},
+ {0x5A66, 0xDCFE},{0x5A92, 0xD8DA},{0x5A9A, 0xDAAC},{0x5A9B, 0xEAB0},{0x5AA4, 0xE3B8},{0x5AC1, 0xCAAA},{0x5AC2, 0xE1F9},{0x5AC4, 0xEAB1},
+ {0x5AC9, 0xF2EC},{0x5ACC, 0xFAEE},{0x5AE1, 0xEED5},{0x5AE6, 0xF9F4},{0x5AE9, 0xD2EC},{0x5B05, 0xFBFB},{0x5B09, 0xFDF0},{0x5B0B, 0xE0BD},
+ {0x5B0C, 0xCEE3},{0x5B16, 0xF8C6},{0x5B2A, 0xDEAE},{0x5B40, 0xDFC5},{0x5B43, 0xE5BE},{0x5B50, 0xEDAD},{0x5B51, 0xFAEA},{0x5B54, 0xCDEE},
+ {0x5B55, 0xEDA6},{0x5B57, 0xEDAE},{0x5B58, 0xF0ED},{0x5B5A, 0xDDA1},{0x5B5C, 0xEDAF},{0x5B5D, 0xFCF8},{0x5B5F, 0xD8EB},{0x5B63, 0xCCF9},
+ {0x5B64, 0xCDB5},{0x5B69, 0xFAA9},{0x5B6B, 0xE1DD},{0x5B70, 0xE2D5},{0x5B71, 0xEDCF},{0x5B75, 0xDDA2},{0x5B78, 0xF9CA},{0x5B7A, 0xEAE8},
+ {0x5B7C, 0xE5ED},{0x5B85, 0xD3EB},{0x5B87, 0xE9D4},{0x5B88, 0xE1FA},{0x5B89, 0xE4CC},{0x5B8B, 0xE1E4},{0x5B8C, 0xE8C7},{0x5B8F, 0xCEDB},
+ {0x5B93, 0xDCD5},{0x5B95, 0xF7B5},{0x5B96, 0xFCF3},{0x5B97, 0xF0F3},{0x5B98, 0xCEAF},{0x5B99, 0xF1B5},{0x5B9A, 0xEFD2},{0x5B9B, 0xE8C8},
+ {0x5B9C, 0xEBF1},{0x5BA2, 0xCBD4},{0x5BA3, 0xE0BE},{0x5BA4, 0xE3F8},{0x5BA5, 0xEAE9},{0x5BA6, 0xFCB2},{0x5BAC, 0xE0F4},{0x5BAE, 0xCFE0},
+ {0x5BB0, 0xEEA5},{0x5BB3, 0xFAAA},{0x5BB4, 0xE6C3},{0x5BB5, 0xE1B2},{0x5BB6, 0xCAAB},{0x5BB8, 0xE3E4},{0x5BB9, 0xE9BB},{0x5BBF, 0xE2D6},
+ {0x5BC0, 0xF3F2},{0x5BC2, 0xEED6},{0x5BC3, 0xEAB2},{0x5BC4, 0xD0F6},{0x5BC5, 0xECD9},{0x5BC6, 0xDACB},{0x5BC7, 0xCFA8},{0x5BCC, 0xDDA3},
+ {0x5BD0, 0xD8DB},{0x5BD2, 0xF9CE},{0x5BD3, 0xE9D5},{0x5BD4, 0xE3D1},{0x5BD7, 0xD2BC},{0x5BDE, 0xD8AC},{0x5BDF, 0xF3CC},{0x5BE1, 0xCDFB},
+ {0x5BE2, 0xF6D6},{0x5BE4, 0xE7F5},{0x5BE5, 0xE8EF},{0x5BE6, 0xE3F9},{0x5BE7, 0xD2BB},{0x5BE8, 0xF3F3},{0x5BE9, 0xE3FB},{0x5BEB, 0xDED0},
+ {0x5BEC, 0xCEB0},{0x5BEE, 0xD6F7},{0x5BEF, 0xF1D9},{0x5BF5, 0xF5C1},{0x5BF6, 0xDCC4},{0x5BF8, 0xF5BB},{0x5BFA, 0xDED1},{0x5C01, 0xDCE6},
+ {0x5C04, 0xDED2},{0x5C07, 0xEDE2},{0x5C08, 0xEEF6},{0x5C09, 0xEACF},{0x5C0A, 0xF0EE},{0x5C0B, 0xE3FC},{0x5C0D, 0xD3DF},{0x5C0E, 0xD3F4},
+ {0x5C0F, 0xE1B3},{0x5C11, 0xE1B4},{0x5C16, 0xF4D3},{0x5C19, 0xDFC6},{0x5C24, 0xE9D6},{0x5C28, 0xDBAB},{0x5C31, 0xF6A6},{0x5C38, 0xE3B9},
+ {0x5C39, 0xEBC5},{0x5C3A, 0xF4A9},{0x5C3B, 0xCDB6},{0x5C3C, 0xD2F9},{0x5C3E, 0xDAAD},{0x5C3F, 0xD2E3},{0x5C40, 0xCFD1},{0x5C45, 0xCBDC},
+ {0x5C46, 0xCCFA},{0x5C48, 0xCFDD},{0x5C4B, 0xE8A9},{0x5C4D, 0xE3BB},{0x5C4E, 0xE3BA},{0x5C51, 0xE0DA},{0x5C55, 0xEEF7},{0x5C5B, 0xDCB3},
+ {0x5C60, 0xD3F5},{0x5C62, 0xD7A6},{0x5C64, 0xF6B5},{0x5C65, 0xD7DB},{0x5C6C, 0xE1D5},{0x5C6F, 0xD4EA},{0x5C71, 0xDFA3},{0x5C79, 0xFDDF},
+ {0x5C90, 0xD0F7},{0x5C91, 0xEDD4},{0x5CA1, 0xCBAA},{0x5CA9, 0xE4DB},{0x5CAB, 0xE1FB},{0x5CAC, 0xCBA2},{0x5CB1, 0xD3E0},{0x5CB3, 0xE4BF},
+ {0x5CB5, 0xFBC0},{0x5CB7, 0xDABE},{0x5CB8, 0xE4CD},{0x5CBA, 0xD6B9},{0x5CBE, 0xEFC0},{0x5CC0, 0xE1FC},{0x5CD9, 0xF6B9},{0x5CE0, 0xDFC7},
+ {0x5CE8, 0xE4B1},{0x5CEF, 0xDCE7},{0x5CF0, 0xDCE8},{0x5CF4, 0xFAD6},{0x5CF6, 0xD3F6},{0x5CFB, 0xF1DA},{0x5CFD, 0xFAF2},{0x5D07, 0xE2FD},
+ {0x5D0D, 0xD5CF},{0x5D0E, 0xD0F8},{0x5D11, 0xCDDF},{0x5D14, 0xF5CB},{0x5D16, 0xE4F0},{0x5D17, 0xCBAB},{0x5D19, 0xD7C4},{0x5D27, 0xE2FE},
+ {0x5D29, 0xDDDA},{0x5D4B, 0xDAAE},{0x5D4C, 0xCAEE},{0x5D50, 0xD5B9},{0x5D69, 0xE3A1},{0x5D6C, 0xE8E3},{0x5D6F, 0xF3AB},{0x5D87, 0xCFA9},
+ {0x5D8B, 0xD3F7},{0x5D9D, 0xD4F1},{0x5DA0, 0xCEE4},{0x5DA2, 0xE8F2},{0x5DAA, 0xE5F5},{0x5DB8, 0xE7AE},{0x5DBA, 0xD6BA},{0x5DBC, 0xDFEC},
+ {0x5DBD, 0xE4C0},{0x5DCD, 0xE8E4},{0x5DD2, 0xD8B5},{0x5DD6, 0xE4DC},{0x5DDD, 0xF4B9},{0x5DDE, 0xF1B6},{0x5DE1, 0xE2DE},{0x5DE2, 0xE1B5},
+ {0x5DE5, 0xCDEF},{0x5DE6, 0xF1A7},{0x5DE7, 0xCEE5},{0x5DE8, 0xCBDD},{0x5DEB, 0xD9E3},{0x5DEE, 0xF3AC},{0x5DF1, 0xD0F9},{0x5DF2, 0xECAB},
+ {0x5DF3, 0xDED3},{0x5DF4, 0xF7E9},{0x5DF7, 0xF9F5},{0x5DFD, 0xE1DE},{0x5DFE, 0xCBEE},{0x5E02, 0xE3BC},{0x5E03, 0xF8D6},{0x5E06, 0xDBEE},
+ {0x5E0C, 0xFDF1},{0x5E11, 0xF7B6},{0x5E16, 0xF4DE},{0x5E19, 0xF2ED},{0x5E1B, 0xDBD9},{0x5E1D, 0xF0A8},{0x5E25, 0xE1FD},{0x5E2B, 0xDED4},
+ {0x5E2D, 0xE0AC},{0x5E33, 0xEDE3},{0x5E36, 0xD3E1},{0x5E38, 0xDFC8},{0x5E3D, 0xD9B6},{0x5E3F, 0xFDAC},{0x5E40, 0xEFD3},{0x5E44, 0xE4C1},
+ {0x5E45, 0xF8EB},{0x5E47, 0xDBAC},{0x5E4C, 0xFCC6},{0x5E55, 0xD8AD},{0x5E5F, 0xF6BA},{0x5E61, 0xDBDF},{0x5E62, 0xD3D3},{0x5E63, 0xF8C7},
+ {0x5E72, 0xCACE},{0x5E73, 0xF8C1},{0x5E74, 0xD2B4},{0x5E77, 0xDCB4},{0x5E78, 0xFAB9},{0x5E79, 0xCACF},{0x5E7B, 0xFCB3},{0x5E7C, 0xEAEA},
+ {0x5E7D, 0xEAEB},{0x5E7E, 0xD0FA},{0x5E84, 0xEDE4},{0x5E87, 0xDDE7},{0x5E8A, 0xDFC9},{0x5E8F, 0xDFED},{0x5E95, 0xEEBC},{0x5E97, 0xEFC1},
+ {0x5E9A, 0xCCD2},{0x5E9C, 0xDDA4},{0x5EA0, 0xDFCA},{0x5EA6, 0xD3F8},{0x5EA7, 0xF1A8},{0x5EAB, 0xCDB7},{0x5EAD, 0xEFD4},{0x5EB5, 0xE4DD},
+ {0x5EB6, 0xDFEE},{0x5EB7, 0xCBAC},{0x5EB8, 0xE9BC},{0x5EBE, 0xEAEC},{0x5EC2, 0xDFCB},{0x5EC8, 0xF9BF},{0x5EC9, 0xD6AF},{0x5ECA, 0xD5C6},
+ {0x5ED0, 0xCFAA},{0x5ED3, 0xCEA9},{0x5ED6, 0xD6F8},{0x5EDA, 0xF1B7},{0x5EDB, 0xEEF8},{0x5EDF, 0xD9D9},{0x5EE0, 0xF3DF},{0x5EE2, 0xF8C8},
+ {0x5EE3, 0xCEC6},{0x5EEC, 0xD5E6},{0x5EF3, 0xF4E6},{0x5EF6, 0xE6C5},{0x5EF7, 0xEFD5},{0x5EFA, 0xCBEF},{0x5EFB, 0xFCDF},{0x5F01, 0xDCA7},
+ {0x5F04, 0xD6E7},{0x5F0A, 0xF8C9},{0x5F0F, 0xE3D2},{0x5F11, 0xE3BD},{0x5F13, 0xCFE1},{0x5F14, 0xF0C0},{0x5F15, 0xECDA},{0x5F17, 0xDDD7},
+ {0x5F18, 0xFBF0},{0x5F1B, 0xECAC},{0x5F1F, 0xF0A9},{0x5F26, 0xFAD7},{0x5F27, 0xFBC1},{0x5F29, 0xD2C0},{0x5F31, 0xE5B0},{0x5F35, 0xEDE5},
+ {0x5F3A, 0xCBAD},{0x5F3C, 0xF9B0},{0x5F48, 0xF7A5},{0x5F4A, 0xCBAE},{0x5F4C, 0xDAAF},{0x5F4E, 0xD8B6},{0x5F56, 0xD3A7},{0x5F57, 0xFBB2},
+ {0x5F59, 0xFDC4},{0x5F5B, 0xECAD},{0x5F62, 0xFBA1},{0x5F66, 0xE5E9},{0x5F67, 0xE9EE},{0x5F69, 0xF3F4},{0x5F6A, 0xF8F3},{0x5F6B, 0xF0C1},
+ {0x5F6C, 0xDEAF},{0x5F6D, 0xF8B0},{0x5F70, 0xF3E0},{0x5F71, 0xE7AF},{0x5F77, 0xDBAD},{0x5F79, 0xE6B5},{0x5F7C, 0xF9A8},{0x5F7F, 0xDDD8},
+ {0x5F80, 0xE8D9},{0x5F81, 0xEFD6},{0x5F85, 0xD3E2},{0x5F87, 0xE2DF},{0x5F8A, 0xFCE0},{0x5F8B, 0xD7C8},{0x5F8C, 0xFDAD},{0x5F90, 0xDFEF},
+ {0x5F91, 0xCCD3},{0x5F92, 0xD3F9},{0x5F97, 0xD4F0},{0x5F98, 0xDBC7},{0x5F99, 0xDED5},{0x5F9E, 0xF0F4},{0x5FA0, 0xD5D0},{0x5FA1, 0xE5D9},
+ {0x5FA8, 0xFCC7},{0x5FA9, 0xDCD6},{0x5FAA, 0xE2E0},{0x5FAE, 0xDAB0},{0x5FB5, 0xF3A3},{0x5FB7, 0xD3EC},{0x5FB9, 0xF4CB},{0x5FBD, 0xFDC5},
+ {0x5FC3, 0xE3FD},{0x5FC5, 0xF9B1},{0x5FCC, 0xD0FB},{0x5FCD, 0xECDB},{0x5FD6, 0xF5BC},{0x5FD7, 0xF2A4},{0x5FD8, 0xD8CE},{0x5FD9, 0xD8CF},
+ {0x5FE0, 0xF5F7},{0x5FEB, 0xF6E1},{0x5FF5, 0xD2B7},{0x5FFD, 0xFBEC},{0x5FFF, 0xDDC8},{0x600F, 0xE4E8},{0x6012, 0xD2C1},{0x6016, 0xF8D7},
+ {0x601C, 0xD6BB},{0x601D, 0xDED6},{0x6020, 0xF7BD},{0x6021, 0xECAE},{0x6025, 0xD0E1},{0x6027, 0xE0F5},{0x6028, 0xEAB3},{0x602A, 0xCED6},
+ {0x602F, 0xCCA5},{0x6041, 0xECF6},{0x6042, 0xE2E1},{0x6043, 0xE3BE},{0x604D, 0xFCC8},{0x6050, 0xCDF0},{0x6052, 0xF9F6},{0x6055, 0xDFF0},
+ {0x6059, 0xE5BF},{0x605D, 0xCEBF},{0x6062, 0xFCE1},{0x6063, 0xEDB0},{0x6064, 0xFDD1},{0x6065, 0xF6BB},{0x6068, 0xF9CF},{0x6069, 0xEBDA},
+ {0x606A, 0xCAC1},{0x606C, 0xD2B8},{0x606D, 0xCDF1},{0x606F, 0xE3D3},{0x6070, 0xFDE6},{0x6085, 0xE6ED},{0x6089, 0xE3FA},{0x608C, 0xF0AA},
+ {0x608D, 0xF9D0},{0x6094, 0xFCE2},{0x6096, 0xF8A7},{0x609A, 0xE1E5},{0x609B, 0xEEF9},{0x609F, 0xE7F6},{0x60A0, 0xEAED},{0x60A3, 0xFCB4},
+ {0x60A4, 0xF5C2},{0x60A7, 0xD7DC},{0x60B0, 0xF0F5},{0x60B2, 0xDDE8},{0x60B3, 0xD3ED},{0x60B4, 0xF5FC},{0x60B6, 0xDABF},{0x60B8, 0xCCFB},
+ {0x60BC, 0xD3FA},{0x60BD, 0xF4A4},{0x60C5, 0xEFD7},{0x60C7, 0xD4C3},{0x60D1, 0xFBE3},{0x60DA, 0xFBED},{0x60DC, 0xE0AD},{0x60DF, 0xEAEE},
+ {0x60E0, 0xFBB3},{0x60E1, 0xE4C2},{0x60F0, 0xF6E7},{0x60F1, 0xD2DD},{0x60F3, 0xDFCC},{0x60F6, 0xFCC9},{0x60F9, 0xE5A9},{0x60FA, 0xE0F6},
+ {0x60FB, 0xF6B3},{0x6101, 0xE1FE},{0x6106, 0xCBF0},{0x6108, 0xEAEF},{0x6109, 0xEAF0},{0x610D, 0xDAC0},{0x610E, 0xF8B4},{0x610F, 0xEBF2},
+ {0x6115, 0xE4C3},{0x611A, 0xE9D7},{0x611B, 0xE4F1},{0x611F, 0xCAEF},{0x6127, 0xCED7},{0x6130, 0xFCCA},{0x6134, 0xF3E1},{0x6137, 0xCBC4},
+ {0x613C, 0xE3E5},{0x613E, 0xCBC5},{0x613F, 0xEAB4},{0x6142, 0xE9BD},{0x6144, 0xD7C9},{0x6147, 0xEBDB},{0x6148, 0xEDB1},{0x614A, 0xCCC3},
+ {0x614B, 0xF7BE},{0x614C, 0xFCCB},{0x6153, 0xF8F4},{0x6155, 0xD9B7},{0x6158, 0xF3D3},{0x6159, 0xF3D4},{0x615D, 0xF7E4},{0x615F, 0xF7D1},
+ {0x6162, 0xD8B7},{0x6163, 0xCEB1},{0x6164, 0xCAC2},{0x6167, 0xFBB4},{0x6168, 0xCBC6},{0x616B, 0xF0F6},{0x616E, 0xD5E7},{0x6170, 0xEAD0},
+ {0x6176, 0xCCD4},{0x6177, 0xCBAF},{0x617D, 0xF4AA},{0x617E, 0xE9AF},{0x6181, 0xF5C3},{0x6182, 0xE9D8},{0x618A, 0xDDE9},{0x618E, 0xF1F3},
+ {0x6190, 0xD5FB},{0x6191, 0xDEBB},{0x6194, 0xF4FB},{0x6198, 0xFDF3},{0x6199, 0xFDF2},{0x619A, 0xF7A6},{0x61A4, 0xDDC9},{0x61A7, 0xD4D3},
+ {0x61A9, 0xCCA8},{0x61AB, 0xDAC1},{0x61AC, 0xCCD5},{0x61AE, 0xD9E4},{0x61B2, 0xFACA},{0x61B6, 0xE5E3},{0x61BA, 0xD3BC},{0x61BE, 0xCAF0},
+ {0x61C3, 0xD0C4},{0x61C7, 0xCAD0},{0x61C8, 0xFAAB},{0x61C9, 0xEBEB},{0x61CA, 0xE7F8},{0x61CB, 0xD9E5},{0x61E6, 0xD1D7},{0x61F2, 0xF3A4},
+ {0x61F6, 0xD4FB},{0x61F7, 0xFCE3},{0x61F8, 0xFAD8},{0x61FA, 0xF3D5},{0x61FC, 0xCFAB},{0x61FF, 0xEBF3},{0x6200, 0xD5FC},{0x6207, 0xD3D4},
+ {0x6208, 0xCDFC},{0x620A, 0xD9E6},{0x620C, 0xE2F9},{0x620D, 0xE2A1},{0x620E, 0xEBD4},{0x6210, 0xE0F7},{0x6211, 0xE4B2},{0x6212, 0xCCFC},
+ {0x6216, 0xFBE4},{0x621A, 0xF4AB},{0x621F, 0xD0BD},{0x6221, 0xCAF1},{0x622A, 0xEFB8},{0x622E, 0xD7C0},{0x6230, 0xEEFA},{0x6231, 0xFDF4},
+ {0x6234, 0xD3E3},{0x6236, 0xFBC2},{0x623E, 0xD5E8},{0x623F, 0xDBAE},{0x6240, 0xE1B6},{0x6241, 0xF8B7},{0x6247, 0xE0BF},{0x6248, 0xFBC3},
+ {0x6249, 0xDDEA},{0x624B, 0xE2A2},{0x624D, 0xEEA6},{0x6253, 0xF6E8},{0x6258, 0xF6F5},{0x626E, 0xDDCA},{0x6271, 0xD0E2},{0x6276, 0xDDA6},
+ {0x6279, 0xDDEB},{0x627C, 0xE4F9},{0x627F, 0xE3AF},{0x6280, 0xD0FC},{0x6284, 0xF4FC},{0x6289, 0xCCBC},{0x628A, 0xF7EA},{0x6291, 0xE5E4},
+ {0x6292, 0xDFF1},{0x6295, 0xF7E1},{0x6297, 0xF9F7},{0x6298, 0xEFB9},{0x629B, 0xF8D8},{0x62AB, 0xF9A9},{0x62B1, 0xF8D9},{0x62B5, 0xEEBD},
+ {0x62B9, 0xD8C6},{0x62BC, 0xE4E3},{0x62BD, 0xF5CE},{0x62C2, 0xDDD9},{0x62C7, 0xD9E7},{0x62C8, 0xD2B9},{0x62C9, 0xD5C3},{0x62CC, 0xDAE5},
+ {0x62CD, 0xDAD0},{0x62CF, 0xD1D9},{0x62D0, 0xCED8},{0x62D2, 0xCBDE},{0x62D3, 0xF4AC},{0x62D4, 0xDAFB},{0x62D6, 0xF6E9},{0x62D7, 0xE8F3},
+ {0x62D8, 0xCFAC},{0x62D9, 0xF0F0},{0x62DB, 0xF4FD},{0x62DC, 0xDBC8},{0x62EC, 0xCEC0},{0x62ED, 0xE3D4},{0x62EE, 0xD1CF},{0x62EF, 0xF1F5},
+ {0x62F1, 0xCDF2},{0x62F3, 0xCFEB},{0x62F7, 0xCDB8},{0x62FE, 0xE3A6},{0x62FF, 0xD1DA},{0x6301, 0xF2A5},{0x6307, 0xF2A6},{0x6309, 0xE4CE},
+ {0x6311, 0xD3FB},{0x632B, 0xF1A9},{0x632F, 0xF2C9},{0x633A, 0xEFD8},{0x633B, 0xE6C9},{0x633D, 0xD8B8},{0x633E, 0xFAF3},{0x6349, 0xF3B5},
+ {0x634C, 0xF8A4},{0x634F, 0xD1F3},{0x6350, 0xE6C8},{0x6355, 0xF8DA},{0x6367, 0xDCE9},{0x6368, 0xDED7},{0x636E, 0xCBDF},{0x6372, 0xCFEC},
+ {0x6377, 0xF4DF},{0x637A, 0xD1F4},{0x637B, 0xD2BA},{0x637F, 0xDFF2},{0x6383, 0xE1B7},{0x6388, 0xE2A3},{0x6389, 0xD3FC},{0x638C, 0xEDE6},
+ {0x6392, 0xDBC9},{0x6396, 0xE4FA},{0x6398, 0xCFDE},{0x639B, 0xCED0},{0x63A0, 0xD5D3},{0x63A1, 0xF3F5},{0x63A2, 0xF7AE},{0x63A5, 0xEFC8},
+ {0x63A7, 0xCDF3},{0x63A8, 0xF5CF},{0x63A9, 0xE5F3},{0x63AA, 0xF0C2},{0x63C0, 0xCAD1},{0x63C4, 0xEAF1},{0x63C6, 0xD0A6},{0x63CF, 0xD9DA},
+ {0x63D0, 0xF0AB},{0x63D6, 0xEBE7},{0x63DA, 0xE5C0},{0x63DB, 0xFCB5},{0x63E1, 0xE4C4},{0x63ED, 0xCCA9},{0x63EE, 0xFDC6},{0x63F4, 0xEAB5},
+ {0x63F6, 0xE5AA},{0x63F7, 0xDFBA},{0x640D, 0xE1DF},{0x640F, 0xDAD1},{0x6414, 0xE1B8},{0x6416, 0xE8F4},{0x6417, 0xD3FD},{0x641C, 0xE2A4},
+ {0x6422, 0xF2CA},{0x642C, 0xDAE6},{0x642D, 0xF7B3},{0x643A, 0xFDCD},{0x643E, 0xF3B6},{0x6458, 0xEED7},{0x6460, 0xF5C4},{0x6469, 0xD8A4},
+ {0x646F, 0xF2A7},{0x6478, 0xD9B8},{0x6479, 0xD9B9},{0x647A, 0xEFC9},{0x6488, 0xD6CE},{0x6491, 0xF7CB},{0x6492, 0xDFAE},{0x6493, 0xE8F5},
+ {0x649A, 0xD2B5},{0x649E, 0xD3D5},{0x64A4, 0xF4CC},{0x64A5, 0xDAFC},{0x64AB, 0xD9E8},{0x64AD, 0xF7EB},{0x64AE, 0xF5C9},{0x64B0, 0xF3BC},
+ {0x64B2, 0xDAD2},{0x64BB, 0xD3B5},{0x64C1, 0xE8B6},{0x64C4, 0xD6CF},{0x64C5, 0xF4BA},{0x64C7, 0xF7C9},{0x64CA, 0xCCAA},{0x64CD, 0xF0C3},
+ {0x64CE, 0xCCD6},{0x64D2, 0xD0D3},{0x64D4, 0xD3BD},{0x64D8, 0xDBFB},{0x64DA, 0xCBE0},{0x64E1, 0xD3E4},{0x64E2, 0xF6F7},{0x64E5, 0xD5BA},
+ {0x64E6, 0xF3CD},{0x64E7, 0xCBE1},{0x64EC, 0xEBF4},{0x64F2, 0xF4AD},{0x64F4, 0xFCAA},{0x64FA, 0xF7EC},{0x64FE, 0xE8F6},{0x6500, 0xDAE7},
+ {0x6504, 0xF7CC},{0x6518, 0xE5C1},{0x651D, 0xE0EE},{0x6523, 0xD5FD},{0x652A, 0xCEE6},{0x652B, 0xFCAB},{0x652C, 0xD5BB},{0x652F, 0xF2A8},
+ {0x6536, 0xE2A5},{0x6537, 0xCDB9},{0x6538, 0xEAF2},{0x6539, 0xCBC7},{0x653B, 0xCDF4},{0x653E, 0xDBAF},{0x653F, 0xEFD9},{0x6545, 0xCDBA},
+ {0x6548, 0xFCF9},{0x654D, 0xDFF3},{0x654E, 0xCEE7},{0x654F, 0xDAC2},{0x6551, 0xCFAD},{0x6556, 0xE7F9},{0x6557, 0xF8A8},{0x655E, 0xF3E2},
+ {0x6562, 0xCAF2},{0x6563, 0xDFA4},{0x6566, 0xD4C4},{0x656C, 0xCCD7},{0x656D, 0xE5C2},{0x6572, 0xCDBB},{0x6574, 0xEFDA},{0x6575, 0xEED8},
+ {0x6577, 0xDDA7},{0x6578, 0xE2A6},{0x657E, 0xE0C0},{0x6582, 0xD6B0},{0x6583, 0xF8CA},{0x6585, 0xFCFA},{0x6587, 0xD9FE},{0x658C, 0xDEB0},
+ {0x6590, 0xDDEC},{0x6591, 0xDAE8},{0x6597, 0xD4E0},{0x6599, 0xD6F9},{0x659B, 0xCDD7},{0x659C, 0xDED8},{0x659F, 0xF2F8},{0x65A1, 0xE4D6},
+ {0x65A4, 0xD0C5},{0x65A5, 0xF4AE},{0x65A7, 0xDDA8},{0x65AB, 0xEDC5},{0x65AC, 0xF3D6},{0x65AF, 0xDED9},{0x65B0, 0xE3E6},{0x65B7, 0xD3A8},
+ {0x65B9, 0xDBB0},{0x65BC, 0xE5DA},{0x65BD, 0xE3BF},{0x65C1, 0xDBB1},{0x65C5, 0xD5E9},{0x65CB, 0xE0C1},{0x65CC, 0xEFDB},{0x65CF, 0xF0E9},
+ {0x65D2, 0xD7B2},{0x65D7, 0xD0FD},{0x65E0, 0xD9E9},{0x65E3, 0xD0FE},{0x65E5, 0xECED},{0x65E6, 0xD3A9},{0x65E8, 0xF2A9},{0x65E9, 0xF0C4},
+ {0x65EC, 0xE2E2},{0x65ED, 0xE9EF},{0x65F1, 0xF9D1},{0x65F4, 0xE9D9},{0x65FA, 0xE8DA},{0x65FB, 0xDAC3},{0x65FC, 0xDAC4},{0x65FD, 0xD4C5},
+ {0x65FF, 0xE7FA},{0x6606, 0xCDE0},{0x6607, 0xE3B0},{0x6609, 0xDBB2},{0x660A, 0xFBC4},{0x660C, 0xF3E3},{0x660E, 0xD9A5},{0x660F, 0xFBE7},
+ {0x6610, 0xDDCB},{0x6611, 0xD0D4},{0x6613, 0xE6B6},{0x6614, 0xE0AE},{0x6615, 0xFDDA},{0x661E, 0xDCB5},{0x661F, 0xE0F8},{0x6620, 0xE7B1},
+ {0x6625, 0xF5F0},{0x6627, 0xD8DC},{0x6628, 0xEDC6},{0x662D, 0xE1B9},{0x662F, 0xE3C0},{0x6630, 0xF9C0},{0x6631, 0xE9F0},{0x6634, 0xD9DB},
+ {0x6636, 0xF3E4},{0x663A, 0xDCB6},{0x663B, 0xE4E9},{0x6641, 0xF0C5},{0x6642, 0xE3C1},{0x6643, 0xFCCC},{0x6644, 0xFCCD},{0x6649, 0xF2CB},
+ {0x664B, 0xF2CC},{0x664F, 0xE4CF},{0x6659, 0xF1DB},{0x665B, 0xFAD9},{0x665D, 0xF1B8},{0x665E, 0xFDF5},{0x665F, 0xE0F9},{0x6664, 0xE7FB},
+ {0x6665, 0xFCB7},{0x6666, 0xFCE4},{0x6667, 0xFBC5},{0x6668, 0xE3E7},{0x6669, 0xD8B9},{0x666B, 0xF6F8},{0x666E, 0xDCC5},{0x666F, 0xCCD8},
+ {0x6673, 0xE0AF},{0x6674, 0xF4E7},{0x6676, 0xEFDC},{0x6677, 0xCFFC},{0x6678, 0xEFDD},{0x667A, 0xF2AA},{0x6684, 0xFDBE},{0x6687, 0xCAAC},
+ {0x6688, 0xFDBB},{0x6689, 0xFDC7},{0x668E, 0xE7B2},{0x6690, 0xEAD1},{0x6691, 0xDFF4},{0x6696, 0xD1EC},{0x6697, 0xE4DE},{0x6698, 0xE5C3},
+ {0x669D, 0xD9A6},{0x66A0, 0xCDBC},{0x66A2, 0xF3E5},{0x66AB, 0xEDD5},{0x66AE, 0xD9BA},{0x66B2, 0xEDE7},{0x66B3, 0xFBB5},{0x66B4, 0xF8EC},
+ {0x66B9, 0xE0E7},{0x66BB, 0xCCD9},{0x66BE, 0xD4C6},{0x66C4, 0xE7A5},{0x66C6, 0xD5F5},{0x66C7, 0xD3BE},{0x66C9, 0xFCFB},{0x66D6, 0xE4F2},
+ {0x66D9, 0xDFF5},{0x66DC, 0xE8F8},{0x66DD, 0xF8ED},{0x66E0, 0xCEC7},{0x66E6, 0xFDF6},{0x66F0, 0xE8D8},{0x66F2, 0xCDD8},{0x66F3, 0xE7D6},
+ {0x66F4, 0xCCDA},{0x66F7, 0xCAE3},{0x66F8, 0xDFF6},{0x66F9, 0xF0C7},{0x66FA, 0xF0C6},{0x66FC, 0xD8BA},{0x66FE, 0xF1F4},{0x66FF, 0xF4F0},
+ {0x6700, 0xF5CC},{0x6703, 0xFCE5},{0x6708, 0xEAC5},{0x6709, 0xEAF3},{0x670B, 0xDDDB},{0x670D, 0xDCD7},{0x6714, 0xDEFD},{0x6715, 0xF2F9},
+ {0x6717, 0xD5C7},{0x671B, 0xD8D0},{0x671D, 0xF0C8},{0x671E, 0xD1A1},{0x671F, 0xD1A2},{0x6726, 0xD9D4},{0x6727, 0xD6E8},{0x6728, 0xD9CA},
+ {0x672A, 0xDAB1},{0x672B, 0xD8C7},{0x672C, 0xDCE2},{0x672D, 0xF3CE},{0x672E, 0xF5F4},{0x6731, 0xF1B9},{0x6734, 0xDAD3},{0x6736, 0xF6EA},
+ {0x673A, 0xCFF5},{0x673D, 0xFDAE},{0x6746, 0xCAD2},{0x6749, 0xDFB4},{0x674E, 0xD7DD},{0x674F, 0xFABA},{0x6750, 0xEEA7},{0x6751, 0xF5BD},
+ {0x6753, 0xF8F5},{0x6756, 0xEDE8},{0x675C, 0xD4E1},{0x675E, 0xD1A3},{0x675F, 0xE1D6},{0x676D, 0xF9F8},{0x676F, 0xDBCA},{0x6770, 0xCBF9},
+ {0x6771, 0xD4D4},{0x6773, 0xD9DC},{0x6775, 0xEEBE},{0x6777, 0xF7ED},{0x677B, 0xD2EE},{0x677E, 0xE1E6},{0x677F, 0xF7F9},{0x6787, 0xDDED},
+ {0x6789, 0xE8DB},{0x678B, 0xDBB3},{0x678F, 0xD1F7},{0x6790, 0xE0B0},{0x6793, 0xD4E2},{0x6795, 0xF6D7},{0x6797, 0xD7F9},{0x679A, 0xD8DD},
+ {0x679C, 0xCDFD},{0x679D, 0xF2AB},{0x67AF, 0xCDBD},{0x67B0, 0xF8C2},{0x67B3, 0xF2AC},{0x67B6, 0xCAAD},{0x67B7, 0xCAAE},{0x67B8, 0xCFAE},
+ {0x67BE, 0xE3C2},{0x67C4, 0xDCB7},{0x67CF, 0xDBDA},{0x67D0, 0xD9BB},{0x67D1, 0xCAF3},{0x67D2, 0xF6D3},{0x67D3, 0xE6F8},{0x67D4, 0xEAF5},
+ {0x67DA, 0xEAF6},{0x67DD, 0xF6F9},{0x67E9, 0xCFAF},{0x67EC, 0xCAD3},{0x67EF, 0xCAAF},{0x67F0, 0xD2B0},{0x67F1, 0xF1BA},{0x67F3, 0xD7B3},
+ {0x67F4, 0xE3C3},{0x67F5, 0xF3FD},{0x67F6, 0xDEDA},{0x67FB, 0xDEDB},{0x67FE, 0xEFDE},{0x6812, 0xE2E3},{0x6813, 0xEEFB},{0x6816, 0xDFF7},
+ {0x6817, 0xD7CA},{0x6821, 0xCEE8},{0x6822, 0xDBDB},{0x682A, 0xF1BB},{0x682F, 0xE9F1},{0x6838, 0xFAB7},{0x6839, 0xD0C6},{0x683C, 0xCCAB},
+ {0x683D, 0xEEA8},{0x6840, 0xCBFA},{0x6841, 0xF9F9},{0x6842, 0xCCFD},{0x6843, 0xD3FE},{0x6848, 0xE4D0},{0x684E, 0xF2EE},{0x6850, 0xD4D5},
+ {0x6851, 0xDFCD},{0x6853, 0xFCB8},{0x6854, 0xD1D0},{0x686D, 0xF2CD},{0x6876, 0xF7D2},{0x687F, 0xCAD4},{0x6881, 0xD5D9},{0x6885, 0xD8DE},
+ {0x688F, 0xCDD9},{0x6893, 0xEEA9},{0x6894, 0xF6BC},{0x6897, 0xCCDB},{0x689D, 0xF0C9},{0x689F, 0xFCFC},{0x68A1, 0xE8C9},{0x68A2, 0xF4FE},
+ {0x68A7, 0xE7FC},{0x68A8, 0xD7DE},{0x68AD, 0xDEDC},{0x68AF, 0xF0AC},{0x68B0, 0xCCFE},{0x68B1, 0xCDE1},{0x68B3, 0xE1BA},{0x68B5, 0xDBEF},
+ {0x68B6, 0xDAB2},{0x68C4, 0xD1A5},{0x68C5, 0xDCB8},{0x68C9, 0xD8F6},{0x68CB, 0xD1A4},{0x68CD, 0xCDE2},{0x68D2, 0xDCEA},{0x68D5, 0xF0F7},
+ {0x68D7, 0xF0CA},{0x68D8, 0xD0BE},{0x68DA, 0xDDDC},{0x68DF, 0xD4D6},{0x68E0, 0xD3D6},{0x68E7, 0xEDD0},{0x68E8, 0xCDA1},{0x68EE, 0xDFB5},
+ {0x68F2, 0xDFF8},{0x68F9, 0xD4A1},{0x68FA, 0xCEB2},{0x6900, 0xE8CA},{0x6905, 0xEBF5},{0x690D, 0xE3D5},{0x690E, 0xF5D0},{0x6912, 0xF5A1},
+ {0x6927, 0xD9A7},{0x6930, 0xE5AB},{0x693D, 0xE6CB},{0x693F, 0xF5F1},{0x694A, 0xE5C5},{0x6953, 0xF9A3},{0x6954, 0xE0DB},{0x6955, 0xF6EB},
+ {0x6957, 0xCBF1},{0x6959, 0xD9EA},{0x695A, 0xF5A2},{0x695E, 0xD7D1},{0x6960, 0xD1F8},{0x6961, 0xEAF8},{0x6962, 0xEAF9},{0x6963, 0xDAB3},
+ {0x6968, 0xEFDF},{0x696B, 0xF1EF},{0x696D, 0xE5F6},{0x696E, 0xEEBF},{0x696F, 0xE2E4},{0x6975, 0xD0BF},{0x6977, 0xFAAC},{0x6978, 0xF5D1},
+ {0x6979, 0xE7B3},{0x6995, 0xE9BE},{0x699B, 0xF2CE},{0x699C, 0xDBB4},{0x69A5, 0xFCCE},{0x69A7, 0xDDEE},{0x69AE, 0xE7B4},{0x69B4, 0xD7B4},
+ {0x69BB, 0xF7B4},{0x69C1, 0xCDBE},{0x69C3, 0xDAE9},{0x69CB, 0xCFB0},{0x69CC, 0xF7D9},{0x69CD, 0xF3E6},{0x69D0, 0xCED9},{0x69E8, 0xCEAA},
+ {0x69EA, 0xCBC8},{0x69FB, 0xD0A7},{0x69FD, 0xF0CB},{0x69FF, 0xD0C7},{0x6A02, 0xE4C5},{0x6A0A, 0xDBE0},{0x6A11, 0xD5DA},{0x6A13, 0xD7A7},
+ {0x6A17, 0xEEC0},{0x6A19, 0xF8F6},{0x6A1E, 0xF5D2},{0x6A1F, 0xEDE9},{0x6A21, 0xD9BC},{0x6A23, 0xE5C6},{0x6A35, 0xF5A3},{0x6A38, 0xDAD4},
+ {0x6A39, 0xE2A7},{0x6A3A, 0xFBFC},{0x6A3D, 0xF1DC},{0x6A44, 0xCAF4},{0x6A48, 0xE8FA},{0x6A4B, 0xCEE9},{0x6A52, 0xE9F8},{0x6A53, 0xE2E5},
+ {0x6A58, 0xD0B9},{0x6A59, 0xD4F2},{0x6A5F, 0xD1A6},{0x6A61, 0xDFCE},{0x6A6B, 0xFCF4},{0x6A80, 0xD3AA},{0x6A84, 0xCCAC},{0x6A89, 0xEFE0},
+ {0x6A8D, 0xE5E5},{0x6A8E, 0xD0D5},{0x6A97, 0xDBFC},{0x6A9C, 0xFCE6},{0x6AA2, 0xCBFE},{0x6AA3, 0xEDEA},{0x6AB3, 0xDEB1},{0x6ABB, 0xF9E3},
+ {0x6AC2, 0xD4A2},{0x6AC3, 0xCFF6},{0x6AD3, 0xD6D0},{0x6ADA, 0xD5EA},{0x6ADB, 0xF1EE},{0x6AF6, 0xFACB},{0x6AFB, 0xE5A1},{0x6B04, 0xD5B1},
+ {0x6B0A, 0xCFED},{0x6B0C, 0xEDEB},{0x6B12, 0xD5B2},{0x6B16, 0xD5BC},{0x6B20, 0xFDE2},{0x6B21, 0xF3AD},{0x6B23, 0xFDDB},{0x6B32, 0xE9B0},
+ {0x6B3A, 0xD1A7},{0x6B3D, 0xFDE3},{0x6B3E, 0xCEB3},{0x6B46, 0xFDE4},{0x6B47, 0xFACE},{0x6B4C, 0xCAB0},{0x6B4E, 0xF7A7},{0x6B50, 0xCFB1},
+ {0x6B5F, 0xE6A2},{0x6B61, 0xFCB6},{0x6B62, 0xF2AD},{0x6B63, 0xEFE1},{0x6B64, 0xF3AE},{0x6B65, 0xDCC6},{0x6B66, 0xD9EB},{0x6B6A, 0xE8E0},
+ {0x6B72, 0xE1A8},{0x6B77, 0xD5F6},{0x6B78, 0xCFFD},{0x6B7B, 0xDEDD},{0x6B7F, 0xD9D1},{0x6B83, 0xE4EA},{0x6B84, 0xF2CF},{0x6B86, 0xF7BF},
+ {0x6B89, 0xE2E6},{0x6B8A, 0xE2A8},{0x6B96, 0xE3D6},{0x6B98, 0xEDD1},{0x6B9E, 0xE9F9},{0x6BAE, 0xD6B1},{0x6BAF, 0xDEB2},{0x6BB2, 0xE0E8},
+ {0x6BB5, 0xD3AB},{0x6BB7, 0xEBDC},{0x6BBA, 0xDFAF},{0x6BBC, 0xCAC3},{0x6BBF, 0xEEFC},{0x6BC1, 0xFDC3},{0x6BC5, 0xEBF6},{0x6BC6, 0xCFB2},
+ {0x6BCB, 0xD9EC},{0x6BCD, 0xD9BD},{0x6BCF, 0xD8DF},{0x6BD2, 0xD4B8},{0x6BD3, 0xEBBE},{0x6BD4, 0xDDEF},{0x6BD6, 0xDDF0},{0x6BD7, 0xDDF1},
+ {0x6BD8, 0xDDF2},{0x6BDB, 0xD9BE},{0x6BEB, 0xFBC6},{0x6BEC, 0xCFB3},{0x6C08, 0xEEFD},{0x6C0F, 0xE4AB},{0x6C11, 0xDAC5},{0x6C13, 0xD8EC},
+ {0x6C23, 0xD1A8},{0x6C34, 0xE2A9},{0x6C37, 0xDEBC},{0x6C38, 0xE7B5},{0x6C3E, 0xDBF0},{0x6C40, 0xEFE2},{0x6C41, 0xF1F0},{0x6C42, 0xCFB4},
+ {0x6C4E, 0xDBF1},{0x6C50, 0xE0B1},{0x6C55, 0xDFA5},{0x6C57, 0xF9D2},{0x6C5A, 0xE7FD},{0x6C5D, 0xE6A3},{0x6C5E, 0xFBF1},{0x6C5F, 0xCBB0},
+ {0x6C60, 0xF2AE},{0x6C68, 0xCDE7},{0x6C6A, 0xE8DC},{0x6C6D, 0xE7D7},{0x6C70, 0xF7C0},{0x6C72, 0xD0E3},{0x6C76, 0xDAA1},{0x6C7A, 0xCCBD},
+ {0x6C7D, 0xD1A9},{0x6C7E, 0xDDCC},{0x6C81, 0xE3FE},{0x6C82, 0xD1AA},{0x6C83, 0xE8AA},{0x6C85, 0xEAB6},{0x6C86, 0xF9FA},{0x6C87, 0xE6CC},
+ {0x6C88, 0xF6D8},{0x6C8C, 0xD4C7},{0x6C90, 0xD9CB},{0x6C92, 0xD9D2},{0x6C93, 0xD3CB},{0x6C94, 0xD8F7},{0x6C95, 0xDAA9},{0x6C96, 0xF5F8},
+ {0x6C99, 0xDEDE},{0x6C9A, 0xF2AF},{0x6C9B, 0xF8A9},{0x6CAB, 0xD8C8},{0x6CAE, 0xEEC1},{0x6CB3, 0xF9C1},{0x6CB8, 0xDDF3},{0x6CB9, 0xEAFA},
+ {0x6CBB, 0xF6BD},{0x6CBC, 0xE1BB},{0x6CBD, 0xCDBF},{0x6CBE, 0xF4D4},{0x6CBF, 0xE6CD},{0x6CC1, 0xFCCF},{0x6CC2, 0xFBA2},{0x6CC4, 0xE0DC},
+ {0x6CC9, 0xF4BB},{0x6CCA, 0xDAD5},{0x6CCC, 0xF9B2},{0x6CD3, 0xFBF2},{0x6CD5, 0xDBF6},{0x6CD7, 0xDEDF},{0x6CDB, 0xDBF2},{0x6CE1, 0xF8DC},
+ {0x6CE2, 0xF7EE},{0x6CE3, 0xEBE8},{0x6CE5, 0xD2FA},{0x6CE8, 0xF1BC},{0x6CEB, 0xFADA},{0x6CEE, 0xDAEA},{0x6CEF, 0xDAC6},{0x6CF0, 0xF7C1},
+ {0x6CF3, 0xE7B6},{0x6D0B, 0xE5C7},{0x6D0C, 0xD6AC},{0x6D11, 0xDCC7},{0x6D17, 0xE1A9},{0x6D19, 0xE2AA},{0x6D1B, 0xD5A6},{0x6D1E, 0xD4D7},
+ {0x6D25, 0xF2D0},{0x6D27, 0xEAFB},{0x6D29, 0xE0DD},{0x6D2A, 0xFBF3},{0x6D32, 0xF1BD},{0x6D35, 0xE2E7},{0x6D36, 0xFDD7},{0x6D38, 0xCEC8},
+ {0x6D39, 0xEAB7},{0x6D3B, 0xFCC0},{0x6D3D, 0xFDE7},{0x6D3E, 0xF7EF},{0x6D41, 0xD7B5},{0x6D59, 0xEFBA},{0x6D5A, 0xF1DD},{0x6D5C, 0xDEB3},
+ {0x6D63, 0xE8CB},{0x6D66, 0xF8DD},{0x6D69, 0xFBC7},{0x6D6A, 0xD5C8},{0x6D6C, 0xD7DF},{0x6D6E, 0xDDA9},{0x6D74, 0xE9B1},{0x6D77, 0xFAAD},
+ {0x6D78, 0xF6D9},{0x6D79, 0xFAF4},{0x6D7F, 0xF8AA},{0x6D85, 0xE6EE},{0x6D87, 0xCCDC},{0x6D88, 0xE1BC},{0x6D89, 0xE0EF},{0x6D8C, 0xE9BF},
+ {0x6D8D, 0xFCFD},{0x6D8E, 0xE6CE},{0x6D91, 0xE1D7},{0x6D93, 0xE6CF},{0x6D95, 0xF4F1},{0x6DAF, 0xE4F3},{0x6DB2, 0xE4FB},{0x6DB5, 0xF9E4},
+ {0x6DC0, 0xEFE3},{0x6DC3, 0xCFEE},{0x6DC4, 0xF6BE},{0x6DC5, 0xE0B2},{0x6DC6, 0xFCFE},{0x6DC7, 0xD1AB},{0x6DCB, 0xD7FA},{0x6DCF, 0xFBC8},
+ {0x6DD1, 0xE2D7},{0x6DD8, 0xD4A3},{0x6DD9, 0xF0F8},{0x6DDA, 0xD7A8},{0x6DDE, 0xE1E7},{0x6DE1, 0xD3BF},{0x6DE8, 0xEFE4},{0x6DEA, 0xD7C5},
+ {0x6DEB, 0xEBE2},{0x6DEE, 0xFCE7},{0x6DF1, 0xE4A2},{0x6DF3, 0xE2E8},{0x6DF5, 0xE6D0},{0x6DF7, 0xFBE8},{0x6DF8, 0xF4E8},{0x6DF9, 0xE5F4},
+ {0x6DFA, 0xF4BC},{0x6DFB, 0xF4D5},{0x6E17, 0xDFB6},{0x6E19, 0xFCB9},{0x6E1A, 0xEEC2},{0x6E1B, 0xCAF5},{0x6E1F, 0xEFE5},{0x6E20, 0xCBE2},
+ {0x6E21, 0xD4A4},{0x6E23, 0xDEE0},{0x6E24, 0xDAFD},{0x6E25, 0xE4C6},{0x6E26, 0xE8BE},{0x6E2B, 0xE0DE},{0x6E2C, 0xF6B4},{0x6E2D, 0xEAD2},
+ {0x6E2F, 0xF9FB},{0x6E32, 0xE0C2},{0x6E34, 0xCAE4},{0x6E36, 0xE7B7},{0x6E38, 0xEAFD},{0x6E3A, 0xD9DD},{0x6E3C, 0xDAB4},{0x6E3D, 0xEEAA},
+ {0x6E3E, 0xFBE9},{0x6E43, 0xDBCB},{0x6E44, 0xDAB5},{0x6E4A, 0xF1BE},{0x6E4D, 0xD3AC},{0x6E56, 0xFBC9},{0x6E58, 0xDFCF},{0x6E5B, 0xD3C0},
+ {0x6E5C, 0xE3D7},{0x6E5E, 0xEFE6},{0x6E5F, 0xFCD0},{0x6E67, 0xE9C0},{0x6E6B, 0xF5D3},{0x6E6E, 0xECDC},{0x6E6F, 0xF7B7},{0x6E72, 0xEAB8},
+ {0x6E73, 0xD1F9},{0x6E7A, 0xDCC8},{0x6E90, 0xEAB9},{0x6E96, 0xF1DE},{0x6E9C, 0xD7B6},{0x6E9D, 0xCFB5},{0x6E9F, 0xD9A8},{0x6EA2, 0xECEE},
+ {0x6EA5, 0xDDAA},{0x6EAA, 0xCDA2},{0x6EAB, 0xE8AE},{0x6EAF, 0xE1BD},{0x6EB1, 0xF2D1},{0x6EB6, 0xE9C1},{0x6EBA, 0xD2FC},{0x6EC2, 0xDBB5},
+ {0x6EC4, 0xF3E7},{0x6EC5, 0xD8FE},{0x6EC9, 0xFCD1},{0x6ECB, 0xEDB2},{0x6ECC, 0xF4AF},{0x6ECE, 0xFBA3},{0x6ED1, 0xFCC1},{0x6ED3, 0xEEAB},
+ {0x6ED4, 0xD4A5},{0x6EEF, 0xF4F2},{0x6EF4, 0xEED9},{0x6EF8, 0xFBCA},{0x6EFE, 0xCDE3},{0x6EFF, 0xD8BB},{0x6F01, 0xE5DB},{0x6F02, 0xF8F7},
+ {0x6F06, 0xF6D4},{0x6F0F, 0xD7A9},{0x6F11, 0xCBC9},{0x6F14, 0xE6D1},{0x6F15, 0xF0CC},{0x6F20, 0xD8AE},{0x6F22, 0xF9D3},{0x6F23, 0xD5FE},
+ {0x6F2B, 0xD8BC},{0x6F2C, 0xF2B0},{0x6F31, 0xE2AB},{0x6F32, 0xF3E8},{0x6F38, 0xEFC2},{0x6F3F, 0xEDEC},{0x6F41, 0xE7B8},{0x6F51, 0xDAFE},
+ {0x6F54, 0xCCBE},{0x6F57, 0xF2FC},{0x6F58, 0xDAEB},{0x6F5A, 0xE2D8},{0x6F5B, 0xEDD6},{0x6F5E, 0xD6D1},{0x6F5F, 0xE0B3},{0x6F62, 0xFCD2},
+ {0x6F64, 0xEBC8},{0x6F6D, 0xD3C1},{0x6F6E, 0xF0CD},{0x6F70, 0xCFF7},{0x6F7A, 0xEDD2},{0x6F7C, 0xD4D8},{0x6F7D, 0xDCC9},{0x6F7E, 0xD7F1},
+ {0x6F81, 0xDFBB},{0x6F84, 0xF3A5},{0x6F88, 0xF4CD},{0x6F8D, 0xF1BF},{0x6F8E, 0xF8B1},{0x6F90, 0xE9FA},{0x6F94, 0xFBCB},{0x6F97, 0xCAD5},
+ {0x6FA3, 0xF9D4},{0x6FA4, 0xF7CA},{0x6FA7, 0xD6C8},{0x6FAE, 0xFCE8},{0x6FAF, 0xF3BD},{0x6FB1, 0xEEFE},{0x6FB3, 0xE7FE},{0x6FB9, 0xD3C2},
+ {0x6FBE, 0xD3B6},{0x6FC0, 0xCCAD},{0x6FC1, 0xF6FA},{0x6FC2, 0xD6B2},{0x6FC3, 0xD2D8},{0x6FCA, 0xE7D8},{0x6FD5, 0xE3A5},{0x6FDA, 0xE7B9},
+ {0x6FDF, 0xF0AD},{0x6FE0, 0xFBCC},{0x6FE1, 0xEBA1},{0x6FE4, 0xD4A6},{0x6FE9, 0xFBCD},{0x6FEB, 0xD5BD},{0x6FEC, 0xF1DF},{0x6FEF, 0xF6FB},
+ {0x6FF1, 0xDEB4},{0x6FFE, 0xD5EB},{0x7001, 0xE5C8},{0x7005, 0xFBA4},{0x7006, 0xD4B9},{0x7009, 0xDEE1},{0x700B, 0xE4A3},{0x700F, 0xD7B7},
+ {0x7011, 0xF8EE},{0x7015, 0xDEB5},{0x7018, 0xD6D2},{0x701A, 0xF9D5},{0x701B, 0xE7BA},{0x701C, 0xEBD5},{0x701D, 0xD5F7},{0x701E, 0xEFE7},
+ {0x701F, 0xE1BE},{0x7023, 0xFAAE},{0x7027, 0xD6E9},{0x7028, 0xD6EE},{0x702F, 0xE7BB},{0x7037, 0xECCB},{0x703E, 0xD5B3},{0x704C, 0xCEB4},
+ {0x7050, 0xFBA5},{0x7051, 0xE1EE},{0x7058, 0xF7A8},{0x705D, 0xFBCE},{0x7063, 0xD8BD},{0x706B, 0xFBFD},{0x7070, 0xFCE9},{0x7078, 0xCFB6},
+ {0x707C, 0xEDC7},{0x707D, 0xEEAC},{0x7085, 0xCCDD},{0x708A, 0xF6A7},{0x708E, 0xE6FA},{0x7092, 0xF5A4},{0x7098, 0xFDDC},{0x7099, 0xEDB3},
+ {0x709A, 0xCEC9},{0x70A1, 0xEFE8},{0x70A4, 0xE1BF},{0x70AB, 0xFADB},{0x70AC, 0xCBE3},{0x70AD, 0xF7A9},{0x70AF, 0xFBA6},{0x70B3, 0xDCB9},
+ {0x70B7, 0xF1C0},{0x70B8, 0xEDC8},{0x70B9, 0xEFC3},{0x70C8, 0xD6AD},{0x70CB, 0xFDCE},{0x70CF, 0xE8A1},{0x70D8, 0xFBF4},{0x70D9, 0xD5A7},
+ {0x70DD, 0xF1F6},{0x70DF, 0xE6D3},{0x70F1, 0xCCDE},{0x70F9, 0xF8B2},{0x70FD, 0xDCEB},{0x7104, 0xFDB6},{0x7109, 0xE5EA},{0x710C, 0xF1E0},
+ {0x7119, 0xDBCC},{0x711A, 0xDDCD},{0x711E, 0xD4C8},{0x7121, 0xD9ED},{0x7126, 0xF5A5},{0x7130, 0xE6FB},{0x7136, 0xE6D4},{0x7147, 0xFDC8},
+ {0x7149, 0xD6A1},{0x714A, 0xFDBF},{0x714C, 0xFCD3},{0x714E, 0xEFA1},{0x7150, 0xE7BC},{0x7156, 0xD1EE},{0x7159, 0xE6D5},{0x715C, 0xE9F2},
+ {0x715E, 0xDFB0},{0x7164, 0xD8E0},{0x7165, 0xFCBA},{0x7166, 0xFDAF},{0x7167, 0xF0CE},{0x7169, 0xDBE1},{0x716C, 0xE5C9},{0x716E, 0xEDB4},
+ {0x717D, 0xE0C3},{0x7184, 0xE3D8},{0x7189, 0xE9FB},{0x718A, 0xEAA8},{0x718F, 0xFDB7},{0x7192, 0xFBA7},{0x7194, 0xE9C2},{0x7199, 0xFDF7},
+ {0x719F, 0xE2D9},{0x71A2, 0xDCEC},{0x71AC, 0xE8A2},{0x71B1, 0xE6F0},{0x71B9, 0xFDF8},{0x71BA, 0xFDF9},{0x71BE, 0xF6BF},{0x71C1, 0xE7A7},
+ {0x71C3, 0xE6D7},{0x71C8, 0xD4F3},{0x71C9, 0xD4C9},{0x71CE, 0xD6FA},{0x71D0, 0xD7F2},{0x71D2, 0xE1C0},{0x71D4, 0xDBE2},{0x71D5, 0xE6D8},
+ {0x71DF, 0xE7BD},{0x71E5, 0xF0CF},{0x71E6, 0xF3BE},{0x71E7, 0xE2AC},{0x71ED, 0xF5B7},{0x71EE, 0xE0F0},{0x71FB, 0xFDB8},{0x71FC, 0xE3E8},
+ {0x71FE, 0xD4A7},{0x71FF, 0xE8FC},{0x7200, 0xFAD2},{0x7206, 0xF8EF},{0x7210, 0xD6D3},{0x721B, 0xD5B4},{0x722A, 0xF0D0},{0x722C, 0xF7F0},
+ {0x722D, 0xEEB3},{0x7230, 0xEABA},{0x7232, 0xEAD3},{0x7235, 0xEDC9},{0x7236, 0xDDAB},{0x723A, 0xE5AC},{0x723B, 0xFDA1},{0x723D, 0xDFD0},
+ {0x723E, 0xECB3},{0x7240, 0xDFD1},{0x7246, 0xEDED},{0x7247, 0xF8B8},{0x7248, 0xF7FA},{0x724C, 0xF8AB},{0x7252, 0xF4E0},{0x7258, 0xD4BA},
+ {0x7259, 0xE4B3},{0x725B, 0xE9DA},{0x725D, 0xDEB6},{0x725F, 0xD9BF},{0x7261, 0xD9C0},{0x7262, 0xD6EF},{0x7267, 0xD9CC},{0x7269, 0xDAAA},
+ {0x7272, 0xDFE5},{0x7279, 0xF7E5},{0x727D, 0xCCB2},{0x7280, 0xDFF9},{0x7281, 0xD7E0},{0x72A2, 0xD4BB},{0x72A7, 0xFDFA},{0x72AC, 0xCCB3},
+ {0x72AF, 0xDBF3},{0x72C0, 0xDFD2},{0x72C2, 0xCECA},{0x72C4, 0xEEDA},{0x72CE, 0xE4E4},{0x72D0, 0xFBCF},{0x72D7, 0xCFB7},{0x72D9, 0xEEC3},
+ {0x72E1, 0xCEEA},{0x72E9, 0xE2AD},{0x72F8, 0xD7E1},{0x72F9, 0xFAF5},{0x72FC, 0xD5C9},{0x72FD, 0xF8AC},{0x730A, 0xE7D9},{0x7316, 0xF3E9},
+ {0x731B, 0xD8ED},{0x731C, 0xE3C4},{0x731D, 0xF0F1},{0x7325, 0xE8E5},{0x7329, 0xE0FA},{0x732A, 0xEEC4},{0x732B, 0xD9DE},{0x7336, 0xEBA2},
+ {0x7337, 0xEBA3},{0x733E, 0xFCC2},{0x733F, 0xEABB},{0x7344, 0xE8AB},{0x7345, 0xDEE2},{0x7350, 0xEDEF},{0x7352, 0xE8A3},{0x7357, 0xCFF1},
+ {0x7368, 0xD4BC},{0x736A, 0xFCEA},{0x7370, 0xE7BE},{0x7372, 0xFCF2},{0x7375, 0xD6B4},{0x7378, 0xE2AE},{0x737A, 0xD3B7},{0x737B, 0xFACC},
+ {0x7384, 0xFADC},{0x7386, 0xEDB5},{0x7387, 0xE1E3},{0x7389, 0xE8AC},{0x738B, 0xE8DD},{0x738E, 0xEFE9},{0x7394, 0xF4BD},{0x7396, 0xCFB8},
+ {0x7397, 0xE9DB},{0x7398, 0xD1AC},{0x739F, 0xDAC7},{0x73A7, 0xEBC9},{0x73A9, 0xE8CC},{0x73AD, 0xDEB7},{0x73B2, 0xD6BC},{0x73B3, 0xD3E5},
+ {0x73B9, 0xFADD},{0x73C0, 0xDAD6},{0x73C2, 0xCAB1},{0x73C9, 0xDAC8},{0x73CA, 0xDFA6},{0x73CC, 0xF9B3},{0x73CD, 0xF2D2},{0x73CF, 0xCAC4},
+ {0x73D6, 0xCECB},{0x73D9, 0xCDF5},{0x73DD, 0xFDB0},{0x73DE, 0xD5A8},{0x73E0, 0xF1C1},{0x73E3, 0xE2E9},{0x73E4, 0xDCCA},{0x73E5, 0xECB4},
+ {0x73E6, 0xFAC0},{0x73E9, 0xFBA8},{0x73EA, 0xD0A8},{0x73ED, 0xDAEC},{0x73F7, 0xD9EE},{0x73F9, 0xE0FB},{0x73FD, 0xEFEA},{0x73FE, 0xFADE},
+ {0x7401, 0xE0C4},{0x7403, 0xCFB9},{0x7405, 0xD5CA},{0x7406, 0xD7E2},{0x7407, 0xE2AF},{0x7409, 0xD7B8},{0x7413, 0xE8CD},{0x741B, 0xF6DA},
+ {0x7420, 0xEFA2},{0x7421, 0xE2DA},{0x7422, 0xF6FC},{0x7425, 0xFBD0},{0x7426, 0xD1AD},{0x7428, 0xCDE4},{0x742A, 0xD1AE},{0x742B, 0xDCED},
+ {0x742C, 0xE8CE},{0x742E, 0xF0F9},{0x742F, 0xCEB5},{0x7430, 0xE6FC},{0x7433, 0xD7FB},{0x7434, 0xD0D6},{0x7435, 0xDDF5},{0x7436, 0xF7F1},
+ {0x7438, 0xF6FD},{0x743A, 0xDBF7},{0x743F, 0xFBEA},{0x7440, 0xE9DC},{0x7441, 0xD9C1},{0x7443, 0xF5F2},{0x7444, 0xE0C5},{0x744B, 0xEAD4},
+ {0x7455, 0xF9C2},{0x7457, 0xEABC},{0x7459, 0xD2C5},{0x745A, 0xFBD1},{0x745B, 0xE7C0},{0x745C, 0xEBA5},{0x745E, 0xDFFA},{0x745F, 0xE3A2},
+ {0x7460, 0xD7B9},{0x7462, 0xE9C3},{0x7464, 0xE8FD},{0x7465, 0xE8AF},{0x7468, 0xF2D3},{0x7469, 0xFBA9},{0x746A, 0xD8A5},{0x746F, 0xD5CB},
+ {0x747E, 0xD0C8},{0x7482, 0xD1AF},{0x7483, 0xD7E3},{0x7487, 0xE0C6},{0x7489, 0xD6A2},{0x748B, 0xEDF0},{0x7498, 0xD7F3},{0x749C, 0xFCD4},
+ {0x749E, 0xDAD7},{0x749F, 0xCCDF},{0x74A1, 0xF2D4},{0x74A3, 0xD1B0},{0x74A5, 0xCCE0},{0x74A7, 0xDBFD},{0x74A8, 0xF3BF},{0x74AA, 0xF0D1},
+ {0x74B0, 0xFCBB},{0x74B2, 0xE2B0},{0x74B5, 0xE6A5},{0x74B9, 0xE2DB},{0x74BD, 0xDFDE},{0x74BF, 0xE0C7},{0x74C6, 0xF2EF},{0x74CA, 0xCCE1},
+ {0x74CF, 0xD6EA},{0x74D4, 0xE7C2},{0x74D8, 0xCEB6},{0x74DA, 0xF3C0},{0x74DC, 0xCDFE},{0x74E0, 0xFBD2},{0x74E2, 0xF8F8},{0x74E3, 0xF7FB},
+ {0x74E6, 0xE8BF},{0x74EE, 0xE8B7},{0x74F7, 0xEDB6},{0x7501, 0xDCBA},{0x7504, 0xCCB4},{0x7511, 0xF1F7},{0x7515, 0xE8B8},{0x7518, 0xCAF6},
+ {0x751A, 0xE4A4},{0x751B, 0xF4D6},{0x751F, 0xDFE6},{0x7523, 0xDFA7},{0x7525, 0xDFE7},{0x7526, 0xE1C1},{0x7528, 0xE9C4},{0x752B, 0xDCCB},
+ {0x752C, 0xE9C5},{0x7530, 0xEFA3},{0x7531, 0xEBA6},{0x7532, 0xCBA3},{0x7533, 0xE3E9},{0x7537, 0xD1FB},{0x7538, 0xEFA4},{0x753A, 0xEFEB},
+ {0x7547, 0xD0B4},{0x754C, 0xCDA3},{0x754F, 0xE8E6},{0x7551, 0xEFA5},{0x7553, 0xD3CC},{0x7554, 0xDAED},{0x7559, 0xD7BA},{0x755B, 0xF2D5},
+ {0x755C, 0xF5E5},{0x755D, 0xD9EF},{0x7562, 0xF9B4},{0x7565, 0xD5D4},{0x7566, 0xFDCF},{0x756A, 0xDBE3},{0x756F, 0xF1E1},{0x7570, 0xECB6},
+ {0x7575, 0xFBFE},{0x7576, 0xD3D7},{0x7578, 0xD1B1},{0x757A, 0xCBB1},{0x757F, 0xD1B2},{0x7586, 0xCBB2},{0x7587, 0xF1C2},{0x758A, 0xF4E1},
+ {0x758B, 0xF9B5},{0x758E, 0xE1C3},{0x758F, 0xE1C2},{0x7591, 0xEBF7},{0x759D, 0xDFA8},{0x75A5, 0xCBCA},{0x75AB, 0xE6B9},{0x75B1, 0xF8DE},
+ {0x75B2, 0xF9AA},{0x75B3, 0xCAF7},{0x75B5, 0xEDB7},{0x75B8, 0xD3B8},{0x75B9, 0xF2D6},{0x75BC, 0xD4D9},{0x75BD, 0xEEC5},{0x75BE, 0xF2F0},
+ {0x75C2, 0xCAB2},{0x75C5, 0xDCBB},{0x75C7, 0xF1F8},{0x75CD, 0xECB7},{0x75D2, 0xE5CA},{0x75D4, 0xF6C0},{0x75D5, 0xFDDD},{0x75D8, 0xD4E3},
+ {0x75D9, 0xCCE2},{0x75DB, 0xF7D4},{0x75E2, 0xD7E5},{0x75F0, 0xD3C3},{0x75F2, 0xD8A6},{0x75F4, 0xF6C1},{0x75FA, 0xDDF6},{0x75FC, 0xCDC0},
+ {0x7600, 0xE5DC},{0x760D, 0xE5CB},{0x7619, 0xE1C4},{0x761F, 0xE8B0},{0x7620, 0xF4B0},{0x7621, 0xF3EA},{0x7622, 0xDAEE},{0x7624, 0xD7BB},
+ {0x7626, 0xE2B1},{0x763B, 0xD7AA},{0x7642, 0xD6FB},{0x764C, 0xE4DF},{0x764E, 0xCAD6},{0x7652, 0xEBA8},{0x7656, 0xDBFE},{0x7661, 0xF6C2},
+ {0x7664, 0xEFBB},{0x7669, 0xD4FD},{0x766C, 0xE0C8},{0x7670, 0xE8B9},{0x7672, 0xEFA6},{0x7678, 0xCDA4},{0x767B, 0xD4F4},{0x767C, 0xDBA1},
+ {0x767D, 0xDBDC},{0x767E, 0xDBDD},{0x7684, 0xEEDC},{0x7686, 0xCBCB},{0x7687, 0xFCD5},{0x768E, 0xCEEB},{0x7690, 0xCDC1},{0x7693, 0xFBD3},
+ {0x76AE, 0xF9AB},{0x76BA, 0xF5D4},{0x76BF, 0xD9A9},{0x76C2, 0xE9DD},{0x76C3, 0xDBCD},{0x76C6, 0xDDCE},{0x76C8, 0xE7C3},{0x76CA, 0xECCC},
+ {0x76D2, 0xF9EC},{0x76D6, 0xCBCC},{0x76DB, 0xE0FC},{0x76DC, 0xD4A8},{0x76DE, 0xEDD3},{0x76DF, 0xD8EF},{0x76E1, 0xF2D7},{0x76E3, 0xCAF8},
+ {0x76E4, 0xDAEF},{0x76E7, 0xD6D4},{0x76EE, 0xD9CD},{0x76F2, 0xD8EE},{0x76F4, 0xF2C1},{0x76F8, 0xDFD3},{0x76FC, 0xDAF0},{0x76FE, 0xE2EA},
+ {0x7701, 0xE0FD},{0x7704, 0xD8F8},{0x7708, 0xF7AF},{0x7709, 0xDAB6},{0x770B, 0xCAD7},{0x771E, 0xF2D8},{0x7720, 0xD8F9},{0x7729, 0xFADF},
+ {0x7737, 0xCFEF},{0x7738, 0xD9C2},{0x773A, 0xF0D2},{0x773C, 0xE4D1},{0x7740, 0xF3B7},{0x774D, 0xFAE0},{0x775B, 0xEFEC},{0x7761, 0xE2B2},
+ {0x7763, 0xD4BD},{0x7766, 0xD9CE},{0x776B, 0xF4E2},{0x7779, 0xD4A9},{0x777E, 0xCDC2},{0x777F, 0xE7DA},{0x778B, 0xF2D9},{0x7791, 0xD9AA},
+ {0x779E, 0xD8BE},{0x77A5, 0xDCAD},{0x77AC, 0xE2EB},{0x77AD, 0xD6FC},{0x77B0, 0xCAF9},{0x77B3, 0xD4DA},{0x77BB, 0xF4D7},{0x77BC, 0xCCA1},
+ {0x77BF, 0xCFBA},{0x77D7, 0xF5B8},{0x77DB, 0xD9C3},{0x77DC, 0xD0E8},{0x77E2, 0xE3C5},{0x77E3, 0xEBF8},{0x77E5, 0xF2B1},{0x77E9, 0xCFBB},
+ {0x77ED, 0xD3AD},{0x77EE, 0xE8E1},{0x77EF, 0xCEEC},{0x77F3, 0xE0B4},{0x7802, 0xDEE3},{0x7812, 0xDDF7},{0x7825, 0xF2B2},{0x7826, 0xF3F6},
+ {0x7827, 0xF6DB},{0x782C, 0xD7FE},{0x7832, 0xF8DF},{0x7834, 0xF7F2},{0x7845, 0xD0A9},{0x784F, 0xE6DA},{0x785D, 0xF5A6},{0x786B, 0xD7BC},
+ {0x786C, 0xCCE3},{0x786F, 0xE6DB},{0x787C, 0xDDDD},{0x7881, 0xD1B3},{0x7887, 0xEFED},{0x788C, 0xD6DE},{0x788D, 0xE4F4},{0x788E, 0xE1EF},
+ {0x7891, 0xDDF8},{0x7897, 0xE8CF},{0x78A3, 0xCAE5},{0x78A7, 0xDCA1},{0x78A9, 0xE0B5},{0x78BA, 0xFCAC},{0x78BB, 0xFCAD},{0x78BC, 0xD8A7},
+ {0x78C1, 0xEDB8},{0x78C5, 0xDBB6},{0x78CA, 0xD6F0},{0x78CB, 0xF3AF},{0x78CE, 0xCDA5},{0x78D0, 0xDAF1},{0x78E8, 0xD8A8},{0x78EC, 0xCCE4},
+ {0x78EF, 0xD1B4},{0x78F5, 0xCAD8},{0x78FB, 0xDAF2},{0x7901, 0xF5A7},{0x790E, 0xF5A8},{0x7916, 0xE6A6},{0x792A, 0xD5EC},{0x792B, 0xD5F8},
+ {0x792C, 0xDAF3},{0x793A, 0xE3C6},{0x793E, 0xDEE4},{0x7940, 0xDEE5},{0x7941, 0xD1B5},{0x7947, 0xD1B6},{0x7948, 0xD1B7},{0x7949, 0xF2B3},
+ {0x7950, 0xE9DE},{0x7956, 0xF0D3},{0x7957, 0xF2B4},{0x795A, 0xF0D4},{0x795B, 0xCBE4},{0x795C, 0xFBD4},{0x795D, 0xF5E6},{0x795E, 0xE3EA},
+ {0x7960, 0xDEE6},{0x7965, 0xDFD4},{0x7968, 0xF8F9},{0x796D, 0xF0AE},{0x797A, 0xD1B8},{0x797F, 0xD6DF},{0x7981, 0xD0D7},{0x798D, 0xFCA1},
+ {0x798E, 0xEFEE},{0x798F, 0xDCD8},{0x7991, 0xE9DF},{0x79A6, 0xE5DD},{0x79A7, 0xFDFB},{0x79AA, 0xE0C9},{0x79AE, 0xD6C9},{0x79B1, 0xD4AA},
+ {0x79B3, 0xE5CC},{0x79B9, 0xE9E0},{0x79BD, 0xD0D8},{0x79BE, 0xFCA2},{0x79BF, 0xD4BE},{0x79C0, 0xE2B3},{0x79C1, 0xDEE7},{0x79C9, 0xDCBC},
+ {0x79CA, 0xD2B6},{0x79CB, 0xF5D5},{0x79D1, 0xCEA1},{0x79D2, 0xF5A9},{0x79D5, 0xDDF9},{0x79D8, 0xDDFA},{0x79DF, 0xF0D5},{0x79E4, 0xF6DF},
+ {0x79E6, 0xF2DA},{0x79E7, 0xE4EB},{0x79E9, 0xF2F1},{0x79FB, 0xECB9},{0x7A00, 0xFDFC},{0x7A05, 0xE1AA},{0x7A08, 0xCAD9},{0x7A0B, 0xEFEF},
+ {0x7A0D, 0xF5AA},{0x7A14, 0xECF9},{0x7A17, 0xF8AD},{0x7A19, 0xF2C2},{0x7A1A, 0xF6C3},{0x7A1C, 0xD7D2},{0x7A1F, 0xF9A2},{0x7A20, 0xF0D6},
+ {0x7A2E, 0xF0FA},{0x7A31, 0xF6E0},{0x7A36, 0xE9F3},{0x7A37, 0xF2C3},{0x7A3B, 0xD4AB},{0x7A3C, 0xCAB3},{0x7A3D, 0xCDA6},{0x7A3F, 0xCDC3},
+ {0x7A40, 0xCDDA},{0x7A46, 0xD9CF},{0x7A49, 0xF6C4},{0x7A4D, 0xEEDD},{0x7A4E, 0xE7C4},{0x7A57, 0xE2B4},{0x7A61, 0xDFE2},{0x7A62, 0xE7DB},
+ {0x7A69, 0xE8B1},{0x7A6B, 0xFCAE},{0x7A70, 0xE5CD},{0x7A74, 0xFAEB},{0x7A76, 0xCFBC},{0x7A79, 0xCFE2},{0x7A7A, 0xCDF6},{0x7A7D, 0xEFF0},
+ {0x7A7F, 0xF4BE},{0x7A81, 0xD4CD},{0x7A84, 0xF3B8},{0x7A88, 0xE9A1},{0x7A92, 0xF2F2},{0x7A93, 0xF3EB},{0x7A95, 0xF0D7},{0x7A98, 0xCFD7},
+ {0x7A9F, 0xCFDF},{0x7AA9, 0xE8C0},{0x7AAA, 0xE8C1},{0x7AAE, 0xCFE3},{0x7AAF, 0xE9A2},{0x7ABA, 0xD0AA},{0x7AC4, 0xF3C1},{0x7AC5, 0xD0AB},
+ {0x7AC7, 0xD4E4},{0x7ACA, 0xEFBC},{0x7ACB, 0xD8A1},{0x7AD7, 0xD9DF},{0x7AD9, 0xF3D7},{0x7ADD, 0xDCBD},{0x7ADF, 0xCCE5},{0x7AE0, 0xEDF1},
+ {0x7AE3, 0xF1E2},{0x7AE5, 0xD4DB},{0x7AEA, 0xE2B5},{0x7AED, 0xCAE6},{0x7AEF, 0xD3AE},{0x7AF6, 0xCCE6},{0x7AF9, 0xF1D3},{0x7AFA, 0xF5E7},
+ {0x7AFF, 0xCADA},{0x7B0F, 0xFBEE},{0x7B11, 0xE1C5},{0x7B19, 0xDFE9},{0x7B1B, 0xEEDE},{0x7B1E, 0xF7C2},{0x7B20, 0xD8A2},{0x7B26, 0xDDAC},
+ {0x7B2C, 0xF0AF},{0x7B2D, 0xD6BD},{0x7B39, 0xE1AB},{0x7B46, 0xF9B6},{0x7B49, 0xD4F5},{0x7B4B, 0xD0C9},{0x7B4C, 0xEFA7},{0x7B4D, 0xE2EC},
+ {0x7B4F, 0xDBEA},{0x7B50, 0xCECC},{0x7B51, 0xF5E8},{0x7B52, 0xF7D5},{0x7B54, 0xD3CD},{0x7B56, 0xF3FE},{0x7B60, 0xD0B5},{0x7B6C, 0xE0FE},
+ {0x7B6E, 0xDFFB},{0x7B75, 0xE6DD},{0x7B7D, 0xE8A4},{0x7B87, 0xCBCD},{0x7B8B, 0xEFA8},{0x7B8F, 0xEEB4},{0x7B94, 0xDAD8},{0x7B95, 0xD1B9},
+ {0x7B97, 0xDFA9},{0x7B9A, 0xF3B0},{0x7B9D, 0xCCC4},{0x7BA1, 0xCEB7},{0x7BAD, 0xEFA9},{0x7BB1, 0xDFD5},{0x7BB4, 0xEDD7},{0x7BB8, 0xEEC6},
+ {0x7BC0, 0xEFBD},{0x7BC1, 0xFCD6},{0x7BC4, 0xDBF4},{0x7BC6, 0xEFAA},{0x7BC7, 0xF8B9},{0x7BC9, 0xF5E9},{0x7BD2, 0xE3D9},{0x7BE0, 0xE1C6},
+ {0x7BE4, 0xD4BF},{0x7BE9, 0xDEE8},{0x7C07, 0xF0EA},{0x7C12, 0xF3C2},{0x7C1E, 0xD3AF},{0x7C21, 0xCADB},{0x7C27, 0xFCD7},{0x7C2A, 0xEDD8},
+ {0x7C2B, 0xE1C7},{0x7C3D, 0xF4D8},{0x7C3E, 0xD6B3},{0x7C3F, 0xDDAD},{0x7C43, 0xD5BE},{0x7C4C, 0xF1C3},{0x7C4D, 0xEEDF},{0x7C60, 0xD6EB},
+ {0x7C64, 0xF4D9},{0x7C6C, 0xD7E6},{0x7C73, 0xDAB7},{0x7C83, 0xDDFB},{0x7C89, 0xDDCF},{0x7C92, 0xD8A3},{0x7C95, 0xDAD9},{0x7C97, 0xF0D8},
+ {0x7C98, 0xEFC4},{0x7C9F, 0xE1D8},{0x7CA5, 0xF1D4},{0x7CA7, 0xEDF2},{0x7CAE, 0xD5DB},{0x7CB1, 0xD5DC},{0x7CB2, 0xF3C4},{0x7CB3, 0xCBD7},
+ {0x7CB9, 0xE2B6},{0x7CBE, 0xEFF1},{0x7CCA, 0xFBD5},{0x7CD6, 0xD3D8},{0x7CDE, 0xDDD0},{0x7CDF, 0xF0D9},{0x7CE0, 0xCBB3},{0x7CE7, 0xD5DD},
+ {0x7CFB, 0xCDA7},{0x7CFE, 0xD0AC},{0x7D00, 0xD1BA},{0x7D02, 0xF1C4},{0x7D04, 0xE5B3},{0x7D05, 0xFBF5},{0x7D06, 0xE9E1},{0x7D07, 0xFDE0},
+ {0x7D08, 0xFCBC},{0x7D0A, 0xDAA2},{0x7D0B, 0xDAA3},{0x7D0D, 0xD2A1},{0x7D10, 0xD2EF},{0x7D14, 0xE2ED},{0x7D17, 0xDEE9},{0x7D18, 0xCEDC},
+ {0x7D19, 0xF2B5},{0x7D1A, 0xD0E4},{0x7D1B, 0xDDD1},{0x7D20, 0xE1C8},{0x7D21, 0xDBB7},{0x7D22, 0xDFE3},{0x7D2B, 0xEDB9},{0x7D2C, 0xF1C5},
+ {0x7D2E, 0xF3CF},{0x7D2F, 0xD7AB},{0x7D30, 0xE1AC},{0x7D33, 0xE3EB},{0x7D35, 0xEEC7},{0x7D39, 0xE1C9},{0x7D3A, 0xCAFA},{0x7D42, 0xF0FB},
+ {0x7D43, 0xFAE1},{0x7D44, 0xF0DA},{0x7D45, 0xCCE7},{0x7D46, 0xDAF4},{0x7D50, 0xCCBF},{0x7D5E, 0xCEED},{0x7D61, 0xD5A9},{0x7D62, 0xFAE2},
+ {0x7D66, 0xD0E5},{0x7D68, 0xEBD6},{0x7D6A, 0xECDF},{0x7D6E, 0xDFFC},{0x7D71, 0xF7D6},{0x7D72, 0xDEEA},{0x7D73, 0xCBB4},{0x7D76, 0xEFBE},
+ {0x7D79, 0xCCB5},{0x7D7F, 0xCFBD},{0x7D8E, 0xEFF2},{0x7D8F, 0xE2B7},{0x7D93, 0xCCE8},{0x7D9C, 0xF0FC},{0x7DA0, 0xD6E0},{0x7DA2, 0xF1C6},
+ {0x7DAC, 0xE2B8},{0x7DAD, 0xEBAB},{0x7DB1, 0xCBB5},{0x7DB2, 0xD8D1},{0x7DB4, 0xF4CE},{0x7DB5, 0xF3F7},{0x7DB8, 0xD7C6},{0x7DBA, 0xD1BB},
+ {0x7DBB, 0xF7AA},{0x7DBD, 0xEDCA},{0x7DBE, 0xD7D3},{0x7DBF, 0xD8FA},{0x7DC7, 0xF6C5},{0x7DCA, 0xD1CC},{0x7DCB, 0xDDFC},{0x7DD6, 0xDFFD},
+ {0x7DD8, 0xF9E5},{0x7DDA, 0xE0CA},{0x7DDD, 0xF2FD},{0x7DDE, 0xD3B0},{0x7DE0, 0xF4F3},{0x7DE1, 0xDAC9},{0x7DE3, 0xE6DE},{0x7DE8, 0xF8BA},
+ {0x7DE9, 0xE8D0},{0x7DEC, 0xD8FB},{0x7DEF, 0xEAD5},{0x7DF4, 0xD6A3},{0x7DFB, 0xF6C6},{0x7E09, 0xF2DB},{0x7E0A, 0xE4FC},{0x7E15, 0xE8B2},
+ {0x7E1B, 0xDADA},{0x7E1D, 0xF2DC},{0x7E1E, 0xFBD6},{0x7E1F, 0xE9B2},{0x7E21, 0xEEAD},{0x7E23, 0xFAE3},{0x7E2B, 0xDCEE},{0x7E2E, 0xF5EA},
+ {0x7E2F, 0xE6E0},{0x7E31, 0xF0FD},{0x7E37, 0xD7AC},{0x7E3D, 0xF5C5},{0x7E3E, 0xEEE0},{0x7E41, 0xDBE5},{0x7E43, 0xDDDE},{0x7E46, 0xD9F0},
+ {0x7E47, 0xE9A3},{0x7E52, 0xF1F9},{0x7E54, 0xF2C4},{0x7E55, 0xE0CB},{0x7E5E, 0xE9A4},{0x7E61, 0xE2B9},{0x7E69, 0xE3B1},{0x7E6A, 0xFCEB},
+ {0x7E6B, 0xCDA8},{0x7E6D, 0xCCB6},{0x7E70, 0xF0DB},{0x7E79, 0xE6BA},{0x7E7C, 0xCDA9},{0x7E82, 0xF3C3},{0x7E8C, 0xE1D9},{0x7E8F, 0xEFAB},
+ {0x7E93, 0xE7C5},{0x7E96, 0xE0E9},{0x7E98, 0xF3C5},{0x7E9B, 0xD4C0},{0x7E9C, 0xD5BF},{0x7F36, 0xDDAE},{0x7F38, 0xF9FC},{0x7F3A, 0xCCC0},
+ {0x7F4C, 0xE5A2},{0x7F50, 0xCEB8},{0x7F54, 0xD8D2},{0x7F55, 0xF9D6},{0x7F6A, 0xF1AA},{0x7F6B, 0xCED1},{0x7F6E, 0xF6C7},{0x7F70, 0xDBEB},
+ {0x7F72, 0xDFFE},{0x7F75, 0xD8E1},{0x7F77, 0xF7F3},{0x7F79, 0xD7E7},{0x7F85, 0xD4FE},{0x7F88, 0xD1BC},{0x7F8A, 0xE5CF},{0x7F8C, 0xCBB6},
+ {0x7F8E, 0xDAB8},{0x7F94, 0xCDC4},{0x7F9A, 0xD6BE},{0x7F9E, 0xE2BA},{0x7FA4, 0xCFD8},{0x7FA8, 0xE0CC},{0x7FA9, 0xEBF9},{0x7FB2, 0xFDFD},
+ {0x7FB8, 0xD7E8},{0x7FB9, 0xCBD8},{0x7FBD, 0xE9E2},{0x7FC1, 0xE8BA},{0x7FC5, 0xE3C7},{0x7FCA, 0xECCD},{0x7FCC, 0xECCE},{0x7FCE, 0xD6BF},
+ {0x7FD2, 0xE3A7},{0x7FD4, 0xDFD6},{0x7FD5, 0xFDE8},{0x7FDF, 0xEEE1},{0x7FE0, 0xF6A8},{0x7FE1, 0xDDFD},{0x7FE9, 0xF8BB},{0x7FEB, 0xE8D1},
+ {0x7FF0, 0xF9D7},{0x7FF9, 0xCEEE},{0x7FFC, 0xECCF},{0x8000, 0xE9A5},{0x8001, 0xD6D5},{0x8003, 0xCDC5},{0x8005, 0xEDBA},{0x8006, 0xD1BD},
+ {0x8009, 0xCFBE},{0x800C, 0xECBB},{0x8010, 0xD2B1},{0x8015, 0xCCE9},{0x8017, 0xD9C4},{0x8018, 0xE9FC},{0x802D, 0xD1BE},{0x8033, 0xECBC},
+ {0x8036, 0xE5AD},{0x803D, 0xF7B0},{0x803F, 0xCCEA},{0x8043, 0xD3C4},{0x8046, 0xD6C0},{0x804A, 0xD6FD},{0x8056, 0xE1A1},{0x8058, 0xDEBD},
+ {0x805A, 0xF6A9},{0x805E, 0xDAA4},{0x806F, 0xD6A4},{0x8070, 0xF5C6},{0x8072, 0xE1A2},{0x8073, 0xE9C6},{0x8077, 0xF2C5},{0x807D, 0xF4E9},
+ {0x807E, 0xD6EC},{0x807F, 0xEBD3},{0x8084, 0xECBD},{0x8085, 0xE2DC},{0x8086, 0xDEEB},{0x8087, 0xF0DC},{0x8089, 0xEBBF},{0x808B, 0xD7CE},
+ {0x808C, 0xD1BF},{0x8096, 0xF5AB},{0x809B, 0xF9FD},{0x809D, 0xCADC},{0x80A1, 0xCDC6},{0x80A2, 0xF2B6},{0x80A5, 0xDDFE},{0x80A9, 0xCCB7},
+ {0x80AA, 0xDBB8},{0x80AF, 0xD0E9},{0x80B1, 0xCEDD},{0x80B2, 0xEBC0},{0x80B4, 0xFDA2},{0x80BA, 0xF8CB},{0x80C3, 0xEAD6},{0x80C4, 0xF1B0},
+ {0x80CC, 0xDBCE},{0x80CE, 0xF7C3},{0x80DA, 0xDBCF},{0x80DB, 0xCBA4},{0x80DE, 0xF8E0},{0x80E1, 0xFBD7},{0x80E4, 0xEBCA},{0x80E5, 0xE0A1},
+ {0x80F1, 0xCECD},{0x80F4, 0xD4DC},{0x80F8, 0xFDD8},{0x80FD, 0xD2F6},{0x8102, 0xF2B7},{0x8105, 0xFAF6},{0x8106, 0xF6AA},{0x8107, 0xFAF7},
+ {0x8108, 0xD8E6},{0x810A, 0xF4B1},{0x8118, 0xE8D2},{0x811A, 0xCAC5},{0x811B, 0xCCEB},{0x8123, 0xE2EE},{0x8129, 0xE2BB},{0x812B, 0xF7AD},
+ {0x812F, 0xF8E1},{0x8139, 0xF3EC},{0x813E, 0xDEA1},{0x814B, 0xE4FD},{0x814E, 0xE3EC},{0x8150, 0xDDAF},{0x8151, 0xDDB0},{0x8154, 0xCBB7},
+ {0x8155, 0xE8D3},{0x8165, 0xE1A3},{0x8166, 0xD2E0},{0x816B, 0xF0FE},{0x8170, 0xE9A6},{0x8171, 0xCBF2},{0x8178, 0xEDF3},{0x8179, 0xDCD9},
+ {0x817A, 0xE0CD},{0x817F, 0xF7DA},{0x8180, 0xDBB9},{0x8188, 0xCCAE},{0x818A, 0xDADB},{0x818F, 0xCDC7},{0x819A, 0xDDB1},{0x819C, 0xD8AF},
+ {0x819D, 0xE3A3},{0x81A0, 0xCEEF},{0x81A3, 0xF2F3},{0x81A8, 0xF8B3},{0x81B3, 0xE0CE},{0x81B5, 0xF5FD},{0x81BA, 0xEBEC},{0x81BD, 0xD3C5},
+ {0x81BE, 0xFCEC},{0x81BF, 0xD2DB},{0x81C0, 0xD4EB},{0x81C2, 0xDEA2},{0x81C6, 0xE5E6},{0x81CD, 0xF0B0},{0x81D8, 0xD5C4},{0x81DF, 0xEDF4},
+ {0x81E3, 0xE3ED},{0x81E5, 0xE8C2},{0x81E7, 0xEDF5},{0x81E8, 0xD7FC},{0x81EA, 0xEDBB},{0x81ED, 0xF6AB},{0x81F3, 0xF2B8},{0x81F4, 0xF6C8},
+ {0x81FA, 0xD3E6},{0x81FB, 0xF2DD},{0x81FC, 0xCFBF},{0x81FE, 0xEBAC},{0x8205, 0xCFC0},{0x8207, 0xE6A8},{0x8208, 0xFDE9},{0x820A, 0xCFC1},
+ {0x820C, 0xE0DF},{0x820D, 0xDEEC},{0x8212, 0xE0A2},{0x821B, 0xF4BF},{0x821C, 0xE2EF},{0x821E, 0xD9F1},{0x821F, 0xF1C7},{0x8221, 0xCBB8},
+ {0x822A, 0xF9FE},{0x822B, 0xDBBA},{0x822C, 0xDAF5},{0x8235, 0xF6EC},{0x8236, 0xDADC},{0x8237, 0xFAE4},{0x8239, 0xE0CF},{0x8240, 0xDDB2},
+ {0x8245, 0xE6A9},{0x8247, 0xEFF3},{0x8259, 0xF3ED},{0x8264, 0xEBFA},{0x8266, 0xF9E6},{0x826E, 0xCADD},{0x826F, 0xD5DE},{0x8271, 0xCADE},
+ {0x8272, 0xDFE4},{0x8276, 0xE6FD},{0x8278, 0xF5AC},{0x827E, 0xE4F5},{0x828B, 0xE9E3},{0x828D, 0xEDCB},{0x828E, 0xCFE4},{0x8292, 0xD8D3},
+ {0x8299, 0xDDB3},{0x829A, 0xD4EC},{0x829D, 0xF2B9},{0x829F, 0xDFB7},{0x82A5, 0xCBCE},{0x82A6, 0xFBD8},{0x82A9, 0xD0D9},{0x82AC, 0xDDD2},
+ {0x82AD, 0xF7F4},{0x82AE, 0xE7DC},{0x82AF, 0xE4A5},{0x82B1, 0xFCA3},{0x82B3, 0xDBBB},{0x82B7, 0xF2BA},{0x82B8, 0xE9FD},{0x82B9, 0xD0CA},
+ {0x82BB, 0xF5D6},{0x82BC, 0xD9C5},{0x82BD, 0xE4B4},{0x82BF, 0xEDA7},{0x82D1, 0xEABD},{0x82D2, 0xE6FE},{0x82D4, 0xF7C4},{0x82D5, 0xF5AD},
+ {0x82D7, 0xD9E0},{0x82DB, 0xCAB4},{0x82DE, 0xF8E2},{0x82DF, 0xCFC2},{0x82E1, 0xECBE},{0x82E5, 0xE5B4},{0x82E6, 0xCDC8},{0x82E7, 0xEEC8},
+ {0x82F1, 0xE7C8},{0x82FD, 0xCDC9},{0x82FE, 0xF9B7},{0x8301, 0xF1E8},{0x8302, 0xD9F2},{0x8303, 0xDBF5},{0x8304, 0xCAB5},{0x8305, 0xD9C6},
+ {0x8309, 0xD8C9},{0x8317, 0xD9AB},{0x8328, 0xEDBC},{0x832B, 0xD8D4},{0x832F, 0xDCDA},{0x8331, 0xE2BC},{0x8334, 0xFCED},{0x8335, 0xECE0},
+ {0x8336, 0xD2FE},{0x8338, 0xE9C7},{0x8339, 0xE6AA},{0x8340, 0xE2F0},{0x8347, 0xFABB},{0x8349, 0xF5AE},{0x834A, 0xFBAA},{0x834F, 0xECFB},
+ {0x8351, 0xECBF},{0x8352, 0xFCD8},{0x8373, 0xD4E5},{0x8377, 0xF9C3},{0x837B, 0xEEE2},{0x8389, 0xD7E9},{0x838A, 0xEDF6},{0x838E, 0xDEED},
+ {0x8396, 0xCCEC},{0x8398, 0xE3EE},{0x839E, 0xE8D4},{0x83A2, 0xFAF8},{0x83A9, 0xDDB4},{0x83AA, 0xE4B5},{0x83AB, 0xD8B0},{0x83BD, 0xD8D5},
+ {0x83C1, 0xF4EA},{0x83C5, 0xCEB9},{0x83C9, 0xD6E1},{0x83CA, 0xCFD2},{0x83CC, 0xD0B6},{0x83D3, 0xCEA2},{0x83D6, 0xF3EE},{0x83DC, 0xF3F8},
+ {0x83E9, 0xDCCC},{0x83EB, 0xD0CB},{0x83EF, 0xFCA4},{0x83F0, 0xCDCA},{0x83F1, 0xD7D4},{0x83F2, 0xDEA3},{0x83F4, 0xE4E0},{0x83F9, 0xEEC9},
+ {0x83FD, 0xE2DD},{0x8403, 0xF5FE},{0x8404, 0xD4AC},{0x840A, 0xD5D1},{0x840C, 0xD8F0},{0x840D, 0xF8C3},{0x840E, 0xEAD7},{0x8429, 0xF5D7},
+ {0x842C, 0xD8BF},{0x8431, 0xFDC0},{0x8438, 0xEBAD},{0x843D, 0xD5AA},{0x8449, 0xE7A8},{0x8457, 0xEECA},{0x845B, 0xCAE7},{0x8461, 0xF8E3},
+ {0x8463, 0xD4DD},{0x8466, 0xEAD8},{0x846B, 0xFBD9},{0x846C, 0xEDF7},{0x846F, 0xE5B5},{0x8475, 0xD0AD},{0x847A, 0xF1F1},{0x8490, 0xE2BD},
+ {0x8494, 0xE3C8},{0x8499, 0xD9D5},{0x849C, 0xDFAA},{0x84A1, 0xDBBC},{0x84B2, 0xF8E4},{0x84B8, 0xF1FA},{0x84BB, 0xE5B6},{0x84BC, 0xF3EF},
+ {0x84BF, 0xFBDA},{0x84C0, 0xE1E0},{0x84C2, 0xD9AC},{0x84C4, 0xF5EB},{0x84C6, 0xE0B6},{0x84C9, 0xE9C8},{0x84CB, 0xCBCF},{0x84CD, 0xE3C9},
+ {0x84D1, 0xDEEE},{0x84DA, 0xE2BE},{0x84EC, 0xDCEF},{0x84EE, 0xD6A5},{0x84F4, 0xE2F1},{0x84FC, 0xD6FE},{0x8511, 0xD9A1},{0x8513, 0xD8C0},
+ {0x8514, 0xDCDB},{0x8517, 0xEDBD},{0x8518, 0xDFB8},{0x851A, 0xEAA5},{0x851E, 0xD7AD},{0x8521, 0xF3F9},{0x8523, 0xEDF8},{0x8525, 0xF5C7},
+ {0x852C, 0xE1CA},{0x852D, 0xEBE3},{0x852F, 0xF2DE},{0x853D, 0xF8CC},{0x853F, 0xEAD9},{0x8541, 0xD3C6},{0x8543, 0xDBE6},{0x8549, 0xF5AF},
+ {0x854E, 0xCEF0},{0x8553, 0xE9FE},{0x8559, 0xFBB6},{0x8563, 0xE2F2},{0x8568, 0xCFF2},{0x8569, 0xF7B9},{0x856A, 0xD9F3},{0x856D, 0xE1CB},
+ {0x8584, 0xDADD},{0x8587, 0xDAB9},{0x858F, 0xEBFB},{0x8591, 0xCBB9},{0x8594, 0xEDF9},{0x859B, 0xE0E0},{0x85A6, 0xF4C0},{0x85A8, 0xFDBC},
+ {0x85A9, 0xDFB1},{0x85AA, 0xE3EF},{0x85AF, 0xE0A3},{0x85B0, 0xFDB9},{0x85BA, 0xF0B1},{0x85C1, 0xCDCB},{0x85C9, 0xEDBE},{0x85CD, 0xD5C0},
+ {0x85CE, 0xE3F0},{0x85CF, 0xEDFA},{0x85D5, 0xE9E4},{0x85DC, 0xD5ED},{0x85DD, 0xE7DD},{0x85E4, 0xD4F6},{0x85E5, 0xE5B7},{0x85E9, 0xDBE7},
+ {0x85EA, 0xE2BF},{0x85F7, 0xEECB},{0x85FA, 0xD7F4},{0x85FB, 0xF0DD},{0x85FF, 0xCEAB},{0x8602, 0xE7DE},{0x8606, 0xD6D6},{0x8607, 0xE1CC},
+ {0x860A, 0xE8B3},{0x8616, 0xE5EE},{0x8617, 0xDCA2},{0x861A, 0xE0D0},{0x862D, 0xD5B5},{0x863F, 0xD5A1},{0x864E, 0xFBDB},{0x8650, 0xF9CB},
+ {0x8654, 0xCBF3},{0x8655, 0xF4A5},{0x865B, 0xFAC8},{0x865C, 0xD6D7},{0x865E, 0xE9E5},{0x865F, 0xFBDC},{0x8667, 0xFDD0},{0x8679, 0xFBF6},
+ {0x868A, 0xDAA5},{0x868C, 0xDBBD},{0x8693, 0xECE2},{0x86A3, 0xCDF7},{0x86A4, 0xF0DE},{0x86A9, 0xF6C9},{0x86C7, 0xDEEF},{0x86CB, 0xD3B1},
+ {0x86D4, 0xFCEE},{0x86D9, 0xE8C3},{0x86DB, 0xF1C8},{0x86DF, 0xCEF1},{0x86E4, 0xF9ED},{0x86ED, 0xF2F4},{0x86FE, 0xE4B6},{0x8700, 0xF5B9},
+ {0x8702, 0xDCF0},{0x8703, 0xE3F1},{0x8708, 0xE8A5},{0x8718, 0xF2BB},{0x871A, 0xDEA4},{0x871C, 0xDACC},{0x874E, 0xCAE9},{0x8755, 0xE3DA},
+ {0x8757, 0xFCD9},{0x875F, 0xEADA},{0x8766, 0xF9C4},{0x8768, 0xE3A4},{0x8774, 0xFBDD},{0x8776, 0xEFCA},{0x8778, 0xE8C4},{0x8782, 0xD5CC},
+ {0x878D, 0xEBD7},{0x879F, 0xD9AD},{0x87A2, 0xFBAB},{0x87B3, 0xD3D9},{0x87BA, 0xD5A2},{0x87C4, 0xF6DE},{0x87E0, 0xDAF6},{0x87EC, 0xE0D1},
+ {0x87EF, 0xE9A8},{0x87F2, 0xF5F9},{0x87F9, 0xFAAF},{0x87FB, 0xEBFC},{0x87FE, 0xE0EA},{0x8805, 0xE3B2},{0x881F, 0xD5C5},{0x8822, 0xF1E3},
+ {0x8823, 0xD5EE},{0x8831, 0xCDCC},{0x8836, 0xEDD9},{0x883B, 0xD8C1},{0x8840, 0xFAEC},{0x8846, 0xF1EB},{0x884C, 0xFABC},{0x884D, 0xE6E2},
+ {0x8852, 0xFAE5},{0x8853, 0xE2FA},{0x8857, 0xCAB6},{0x8859, 0xE4B7},{0x885B, 0xEADB},{0x885D, 0xF5FA},{0x8861, 0xFBAC},{0x8862, 0xCFC3},
+ {0x8863, 0xEBFD},{0x8868, 0xF8FA},{0x886B, 0xDFB9},{0x8870, 0xE1F1},{0x8872, 0xD2A4},{0x8877, 0xF5FB},{0x887E, 0xD0DA},{0x887F, 0xD0DB},
+ {0x8881, 0xEABE},{0x8882, 0xD9B1},{0x8888, 0xCAB7},{0x888B, 0xD3E7},{0x888D, 0xF8E5},{0x8892, 0xD3B2},{0x8896, 0xE2C0},{0x8897, 0xF2DF},
+ {0x889E, 0xCDE5},{0x88AB, 0xF9AC},{0x88B4, 0xCDCD},{0x88C1, 0xEEAE},{0x88C2, 0xD6AE},{0x88CF, 0xD7EA},{0x88D4, 0xE7E0},{0x88D5, 0xEBAE},
+ {0x88D9, 0xCFD9},{0x88DC, 0xDCCD},{0x88DD, 0xEDFB},{0x88DF, 0xDEF0},{0x88E1, 0xD7EB},{0x88E8, 0xDEA5},{0x88F3, 0xDFD7},{0x88F4, 0xDBD0},
+ {0x88F5, 0xDBD1},{0x88F8, 0xD5A3},{0x88FD, 0xF0B2},{0x8907, 0xDCDC},{0x8910, 0xCAE8},{0x8912, 0xF8E6},{0x8913, 0xDCCE},{0x8918, 0xEADC},
+ {0x8919, 0xDBD2},{0x8925, 0xE9B3},{0x892A, 0xF7DB},{0x8936, 0xE3A8},{0x8938, 0xD7AE},{0x893B, 0xE0E1},{0x8941, 0xCBBA},{0x8944, 0xE5D1},
+ {0x895F, 0xD0DC},{0x8964, 0xD5C1},{0x896A, 0xD8CA},{0x8972, 0xE3A9},{0x897F, 0xE0A4},{0x8981, 0xE9A9},{0x8983, 0xD3C7},{0x8986, 0xDCDD},
+ {0x8987, 0xF8AE},{0x898B, 0xCCB8},{0x898F, 0xD0AE},{0x8993, 0xD8F2},{0x8996, 0xE3CA},{0x89A1, 0xCCAF},{0x89A9, 0xD4AD},{0x89AA, 0xF6D1},
+ {0x89B2, 0xD0CC},{0x89BA, 0xCAC6},{0x89BD, 0xD5C2},{0x89C0, 0xCEBA},{0x89D2, 0xCAC7},{0x89E3, 0xFAB0},{0x89F4, 0xDFD8},{0x89F8, 0xF5BA},
+ {0x8A00, 0xE5EB},{0x8A02, 0xEFF4},{0x8A03, 0xDDB5},{0x8A08, 0xCDAA},{0x8A0A, 0xE3F2},{0x8A0C, 0xFBF7},{0x8A0E, 0xF7D0},{0x8A13, 0xFDBA},
+ {0x8A16, 0xFDE1},{0x8A17, 0xF6FE},{0x8A18, 0xD1C0},{0x8A1B, 0xE8C5},{0x8A1D, 0xE4B8},{0x8A1F, 0xE1E8},{0x8A23, 0xCCC1},{0x8A25, 0xD2ED},
+ {0x8A2A, 0xDBBE},{0x8A2D, 0xE0E2},{0x8A31, 0xFAC9},{0x8A34, 0xE1CD},{0x8A36, 0xCAB8},{0x8A3A, 0xF2E0},{0x8A3B, 0xF1C9},{0x8A50, 0xDEF1},
+ {0x8A54, 0xF0DF},{0x8A55, 0xF8C4},{0x8A5B, 0xEECC},{0x8A5E, 0xDEF2},{0x8A60, 0xE7C9},{0x8A62, 0xE2F3},{0x8A63, 0xE7E1},{0x8A66, 0xE3CB},
+ {0x8A69, 0xE3CC},{0x8A6D, 0xCFF8},{0x8A6E, 0xEFAC},{0x8A70, 0xFDFE},{0x8A71, 0xFCA5},{0x8A72, 0xFAB1},{0x8A73, 0xDFD9},{0x8A75, 0xE0D2},
+ {0x8A79, 0xF4DA},{0x8A85, 0xF1CA},{0x8A87, 0xCEA3},{0x8A8C, 0xF2BC},{0x8A8D, 0xECE3},{0x8A93, 0xE0A5},{0x8A95, 0xF7AB},{0x8A98, 0xEBAF},
+ {0x8A9E, 0xE5DE},{0x8AA0, 0xE1A4},{0x8AA1, 0xCDAB},{0x8AA3, 0xD9F4},{0x8AA4, 0xE8A6},{0x8AA5, 0xCDCE},{0x8AA6, 0xE1E9},{0x8AA8, 0xFCEF},
+ {0x8AAA, 0xE0E3},{0x8AB0, 0xE2C1},{0x8AB2, 0xCEA4},{0x8AB9, 0xDEA6},{0x8ABC, 0xEBFE},{0x8ABE, 0xEBDD},{0x8ABF, 0xF0E0},{0x8AC2, 0xF4DB},
+ {0x8AC4, 0xE2F4},{0x8AC7, 0xD3C8},{0x8ACB, 0xF4EB},{0x8ACD, 0xEEB5},{0x8ACF, 0xF5D8},{0x8AD2, 0xD5DF},{0x8AD6, 0xD6E5},{0x8ADB, 0xEBB0},
+ {0x8ADC, 0xF4E3},{0x8AE1, 0xE3CD},{0x8AE6, 0xF4F4},{0x8AE7, 0xFAB2},{0x8AEA, 0xEFF5},{0x8AEB, 0xCADF},{0x8AED, 0xEBB1},{0x8AEE, 0xEDBF},
+ {0x8AF1, 0xFDC9},{0x8AF6, 0xE4A6},{0x8AF7, 0xF9A4},{0x8AF8, 0xF0B3},{0x8AFA, 0xE5EC},{0x8AFE, 0xD1E7},{0x8B00, 0xD9C7},{0x8B01, 0xE4D7},
+ {0x8B02, 0xEADD},{0x8B04, 0xD4F7},{0x8B0E, 0xDABA},{0x8B10, 0xDACD},{0x8B14, 0xF9CC},{0x8B16, 0xE1DA},{0x8B17, 0xDBBF},{0x8B19, 0xCCC5},
+ {0x8B1A, 0xECD0},{0x8B1B, 0xCBBB},{0x8B1D, 0xDEF3},{0x8B20, 0xE9AA},{0x8B28, 0xD9C8},{0x8B2B, 0xEEE3},{0x8B2C, 0xD7BD},{0x8B33, 0xCFC4},
+ {0x8B39, 0xD0CD},{0x8B41, 0xFCA6},{0x8B49, 0xF1FB},{0x8B4E, 0xFDD2},{0x8B4F, 0xD1C1},{0x8B58, 0xE3DB},{0x8B5A, 0xD3C9},{0x8B5C, 0xDCCF},
+ {0x8B66, 0xCCED},{0x8B6C, 0xDEA7},{0x8B6F, 0xE6BB},{0x8B70, 0xECA1},{0x8B74, 0xCCB9},{0x8B77, 0xFBDE},{0x8B7D, 0xE7E2},{0x8B80, 0xD4C1},
+ {0x8B8A, 0xDCA8},{0x8B90, 0xE2C2},{0x8B92, 0xF3D8},{0x8B93, 0xE5D3},{0x8B96, 0xF3D9},{0x8B9A, 0xF3C6},{0x8C37, 0xCDDB},{0x8C3F, 0xCDAC},
+ {0x8C41, 0xFCC3},{0x8C46, 0xD4E7},{0x8C48, 0xD1C2},{0x8C4A, 0xF9A5},{0x8C4C, 0xE8D5},{0x8C55, 0xE3CE},{0x8C5A, 0xD4CA},{0x8C61, 0xDFDA},
+ {0x8C6A, 0xFBDF},{0x8C6B, 0xE7E3},{0x8C79, 0xF8FB},{0x8C7A, 0xE3CF},{0x8C82, 0xF5B0},{0x8C8A, 0xD8E7},{0x8C8C, 0xD9C9},{0x8C9D, 0xF8AF},
+ {0x8C9E, 0xEFF6},{0x8CA0, 0xDDB6},{0x8CA1, 0xEEAF},{0x8CA2, 0xCDF8},{0x8CA7, 0xDEB8},{0x8CA8, 0xFCA7},{0x8CA9, 0xF7FC},{0x8CAA, 0xF7B1},
+ {0x8CAB, 0xCEBB},{0x8CAC, 0xF4A1},{0x8CAF, 0xEECD},{0x8CB0, 0xE1AE},{0x8CB3, 0xECC3},{0x8CB4, 0xCFFE},{0x8CB6, 0xF8BF},{0x8CB7, 0xD8E2},
+ {0x8CB8, 0xD3E8},{0x8CBB, 0xDEA8},{0x8CBC, 0xF4E4},{0x8CBD, 0xECC2},{0x8CBF, 0xD9F5},{0x8CC0, 0xF9C5},{0x8CC1, 0xDDD3},{0x8CC2, 0xD6F1},
+ {0x8CC3, 0xECFC},{0x8CC4, 0xFCF0},{0x8CC7, 0xEDC0},{0x8CC8, 0xCAB9},{0x8CCA, 0xEEE4},{0x8CD1, 0xF2E1},{0x8CD3, 0xDEB9},{0x8CDA, 0xD6F2},
+ {0x8CDC, 0xDEF4},{0x8CDE, 0xDFDB},{0x8CE0, 0xDBD3},{0x8CE2, 0xFAE7},{0x8CE3, 0xD8E3},{0x8CE4, 0xF4C1},{0x8CE6, 0xDDB7},{0x8CEA, 0xF2F5},
+ {0x8CED, 0xD4AE},{0x8CF4, 0xD6F3},{0x8CFB, 0xDDB8},{0x8CFC, 0xCFC5},{0x8CFD, 0xDFDF},{0x8D04, 0xF2BE},{0x8D05, 0xF6A1},{0x8D07, 0xEBCB},
+ {0x8D08, 0xF1FC},{0x8D0A, 0xF3C7},{0x8D0D, 0xE0EB},{0x8D13, 0xEDFC},{0x8D16, 0xE1DB},{0x8D64, 0xEEE5},{0x8D66, 0xDEF5},{0x8D6B, 0xFAD3},
+ {0x8D70, 0xF1CB},{0x8D73, 0xD0AF},{0x8D74, 0xDDB9},{0x8D77, 0xD1C3},{0x8D85, 0xF5B1},{0x8D8A, 0xEAC6},{0x8D99, 0xF0E1},{0x8DA3, 0xF6AC},
+ {0x8DA8, 0xF5D9},{0x8DB3, 0xF0EB},{0x8DBA, 0xDDBA},{0x8DBE, 0xF2BF},{0x8DC6, 0xF7C5},{0x8DCB, 0xDBA2},{0x8DCC, 0xF2F6},{0x8DCF, 0xCABA},
+ {0x8DDB, 0xF7F5},{0x8DDD, 0xCBE5},{0x8DE1, 0xEEE6},{0x8DE3, 0xE0D3},{0x8DE8, 0xCEA5},{0x8DEF, 0xD6D8},{0x8DF3, 0xD4AF},{0x8E0A, 0xE9C9},
+ {0x8E0F, 0xD3CE},{0x8E10, 0xF4C2},{0x8E1E, 0xCBE6},{0x8E2A, 0xF1A1},{0x8E30, 0xEBB2},{0x8E35, 0xF1A2},{0x8E42, 0xEBB3},{0x8E44, 0xF0B4},
+ {0x8E47, 0xCBF4},{0x8E48, 0xD4B0},{0x8E49, 0xF3B2},{0x8E4A, 0xFBB7},{0x8E59, 0xF5EC},{0x8E5F, 0xEEE7},{0x8E60, 0xF4B2},{0x8E74, 0xF5ED},
+ {0x8E76, 0xCFF3},{0x8E81, 0xF0E2},{0x8E87, 0xEECE},{0x8E8A, 0xF1CC},{0x8E8D, 0xE5B8},{0x8EAA, 0xD7F5},{0x8EAB, 0xE3F3},{0x8EAC, 0xCFE5},
+ {0x8EC0, 0xCFC6},{0x8ECA, 0xF3B3},{0x8ECB, 0xE4D8},{0x8ECC, 0xCFF9},{0x8ECD, 0xCFDA},{0x8ED2, 0xFACD},{0x8EDF, 0xE6E3},{0x8EEB, 0xF2E2},
+ {0x8EF8, 0xF5EE},{0x8EFB, 0xCABB},{0x8EFE, 0xE3DC},{0x8F03, 0xCEF2},{0x8F05, 0xD6D9},{0x8F09, 0xEEB0},{0x8F12, 0xF4E5},{0x8F13, 0xD8C2},
+ {0x8F14, 0xDCD0},{0x8F15, 0xCCEE},{0x8F1B, 0xD5E0},{0x8F1C, 0xF6CA},{0x8F1D, 0xFDCA},{0x8F1E, 0xD8D6},{0x8F1F, 0xF4CF},{0x8F26, 0xD6A6},
+ {0x8F27, 0xDCBE},{0x8F29, 0xDBD4},{0x8F2A, 0xD7C7},{0x8F2F, 0xF2FE},{0x8F33, 0xF1CD},{0x8F38, 0xE2C3},{0x8F39, 0xDCDE},{0x8F3B, 0xDCDF},
+ {0x8F3E, 0xEFAD},{0x8F3F, 0xE6AB},{0x8F44, 0xF9DD},{0x8F45, 0xEABF},{0x8F49, 0xEFAE},{0x8F4D, 0xF4D0},{0x8F4E, 0xCEF3},{0x8F5D, 0xE6AC},
+ {0x8F5F, 0xCEDE},{0x8F62, 0xD5F9},{0x8F9B, 0xE3F4},{0x8F9C, 0xCDD0},{0x8FA3, 0xD5B8},{0x8FA6, 0xF7FD},{0x8FA8, 0xDCA9},{0x8FAD, 0xDEF6},
+ {0x8FAF, 0xDCAA},{0x8FB0, 0xF2E3},{0x8FB1, 0xE9B4},{0x8FB2, 0xD2DC},{0x8FC2, 0xE9E6},{0x8FC5, 0xE3F6},{0x8FCE, 0xE7CA},{0x8FD1, 0xD0CE},
+ {0x8FD4, 0xDAF7},{0x8FE6, 0xCABC},{0x8FEA, 0xEEE8},{0x8FEB, 0xDADE},{0x8FED, 0xF2F7},{0x8FF0, 0xE2FB},{0x8FF2, 0xCCA6},{0x8FF7, 0xDABB},
+ {0x8FF9, 0xEEE9},{0x8FFD, 0xF5DA},{0x9000, 0xF7DC},{0x9001, 0xE1EA},{0x9002, 0xCEC1},{0x9003, 0xD4B1},{0x9005, 0xFDB1},{0x9006, 0xE6BD},
+ {0x9008, 0xFBAD},{0x900B, 0xF8E7},{0x900D, 0xE1CE},{0x900F, 0xF7E2},{0x9010, 0xF5EF},{0x9011, 0xCFC7},{0x9014, 0xD4B2},{0x9015, 0xCCEF},
+ {0x9017, 0xD4E8},{0x9019, 0xEECF},{0x901A, 0xF7D7},{0x901D, 0xE0A6},{0x901E, 0xD6C1},{0x901F, 0xE1DC},{0x9020, 0xF0E3},{0x9021, 0xF1E4},
+ {0x9022, 0xDCF1},{0x9023, 0xD6A7},{0x902E, 0xF4F5},{0x9031, 0xF1CE},{0x9032, 0xF2E4},{0x9035, 0xD0B0},{0x9038, 0xECEF},{0x903C, 0xF9BA},
+ {0x903E, 0xEBB5},{0x9041, 0xD4ED},{0x9042, 0xE2C4},{0x9047, 0xE9E7},{0x904A, 0xEBB4},{0x904B, 0xEAA1},{0x904D, 0xF8BC},{0x904E, 0xCEA6},
+ {0x9050, 0xF9C6},{0x9051, 0xFCDA},{0x9053, 0xD4B3},{0x9054, 0xD3B9},{0x9055, 0xEADE},{0x9059, 0xE9AB},{0x905C, 0xE1E1},{0x905D, 0xD3CF},
+ {0x905E, 0xF4F6},{0x9060, 0xEAC0},{0x9061, 0xE1CF},{0x9063, 0xCCBA},{0x9069, 0xEEEA},{0x906D, 0xF0E4},{0x906E, 0xF3B4},{0x906F, 0xD4EE},
+ {0x9072, 0xF2C0},{0x9075, 0xF1E5},{0x9077, 0xF4C3},{0x9078, 0xE0D4},{0x907A, 0xEBB6},{0x907C, 0xD7A1},{0x907D, 0xCBE8},{0x907F, 0xF9AD},
+ {0x9080, 0xE9AD},{0x9081, 0xD8E4},{0x9082, 0xFAB3},{0x9083, 0xE2C5},{0x9084, 0xFCBD},{0x9087, 0xECC4},{0x9088, 0xD8B1},{0x908A, 0xDCAB},
+ {0x908F, 0xD5A4},{0x9091, 0xEBE9},{0x9095, 0xE8BB},{0x9099, 0xD8D7},{0x90A2, 0xFBAE},{0x90A3, 0xD1E1},{0x90A6, 0xDBC0},{0x90A8, 0xF5BE},
+ {0x90AA, 0xDEF7},{0x90AF, 0xCAFB},{0x90B0, 0xF7C6},{0x90B1, 0xCFC8},{0x90B5, 0xE1D0},{0x90B8, 0xEED0},{0x90C1, 0xE9F4},{0x90CA, 0xCEF4},
+ {0x90DE, 0xD5CD},{0x90E1, 0xCFDB},{0x90E8, 0xDDBB},{0x90ED, 0xCEAC},{0x90F5, 0xE9E8},{0x90FD, 0xD4B4},{0x9102, 0xE4C7},{0x9112, 0xF5DB},
+ {0x9115, 0xFAC1},{0x9119, 0xDEA9},{0x9127, 0xD4F8},{0x912D, 0xEFF7},{0x9132, 0xD3B3},{0x9149, 0xEBB7},{0x914A, 0xEFF8},{0x914B, 0xF5DC},
+ {0x914C, 0xEDCC},{0x914D, 0xDBD5},{0x914E, 0xF1CF},{0x9152, 0xF1D0},{0x9162, 0xF5B2},{0x9169, 0xD9AE},{0x916A, 0xD5AC},{0x916C, 0xE2C6},
+ {0x9175, 0xFDA3},{0x9177, 0xFBE5},{0x9178, 0xDFAB},{0x9187, 0xE2F5},{0x9189, 0xF6AD},{0x918B, 0xF5B3},{0x918D, 0xF0B5},{0x9192, 0xE1A5},
+ {0x919C, 0xF5DD},{0x91AB, 0xECA2},{0x91AC, 0xEDFD},{0x91AE, 0xF5B4},{0x91AF, 0xFBB8},{0x91B1, 0xDBA3},{0x91B4, 0xD6CA},{0x91B5, 0xCBD9},
+ {0x91C0, 0xE5D4},{0x91C7, 0xF3FA},{0x91C9, 0xEBB8},{0x91CB, 0xE0B7},{0x91CC, 0xD7EC},{0x91CD, 0xF1EC},{0x91CE, 0xE5AF},{0x91CF, 0xD5E1},
+ {0x91D0, 0xD7ED},{0x91D1, 0xD1D1},{0x91D7, 0xE1F2},{0x91D8, 0xEFF9},{0x91DC, 0xDDBC},{0x91DD, 0xF6DC},{0x91E3, 0xF0E5},{0x91E7, 0xF4C4},
+ {0x91EA, 0xE9E9},{0x91F5, 0xF3FB},{0x920D, 0xD4EF},{0x9210, 0xCCA2},{0x9211, 0xF7FE},{0x9212, 0xDFBC},{0x9217, 0xEBCD},{0x921E, 0xD0B7},
+ {0x9234, 0xD6C2},{0x923A, 0xE8AD},{0x923F, 0xEFAF},{0x9240, 0xCBA5},{0x9245, 0xCBE9},{0x9249, 0xFAE8},{0x9257, 0xCCC6},{0x925B, 0xE6E7},
+ {0x925E, 0xEAC7},{0x9262, 0xDBA4},{0x9264, 0xCFC9},{0x9265, 0xE2FC},{0x9266, 0xEFFA},{0x9280, 0xEBDE},{0x9283, 0xF5C8},{0x9285, 0xD4DE},
+ {0x9291, 0xE0D5},{0x9293, 0xEFB0},{0x9296, 0xE2C7},{0x9298, 0xD9AF},{0x929C, 0xF9E7},{0x92B3, 0xE7E5},{0x92B6, 0xCFCA},{0x92B7, 0xE1D1},
+ {0x92B9, 0xE2C8},{0x92CC, 0xEFFB},{0x92CF, 0xFAF9},{0x92D2, 0xDCF2},{0x92E4, 0xE0A7},{0x92EA, 0xF8E8},{0x92F8, 0xCBEA},{0x92FC, 0xCBBC},
+ {0x9304, 0xD6E2},{0x9310, 0xF5DE},{0x9318, 0xF5DF},{0x931A, 0xEEB6},{0x931E, 0xE2F6},{0x931F, 0xD3CA},{0x9320, 0xEFFC},{0x9321, 0xD1C4},
+ {0x9322, 0xEFB1},{0x9324, 0xD1C5},{0x9326, 0xD0DE},{0x9328, 0xD9E1},{0x932B, 0xE0B8},{0x932E, 0xCDD1},{0x932F, 0xF3B9},{0x9348, 0xE7CC},
+ {0x934A, 0xD6A8},{0x934B, 0xCEA7},{0x934D, 0xD4B5},{0x9354, 0xE4C8},{0x935B, 0xD3B4},{0x936E, 0xEBB9},{0x9375, 0xCBF5},{0x937C, 0xF6DD},
+ {0x937E, 0xF1A3},{0x938C, 0xCCC7},{0x9394, 0xE9CA},{0x9396, 0xE1F0},{0x939A, 0xF5E0},{0x93A3, 0xFBAF},{0x93A7, 0xCBD1},{0x93AC, 0xFBE0},
+ {0x93AD, 0xF2E5},{0x93B0, 0xECF0},{0x93C3, 0xF0EC},{0x93D1, 0xEEEB},{0x93DE, 0xE9CB},{0x93E1, 0xCCF0},{0x93E4, 0xD7AF},{0x93F6, 0xF3A1},
+ {0x9404, 0xFCF5},{0x9418, 0xF1A4},{0x9425, 0xE0D6},{0x942B, 0xEFB2},{0x9435, 0xF4D1},{0x9438, 0xF7A1},{0x9444, 0xF1D1},{0x9451, 0xCAFC},
+ {0x9452, 0xCAFD},{0x945B, 0xCECE},{0x947D, 0xF3C8},{0x947F, 0xF3BA},{0x9577, 0xEDFE},{0x9580, 0xDAA6},{0x9583, 0xE0EC},{0x9589, 0xF8CD},
+ {0x958B, 0xCBD2},{0x958F, 0xEBCE},{0x9591, 0xF9D8},{0x9592, 0xF9D9},{0x9593, 0xCAE0},{0x9594, 0xDACA},{0x9598, 0xCBA6},{0x95A3, 0xCAC8},
+ {0x95A4, 0xF9EE},{0x95A5, 0xDBEC},{0x95A8, 0xD0B1},{0x95AD, 0xD5EF},{0x95B1, 0xE6F3},{0x95BB, 0xE7A2},{0x95BC, 0xE4D9},{0x95C7, 0xE4E1},
+ {0x95CA, 0xFCC4},{0x95D4, 0xF9EF},{0x95D5, 0xCFF4},{0x95D6, 0xF7E6},{0x95DC, 0xCEBC},{0x95E1, 0xF4C5},{0x95E2, 0xDCA3},{0x961C, 0xDDBD},
+ {0x9621, 0xF4C6},{0x962A, 0xF8A1},{0x962E, 0xE8D6},{0x9632, 0xDBC1},{0x963B, 0xF0E6},{0x963F, 0xE4B9},{0x9640, 0xF6ED},{0x9642, 0xF9AE},
+ {0x9644, 0xDDBE},{0x964B, 0xD7B0},{0x964C, 0xD8E8},{0x964D, 0xCBBD},{0x9650, 0xF9DA},{0x965B, 0xF8CE},{0x965C, 0xF9F0},{0x965D, 0xE0ED},
+ {0x965E, 0xE3B3},{0x965F, 0xF4B3},{0x9662, 0xEAC2},{0x9663, 0xF2E6},{0x9664, 0xF0B6},{0x966A, 0xDBD6},{0x9670, 0xEBE4},{0x9673, 0xF2E7},
+ {0x9675, 0xD7D5},{0x9676, 0xD4B6},{0x9677, 0xF9E8},{0x9678, 0xD7C1},{0x967D, 0xE5D5},{0x9685, 0xE9EA},{0x9686, 0xD7CC},{0x968A, 0xD3E9},
+ {0x968B, 0xE2C9},{0x968D, 0xFCDB},{0x968E, 0xCDAD},{0x9694, 0xCCB0},{0x9695, 0xEAA2},{0x9698, 0xE4F6},{0x9699, 0xD0C0},{0x969B, 0xF0B7},
+ {0x969C, 0xEEA1},{0x96A3, 0xD7F6},{0x96A7, 0xE2CA},{0x96A8, 0xE2CB},{0x96AA, 0xFACF},{0x96B1, 0xEBDF},{0x96B7, 0xD6CB},{0x96BB, 0xF4B4},
+ {0x96C0, 0xEDCD},{0x96C1, 0xE4D2},{0x96C4, 0xEAA9},{0x96C5, 0xE4BA},{0x96C6, 0xF3A2},{0x96C7, 0xCDD2},{0x96C9, 0xF6CB},{0x96CB, 0xF1E6},
+ {0x96CC, 0xEDC1},{0x96CD, 0xE8BC},{0x96CE, 0xEED1},{0x96D5, 0xF0E7},{0x96D6, 0xE2CC},{0x96D9, 0xE4AA},{0x96DB, 0xF5E1},{0x96DC, 0xEDDA},
+ {0x96E2, 0xD7EE},{0x96E3, 0xD1F1},{0x96E8, 0xE9EB},{0x96E9, 0xE9EC},{0x96EA, 0xE0E4},{0x96EF, 0xDAA7},{0x96F0, 0xDDD4},{0x96F2, 0xEAA3},
+ {0x96F6, 0xD6C3},{0x96F7, 0xD6F4},{0x96F9, 0xDADF},{0x96FB, 0xEFB3},{0x9700, 0xE2CD},{0x9706, 0xEFFD},{0x9707, 0xF2E8},{0x9711, 0xEFC5},
+ {0x9713, 0xE7E7},{0x9716, 0xD7FD},{0x9719, 0xE7CE},{0x971C, 0xDFDC},{0x971E, 0xF9C7},{0x9727, 0xD9F6},{0x9730, 0xDFAC},{0x9732, 0xD6DA},
+ {0x9739, 0xDCA4},{0x973D, 0xF0B8},{0x9742, 0xD5FA},{0x9744, 0xE4F7},{0x9748, 0xD6C4},{0x9751, 0xF4EC},{0x9756, 0xEFFE},{0x975C, 0xF0A1},
+ {0x975E, 0xDEAA},{0x9761, 0xDABC},{0x9762, 0xD8FC},{0x9769, 0xFAD4},{0x976D, 0xECE5},{0x9774, 0xFCA8},{0x9777, 0xECE6},{0x977A, 0xD8CB},
+ {0x978B, 0xFBB9},{0x978D, 0xE4D3},{0x978F, 0xCDF9},{0x97A0, 0xCFD3},{0x97A8, 0xCAEA},{0x97AB, 0xCFD4},{0x97AD, 0xF8BD},{0x97C6, 0xF4C7},
+ {0x97CB, 0xEADF},{0x97D3, 0xF9DB},{0x97DC, 0xD4B7},{0x97F3, 0xEBE5},{0x97F6, 0xE1D2},{0x97FB, 0xEAA4},{0x97FF, 0xFAC2},{0x9800, 0xFBE1},
+ {0x9801, 0xFAED},{0x9802, 0xF0A2},{0x9803, 0xCCF1},{0x9805, 0xFAA3},{0x9806, 0xE2F7},{0x9808, 0xE2CE},{0x980A, 0xE9F5},{0x980C, 0xE1EB},
+ {0x9810, 0xE7E8},{0x9811, 0xE8D7},{0x9812, 0xDAF8},{0x9813, 0xD4CB},{0x9817, 0xF7F6},{0x9818, 0xD6C5},{0x982D, 0xD4E9},{0x9830, 0xFAFA},
+ {0x9838, 0xCCF2},{0x9839, 0xF7DD},{0x983B, 0xDEBA},{0x9846, 0xCEA8},{0x984C, 0xF0B9},{0x984D, 0xE4FE},{0x984E, 0xE4C9},{0x9854, 0xE4D4},
+ {0x9858, 0xEAC3},{0x985A, 0xEFB4},{0x985E, 0xD7BE},{0x9865, 0xFBE2},{0x9867, 0xCDD3},{0x986B, 0xEFB5},{0x986F, 0xFAE9},{0x98A8, 0xF9A6},
+ {0x98AF, 0xDFBD},{0x98B1, 0xF7C7},{0x98C4, 0xF8FD},{0x98C7, 0xF8FC},{0x98DB, 0xDEAB},{0x98DC, 0xDBE8},{0x98DF, 0xE3DD},{0x98E1, 0xE1E2},
+ {0x98E2, 0xD1C6},{0x98ED, 0xF6D0},{0x98EE, 0xEBE6},{0x98EF, 0xDAF9},{0x98F4, 0xECC7},{0x98FC, 0xDEF8},{0x98FD, 0xF8E9},{0x98FE, 0xE3DE},
+ {0x9903, 0xCEF5},{0x9909, 0xFAC3},{0x990A, 0xE5D7},{0x990C, 0xECC8},{0x9910, 0xF3C9},{0x9913, 0xE4BB},{0x9918, 0xE6AE},{0x991E, 0xEFB6},
+ {0x9920, 0xDCBF},{0x9928, 0xCEBD},{0x9945, 0xD8C3},{0x9949, 0xD0CF},{0x994B, 0xCFFA},{0x994C, 0xF3CA},{0x994D, 0xE0D7},{0x9951, 0xD1C7},
+ {0x9952, 0xE9AE},{0x9954, 0xE8BD},{0x9957, 0xFAC4},{0x9996, 0xE2CF},{0x9999, 0xFAC5},{0x999D, 0xF9B8},{0x99A5, 0xDCE0},{0x99A8, 0xFBB0},
+ {0x99AC, 0xD8A9},{0x99AD, 0xE5DF},{0x99AE, 0xF9A7},{0x99B1, 0xF6EE},{0x99B3, 0xF6CC},{0x99B4, 0xE2F8},{0x99B9, 0xECF1},{0x99C1, 0xDAE0},
+ {0x99D0, 0xF1D2},{0x99D1, 0xD2CC},{0x99D2, 0xCFCB},{0x99D5, 0xCABD},{0x99D9, 0xDDBF},{0x99DD, 0xF6EF},{0x99DF, 0xDEF9},{0x99ED, 0xFAB4},
+ {0x99F1, 0xD5AD},{0x99FF, 0xF1E7},{0x9A01, 0xDEBE},{0x9A08, 0xDCC0},{0x9A0E, 0xD1C8},{0x9A0F, 0xD1C9},{0x9A19, 0xF8BE},{0x9A2B, 0xCBF6},
+ {0x9A30, 0xD4F9},{0x9A36, 0xF5E2},{0x9A37, 0xE1D3},{0x9A40, 0xD8E9},{0x9A43, 0xF8FE},{0x9A45, 0xCFCC},{0x9A4D, 0xFDA4},{0x9A55, 0xCEF6},
+ {0x9A57, 0xFAD0},{0x9A5A, 0xCCF3},{0x9A5B, 0xE6BE},{0x9A5F, 0xF6AE},{0x9A62, 0xD5F0},{0x9A65, 0xD1CA},{0x9A69, 0xFCBE},{0x9A6A, 0xD5F1},
+ {0x9AA8, 0xCDE9},{0x9AB8, 0xFAB5},{0x9AD3, 0xE2D0},{0x9AD4, 0xF4F7},{0x9AD8, 0xCDD4},{0x9AE5, 0xE7A3},{0x9AEE, 0xDBA5},{0x9B1A, 0xE2D1},
+ {0x9B27, 0xD7A2},{0x9B2A, 0xF7E3},{0x9B31, 0xEAA6},{0x9B3C, 0xD0A1},{0x9B41, 0xCEDA},{0x9B42, 0xFBEB},{0x9B43, 0xDBA6},{0x9B44, 0xDBDE},
+ {0x9B45, 0xD8E5},{0x9B4F, 0xEAE0},{0x9B54, 0xD8AA},{0x9B5A, 0xE5E0},{0x9B6F, 0xD6DB},{0x9B8E, 0xEFC6},{0x9B91, 0xF8EA},{0x9B9F, 0xE4D5},
+ {0x9BAB, 0xCEF7},{0x9BAE, 0xE0D8},{0x9BC9, 0xD7EF},{0x9BD6, 0xF4ED},{0x9BE4, 0xCDE6},{0x9BE8, 0xCCF4},{0x9C0D, 0xF5E3},{0x9C10, 0xE4CA},
+ {0x9C12, 0xDCE1},{0x9C15, 0xF9C8},{0x9C25, 0xFCBF},{0x9C32, 0xE8A7},{0x9C3B, 0xD8C4},{0x9C47, 0xCBBE},{0x9C49, 0xDCAE},{0x9C57, 0xD7F7},
+ {0x9CE5, 0xF0E8},{0x9CE7, 0xDDC0},{0x9CE9, 0xCFCD},{0x9CF3, 0xDCF3},{0x9CF4, 0xD9B0},{0x9CF6, 0xE6E9},{0x9D09, 0xE4BC},{0x9D1B, 0xEAC4},
+ {0x9D26, 0xE4EC},{0x9D28, 0xE4E5},{0x9D3B, 0xFBF8},{0x9D51, 0xCCBB},{0x9D5D, 0xE4BD},{0x9D60, 0xCDDC},{0x9D61, 0xD9F7},{0x9D6C, 0xDDDF},
+ {0x9D72, 0xEDCE},{0x9DA9, 0xD9D0},{0x9DAF, 0xE5A3},{0x9DB4, 0xF9CD},{0x9DC4, 0xCDAE},{0x9DD7, 0xCFCE},{0x9DF2, 0xF6AF},{0x9DF8, 0xFDD3},
+ {0x9DF9, 0xEBED},{0x9DFA, 0xD6DC},{0x9E1A, 0xE5A4},{0x9E1E, 0xD5B6},{0x9E75, 0xD6DD},{0x9E79, 0xF9E9},{0x9E7D, 0xE7A4},{0x9E7F, 0xD6E3},
+ {0x9E92, 0xD1CB},{0x9E93, 0xD6E4},{0x9E97, 0xD5F2},{0x9E9D, 0xDEFA},{0x9E9F, 0xD7F8},{0x9EA5, 0xD8EA},{0x9EB4, 0xCFD5},{0x9EB5, 0xD8FD},
+ {0x9EBB, 0xD8AB},{0x9EBE, 0xFDCB},{0x9EC3, 0xFCDC},{0x9ECD, 0xE0A8},{0x9ECE, 0xD5F3},{0x9ED1, 0xFDD9},{0x9ED4, 0xCCA3},{0x9ED8, 0xD9F9},
+ {0x9EDB, 0xD3EA},{0x9EDC, 0xF5F5},{0x9EDE, 0xEFC7},{0x9EE8, 0xD3DA},{0x9EF4, 0xDABD},{0x9F07, 0xE8A8},{0x9F08, 0xDCAF},{0x9F0E, 0xF0A3},
+ {0x9F13, 0xCDD5},{0x9F20, 0xE0A9},{0x9F3B, 0xDEAC},{0x9F4A, 0xF0BA},{0x9F4B, 0xEEB1},{0x9F4E, 0xEEB2},{0x9F52, 0xF6CD},{0x9F5F, 0xEED2},
+ {0x9F61, 0xD6C6},{0x9F67, 0xE0E5},{0x9F6A, 0xF3BB},{0x9F6C, 0xE5E1},{0x9F77, 0xE4CB},{0x9F8D, 0xD7A3},{0x9F90, 0xDBC2},{0x9F95, 0xCAFE},
+ {0x9F9C, 0xCFCF},{0xAC00, 0xB0A1},{0xAC01, 0xB0A2},{0xAC02, 0x8141},{0xAC03, 0x8142},{0xAC04, 0xB0A3},{0xAC05, 0x8143},{0xAC06, 0x8144},
+ {0xAC07, 0xB0A4},{0xAC08, 0xB0A5},{0xAC09, 0xB0A6},{0xAC0A, 0xB0A7},{0xAC0B, 0x8145},{0xAC0C, 0x8146},{0xAC0D, 0x8147},{0xAC0E, 0x8148},
+ {0xAC0F, 0x8149},{0xAC10, 0xB0A8},{0xAC11, 0xB0A9},{0xAC12, 0xB0AA},{0xAC13, 0xB0AB},{0xAC14, 0xB0AC},{0xAC15, 0xB0AD},{0xAC16, 0xB0AE},
+ {0xAC17, 0xB0AF},{0xAC18, 0x814A},{0xAC19, 0xB0B0},{0xAC1A, 0xB0B1},{0xAC1B, 0xB0B2},{0xAC1C, 0xB0B3},{0xAC1D, 0xB0B4},{0xAC1E, 0x814B},
+ {0xAC1F, 0x814C},{0xAC20, 0xB0B5},{0xAC21, 0x814D},{0xAC22, 0x814E},{0xAC23, 0x814F},{0xAC24, 0xB0B6},{0xAC25, 0x8150},{0xAC26, 0x8151},
+ {0xAC27, 0x8152},{0xAC28, 0x8153},{0xAC29, 0x8154},{0xAC2A, 0x8155},{0xAC2B, 0x8156},{0xAC2C, 0xB0B7},{0xAC2D, 0xB0B8},{0xAC2E, 0x8157},
+ {0xAC2F, 0xB0B9},{0xAC30, 0xB0BA},{0xAC31, 0xB0BB},{0xAC32, 0x8158},{0xAC33, 0x8159},{0xAC34, 0x815A},{0xAC35, 0x8161},{0xAC36, 0x8162},
+ {0xAC37, 0x8163},{0xAC38, 0xB0BC},{0xAC39, 0xB0BD},{0xAC3A, 0x8164},{0xAC3B, 0x8165},{0xAC3C, 0xB0BE},{0xAC3D, 0x8166},{0xAC3E, 0x8167},
+ {0xAC3F, 0x8168},{0xAC40, 0xB0BF},{0xAC41, 0x8169},{0xAC42, 0x816A},{0xAC43, 0x816B},{0xAC44, 0x816C},{0xAC45, 0x816D},{0xAC46, 0x816E},
+ {0xAC47, 0x816F},{0xAC48, 0x8170},{0xAC49, 0x8171},{0xAC4A, 0x8172},{0xAC4B, 0xB0C0},{0xAC4C, 0x8173},{0xAC4D, 0xB0C1},{0xAC4E, 0x8174},
+ {0xAC4F, 0x8175},{0xAC50, 0x8176},{0xAC51, 0x8177},{0xAC52, 0x8178},{0xAC53, 0x8179},{0xAC54, 0xB0C2},{0xAC55, 0x