diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /i18nutil | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'i18nutil')
-rw-r--r-- | i18nutil/IwyuFilter_i18nutil.yaml | 2 | ||||
-rw-r--r-- | i18nutil/Library_i18nutil.mk | 55 | ||||
-rw-r--r-- | i18nutil/Makefile | 14 | ||||
-rw-r--r-- | i18nutil/Module_i18nutil.mk | 15 | ||||
-rw-r--r-- | i18nutil/README.md | 4 | ||||
-rw-r--r-- | i18nutil/source/utility/casefolding.cxx | 223 | ||||
-rw-r--r-- | i18nutil/source/utility/casefolding_data.h | 859 | ||||
-rw-r--r-- | i18nutil/source/utility/oneToOneMapping.cxx | 145 | ||||
-rw-r--r-- | i18nutil/source/utility/paper.cxx | 499 | ||||
-rw-r--r-- | i18nutil/source/utility/scripttypedetector.cxx | 84 | ||||
-rw-r--r-- | i18nutil/source/utility/unicode.cxx | 1319 | ||||
-rw-r--r-- | i18nutil/source/utility/unicode_data.h | 763 | ||||
-rw-r--r-- | i18nutil/source/utility/widthfolding.cxx | 244 | ||||
-rw-r--r-- | i18nutil/source/utility/widthfolding_data.h | 941 |
14 files changed, 5167 insertions, 0 deletions
diff --git a/i18nutil/IwyuFilter_i18nutil.yaml b/i18nutil/IwyuFilter_i18nutil.yaml new file mode 100644 index 0000000000..7c69af4385 --- /dev/null +++ b/i18nutil/IwyuFilter_i18nutil.yaml @@ -0,0 +1,2 @@ +--- +assumeFilename: i18nutil/source/utility/paper.cxx diff --git a/i18nutil/Library_i18nutil.mk b/i18nutil/Library_i18nutil.mk new file mode 100644 index 0000000000..2a255e41d2 --- /dev/null +++ b/i18nutil/Library_i18nutil.mk @@ -0,0 +1,55 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Library_Library,i18nutil)) + +$(eval $(call gb_Library_use_externals,i18nutil,\ + boost_headers \ + icu_headers \ + icui18n \ + icuuc \ +)) + +$(eval $(call gb_Library_use_custom_headers,i18nutil,\ + officecfg/registry \ +)) + +$(eval $(call gb_Library_use_sdk_api,i18nutil)) + +$(eval $(call gb_Library_add_defs,i18nutil,\ + -DI18NUTIL_DLLIMPLEMENTATION \ +)) + +$(eval $(call gb_Library_use_libraries,i18nutil,\ + utl \ + i18nlangtag \ + comphelper \ + cppu \ + sal \ +)) + +$(eval $(call gb_Library_add_exception_objects,i18nutil,\ + i18nutil/source/utility/casefolding \ + i18nutil/source/utility/oneToOneMapping \ + i18nutil/source/utility/paper \ + i18nutil/source/utility/scripttypedetector \ + i18nutil/source/utility/unicode \ + i18nutil/source/utility/widthfolding \ +)) + +# vim: set noet sw=4: diff --git a/i18nutil/Makefile b/i18nutil/Makefile new file mode 100644 index 0000000000..0997e62848 --- /dev/null +++ b/i18nutil/Makefile @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) + +include $(module_directory)/../solenv/gbuild/partial_build.mk + +# vim: set noet sw=4 ts=4: diff --git a/i18nutil/Module_i18nutil.mk b/i18nutil/Module_i18nutil.mk new file mode 100644 index 0000000000..9b543dfdc3 --- /dev/null +++ b/i18nutil/Module_i18nutil.mk @@ -0,0 +1,15 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Module_Module,i18nutil)) + +$(eval $(call gb_Module_add_targets,i18nutil,\ + Library_i18nutil \ +)) + +# vim: set noet sw=4: diff --git a/i18nutil/README.md b/i18nutil/README.md new file mode 100644 index 0000000000..aa90a90135 --- /dev/null +++ b/i18nutil/README.md @@ -0,0 +1,4 @@ +# Internationalization Related Utilities (i18nutil) + +It comprises of honest c++ code which you just link to directly, while `i18npool` +tends to consist of code you interact with via UNO. diff --git a/i18nutil/source/utility/casefolding.cxx b/i18nutil/source/utility/casefolding.cxx new file mode 100644 index 0000000000..52dbeb1ca1 --- /dev/null +++ b/i18nutil/source/utility/casefolding.cxx @@ -0,0 +1,223 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <i18nutil/casefolding.hxx> +#include "casefolding_data.h" +#include <i18nutil/oneToOneMapping.hxx> +#include <i18nutil/widthfolding.hxx> +#include <i18nutil/transliteration.hxx> +#include <com/sun/star/lang/Locale.hpp> +#include <com/sun/star/uno/RuntimeException.hpp> +#include <rtl/character.hxx> + +#include <unicode/uchar.h> + +using namespace com::sun::star::lang; +using namespace com::sun::star::uno; + +namespace i18nutil { + +const Mapping mapping_03a3[] = {{0, 1, {0x03c2, 0, 0}},{0, 1, {0x03c3, 0, 0}}}; +const Mapping mapping_0307[] = {{0, 0, {0, 0, 0}},{0, 1, {0x0307, 0, 0}}}; +const Mapping mapping_004a[] = {{0, 2, {0x006a, 0x0307, 0}},{0, 1, {0x006a, 0, 0}}}; +const Mapping mapping_012e[] = {{0, 2, {0x012f, 0x0307, 0}},{0, 1, {0x012f, 0, 0}}}; +const Mapping mapping_00cc[] = {{0, 3, {0x0069, 0x0307, 0x0300}},{0, 1, {0x00ec, 0, 0}}}; +const Mapping mapping_00cd[] = {{0, 3, {0x0069, 0x0307, 0x0301}},{0, 1, {0x00ed, 0, 0}}}; +const Mapping mapping_0128[] = {{0, 3, {0x0069, 0x0307, 0x0303}},{0, 1, {0x0129, 0, 0}}}; +const Mapping mapping_0049[] = {{0, 2, {0x0069, 0x0307, 0}},{0, 1, {0x0131, 0, 0}},{0, 1, {0x0069, 0, 0}}}; +const Mapping mapping_0069[] = {{0, 1, {0x0130, 0, 0}},{0, 1, {0x0049, 0, 0}}}; +const Mapping mapping_0130[] = {{0, 1, {0x0069, 0, 0}},{0, 1, {0x0130, 0, 0}}}; + +#define langIs(lang) (aLocale.Language == lang) + +// only check simple case, there is more complicated case need to be checked. +#define type_i(ch) ((ch) == 0x0069 || (ch) == 0x006a) + +static bool cased_letter(sal_Unicode ch) +{ + int msb = ch >> 8; + int cmi = CaseMappingIndex[msb]; + if (cmi < 0) + return false; + int cmv_idx = (cmi << 8) + (ch & 0xff); + return bool(static_cast<MappingType>(CaseMappingValue[cmv_idx].type) & MappingType::CasedLetterMask); +} + +// for Lithuanian, condition to make explicit dot above when lowercasing capital I's and J's +// whenever there are more accents above. +#define accent_above(ch) (((ch) >= 0x0300 && (ch) <= 0x0314) || ((ch) >= 0x033D && (ch) <= 0x0344) || (ch) == 0x0346 || ((ch) >= 0x034A && (ch) <= 0x034C)) + +const Mapping& casefolding::getConditionalValue(const sal_Unicode* str, sal_Int32 pos, sal_Int32 len, Locale const & aLocale, MappingType nMappingType) +{ + switch(str[pos]) { + case 0x03a3: + // final_sigma (not followed by cased and preceded by cased character) + // DOES NOT check ignorable sequence yet (more complicated implementation). + return !(pos < len && cased_letter(str[pos+1])) && (pos > 0 && cased_letter(str[pos-1])) ? + mapping_03a3[0] : mapping_03a3[1]; + case 0x0307: + return (((nMappingType == MappingType::LowerToUpper && langIs("lt")) || + (nMappingType == MappingType::UpperToLower && (langIs("tr") || langIs("az")))) && + (pos > 0 && type_i(str[pos-1]))) ? // after_i + mapping_0307[0] : mapping_0307[1]; + case 0x0130: + return (langIs("tr") || langIs("az")) ? mapping_0130[0] : mapping_0130[1]; + case 0x0069: + return (langIs("tr") || langIs("az")) ? mapping_0069[0] : mapping_0069[1]; + case 0x0049: return langIs("lt") && pos > len && accent_above(str[pos+1]) ? mapping_0049[0] : + (langIs("tr") || langIs("az")) ? mapping_0049[1] : mapping_0049[2]; + case 0x004a: return langIs("lt") && pos > len && accent_above(str[pos+1]) ? mapping_004a[0] : mapping_004a[1]; + case 0x012e: return langIs("lt") && pos > len && accent_above(str[pos+1]) ? mapping_012e[0] : mapping_012e[1]; + case 0x00cc: return langIs("lt") ? mapping_00cc[0] : mapping_00cc[1]; + case 0x00cd: return langIs("lt") ? mapping_00cd[0] : mapping_00cd[1]; + case 0x0128: return langIs("lt") ? mapping_0128[0] : mapping_0128[1]; + } + // Should not come here + throw RuntimeException(); +} + +Mapping casefolding::getValue(const sal_Unicode* str, sal_Int32 pos, sal_Int32 len, Locale const & aLocale, MappingType nMappingType) +{ + if (pos > 0 && rtl::isHighSurrogate(str[pos-1]) && rtl::isLowSurrogate(str[pos])) + return { 0, 0, { 0, 0, 0 } }; + + Mapping dummy = { 0, 1, { str[pos], 0, 0 } }; + + sal_uInt32 c; + if (pos + 1 < len && rtl::isHighSurrogate(str[pos]) && rtl::isLowSurrogate(str[pos + 1])) + c = rtl::combineSurrogates(str[pos], str[pos + 1]); + else + c = str[pos]; + + sal_Int16 address = -1; + if (c < SAL_N_ELEMENTS(CaseMappingIndex) * 256) + address = CaseMappingIndex[c >> 8]; + + if (address >= 0) { + address = (address << 8) + (c & 0xFF); + if (static_cast<MappingType>(CaseMappingValue[address].type) & nMappingType) { + MappingType type = static_cast<MappingType>(CaseMappingValue[address].type); + if (type & MappingType::NotValue) { + if (CaseMappingValue[address].value == 0) + return getConditionalValue(str, pos, len, aLocale, nMappingType); + else { + for (int map = CaseMappingValue[address].value; + map < CaseMappingValue[address].value + MaxCaseMappingExtras; map++) { + if (static_cast<MappingType>(CaseMappingExtra[map].type) & nMappingType) { + if (static_cast<MappingType>(CaseMappingExtra[map].type) & MappingType::NotValue) + return getConditionalValue(str, pos, len, aLocale, nMappingType); + else + return CaseMappingExtra[map]; + } + } + // Should not come here + throw RuntimeException(); + } + } + else + { + dummy.map[0] = CaseMappingValue[address].value; + return dummy; + } + } + } + + // If the code point is not supported by our case mapping tables, + // fallback to ICU functions. + // TODO: this does not handle special case mapping as these require + // using ustring.h APIs, which work on the whole string not character + // by character. + // TODO: what is the difference between ToLower and UpperToLower etc.? + sal_uInt32 value = c; + switch (nMappingType) + { + case MappingType::ToLower: + case MappingType::UpperToLower: + value = u_tolower(c); + break; + case MappingType::ToUpper: + case MappingType::LowerToUpper: + value = u_toupper(c); + break; + case MappingType::ToTitle: + value = u_totitle(c); + break; + case MappingType::SimpleFolding: + case MappingType::FullFolding: + value = u_foldCase(c, U_FOLD_CASE_DEFAULT); + break; + default: break; + } + + dummy.nmap = rtl::splitSurrogates(value, dummy.map); + + return dummy; +} + +static bool +is_ja_voice_sound_mark(sal_Unicode& current, sal_Unicode next) +{ + if (next != 0x3099 && next != 0x309a) + return false; + sal_Unicode c = widthfolding::getCompositionChar(current, next); + if (c != 0) + current = c; + return c != 0; +} + +sal_Unicode casefolding::getNextChar(const sal_Unicode *str, sal_Int32& idx, sal_Int32 len, MappingElement& e, Locale const & aLocale, MappingType nMappingType, TransliterationFlags moduleLoaded) +{ + if( idx >= len ) + { + e = MappingElement(); + return 0; + } + + sal_Unicode c; + + if (moduleLoaded & TransliterationFlags::IGNORE_CASE) { + if( e.current >= e.element.nmap ) { + e.element = getValue(str, idx++, len, aLocale, nMappingType); + e.current = 0; + } + c = e.element.map[e.current++]; + } else { + c = *(str + idx++); + } + + if (moduleLoaded & TransliterationFlags::IGNORE_KANA) { + if ((0x3040 <= c && c <= 0x3094) || (0x309d <= c && c <= 0x309f)) + c += 0x60; + } + + // composition: KA + voice-mark --> GA. see halfwidthToFullwidth.cxx for detail + if (moduleLoaded & TransliterationFlags::IGNORE_WIDTH) { + static oneToOneMapping& half2fullTable = widthfolding::gethalf2fullTable(); + c = half2fullTable[c]; + if (0x3040 <= c && c <= 0x30ff && idx < len && + is_ja_voice_sound_mark(c, half2fullTable[*(str + idx)])) + idx++; + } + + return c; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/casefolding_data.h b/i18nutil/source/utility/casefolding_data.h new file mode 100644 index 0000000000..174fdc066e --- /dev/null +++ b/i18nutil/source/utility/casefolding_data.h @@ -0,0 +1,859 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef INCLUDED_I18NUTIL_SOURCE_UTILITY_CASEFOLDING_DATA_H +#define INCLUDED_I18NUTIL_SOURCE_UTILITY_CASEFOLDING_DATA_H + +#include <sal/types.h> + +namespace i18nutil { + +const sal_Int8 CaseMappingIndex[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, -1, -1, // 0000 - 07ff + -1, -1, -1, -1, -1, -1, -1, -1, // 0800 - 0fff + -1, -1, -1, -1, -1, -1, -1, -1, // 1000 - 17ff + -1, -1, -1, -1, -1, -1, 0x06, 0x07, // 1800 - 1fff + -1, 0x08, -1, -1, 0x09, -1, -1, -1, // 2000 - 27ff + -1, -1, -1, -1, 0x0a, -1, -1, -1, // 2800 - 2fff, Coptic added + -1, -1, -1, -1, -1, -1, -1, -1, // 3000 - 37ff + -1, -1, -1, -1, -1, -1, -1, -1, // 3800 - 3fff + -1, -1, -1, -1, -1, -1, -1, -1, // 4000 - 47ff + -1, -1, -1, -1, -1, -1, -1, -1, // 4800 - 4fff + -1, -1, -1, -1, -1, -1, -1, -1, // 5000 - 57ff + -1, -1, -1, -1, -1, -1, -1, -1, // 5800 - 5fff + -1, -1, -1, -1, -1, -1, -1, -1, // 6000 - 67ff + -1, -1, -1, -1, -1, -1, -1, -1, // 6800 - 6fff + -1, -1, -1, -1, -1, -1, -1, -1, // 7000 - 77ff + -1, -1, -1, -1, -1, -1, -1, -1, // 7800 - 7fff + -1, -1, -1, -1, -1, -1, -1, -1, // 8000 - 87ff + -1, -1, -1, -1, -1, -1, -1, -1, // 8800 - 8fff + -1, -1, -1, -1, -1, -1, -1, -1, // 9000 - 97ff + -1, -1, -1, -1, -1, -1, -1, -1, // 9800 - 9fff + -1, -1, -1, -1, -1, -1, -1, -1, // a000 - a7ff + -1, -1, -1, -1, -1, -1, -1, -1, // a800 - afff + -1, -1, -1, -1, -1, -1, -1, -1, // b000 - b7ff + -1, -1, -1, -1, -1, -1, -1, -1, // b800 - bfff + -1, -1, -1, -1, -1, -1, -1, -1, // c000 - c7ff + -1, -1, -1, -1, -1, -1, -1, -1, // c800 - cfff + -1, -1, -1, -1, -1, -1, -1, -1, // d000 - d7ff + -1, -1, -1, -1, -1, -1, -1, -1, // d800 - dfff + -1, -1, -1, -1, -1, -1, -1, -1, // e000 - e7ff + -1, -1, -1, -1, -1, -1, -1, -1, // e800 - efff + -1, -1, -1, -1, -1, -1, -1, -1, // f000 - f7ff + -1, -1, -1, 0x0b, -1, -1, -1, 0x0c, // f800 - ffff +}; + + +const Value CaseMappingValue[] = { + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0000 - 0007 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0008 - 000f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0010 - 0017 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0018 - 001f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0020 - 0027 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0028 - 002f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0030 - 0037 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0038 - 003f + {0x00, 0x0000}, {0x6a, 0x0061}, {0x6a, 0x0062}, {0x6a, 0x0063}, {0x6a, 0x0064}, {0x6a, 0x0065}, {0x6a, 0x0066}, {0x6a, 0x0067}, // 0040 - 0047 + {0x6a, 0x0068}, {0xea, 0x0000}, {0xea, 0x0003}, {0x6a, 0x006B}, {0x6a, 0x006C}, {0x6a, 0x006D}, {0x6a, 0x006E}, {0x6a, 0x006F}, // 0048 - 004f + {0x6a, 0x0070}, {0x6a, 0x0071}, {0x6a, 0x0072}, {0x6a, 0x0073}, {0x6a, 0x0074}, {0x6a, 0x0075}, {0x6a, 0x0076}, {0x6a, 0x0077}, // 0050 - 0057 + {0x6a, 0x0078}, {0x6a, 0x0079}, {0x6a, 0x007A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0058 - 005f + {0x00, 0x0000}, {0x15, 0x0041}, {0x15, 0x0042}, {0x15, 0x0043}, {0x15, 0x0044}, {0x15, 0x0045}, {0x15, 0x0046}, {0x15, 0x0047}, // 0060 - 0067 + {0x15, 0x0048}, {0x95, 0x0000}, {0x15, 0x004A}, {0x15, 0x004B}, {0x15, 0x004C}, {0x15, 0x004D}, {0x15, 0x004E}, {0x15, 0x004F}, // 0068 - 006f + {0x15, 0x0050}, {0x15, 0x0051}, {0x15, 0x0052}, {0x15, 0x0053}, {0x15, 0x0054}, {0x15, 0x0055}, {0x15, 0x0056}, {0x15, 0x0057}, // 0070 - 0077 + {0x15, 0x0058}, {0x15, 0x0059}, {0x15, 0x005A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0078 - 007f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0080 - 0087 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0088 - 008f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0090 - 0097 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0098 - 009f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 00a0 - 00a7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 00a8 - 00af + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xf5, 0x0005}, {0x00, 0x0000}, {0x00, 0x0000}, // 00b0 - 00b7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 00b8 - 00bf + {0x6a, 0x00E0}, {0x6a, 0x00E1}, {0x6a, 0x00E2}, {0x6a, 0x00E3}, {0x6a, 0x00E4}, {0x6a, 0x00E5}, {0x6a, 0x00E6}, {0x6a, 0x00E7}, // 00c0 - 00c7 + {0x6a, 0x00E8}, {0x6a, 0x00E9}, {0x6a, 0x00EA}, {0x6a, 0x00EB}, {0xea, 0x0007}, {0xea, 0x0009}, {0x6a, 0x00EE}, {0x6a, 0x00EF}, // 00c8 - 00cf + {0x6a, 0x00F0}, {0x6a, 0x00F1}, {0x6a, 0x00F2}, {0x6a, 0x00F3}, {0x6a, 0x00F4}, {0x6a, 0x00F5}, {0x6a, 0x00F6}, {0x00, 0x0000}, // 00d0 - 00d7 + {0x6a, 0x00F8}, {0x6a, 0x00F9}, {0x6a, 0x00FA}, {0x6a, 0x00FB}, {0x6a, 0x00FC}, {0x6a, 0x00FD}, {0x6a, 0x00FE}, {0xd5, 0x000B}, // 00d8 - 00df + {0x15, 0x00C0}, {0x15, 0x00C1}, {0x15, 0x00C2}, {0x15, 0x00C3}, {0x15, 0x00C4}, {0x15, 0x00C5}, {0x15, 0x00C6}, {0x15, 0x00C7}, // 00e0 - 00e7 + {0x15, 0x00C8}, {0x15, 0x00C9}, {0x15, 0x00CA}, {0x15, 0x00CB}, {0x15, 0x00CC}, {0x15, 0x00CD}, {0x15, 0x00CE}, {0x15, 0x00CF}, // 00e8 - 00ef + {0x15, 0x00D0}, {0x15, 0x00D1}, {0x15, 0x00D2}, {0x15, 0x00D3}, {0x15, 0x00D4}, {0x15, 0x00D5}, {0x15, 0x00D6}, {0x00, 0x0000}, // 00f0 - 00f7 + {0x15, 0x00D8}, {0x15, 0x00D9}, {0x15, 0x00DA}, {0x15, 0x00DB}, {0x15, 0x00DC}, {0x15, 0x00DD}, {0x15, 0x00DE}, {0x15, 0x0178}, // 00f8 - 00ff + + {0x6a, 0x0101}, {0x15, 0x0100}, {0x6a, 0x0103}, {0x15, 0x0102}, {0x6a, 0x0105}, {0x15, 0x0104}, {0x6a, 0x0107}, {0x15, 0x0106}, // 0100 - 0107 + {0x6a, 0x0109}, {0x15, 0x0108}, {0x6a, 0x010B}, {0x15, 0x010A}, {0x6a, 0x010D}, {0x15, 0x010C}, {0x6a, 0x010F}, {0x15, 0x010E}, // 0108 - 010f + {0x6a, 0x0111}, {0x15, 0x0110}, {0x6a, 0x0113}, {0x15, 0x0112}, {0x6a, 0x0115}, {0x15, 0x0114}, {0x6a, 0x0117}, {0x15, 0x0116}, // 0110 - 0117 + {0x6a, 0x0119}, {0x15, 0x0118}, {0x6a, 0x011B}, {0x15, 0x011A}, {0x6a, 0x011D}, {0x15, 0x011C}, {0x6a, 0x011F}, {0x15, 0x011E}, // 0118 - 011f + {0x6a, 0x0121}, {0x15, 0x0120}, {0x6a, 0x0123}, {0x15, 0x0122}, {0x6a, 0x0125}, {0x15, 0x0124}, {0x6a, 0x0127}, {0x15, 0x0126}, // 0120 - 0127 + {0xea, 0x000E}, {0x15, 0x0128}, {0x6a, 0x012B}, {0x15, 0x012A}, {0x6a, 0x012D}, {0x15, 0x012C}, {0xea, 0x0010}, {0x15, 0x012E}, // 0128 - 012f + {0xea, 0x0000}, {0x15, 0x0049}, {0x6a, 0x0133}, {0x15, 0x0132}, {0x6a, 0x0135}, {0x15, 0x0134}, {0x6a, 0x0137}, {0x15, 0x0136}, // 0130 - 0137 + {0x00, 0x0000}, {0x6a, 0x013A}, {0x15, 0x0139}, {0x6a, 0x013C}, {0x15, 0x013B}, {0x6a, 0x013E}, {0x15, 0x013D}, {0x6a, 0x0140}, // 0138 - 013f + {0x15, 0x013F}, {0x6a, 0x0142}, {0x15, 0x0141}, {0x6a, 0x0144}, {0x15, 0x0143}, {0x6a, 0x0146}, {0x15, 0x0145}, {0x6a, 0x0148}, // 0140 - 0147 + {0x15, 0x0147}, {0xd5, 0x0014}, {0x6a, 0x014B}, {0x15, 0x014A}, {0x6a, 0x014D}, {0x15, 0x014C}, {0x6a, 0x014F}, {0x15, 0x014E}, // 0148 - 014f + {0x6a, 0x0151}, {0x15, 0x0150}, {0x6a, 0x0153}, {0x15, 0x0152}, {0x6a, 0x0155}, {0x15, 0x0154}, {0x6a, 0x0157}, {0x15, 0x0156}, // 0150 - 0157 + {0x6a, 0x0159}, {0x15, 0x0158}, {0x6a, 0x015B}, {0x15, 0x015A}, {0x6a, 0x015D}, {0x15, 0x015C}, {0x6a, 0x015F}, {0x15, 0x015E}, // 0158 - 015f + {0x6a, 0x0161}, {0x15, 0x0160}, {0x6a, 0x0163}, {0x15, 0x0162}, {0x6a, 0x0165}, {0x15, 0x0164}, {0x6a, 0x0167}, {0x15, 0x0166}, // 0160 - 0167 + {0x6a, 0x0169}, {0x15, 0x0168}, {0x6a, 0x016B}, {0x15, 0x016A}, {0x6a, 0x016D}, {0x15, 0x016C}, {0x6a, 0x016F}, {0x15, 0x016E}, // 0168 - 016f + {0x6a, 0x0171}, {0x15, 0x0170}, {0x6a, 0x0173}, {0x15, 0x0172}, {0x6a, 0x0175}, {0x15, 0x0174}, {0x6a, 0x0177}, {0x15, 0x0176}, // 0170 - 0177 + {0x6a, 0x00FF}, {0x6a, 0x017A}, {0x15, 0x0179}, {0x6a, 0x017C}, {0x15, 0x017B}, {0x6a, 0x017E}, {0x15, 0x017D}, {0xf5, 0x0016}, // 0178 - 017f + {0x00, 0x0000}, {0x6a, 0x0253}, {0x6a, 0x0183}, {0x15, 0x0182}, {0x6a, 0x0185}, {0x15, 0x0184}, {0x6a, 0x0254}, {0x6a, 0x0188}, // 0180 - 0187 + {0x15, 0x0187}, {0x6a, 0x0256}, {0x6a, 0x0257}, {0x6a, 0x018C}, {0x15, 0x018B}, {0x00, 0x0000}, {0x6a, 0x01DD}, {0x6a, 0x0259}, // 0188 - 018f + {0x6a, 0x025B}, {0x6a, 0x0192}, {0x15, 0x0191}, {0x6a, 0x0260}, {0x6a, 0x0263}, {0x15, 0x01F6}, {0x6a, 0x0269}, {0x6a, 0x0268}, // 0190 - 0197 + {0x6a, 0x0199}, {0x15, 0x0198}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x026F}, {0x6a, 0x0272}, {0x00, 0x0000}, {0x6a, 0x0275}, // 0198 - 019f + {0x6a, 0x01A1}, {0x15, 0x01A0}, {0x6a, 0x01A3}, {0x15, 0x01A2}, {0x6a, 0x01A5}, {0x15, 0x01A4}, {0x6a, 0x0280}, {0x6a, 0x01A8}, // 01a0 - 01a7 + {0x15, 0x01A7}, {0x6a, 0x0283}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x01AD}, {0x15, 0x01AC}, {0x6a, 0x0288}, {0x6a, 0x01B0}, // 01a8 - 01af + {0x15, 0x01AF}, {0x6a, 0x028A}, {0x6a, 0x028B}, {0x6a, 0x01B4}, {0x15, 0x01B3}, {0x6a, 0x01B6}, {0x15, 0x01B5}, {0x6a, 0x0292}, // 01b0 - 01b7 + {0x6a, 0x01B9}, {0x15, 0x01B8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x01BD}, {0x15, 0x01BC}, {0x00, 0x0000}, {0x15, 0x01F7}, // 01b8 - 01bf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xfa, 0x0018}, {0xec, 0x001A}, {0x95, 0x001C}, {0xfa, 0x001E}, // 01c0 - 01c7 + {0xec, 0x0020}, {0x95, 0x0022}, {0xfa, 0x0024}, {0xec, 0x0026}, {0x95, 0x0028}, {0x6a, 0x01CE}, {0x15, 0x01CD}, {0x6a, 0x01D0}, // 01c8 - 01cf + {0x15, 0x01CF}, {0x6a, 0x01D2}, {0x15, 0x01D1}, {0x6a, 0x01D4}, {0x15, 0x01D3}, {0x6a, 0x01D6}, {0x15, 0x01D5}, {0x6a, 0x01D8}, // 01d0 - 01d7 + {0x15, 0x01D7}, {0x6a, 0x01DA}, {0x15, 0x01D9}, {0x6a, 0x01DC}, {0x15, 0x01DB}, {0x15, 0x018E}, {0x6a, 0x01DF}, {0x15, 0x01DE}, // 01d8 - 01df + {0x6a, 0x01E1}, {0x15, 0x01E0}, {0x6a, 0x01E3}, {0x15, 0x01E2}, {0x6a, 0x01E5}, {0x15, 0x01E4}, {0x6a, 0x01E7}, {0x15, 0x01E6}, // 01e0 - 01e7 + {0x6a, 0x01E9}, {0x15, 0x01E8}, {0x6a, 0x01EB}, {0x15, 0x01EA}, {0x6a, 0x01ED}, {0x15, 0x01EC}, {0x6a, 0x01EF}, {0x15, 0x01EE}, // 01e8 - 01ef + {0xd5, 0x002A}, {0xfa, 0x002C}, {0xec, 0x002E}, {0x95, 0x0030}, {0x6a, 0x01F5}, {0x15, 0x01F4}, {0x6a, 0x0195}, {0x6a, 0x01BF}, // 01f0 - 01f7 + {0x6a, 0x01F9}, {0x15, 0x01F8}, {0x6a, 0x01FB}, {0x15, 0x01FA}, {0x6a, 0x01FD}, {0x15, 0x01FC}, {0x6a, 0x01FF}, {0x15, 0x01FE}, // 01f8 - 01ff + + {0x6a, 0x0201}, {0x15, 0x0200}, {0x6a, 0x0203}, {0x15, 0x0202}, {0x6a, 0x0205}, {0x15, 0x0204}, {0x6a, 0x0207}, {0x15, 0x0206}, // 0200 - 0207 + {0x6a, 0x0209}, {0x15, 0x0208}, {0x6a, 0x020B}, {0x15, 0x020A}, {0x6a, 0x020D}, {0x15, 0x020C}, {0x6a, 0x020F}, {0x15, 0x020E}, // 0208 - 020f + {0x6a, 0x0211}, {0x15, 0x0210}, {0x6a, 0x0213}, {0x15, 0x0212}, {0x6a, 0x0215}, {0x15, 0x0214}, {0x6a, 0x0217}, {0x15, 0x0216}, // 0210 - 0217 + {0x6a, 0x0219}, {0x15, 0x0218}, {0x6a, 0x021B}, {0x15, 0x021A}, {0x6a, 0x021D}, {0x15, 0x021C}, {0x6a, 0x021F}, {0x15, 0x021E}, // 0218 - 021f + {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x0223}, {0x15, 0x0222}, {0x6a, 0x0225}, {0x15, 0x0224}, {0x6a, 0x0227}, {0x15, 0x0226}, // 0220 - 0227 + {0x6a, 0x0229}, {0x15, 0x0228}, {0x6a, 0x022B}, {0x15, 0x022A}, {0x6a, 0x022D}, {0x15, 0x022C}, {0x6a, 0x022F}, {0x15, 0x022E}, // 0228 - 022f + {0x6a, 0x0231}, {0x15, 0x0230}, {0x6a, 0x0233}, {0x15, 0x0232}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0230 - 0237 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0238 - 023f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0240 - 0247 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0248 - 024f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x0181}, {0x15, 0x0186}, {0x00, 0x0000}, {0x15, 0x0189}, {0x15, 0x018A}, // 0250 - 0257 + {0x00, 0x0000}, {0x15, 0x018F}, {0x00, 0x0000}, {0x15, 0x0190}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0258 - 025f + {0x15, 0x0193}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x0194}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0260 - 0267 + {0x15, 0x0197}, {0x15, 0x0196}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x019C}, // 0268 - 026f + {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x019D}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x019F}, {0x00, 0x0000}, {0x00, 0x0000}, // 0270 - 0277 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0278 - 027f + {0x15, 0x01A6}, {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x01A9}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0280 - 0287 + {0x15, 0x01AE}, {0x00, 0x0000}, {0x15, 0x01B1}, {0x15, 0x01B2}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0288 - 028f + {0x00, 0x0000}, {0x00, 0x0000}, {0x15, 0x01B7}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0290 - 0297 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0298 - 029f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02a0 - 02a7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02a8 - 02af + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02b0 - 02b7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02b8 - 02bf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02c0 - 02c7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02c8 - 02cf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02d0 - 02d7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02d8 - 02df + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02e0 - 02e7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02e8 - 02ef + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02f0 - 02f7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 02f8 - 02ff + + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x9f, 0x0000}, // 0300 - 0307 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0308 - 030f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0310 - 0317 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0318 - 031f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0320 - 0327 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0328 - 032f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0330 - 0337 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0338 - 033f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xf4, 0x0032}, {0x00, 0x0000}, {0x00, 0x0000}, // 0340 - 0347 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0348 - 034f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0350 - 0357 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0358 - 035f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0360 - 0367 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0368 - 036f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0370 - 0377 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0378 - 037f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03AC}, {0x00, 0x0000}, // 0380 - 0387 + {0x6a, 0x03AD}, {0x6a, 0x03AE}, {0x6a, 0x03AF}, {0x00, 0x0000}, {0x6a, 0x03CC}, {0x00, 0x0000}, {0x6a, 0x03CD}, {0x6a, 0x03CE}, // 0388 - 038f + {0xd5, 0x0034}, {0x6a, 0x03B1}, {0x6a, 0x03B2}, {0x6a, 0x03B3}, {0x6a, 0x03B4}, {0x6a, 0x03B5}, {0x6a, 0x03B6}, {0x6a, 0x03B7}, // 0390 - 0397 + {0x6a, 0x03B8}, {0x6a, 0x03B9}, {0x6a, 0x03BA}, {0x6a, 0x03BB}, {0x6a, 0x03BC}, {0x6a, 0x03BD}, {0x6a, 0x03BE}, {0x6a, 0x03BF}, // 0398 - 039f + {0x6a, 0x03C0}, {0x6a, 0x03C1}, {0x00, 0x0000}, {0xea, 0x0036}, {0x6a, 0x03C4}, {0x6a, 0x03C5}, {0x6a, 0x03C6}, {0x6a, 0x03C7}, // 03a0 - 03a7 + {0x6a, 0x03C8}, {0x6a, 0x03C9}, {0x6a, 0x03CA}, {0x6a, 0x03CB}, {0x15, 0x0386}, {0x15, 0x0388}, {0x15, 0x0389}, {0x15, 0x038A}, // 03a8 - 03af + {0xd5, 0x0038}, {0x15, 0x0391}, {0x15, 0x0392}, {0x15, 0x0393}, {0x15, 0x0394}, {0x15, 0x0395}, {0x15, 0x0396}, {0x15, 0x0397}, // 03b0 - 03b7 + {0x15, 0x0398}, {0x15, 0x0399}, {0x15, 0x039A}, {0x15, 0x039B}, {0x15, 0x039C}, {0x15, 0x039D}, {0x15, 0x039E}, {0x15, 0x039F}, // 03b8 - 03bf + {0x15, 0x03A0}, {0x15, 0x03A1}, {0xf5, 0x003A}, {0x15, 0x03A3}, {0x15, 0x03A4}, {0x15, 0x03A5}, {0x15, 0x03A6}, {0x15, 0x03A7}, // 03c0 - 03c7 + {0x15, 0x03A8}, {0x15, 0x03A9}, {0x15, 0x03AA}, {0x15, 0x03AB}, {0x15, 0x038C}, {0x15, 0x038E}, {0x15, 0x038F}, {0x00, 0x0000}, // 03c8 - 03cf + {0xf5, 0x003C}, {0xf5, 0x003E}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xf5, 0x0040}, {0xf5, 0x0042}, {0x00, 0x0000}, // 03d0 - 03d7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03DB}, {0x15, 0x03DA}, {0x6a, 0x03DD}, {0x15, 0x03DC}, {0x6a, 0x03DF}, {0x15, 0x03DE}, // 03d8 - 03df + {0x6a, 0x03E1}, {0x15, 0x03E0}, {0x6a, 0x03E3}, {0x15, 0x03E2}, {0x6a, 0x03E5}, {0x15, 0x03E4}, {0x6a, 0x03E7}, {0x15, 0x03E6}, // 03e0 - 03e7 + {0x6a, 0x03E9}, {0x15, 0x03E8}, {0x6a, 0x03EB}, {0x15, 0x03EA}, {0x6a, 0x03ED}, {0x15, 0x03EC}, {0x6a, 0x03EF}, {0x15, 0x03EE}, // 03e8 - 03ef + {0xf5, 0x0044}, {0xf5, 0x0046}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03B8}, {0xf5, 0x004A}, {0x00, 0x0000}, {0x00, 0x0000}, // 03f0 - 03f7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 03f8 - 03ff + + {0x6a, 0x0450}, {0x6a, 0x0451}, {0x6a, 0x0452}, {0x6a, 0x0453}, {0x6a, 0x0454}, {0x6a, 0x0455}, {0x6a, 0x0456}, {0x6a, 0x0457}, // 0400 - 0407 + {0x6a, 0x0458}, {0x6a, 0x0459}, {0x6a, 0x045A}, {0x6a, 0x045B}, {0x6a, 0x045C}, {0x6a, 0x045D}, {0x6a, 0x045E}, {0x6a, 0x045F}, // 0408 - 040f + {0x6a, 0x0430}, {0x6a, 0x0431}, {0x6a, 0x0432}, {0x6a, 0x0433}, {0x6a, 0x0434}, {0x6a, 0x0435}, {0x6a, 0x0436}, {0x6a, 0x0437}, // 0410 - 0417 + {0x6a, 0x0438}, {0x6a, 0x0439}, {0x6a, 0x043A}, {0x6a, 0x043B}, {0x6a, 0x043C}, {0x6a, 0x043D}, {0x6a, 0x043E}, {0x6a, 0x043F}, // 0418 - 041f + {0x6a, 0x0440}, {0x6a, 0x0441}, {0x6a, 0x0442}, {0x6a, 0x0443}, {0x6a, 0x0444}, {0x6a, 0x0445}, {0x6a, 0x0446}, {0x6a, 0x0447}, // 0420 - 0427 + {0x6a, 0x0448}, {0x6a, 0x0449}, {0x6a, 0x044A}, {0x6a, 0x044B}, {0x6a, 0x044C}, {0x6a, 0x044D}, {0x6a, 0x044E}, {0x6a, 0x044F}, // 0428 - 042f + {0x15, 0x0410}, {0x15, 0x0411}, {0x15, 0x0412}, {0x15, 0x0413}, {0x15, 0x0414}, {0x15, 0x0415}, {0x15, 0x0416}, {0x15, 0x0417}, // 0430 - 0437 + {0x15, 0x0418}, {0x15, 0x0419}, {0x15, 0x041A}, {0x15, 0x041B}, {0x15, 0x041C}, {0x15, 0x041D}, {0x15, 0x041E}, {0x15, 0x041F}, // 0438 - 043f + {0x15, 0x0420}, {0x15, 0x0421}, {0x15, 0x0422}, {0x15, 0x0423}, {0x15, 0x0424}, {0x15, 0x0425}, {0x15, 0x0426}, {0x15, 0x0427}, // 0440 - 0447 + {0x15, 0x0428}, {0x15, 0x0429}, {0x15, 0x042A}, {0x15, 0x042B}, {0x15, 0x042C}, {0x15, 0x042D}, {0x15, 0x042E}, {0x15, 0x042F}, // 0448 - 044f + {0x15, 0x0400}, {0x15, 0x0401}, {0x15, 0x0402}, {0x15, 0x0403}, {0x15, 0x0404}, {0x15, 0x0405}, {0x15, 0x0406}, {0x15, 0x0407}, // 0450 - 0457 + {0x15, 0x0408}, {0x15, 0x0409}, {0x15, 0x040A}, {0x15, 0x040B}, {0x15, 0x040C}, {0x15, 0x040D}, {0x15, 0x040E}, {0x15, 0x040F}, // 0458 - 045f + {0x6a, 0x0461}, {0x15, 0x0460}, {0x6a, 0x0463}, {0x15, 0x0462}, {0x6a, 0x0465}, {0x15, 0x0464}, {0x6a, 0x0467}, {0x15, 0x0466}, // 0460 - 0467 + {0x6a, 0x0469}, {0x15, 0x0468}, {0x6a, 0x046B}, {0x15, 0x046A}, {0x6a, 0x046D}, {0x15, 0x046C}, {0x6a, 0x046F}, {0x15, 0x046E}, // 0468 - 046f + {0x6a, 0x0471}, {0x15, 0x0470}, {0x6a, 0x0473}, {0x15, 0x0472}, {0x6a, 0x0475}, {0x15, 0x0474}, {0x6a, 0x0477}, {0x15, 0x0476}, // 0470 - 0477 + {0x6a, 0x0479}, {0x15, 0x0478}, {0x6a, 0x047B}, {0x15, 0x047A}, {0x6a, 0x047D}, {0x15, 0x047C}, {0x6a, 0x047F}, {0x15, 0x047E}, // 0478 - 047f + {0x6a, 0x0481}, {0x15, 0x0480}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0480 - 0487 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x048D}, {0x15, 0x048C}, {0x6a, 0x048F}, {0x15, 0x048E}, // 0488 - 048f + {0x6a, 0x0491}, {0x15, 0x0490}, {0x6a, 0x0493}, {0x15, 0x0492}, {0x6a, 0x0495}, {0x15, 0x0494}, {0x6a, 0x0497}, {0x15, 0x0496}, // 0490 - 0497 + {0x6a, 0x0499}, {0x15, 0x0498}, {0x6a, 0x049B}, {0x15, 0x049A}, {0x6a, 0x049D}, {0x15, 0x049C}, {0x6a, 0x049F}, {0x15, 0x049E}, // 0498 - 049f + {0x6a, 0x04A1}, {0x15, 0x04A0}, {0x6a, 0x04A3}, {0x15, 0x04A2}, {0x6a, 0x04A5}, {0x15, 0x04A4}, {0x6a, 0x04A7}, {0x15, 0x04A6}, // 04a0 - 04a7 + {0x6a, 0x04A9}, {0x15, 0x04A8}, {0x6a, 0x04AB}, {0x15, 0x04AA}, {0x6a, 0x04AD}, {0x15, 0x04AC}, {0x6a, 0x04AF}, {0x15, 0x04AE}, // 04a8 - 04af + {0x6a, 0x04B1}, {0x15, 0x04B0}, {0x6a, 0x04B3}, {0x15, 0x04B2}, {0x6a, 0x04B5}, {0x15, 0x04B4}, {0x6a, 0x04B7}, {0x15, 0x04B6}, // 04b0 - 04b7 + {0x6a, 0x04B9}, {0x15, 0x04B8}, {0x6a, 0x04BB}, {0x15, 0x04BA}, {0x6a, 0x04BD}, {0x15, 0x04BC}, {0x6a, 0x04BF}, {0x15, 0x04BE}, // 04b8 - 04bf + {0x00, 0x0000}, {0x6a, 0x04C2}, {0x15, 0x04C1}, {0x6a, 0x04C4}, {0x15, 0x04C3}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x04C8}, // 04c0 - 04c7 + {0x15, 0x04C7}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x04CC}, {0x15, 0x04CB}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 04c8 - 04cf + {0x6a, 0x04D1}, {0x15, 0x04D0}, {0x6a, 0x04D3}, {0x15, 0x04D2}, {0x6a, 0x04D5}, {0x15, 0x04D4}, {0x6a, 0x04D7}, {0x15, 0x04D6}, // 04d0 - 04d7 + {0x6a, 0x04D9}, {0x15, 0x04D8}, {0x6a, 0x04DB}, {0x15, 0x04DA}, {0x6a, 0x04DD}, {0x15, 0x04DC}, {0x6a, 0x04DF}, {0x15, 0x04DE}, // 04d8 - 04df + {0x6a, 0x04E1}, {0x15, 0x04E0}, {0x6a, 0x04E3}, {0x15, 0x04E2}, {0x6a, 0x04E5}, {0x15, 0x04E4}, {0x6a, 0x04E7}, {0x15, 0x04E6}, // 04e0 - 04e7 + {0x6a, 0x04E9}, {0x15, 0x04E8}, {0x6a, 0x04EB}, {0x15, 0x04EA}, {0x6a, 0x04ED}, {0x15, 0x04EC}, {0x6a, 0x04EF}, {0x15, 0x04EE}, // 04e8 - 04ef + {0x6a, 0x04F1}, {0x15, 0x04F0}, {0x6a, 0x04F3}, {0x15, 0x04F2}, {0x6a, 0x04F5}, {0x15, 0x04F4}, {0x00, 0x0000}, {0x00, 0x0000}, // 04f0 - 04f7 + {0x6a, 0x04F9}, {0x15, 0x04F8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 04f8 - 04ff + + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0500 - 0507 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0508 - 050f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0510 - 0517 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0518 - 051f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0520 - 0527 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0528 - 052f + {0x00, 0x0000}, {0x6a, 0x0561}, {0x6a, 0x0562}, {0x6a, 0x0563}, {0x6a, 0x0564}, {0x6a, 0x0565}, {0x6a, 0x0566}, {0x6a, 0x0567}, // 0530 - 0537 + {0x6a, 0x0568}, {0x6a, 0x0569}, {0x6a, 0x056A}, {0x6a, 0x056B}, {0x6a, 0x056C}, {0x6a, 0x056D}, {0x6a, 0x056E}, {0x6a, 0x056F}, // 0538 - 053f + {0x6a, 0x0570}, {0x6a, 0x0571}, {0x6a, 0x0572}, {0x6a, 0x0573}, {0x6a, 0x0574}, {0x6a, 0x0575}, {0x6a, 0x0576}, {0x6a, 0x0577}, // 0540 - 0547 + {0x6a, 0x0578}, {0x6a, 0x0579}, {0x6a, 0x057A}, {0x6a, 0x057B}, {0x6a, 0x057C}, {0x6a, 0x057D}, {0x6a, 0x057E}, {0x6a, 0x057F}, // 0548 - 054f + {0x6a, 0x0580}, {0x6a, 0x0581}, {0x6a, 0x0582}, {0x6a, 0x0583}, {0x6a, 0x0584}, {0x6a, 0x0585}, {0x6a, 0x0586}, {0x00, 0x0000}, // 0550 - 0557 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0558 - 055f + {0x00, 0x0000}, {0x15, 0x0531}, {0x15, 0x0532}, {0x15, 0x0533}, {0x15, 0x0534}, {0x15, 0x0535}, {0x15, 0x0536}, {0x15, 0x0537}, // 0560 - 0567 + {0x15, 0x0538}, {0x15, 0x0539}, {0x15, 0x053A}, {0x15, 0x053B}, {0x15, 0x053C}, {0x15, 0x053D}, {0x15, 0x053E}, {0x15, 0x053F}, // 0568 - 056f + {0x15, 0x0540}, {0x15, 0x0541}, {0x15, 0x0542}, {0x15, 0x0543}, {0x15, 0x0544}, {0x15, 0x0545}, {0x15, 0x0546}, {0x15, 0x0547}, // 0570 - 0577 + {0x15, 0x0548}, {0x15, 0x0549}, {0x15, 0x054A}, {0x15, 0x054B}, {0x15, 0x054C}, {0x15, 0x054D}, {0x15, 0x054E}, {0x15, 0x054F}, // 0578 - 057f + {0x15, 0x0550}, {0x15, 0x0551}, {0x15, 0x0552}, {0x15, 0x0553}, {0x15, 0x0554}, {0x15, 0x0555}, {0x15, 0x0556}, {0xd5, 0x004C}, // 0580 - 0587 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0588 - 058f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0590 - 0597 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 0598 - 059f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05a0 - 05a7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05a8 - 05af + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05b0 - 05b7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05b8 - 05bf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05c0 - 05c7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05c8 - 05cf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05d0 - 05d7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05d8 - 05df + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05e0 - 05e7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05e8 - 05ef + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05f0 - 05f7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 05f8 - 05ff + + {0x6a, 0x1E01}, {0x15, 0x1E00}, {0x6a, 0x1E03}, {0x15, 0x1E02}, {0x6a, 0x1E05}, {0x15, 0x1E04}, {0x6a, 0x1E07}, {0x15, 0x1E06}, // 1e00 - 1e07 + {0x6a, 0x1E09}, {0x15, 0x1E08}, {0x6a, 0x1E0B}, {0x15, 0x1E0A}, {0x6a, 0x1E0D}, {0x15, 0x1E0C}, {0x6a, 0x1E0F}, {0x15, 0x1E0E}, // 1e08 - 1e0f + {0x6a, 0x1E11}, {0x15, 0x1E10}, {0x6a, 0x1E13}, {0x15, 0x1E12}, {0x6a, 0x1E15}, {0x15, 0x1E14}, {0x6a, 0x1E17}, {0x15, 0x1E16}, // 1e10 - 1e17 + {0x6a, 0x1E19}, {0x15, 0x1E18}, {0x6a, 0x1E1B}, {0x15, 0x1E1A}, {0x6a, 0x1E1D}, {0x15, 0x1E1C}, {0x6a, 0x1E1F}, {0x15, 0x1E1E}, // 1e18 - 1e1f + {0x6a, 0x1E21}, {0x15, 0x1E20}, {0x6a, 0x1E23}, {0x15, 0x1E22}, {0x6a, 0x1E25}, {0x15, 0x1E24}, {0x6a, 0x1E27}, {0x15, 0x1E26}, // 1e20 - 1e27 + {0x6a, 0x1E29}, {0x15, 0x1E28}, {0x6a, 0x1E2B}, {0x15, 0x1E2A}, {0x6a, 0x1E2D}, {0x15, 0x1E2C}, {0x6a, 0x1E2F}, {0x15, 0x1E2E}, // 1e28 - 1e2f + {0x6a, 0x1E31}, {0x15, 0x1E30}, {0x6a, 0x1E33}, {0x15, 0x1E32}, {0x6a, 0x1E35}, {0x15, 0x1E34}, {0x6a, 0x1E37}, {0x15, 0x1E36}, // 1e30 - 1e37 + {0x6a, 0x1E39}, {0x15, 0x1E38}, {0x6a, 0x1E3B}, {0x15, 0x1E3A}, {0x6a, 0x1E3D}, {0x15, 0x1E3C}, {0x6a, 0x1E3F}, {0x15, 0x1E3E}, // 1e38 - 1e3f + {0x6a, 0x1E41}, {0x15, 0x1E40}, {0x6a, 0x1E43}, {0x15, 0x1E42}, {0x6a, 0x1E45}, {0x15, 0x1E44}, {0x6a, 0x1E47}, {0x15, 0x1E46}, // 1e40 - 1e47 + {0x6a, 0x1E49}, {0x15, 0x1E48}, {0x6a, 0x1E4B}, {0x15, 0x1E4A}, {0x6a, 0x1E4D}, {0x15, 0x1E4C}, {0x6a, 0x1E4F}, {0x15, 0x1E4E}, // 1e48 - 1e4f + {0x6a, 0x1E51}, {0x15, 0x1E50}, {0x6a, 0x1E53}, {0x15, 0x1E52}, {0x6a, 0x1E55}, {0x15, 0x1E54}, {0x6a, 0x1E57}, {0x15, 0x1E56}, // 1e50 - 1e57 + {0x6a, 0x1E59}, {0x15, 0x1E58}, {0x6a, 0x1E5B}, {0x15, 0x1E5A}, {0x6a, 0x1E5D}, {0x15, 0x1E5C}, {0x6a, 0x1E5F}, {0x15, 0x1E5E}, // 1e58 - 1e5f + {0x6a, 0x1E61}, {0x15, 0x1E60}, {0x6a, 0x1E63}, {0x15, 0x1E62}, {0x6a, 0x1E65}, {0x15, 0x1E64}, {0x6a, 0x1E67}, {0x15, 0x1E66}, // 1e60 - 1e67 + {0x6a, 0x1E69}, {0x15, 0x1E68}, {0x6a, 0x1E6B}, {0x15, 0x1E6A}, {0x6a, 0x1E6D}, {0x15, 0x1E6C}, {0x6a, 0x1E6F}, {0x15, 0x1E6E}, // 1e68 - 1e6f + {0x6a, 0x1E71}, {0x15, 0x1E70}, {0x6a, 0x1E73}, {0x15, 0x1E72}, {0x6a, 0x1E75}, {0x15, 0x1E74}, {0x6a, 0x1E77}, {0x15, 0x1E76}, // 1e70 - 1e77 + {0x6a, 0x1E79}, {0x15, 0x1E78}, {0x6a, 0x1E7B}, {0x15, 0x1E7A}, {0x6a, 0x1E7D}, {0x15, 0x1E7C}, {0x6a, 0x1E7F}, {0x15, 0x1E7E}, // 1e78 - 1e7f + {0x6a, 0x1E81}, {0x15, 0x1E80}, {0x6a, 0x1E83}, {0x15, 0x1E82}, {0x6a, 0x1E85}, {0x15, 0x1E84}, {0x6a, 0x1E87}, {0x15, 0x1E86}, // 1e80 - 1e87 + {0x6a, 0x1E89}, {0x15, 0x1E88}, {0x6a, 0x1E8B}, {0x15, 0x1E8A}, {0x6a, 0x1E8D}, {0x15, 0x1E8C}, {0x6a, 0x1E8F}, {0x15, 0x1E8E}, // 1e88 - 1e8f + {0x6a, 0x1E91}, {0x15, 0x1E90}, {0x6a, 0x1E93}, {0x15, 0x1E92}, {0x6a, 0x1E95}, {0x15, 0x1E94}, {0xd5, 0x004F}, {0xd5, 0x0051}, // 1e90 - 1e97 + {0xd5, 0x0053}, {0xd5, 0x0055}, {0xd5, 0x0057}, {0xf5, 0x0059}, {0x00, 0x0000}, {0x00, 0x0000}, {0xea, 0x015E}, {0x00, 0x0000}, // 1e98 - 1e9f + {0x6a, 0x1EA1}, {0x15, 0x1EA0}, {0x6a, 0x1EA3}, {0x15, 0x1EA2}, {0x6a, 0x1EA5}, {0x15, 0x1EA4}, {0x6a, 0x1EA7}, {0x15, 0x1EA6}, // 1ea0 - 1ea7 + {0x6a, 0x1EA9}, {0x15, 0x1EA8}, {0x6a, 0x1EAB}, {0x15, 0x1EAA}, {0x6a, 0x1EAD}, {0x15, 0x1EAC}, {0x6a, 0x1EAF}, {0x15, 0x1EAE}, // 1ea8 - 1eaf + {0x6a, 0x1EB1}, {0x15, 0x1EB0}, {0x6a, 0x1EB3}, {0x15, 0x1EB2}, {0x6a, 0x1EB5}, {0x15, 0x1EB4}, {0x6a, 0x1EB7}, {0x15, 0x1EB6}, // 1eb0 - 1eb7 + {0x6a, 0x1EB9}, {0x15, 0x1EB8}, {0x6a, 0x1EBB}, {0x15, 0x1EBA}, {0x6a, 0x1EBD}, {0x15, 0x1EBC}, {0x6a, 0x1EBF}, {0x15, 0x1EBE}, // 1eb8 - 1ebf + {0x6a, 0x1EC1}, {0x15, 0x1EC0}, {0x6a, 0x1EC3}, {0x15, 0x1EC2}, {0x6a, 0x1EC5}, {0x15, 0x1EC4}, {0x6a, 0x1EC7}, {0x15, 0x1EC6}, // 1ec0 - 1ec7 + {0x6a, 0x1EC9}, {0x15, 0x1EC8}, {0x6a, 0x1ECB}, {0x15, 0x1ECA}, {0x6a, 0x1ECD}, {0x15, 0x1ECC}, {0x6a, 0x1ECF}, {0x15, 0x1ECE}, // 1ec8 - 1ecf + {0x6a, 0x1ED1}, {0x15, 0x1ED0}, {0x6a, 0x1ED3}, {0x15, 0x1ED2}, {0x6a, 0x1ED5}, {0x15, 0x1ED4}, {0x6a, 0x1ED7}, {0x15, 0x1ED6}, // 1ed0 - 1ed7 + {0x6a, 0x1ED9}, {0x15, 0x1ED8}, {0x6a, 0x1EDB}, {0x15, 0x1EDA}, {0x6a, 0x1EDD}, {0x15, 0x1EDC}, {0x6a, 0x1EDF}, {0x15, 0x1EDE}, // 1ed8 - 1edf + {0x6a, 0x1EE1}, {0x15, 0x1EE0}, {0x6a, 0x1EE3}, {0x15, 0x1EE2}, {0x6a, 0x1EE5}, {0x15, 0x1EE4}, {0x6a, 0x1EE7}, {0x15, 0x1EE6}, // 1ee0 - 1ee7 + {0x6a, 0x1EE9}, {0x15, 0x1EE8}, {0x6a, 0x1EEB}, {0x15, 0x1EEA}, {0x6a, 0x1EED}, {0x15, 0x1EEC}, {0x6a, 0x1EEF}, {0x15, 0x1EEE}, // 1ee8 - 1eef + {0x6a, 0x1EF1}, {0x15, 0x1EF0}, {0x6a, 0x1EF3}, {0x15, 0x1EF2}, {0x6a, 0x1EF5}, {0x15, 0x1EF4}, {0x6a, 0x1EF7}, {0x15, 0x1EF6}, // 1ef0 - 1ef7 + {0x6a, 0x1EF9}, {0x15, 0x1EF8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1ef8 - 1eff + + {0x15, 0x1F08}, {0x15, 0x1F09}, {0x15, 0x1F0A}, {0x15, 0x1F0B}, {0x15, 0x1F0C}, {0x15, 0x1F0D}, {0x15, 0x1F0E}, {0x15, 0x1F0F}, // 1f00 - 1f07 + {0x6a, 0x1F00}, {0x6a, 0x1F01}, {0x6a, 0x1F02}, {0x6a, 0x1F03}, {0x6a, 0x1F04}, {0x6a, 0x1F05}, {0x6a, 0x1F06}, {0x6a, 0x1F07}, // 1f08 - 1f0f + {0x15, 0x1F18}, {0x15, 0x1F19}, {0x15, 0x1F1A}, {0x15, 0x1F1B}, {0x15, 0x1F1C}, {0x15, 0x1F1D}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f10 - 1f17 + {0x6a, 0x1F10}, {0x6a, 0x1F11}, {0x6a, 0x1F12}, {0x6a, 0x1F13}, {0x6a, 0x1F14}, {0x6a, 0x1F15}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f18 - 1f1f + {0x15, 0x1F28}, {0x15, 0x1F29}, {0x15, 0x1F2A}, {0x15, 0x1F2B}, {0x15, 0x1F2C}, {0x15, 0x1F2D}, {0x15, 0x1F2E}, {0x15, 0x1F2F}, // 1f20 - 1f27 + {0x6a, 0x1F20}, {0x6a, 0x1F21}, {0x6a, 0x1F22}, {0x6a, 0x1F23}, {0x6a, 0x1F24}, {0x6a, 0x1F25}, {0x6a, 0x1F26}, {0x6a, 0x1F27}, // 1f28 - 1f2f + {0x15, 0x1F38}, {0x15, 0x1F39}, {0x15, 0x1F3A}, {0x15, 0x1F3B}, {0x15, 0x1F3C}, {0x15, 0x1F3D}, {0x15, 0x1F3E}, {0x15, 0x1F3F}, // 1f30 - 1f37 + {0x6a, 0x1F30}, {0x6a, 0x1F31}, {0x6a, 0x1F32}, {0x6a, 0x1F33}, {0x6a, 0x1F34}, {0x6a, 0x1F35}, {0x6a, 0x1F36}, {0x6a, 0x1F37}, // 1f38 - 1f3f + {0x15, 0x1F48}, {0x15, 0x1F49}, {0x15, 0x1F4A}, {0x15, 0x1F4B}, {0x15, 0x1F4C}, {0x15, 0x1F4D}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f40 - 1f47 + {0x6a, 0x1F40}, {0x6a, 0x1F41}, {0x6a, 0x1F42}, {0x6a, 0x1F43}, {0x6a, 0x1F44}, {0x6a, 0x1F45}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f48 - 1f4f + {0xd5, 0x005B}, {0x15, 0x1F59}, {0xd5, 0x005D}, {0x15, 0x1F5B}, {0xd5, 0x005F}, {0x15, 0x1F5D}, {0xd5, 0x0061}, {0x15, 0x1F5F}, // 1f50 - 1f57 + {0x00, 0x0000}, {0x6a, 0x1F51}, {0x00, 0x0000}, {0x6a, 0x1F53}, {0x00, 0x0000}, {0x6a, 0x1F55}, {0x00, 0x0000}, {0x6a, 0x1F57}, // 1f58 - 1f5f + {0x15, 0x1F68}, {0x15, 0x1F69}, {0x15, 0x1F6A}, {0x15, 0x1F6B}, {0x15, 0x1F6C}, {0x15, 0x1F6D}, {0x15, 0x1F6E}, {0x15, 0x1F6F}, // 1f60 - 1f67 + {0x6a, 0x1F60}, {0x6a, 0x1F61}, {0x6a, 0x1F62}, {0x6a, 0x1F63}, {0x6a, 0x1F64}, {0x6a, 0x1F65}, {0x6a, 0x1F66}, {0x6a, 0x1F67}, // 1f68 - 1f6f + {0x15, 0x1FBA}, {0x15, 0x1FBB}, {0x15, 0x1FC8}, {0x15, 0x1FC9}, {0x15, 0x1FCA}, {0x15, 0x1FCB}, {0x15, 0x1FDA}, {0x15, 0x1FDB}, // 1f70 - 1f77 + {0x15, 0x1FF8}, {0x15, 0x1FF9}, {0x15, 0x1FEA}, {0x15, 0x1FEB}, {0x15, 0x1FFA}, {0x15, 0x1FFB}, {0x00, 0x0000}, {0x00, 0x0000}, // 1f78 - 1f7f + {0xd5, 0x0063}, {0xd5, 0x0066}, {0xd5, 0x0069}, {0xd5, 0x006C}, {0xd5, 0x006F}, {0xd5, 0x0072}, {0xd5, 0x0075}, {0xd5, 0x0078}, // 1f80 - 1f87 + {0xec, 0x007B}, {0xec, 0x007E}, {0xec, 0x0081}, {0xec, 0x0084}, {0xec, 0x0087}, {0xec, 0x008A}, {0xec, 0x008D}, {0xec, 0x0090}, // 1f88 - 1f8f + {0xd5, 0x0093}, {0xd5, 0x0096}, {0xd5, 0x0099}, {0xd5, 0x009C}, {0xd5, 0x009F}, {0xd5, 0x00A2}, {0xd5, 0x00A5}, {0xd5, 0x00A8}, // 1f90 - 1f97 + {0xec, 0x00AB}, {0xec, 0x00AE}, {0xec, 0x00B1}, {0xec, 0x00B4}, {0xec, 0x00B7}, {0xec, 0x00BA}, {0xec, 0x00BD}, {0xec, 0x00C0}, // 1f98 - 1f9f + {0xd5, 0x00C3}, {0xd5, 0x00C6}, {0xd5, 0x00C9}, {0xd5, 0x00CC}, {0xd5, 0x00CF}, {0xd5, 0x00D2}, {0xd5, 0x00D5}, {0xd5, 0x00D8}, // 1fa0 - 1fa7 + {0xec, 0x00DB}, {0xec, 0x00DE}, {0xec, 0x00E1}, {0xec, 0x00E4}, {0xec, 0x00E7}, {0xec, 0x00EA}, {0xec, 0x00ED}, {0xec, 0x00F0}, // 1fa8 - 1faf + {0x15, 0x1FB8}, {0x15, 0x1FB9}, {0xd5, 0x00F3}, {0xd5, 0x00F6}, {0xd5, 0x00F9}, {0x00, 0x0000}, {0xd5, 0x00FC}, {0xd5, 0x00FE}, // 1fb0 - 1fb7 + {0x6a, 0x1FB0}, {0x6a, 0x1FB1}, {0x6a, 0x1F70}, {0x6a, 0x1F71}, {0xec, 0x0101}, {0x00, 0x0000}, {0xf5, 0x0104}, {0x00, 0x0000}, // 1fb8 - 1fbf + {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x0106}, {0xd5, 0x0109}, {0xd5, 0x010C}, {0x00, 0x0000}, {0xd5, 0x010F}, {0xd5, 0x0111}, // 1fc0 - 1fc7 + {0x6a, 0x1F72}, {0x6a, 0x1F73}, {0x6a, 0x1F74}, {0x6a, 0x1F75}, {0xec, 0x0114}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1fc8 - 1fcf + {0x15, 0x1FD8}, {0x15, 0x1FD9}, {0xd5, 0x0117}, {0xd5, 0x0119}, {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x011B}, {0xd5, 0x011D}, // 1fd0 - 1fd7 + {0x6a, 0x1FD0}, {0x6a, 0x1FD1}, {0x6a, 0x1F76}, {0x6a, 0x1F77}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1fd8 - 1fdf + {0x15, 0x1FE8}, {0x15, 0x1FE9}, {0xd5, 0x011F}, {0xd5, 0x0121}, {0xd5, 0x0123}, {0x15, 0x1FEC}, {0xd5, 0x0125}, {0xd5, 0x0127}, // 1fe0 - 1fe7 + {0x6a, 0x1FE0}, {0x6a, 0x1FE1}, {0x6a, 0x1F7A}, {0x6a, 0x1F7B}, {0x6a, 0x1FE5}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1fe8 - 1fef + {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x0129}, {0xd5, 0x012C}, {0xd5, 0x012F}, {0x00, 0x0000}, {0xd5, 0x0132}, {0xd5, 0x0134}, // 1ff0 - 1ff7 + {0x6a, 0x1F78}, {0x6a, 0x1F79}, {0x6a, 0x1F7C}, {0x6a, 0x1F7D}, {0xec, 0x0137}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 1ff8 - 1fff + + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2100 - 2107 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2108 - 210f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2110 - 2117 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2118 - 211f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x03C9}, {0x00, 0x0000}, // 2120 - 2127 + {0x00, 0x0000}, {0x00, 0x0000}, {0x6a, 0x006B}, {0x6a, 0x00E5}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2128 - 212f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2130 - 2137 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2138 - 213f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2140 - 2147 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2148 - 214f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2150 - 2157 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2158 - 215f + {0x68, 0x2170}, {0x68, 0x2171}, {0x68, 0x2172}, {0x68, 0x2173}, {0x68, 0x2174}, {0x68, 0x2175}, {0x68, 0x2176}, {0x68, 0x2177}, // 2160 - 2167 + {0x68, 0x2178}, {0x68, 0x2179}, {0x68, 0x217A}, {0x68, 0x217B}, {0x68, 0x217C}, {0x68, 0x217D}, {0x68, 0x217E}, {0x68, 0x217F}, // 2168 - 216f + {0x14, 0x2160}, {0x14, 0x2161}, {0x14, 0x2162}, {0x14, 0x2163}, {0x14, 0x2164}, {0x14, 0x2165}, {0x14, 0x2166}, {0x14, 0x2167}, // 2170 - 2177 + {0x14, 0x2168}, {0x14, 0x2169}, {0x14, 0x216A}, {0x14, 0x216B}, {0x14, 0x216C}, {0x14, 0x216D}, {0x14, 0x216E}, {0x14, 0x216F}, // 2178 - 217f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2180 - 2187 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2188 - 218f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2190 - 2197 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2198 - 219f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21a0 - 21a7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21a8 - 21af + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21b0 - 21b7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21b8 - 21bf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21c0 - 21c7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21c8 - 21cf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21d0 - 21d7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21d8 - 21df + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21e0 - 21e7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21e8 - 21ef + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21f0 - 21f7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 21f8 - 21ff + + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2400 - 2407 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2408 - 240f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2410 - 2417 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2418 - 241f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2420 - 2427 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2428 - 242f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2430 - 2437 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2438 - 243f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2440 - 2447 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2448 - 244f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2450 - 2457 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2458 - 245f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2460 - 2467 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2468 - 246f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2470 - 2477 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2478 - 247f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2480 - 2487 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2488 - 248f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2490 - 2497 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2498 - 249f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24a0 - 24a7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24a8 - 24af + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x68, 0x24D0}, {0x68, 0x24D1}, // 24b0 - 24b7 + {0x68, 0x24D2}, {0x68, 0x24D3}, {0x68, 0x24D4}, {0x68, 0x24D5}, {0x68, 0x24D6}, {0x68, 0x24D7}, {0x68, 0x24D8}, {0x68, 0x24D9}, // 24b8 - 24bf + {0x68, 0x24DA}, {0x68, 0x24DB}, {0x68, 0x24DC}, {0x68, 0x24DD}, {0x68, 0x24DE}, {0x68, 0x24DF}, {0x68, 0x24E0}, {0x68, 0x24E1}, // 24c0 - 24c7 + {0x68, 0x24E2}, {0x68, 0x24E3}, {0x68, 0x24E4}, {0x68, 0x24E5}, {0x68, 0x24E6}, {0x68, 0x24E7}, {0x68, 0x24E8}, {0x68, 0x24E9}, // 24c8 - 24cf + {0x14, 0x24B6}, {0x14, 0x24B7}, {0x14, 0x24B8}, {0x14, 0x24B9}, {0x14, 0x24BA}, {0x14, 0x24BB}, {0x14, 0x24BC}, {0x14, 0x24BD}, // 24d0 - 24d7 + {0x14, 0x24BE}, {0x14, 0x24BF}, {0x14, 0x24C0}, {0x14, 0x24C1}, {0x14, 0x24C2}, {0x14, 0x24C3}, {0x14, 0x24C4}, {0x14, 0x24C5}, // 24d8 - 24df + {0x14, 0x24C6}, {0x14, 0x24C7}, {0x14, 0x24C8}, {0x14, 0x24C9}, {0x14, 0x24CA}, {0x14, 0x24CB}, {0x14, 0x24CC}, {0x14, 0x24CD}, // 24e0 - 24e7 + {0x14, 0x24CE}, {0x14, 0x24CF}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24e8 - 24ef + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24f0 - 24f7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 24f8 - 24ff + + {0x6a, 0x2C30}, {0x6a, 0x2C31}, {0x6a, 0x2C32}, {0x6a, 0x2C33}, {0x6a, 0x2C34}, {0x6a, 0x2C35}, {0x6a, 0x2C36}, {0x6a, 0x2C37}, // 2c00 - 2c07, Glagolitic + {0x6a, 0x2C38}, {0x6a, 0x2C39}, {0x6a, 0x2C3A}, {0x6a, 0x2C3B}, {0x6a, 0x2C3C}, {0x6a, 0x2C3D}, {0x6a, 0x2C3E}, {0x6a, 0x2C3F}, // 2c08 - 2c0f + {0x6a, 0x2C40}, {0x6a, 0x2C41}, {0x6a, 0x2C42}, {0x6a, 0x2C43}, {0x6a, 0x2C44}, {0x6a, 0x2C45}, {0x6a, 0x2C46}, {0x6a, 0x2C47}, // 2c10 - 2c17 + {0x6a, 0x2C48}, {0x6a, 0x2C49}, {0x6a, 0x2C4A}, {0x6a, 0x2C4B}, {0x6a, 0x2C4C}, {0x6a, 0x2C4D}, {0x6a, 0x2C4E}, {0x6a, 0x2C4F}, // 2c18 - 2c1f + {0x6a, 0x2C50}, {0x6a, 0x2C51}, {0x6a, 0x2C52}, {0x6a, 0x2C53}, {0x6a, 0x2C54}, {0x6a, 0x2C55}, {0x6a, 0x2C56}, {0x6a, 0x2C57}, // 2c20 - 2c27 + {0x6a, 0x2C58}, {0x6a, 0x2C59}, {0x6a, 0x2C5A}, {0x6a, 0x2C5B}, {0x6a, 0x2C5C}, {0x6a, 0x2C5D}, {0x6a, 0x2C5E}, {0x00, 0x0000}, // 2c28 - 2c2f + {0x15, 0x2C00}, {0x15, 0x2C01}, {0x15, 0x2C02}, {0x15, 0x2C03}, {0x15, 0x2C04}, {0x15, 0x2C05}, {0x15, 0x2C06}, {0x15, 0x2C07}, // 2c30 - 2c37 + {0x15, 0x2C08}, {0x15, 0x2C09}, {0x15, 0x2C0A}, {0x15, 0x2C0B}, {0x15, 0x2C0C}, {0x15, 0x2C0D}, {0x15, 0x2C0E}, {0x15, 0x2C0F}, // 2c38 - 2c3f + {0x15, 0x2C10}, {0x15, 0x2C11}, {0x15, 0x2C12}, {0x15, 0x2C13}, {0x15, 0x2C14}, {0x15, 0x2C15}, {0x15, 0x2C16}, {0x15, 0x2C17}, // 2c40 - 2c47 + {0x15, 0x2C18}, {0x15, 0x2C19}, {0x15, 0x2C1A}, {0x15, 0x2C1B}, {0x15, 0x2C1C}, {0x15, 0x2C1D}, {0x15, 0x2C1E}, {0x15, 0x2C1F}, // 2c48 - 2c4f + {0x15, 0x2C20}, {0x15, 0x2C21}, {0x15, 0x2C22}, {0x15, 0x2C23}, {0x15, 0x2C24}, {0x15, 0x2C25}, {0x15, 0x2C26}, {0x15, 0x2C27}, // 2c50 - 2c57 + {0x15, 0x2C28}, {0x15, 0x2C29}, {0x15, 0x2C2A}, {0x15, 0x2C2B}, {0x15, 0x2C2C}, {0x15, 0x2C2D}, {0x15, 0x2C2E}, {0x00, 0x0000}, // 2c58 - 2c5f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c60 - 2c67 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c68 - 2c6f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c70 - 2c77 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2c78 - 2c7f + {0x6a, 0x2c81}, {0x15, 0x2c80}, {0x6a, 0x2c83}, {0x15, 0x2c82}, {0x6a, 0x2c85}, {0x15, 0x2c84}, {0x6a, 0x2c87}, {0x15, 0x2c86}, // 2c80 - 2c87, Coptic + {0x6a, 0x2c89}, {0x15, 0x2c88}, {0x6a, 0x2c8b}, {0x15, 0x2c8a}, {0x6a, 0x2c8d}, {0x15, 0x2c8c}, {0x6a, 0x2c8f}, {0x15, 0x2c8e}, // 2c88 - 2c8f + {0x6a, 0x2c91}, {0x15, 0x2c90}, {0x6a, 0x2c93}, {0x15, 0x2c92}, {0x6a, 0x2c95}, {0x15, 0x2c94}, {0x6a, 0x2c97}, {0x15, 0x2c96}, // 2c90 - 2c97 + {0x6a, 0x2c99}, {0x15, 0x2c98}, {0x6a, 0x2c9b}, {0x15, 0x2c9a}, {0x6a, 0x2c9d}, {0x15, 0x2c9c}, {0x6a, 0x2c9f}, {0x15, 0x2c9e}, // 2c98 - 2c9f + {0x6a, 0x2ca1}, {0x15, 0x2ca0}, {0x6a, 0x2ca3}, {0x15, 0x2ca2}, {0x6a, 0x2ca5}, {0x15, 0x2ca4}, {0x6a, 0x2ca7}, {0x15, 0x2ca6}, // 2ca0 - 2ca7 + {0x6a, 0x2ca9}, {0x15, 0x2ca8}, {0x6a, 0x2cab}, {0x15, 0x2caa}, {0x6a, 0x2cad}, {0x15, 0x2cac}, {0x6a, 0x2caf}, {0x15, 0x2cae}, // 2ca8 - 2caf + {0x6a, 0x2cb1}, {0x15, 0x2cb0}, {0x6a, 0x2cb3}, {0x15, 0x2cb2}, {0x6a, 0x2cb5}, {0x15, 0x2cb4}, {0x6a, 0x2cb7}, {0x15, 0x2cb6}, // 2cb0 - 2cb7 + {0x6a, 0x2cb9}, {0x15, 0x2cb8}, {0x6a, 0x2cbb}, {0x15, 0x2cba}, {0x6a, 0x2cbd}, {0x15, 0x2cbc}, {0x6a, 0x2cbf}, {0x15, 0x2cbe}, // 2cb8 - 2cbf + {0x6a, 0x2cc1}, {0x15, 0x2cc0}, {0x6a, 0x2cc3}, {0x15, 0x2cc2}, {0x6a, 0x2cc5}, {0x15, 0x2cc4}, {0x6a, 0x2cc7}, {0x15, 0x2cc6}, // 2cc0 - 2cc7 + {0x6a, 0x2cc9}, {0x15, 0x2cc8}, {0x6a, 0x2ccb}, {0x15, 0x2cca}, {0x6a, 0x2ccd}, {0x15, 0x2ccc}, {0x6a, 0x2ccf}, {0x15, 0x2cce}, // 2cc8 - 2ccf + {0x6a, 0x2cd1}, {0x15, 0x2cd0}, {0x6a, 0x2cd3}, {0x15, 0x2cd2}, {0x6a, 0x2cd5}, {0x15, 0x2cd4}, {0x6a, 0x2cd7}, {0x15, 0x2cd6}, // 2cd0 - 2cd7 + {0x6a, 0x2cd9}, {0x15, 0x2cd8}, {0x6a, 0x2cdb}, {0x15, 0x2cda}, {0x6a, 0x2cdd}, {0x15, 0x2cdc}, {0x6a, 0x2cdf}, {0x15, 0x2cde}, // 2cd8 - 2cdf + {0x6a, 0x2ce1}, {0x15, 0x2ce0}, {0x6a, 0x2ce3}, {0x15, 0x2ce2}, {0x6a, 0x2ce5}, {0x15, 0x2ce4}, {0x6a, 0x2ce7}, {0x15, 0x2ce6}, // 2ce0 - 2ce7 + {0x6a, 0x2ce9}, {0x15, 0x2ce8}, {0x6a, 0x2ceb}, {0x15, 0x2cea}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2ce8 - 2cef + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2cf0 - 2cf7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // 2cf8 - 2cff + + {0xd5, 0x013A}, {0xd5, 0x013D}, {0xd5, 0x0140}, {0xd5, 0x0143}, {0xd5, 0x0146}, {0xd5, 0x0149}, {0xd5, 0x014C}, {0x00, 0x0000}, // fb00 - fb07 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb08 - fb0f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0xd5, 0x014F}, {0xd5, 0x0152}, {0xd5, 0x0155}, {0xd5, 0x0158}, {0xd5, 0x015B}, // fb10 - fb17 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb18 - fb1f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb20 - fb27 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb28 - fb2f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb30 - fb37 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb38 - fb3f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb40 - fb47 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb48 - fb4f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb50 - fb57 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb58 - fb5f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb60 - fb67 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb68 - fb6f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb70 - fb77 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb78 - fb7f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb80 - fb87 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb88 - fb8f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb90 - fb97 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fb98 - fb9f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fba0 - fba7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fba8 - fbaf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbb0 - fbb7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbb8 - fbbf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbc0 - fbc7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbc8 - fbcf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbd0 - fbd7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbd8 - fbdf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbe0 - fbe7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbe8 - fbef + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbf0 - fbf7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fbf8 - fbff + + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff00 - ff07 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff08 - ff0f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff10 - ff17 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff18 - ff1f + {0x00, 0x0000}, {0x6a, 0xFF41}, {0x6a, 0xFF42}, {0x6a, 0xFF43}, {0x6a, 0xFF44}, {0x6a, 0xFF45}, {0x6a, 0xFF46}, {0x6a, 0xFF47}, // ff20 - ff27 + {0x6a, 0xFF48}, {0x6a, 0xFF49}, {0x6a, 0xFF4A}, {0x6a, 0xFF4B}, {0x6a, 0xFF4C}, {0x6a, 0xFF4D}, {0x6a, 0xFF4E}, {0x6a, 0xFF4F}, // ff28 - ff2f + {0x6a, 0xFF50}, {0x6a, 0xFF51}, {0x6a, 0xFF52}, {0x6a, 0xFF53}, {0x6a, 0xFF54}, {0x6a, 0xFF55}, {0x6a, 0xFF56}, {0x6a, 0xFF57}, // ff30 - ff37 + {0x6a, 0xFF58}, {0x6a, 0xFF59}, {0x6a, 0xFF5A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff38 - ff3f + {0x00, 0x0000}, {0x15, 0xFF21}, {0x15, 0xFF22}, {0x15, 0xFF23}, {0x15, 0xFF24}, {0x15, 0xFF25}, {0x15, 0xFF26}, {0x15, 0xFF27}, // ff40 - ff47 + {0x15, 0xFF28}, {0x15, 0xFF29}, {0x15, 0xFF2A}, {0x15, 0xFF2B}, {0x15, 0xFF2C}, {0x15, 0xFF2D}, {0x15, 0xFF2E}, {0x15, 0xFF2F}, // ff48 - ff4f + {0x15, 0xFF30}, {0x15, 0xFF31}, {0x15, 0xFF32}, {0x15, 0xFF33}, {0x15, 0xFF34}, {0x15, 0xFF35}, {0x15, 0xFF36}, {0x15, 0xFF37}, // ff50 - ff57 + {0x15, 0xFF38}, {0x15, 0xFF39}, {0x15, 0xFF3A}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff58 - ff5f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff60 - ff67 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff68 - ff6f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff70 - ff77 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff78 - ff7f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff80 - ff87 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff88 - ff8f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff90 - ff97 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ff98 - ff9f + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffa0 - ffa7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffa8 - ffaf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffb0 - ffb7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffb8 - ffbf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffc0 - ffc7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffc8 - ffcf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffd0 - ffd7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffd8 - ffdf + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffe0 - ffe7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // ffe8 - ffef + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fff0 - fff7 + {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}, // fff8 - ffff +}; + + +#define MaxCaseMappingExtras 3 + +Mapping const CaseMappingExtra[] = { + {0x80, 0, {0x0000, 0x0000, 0x0000}}, // 0x0000 (0 0x0000) + {0x60, 1, {0x0131, 0x0000, 0x0000}}, // 0x0049 (1 0x0001) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x0049 (2 0x0002) + {0x60, 1, {0x006A, 0x0000, 0x0000}}, // 0x004a (3 0x0003) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x004a (4 0x0004) + {0x15, 1, {0x039C, 0x0000, 0x0000}}, // 0x00b5 (5 0x0005) + {0x60, 1, {0x03BC, 0x0000, 0x0000}}, // 0x00b5 (6 0x0006) + {0x60, 1, {0x00EC, 0x0000, 0x0000}}, // 0x00cc (7 0x0007) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x00cc (8 0x0008) + {0x60, 1, {0x00ED, 0x0000, 0x0000}}, // 0x00cd (9 0x0009) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x00cd (10 0x000A) + {0x15, 1, {0x1E9E, 0x0000, 0x0000}}, // 0x00df (11 0x000B) + {0x40, 2, {0x0073, 0x0073, 0x0000}}, // 0x00df (12 0x000C) + {0x20, 1, {0x00DF, 0x0000, 0x0000}}, // 0x00df (13 0x000D) not hit, CaseMappingValue.type is 0xd5=0x80+0x55 not 0xf5=0x80+0x75, but keep slot + {0x60, 1, {0x0129, 0x0000, 0x0000}}, // 0x0128 (14 0x000E) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x0128 (15 0x000F) + {0x60, 1, {0x012F, 0x0000, 0x0000}}, // 0x012e (16 0x0010) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x012e (17 0x0011) + {0x60, 1, {0x0069, 0x0000, 0x0000}}, // 0x0130 (18 0x0012) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x0130 (19 0x0013) + {0x15, 2, {0x02BC, 0x004E, 0x0000}}, // 0x0149 (20 0x0014) + {0x40, 2, {0x02BC, 0x006E, 0x0000}}, // 0x0149 (21 0x0015) + {0x15, 1, {0x0053, 0x0000, 0x0000}}, // 0x017f (22 0x0016) + {0x60, 1, {0x0073, 0x0000, 0x0000}}, // 0x017f (23 0x0017) + {0x6a, 1, {0x01C6, 0x0000, 0x0000}}, // 0x01c4 (24 0x0018) + {0x10, 1, {0x01C5, 0x0000, 0x0000}}, // 0x01c4 (25 0x0019) + {0x68, 1, {0x01C6, 0x0000, 0x0000}}, // 0x01c5 (26 0x001A) + {0x04, 1, {0x01C4, 0x0000, 0x0000}}, // 0x01c5 (27 0x001B) + {0x05, 1, {0x01C4, 0x0000, 0x0000}}, // 0x01c6 (28 0x001C) + {0x10, 1, {0x01C5, 0x0000, 0x0000}}, // 0x01c6 (29 0x001D) + {0x6a, 1, {0x01C9, 0x0000, 0x0000}}, // 0x01c7 (30 0x001E) + {0x10, 1, {0x01C8, 0x0000, 0x0000}}, // 0x01c7 (31 0x001F) + {0x68, 1, {0x01C9, 0x0000, 0x0000}}, // 0x01c8 (32 0x0020) + {0x04, 1, {0x01C7, 0x0000, 0x0000}}, // 0x01c8 (33 0x0021) + {0x05, 1, {0x01C7, 0x0000, 0x0000}}, // 0x01c9 (34 0x0022) + {0x10, 1, {0x01C8, 0x0000, 0x0000}}, // 0x01c9 (35 0x0023) + {0x6a, 1, {0x01CC, 0x0000, 0x0000}}, // 0x01ca (36 0x0024) + {0x10, 1, {0x01CB, 0x0000, 0x0000}}, // 0x01ca (37 0x0025) + {0x68, 1, {0x01CC, 0x0000, 0x0000}}, // 0x01cb (38 0x0026) + {0x04, 1, {0x01CA, 0x0000, 0x0000}}, // 0x01cb (39 0x0027) + {0x05, 1, {0x01CA, 0x0000, 0x0000}}, // 0x01cc (40 0x0028) + {0x10, 1, {0x01CB, 0x0000, 0x0000}}, // 0x01cc (41 0x0029) + {0x15, 2, {0x004A, 0x030C, 0x0000}}, // 0x01f0 (42 0x002A) + {0x40, 2, {0x006A, 0x030C, 0x0000}}, // 0x01f0 (43 0x002B) + {0x6a, 1, {0x01F3, 0x0000, 0x0000}}, // 0x01f1 (44 0x002C) + {0x10, 1, {0x01F2, 0x0000, 0x0000}}, // 0x01f1 (45 0x002D) + {0x68, 1, {0x01F3, 0x0000, 0x0000}}, // 0x01f2 (46 0x002E) + {0x04, 1, {0x01F1, 0x0000, 0x0000}}, // 0x01f2 (47 0x002F) + {0x05, 1, {0x01F1, 0x0000, 0x0000}}, // 0x01f3 (48 0x0030) + {0x10, 1, {0x01F2, 0x0000, 0x0000}}, // 0x01f3 (49 0x0031) + {0x14, 1, {0x0399, 0x0000, 0x0000}}, // 0x0345 (50 0x0032) + {0x60, 1, {0x03B9, 0x0000, 0x0000}}, // 0x0345 (51 0x0033) + {0x15, 3, {0x0399, 0x0308, 0x0301}}, // 0x0390 (52 0x0034) + {0x40, 3, {0x03B9, 0x0308, 0x0301}}, // 0x0390 (53 0x0035) + {0x60, 1, {0x03C3, 0x0000, 0x0000}}, // 0x03a3 (54 0x0036) + {0x8a, 0, {0x0000, 0x0000, 0x0000}}, // 0x03a3 (55 0x0037) + {0x15, 3, {0x03A5, 0x0308, 0x0301}}, // 0x03b0 (56 0x0038) + {0x40, 3, {0x03C5, 0x0308, 0x0301}}, // 0x03b0 (57 0x0039) + {0x15, 1, {0x03A3, 0x0000, 0x0000}}, // 0x03c2 (58 0x003A) + {0x60, 1, {0x03C3, 0x0000, 0x0000}}, // 0x03c2 (59 0x003B) + {0x15, 1, {0x0392, 0x0000, 0x0000}}, // 0x03d0 (60 0x003C) + {0x60, 1, {0x03B2, 0x0000, 0x0000}}, // 0x03d0 (61 0x003D) + {0x15, 1, {0x0398, 0x0000, 0x0000}}, // 0x03d1 (62 0x003E) + {0x60, 1, {0x03B8, 0x0000, 0x0000}}, // 0x03d1 (63 0x003F) + {0x15, 1, {0x03A6, 0x0000, 0x0000}}, // 0x03d5 (64 0x0040) + {0x60, 1, {0x03C6, 0x0000, 0x0000}}, // 0x03d5 (65 0x0041) + {0x15, 1, {0x03A0, 0x0000, 0x0000}}, // 0x03d6 (66 0x0042) + {0x60, 1, {0x03C0, 0x0000, 0x0000}}, // 0x03d6 (67 0x0043) + {0x15, 1, {0x039A, 0x0000, 0x0000}}, // 0x03f0 (68 0x0044) + {0x60, 1, {0x03BA, 0x0000, 0x0000}}, // 0x03f0 (69 0x0045) + {0x15, 1, {0x03A1, 0x0000, 0x0000}}, // 0x03f1 (70 0x0046) + {0x60, 1, {0x03C1, 0x0000, 0x0000}}, // 0x03f1 (71 0x0047) + {0x15, 1, {0x03A3, 0x0000, 0x0000}}, // 0x03f2 (72 0x0048) -- not hit, but keep slot (tdf#97152) + {0x60, 1, {0x03C3, 0x0000, 0x0000}}, // 0x03f2 (73 0x0049) -- not hit, but keep slot (tdf#97152) + {0x15, 1, {0x0395, 0x0000, 0x0000}}, // 0x03f5 (74 0x004A) + {0x60, 1, {0x03B5, 0x0000, 0x0000}}, // 0x03f5 (75 0x004B) + {0x05, 2, {0x0535, 0x0552, 0x0000}}, // 0x0587 (76 0x004C) + {0x10, 2, {0x0535, 0x0582, 0x0000}}, // 0x0587 (77 0x004D) + {0x40, 2, {0x0565, 0x0582, 0x0000}}, // 0x0587 (78 0x004E) + {0x15, 2, {0x0048, 0x0331, 0x0000}}, // 0x1e96 (79 0x004F) + {0x40, 2, {0x0068, 0x0331, 0x0000}}, // 0x1e96 (80 0x0050) + {0x15, 2, {0x0054, 0x0308, 0x0000}}, // 0x1e97 (81 0x0051) + {0x40, 2, {0x0074, 0x0308, 0x0000}}, // 0x1e97 (82 0x0052) + {0x15, 2, {0x0057, 0x030A, 0x0000}}, // 0x1e98 (83 0x0053) + {0x40, 2, {0x0077, 0x030A, 0x0000}}, // 0x1e98 (84 0x0054) + {0x15, 2, {0x0059, 0x030A, 0x0000}}, // 0x1e99 (85 0x0055) + {0x40, 2, {0x0079, 0x030A, 0x0000}}, // 0x1e99 (86 0x0056) + {0x15, 2, {0x0041, 0x02BE, 0x0000}}, // 0x1e9a (87 0x0057) + {0x40, 2, {0x0061, 0x02BE, 0x0000}}, // 0x1e9a (88 0x0058) + {0x15, 1, {0x1E60, 0x0000, 0x0000}}, // 0x1e9b (89 0x0059) + {0x60, 1, {0x1E61, 0x0000, 0x0000}}, // 0x1e9b (90 0x005A) + {0x15, 2, {0x03A5, 0x0313, 0x0000}}, // 0x1f50 (91 0x005B) + {0x40, 2, {0x03C5, 0x0313, 0x0000}}, // 0x1f50 (92 0x005C) + {0x15, 3, {0x03A5, 0x0313, 0x0300}}, // 0x1f52 (93 0x005D) + {0x40, 3, {0x03C5, 0x0313, 0x0300}}, // 0x1f52 (94 0x005E) + {0x15, 3, {0x03A5, 0x0313, 0x0301}}, // 0x1f54 (95 0x005F) + {0x40, 3, {0x03C5, 0x0313, 0x0301}}, // 0x1f54 (96 0x0060) + {0x15, 3, {0x03A5, 0x0313, 0x0342}}, // 0x1f56 (97 0x0061) + {0x40, 3, {0x03C5, 0x0313, 0x0342}}, // 0x1f56 (98 0x0062) + {0x05, 2, {0x1F08, 0x0399, 0x0000}}, // 0x1f80 (99 0x0063) + {0x10, 1, {0x1F88, 0x0000, 0x0000}}, // 0x1f80 (100 0x0064) + {0x40, 2, {0x1F00, 0x03B9, 0x0000}}, // 0x1f80 (101 0x0065) + {0x05, 2, {0x1F09, 0x0399, 0x0000}}, // 0x1f81 (102 0x0066) + {0x10, 1, {0x1F89, 0x0000, 0x0000}}, // 0x1f81 (103 0x0067) + {0x40, 2, {0x1F01, 0x03B9, 0x0000}}, // 0x1f81 (104 0x0068) + {0x05, 2, {0x1F0A, 0x0399, 0x0000}}, // 0x1f82 (105 0x0069) + {0x10, 1, {0x1F8A, 0x0000, 0x0000}}, // 0x1f82 (106 0x006A) + {0x40, 2, {0x1F02, 0x03B9, 0x0000}}, // 0x1f82 (107 0x006B) + {0x05, 2, {0x1F0B, 0x0399, 0x0000}}, // 0x1f83 (108 0x006C) + {0x10, 1, {0x1F8B, 0x0000, 0x0000}}, // 0x1f83 (109 0x006D) + {0x40, 2, {0x1F03, 0x03B9, 0x0000}}, // 0x1f83 (110 0x006E) + {0x05, 2, {0x1F0C, 0x0399, 0x0000}}, // 0x1f84 (111 0x006F) + {0x10, 1, {0x1F8C, 0x0000, 0x0000}}, // 0x1f84 (112 0x0070) + {0x40, 2, {0x1F04, 0x03B9, 0x0000}}, // 0x1f84 (113 0x0071) + {0x05, 2, {0x1F0D, 0x0399, 0x0000}}, // 0x1f85 (114 0x0072) + {0x10, 1, {0x1F8D, 0x0000, 0x0000}}, // 0x1f85 (115 0x0073) + {0x40, 2, {0x1F05, 0x03B9, 0x0000}}, // 0x1f85 (116 0x0074) + {0x05, 2, {0x1F0E, 0x0399, 0x0000}}, // 0x1f86 (117 0x0075) + {0x10, 1, {0x1F8E, 0x0000, 0x0000}}, // 0x1f86 (118 0x0076) + {0x40, 2, {0x1F06, 0x03B9, 0x0000}}, // 0x1f86 (119 0x0077) + {0x05, 2, {0x1F0F, 0x0399, 0x0000}}, // 0x1f87 (120 0x0078) + {0x10, 1, {0x1F8F, 0x0000, 0x0000}}, // 0x1f87 (121 0x0079) + {0x40, 2, {0x1F07, 0x03B9, 0x0000}}, // 0x1f87 (122 0x007A) + {0x28, 1, {0x1F80, 0x0000, 0x0000}}, // 0x1f88 (123 0x007B) + {0x04, 2, {0x1F08, 0x0399, 0x0000}}, // 0x1f88 (124 0x007C) + {0x40, 2, {0x1F00, 0x03B9, 0x0000}}, // 0x1f88 (125 0x007D) + {0x28, 1, {0x1F81, 0x0000, 0x0000}}, // 0x1f89 (126 0x007E) + {0x04, 2, {0x1F09, 0x0399, 0x0000}}, // 0x1f89 (127 0x007F) + {0x40, 2, {0x1F01, 0x03B9, 0x0000}}, // 0x1f89 (128 0x0080) + {0x28, 1, {0x1F82, 0x0000, 0x0000}}, // 0x1f8a (129 0x0081) + {0x04, 2, {0x1F0A, 0x0399, 0x0000}}, // 0x1f8a (130 0x0082) + {0x40, 2, {0x1F02, 0x03B9, 0x0000}}, // 0x1f8a (131 0x0083) + {0x28, 1, {0x1F83, 0x0000, 0x0000}}, // 0x1f8b (132 0x0084) + {0x04, 2, {0x1F0B, 0x0399, 0x0000}}, // 0x1f8b (133 0x0085) + {0x40, 2, {0x1F03, 0x03B9, 0x0000}}, // 0x1f8b (134 0x0086) + {0x28, 1, {0x1F84, 0x0000, 0x0000}}, // 0x1f8c (135 0x0087) + {0x04, 2, {0x1F0C, 0x0399, 0x0000}}, // 0x1f8c (136 0x0088) + {0x40, 2, {0x1F04, 0x03B9, 0x0000}}, // 0x1f8c (137 0x0089) + {0x28, 1, {0x1F85, 0x0000, 0x0000}}, // 0x1f8d (138 0x008A) + {0x04, 2, {0x1F0D, 0x0399, 0x0000}}, // 0x1f8d (139 0x008B) + {0x40, 2, {0x1F05, 0x03B9, 0x0000}}, // 0x1f8d (140 0x008C) + {0x28, 1, {0x1F86, 0x0000, 0x0000}}, // 0x1f8e (141 0x008D) + {0x04, 2, {0x1F0E, 0x0399, 0x0000}}, // 0x1f8e (142 0x008E) + {0x40, 2, {0x1F06, 0x03B9, 0x0000}}, // 0x1f8e (143 0x008F) + {0x28, 1, {0x1F87, 0x0000, 0x0000}}, // 0x1f8f (144 0x0090) + {0x04, 2, {0x1F0F, 0x0399, 0x0000}}, // 0x1f8f (145 0x0091) + {0x40, 2, {0x1F07, 0x03B9, 0x0000}}, // 0x1f8f (146 0x0092) + {0x05, 2, {0x1F28, 0x0399, 0x0000}}, // 0x1f90 (147 0x0093) + {0x10, 1, {0x1F98, 0x0000, 0x0000}}, // 0x1f90 (148 0x0094) + {0x40, 2, {0x1F20, 0x03B9, 0x0000}}, // 0x1f90 (149 0x0095) + {0x05, 2, {0x1F29, 0x0399, 0x0000}}, // 0x1f91 (150 0x0096) + {0x10, 1, {0x1F99, 0x0000, 0x0000}}, // 0x1f91 (151 0x0097) + {0x40, 2, {0x1F21, 0x03B9, 0x0000}}, // 0x1f91 (152 0x0098) + {0x05, 2, {0x1F2A, 0x0399, 0x0000}}, // 0x1f92 (153 0x0099) + {0x10, 1, {0x1F9A, 0x0000, 0x0000}}, // 0x1f92 (154 0x009A) + {0x40, 2, {0x1F22, 0x03B9, 0x0000}}, // 0x1f92 (155 0x009B) + {0x05, 2, {0x1F2B, 0x0399, 0x0000}}, // 0x1f93 (156 0x009C) + {0x10, 1, {0x1F9B, 0x0000, 0x0000}}, // 0x1f93 (157 0x009D) + {0x40, 2, {0x1F23, 0x03B9, 0x0000}}, // 0x1f93 (158 0x009E) + {0x05, 2, {0x1F2C, 0x0399, 0x0000}}, // 0x1f94 (159 0x009F) + {0x10, 1, {0x1F9C, 0x0000, 0x0000}}, // 0x1f94 (160 0x00A0) + {0x40, 2, {0x1F24, 0x03B9, 0x0000}}, // 0x1f94 (161 0x00A1) + {0x05, 2, {0x1F2D, 0x0399, 0x0000}}, // 0x1f95 (162 0x00A2) + {0x10, 1, {0x1F9D, 0x0000, 0x0000}}, // 0x1f95 (163 0x00A3) + {0x40, 2, {0x1F25, 0x03B9, 0x0000}}, // 0x1f95 (164 0x00A4) + {0x05, 2, {0x1F2E, 0x0399, 0x0000}}, // 0x1f96 (165 0x00A5) + {0x10, 1, {0x1F9E, 0x0000, 0x0000}}, // 0x1f96 (166 0x00A6) + {0x40, 2, {0x1F26, 0x03B9, 0x0000}}, // 0x1f96 (167 0x00A7) + {0x05, 2, {0x1F2F, 0x0399, 0x0000}}, // 0x1f97 (168 0x00A8) + {0x10, 1, {0x1F9F, 0x0000, 0x0000}}, // 0x1f97 (169 0x00A9) + {0x40, 2, {0x1F27, 0x03B9, 0x0000}}, // 0x1f97 (170 0x00AA) + {0x28, 1, {0x1F90, 0x0000, 0x0000}}, // 0x1f98 (171 0x00AB) + {0x04, 2, {0x1F28, 0x0399, 0x0000}}, // 0x1f98 (172 0x00AC) + {0x40, 2, {0x1F20, 0x03B9, 0x0000}}, // 0x1f98 (173 0x00AD) + {0x28, 1, {0x1F91, 0x0000, 0x0000}}, // 0x1f99 (174 0x00AE) + {0x04, 2, {0x1F29, 0x0399, 0x0000}}, // 0x1f99 (175 0x00AF) + {0x40, 2, {0x1F21, 0x03B9, 0x0000}}, // 0x1f99 (176 0x00B0) + {0x28, 1, {0x1F92, 0x0000, 0x0000}}, // 0x1f9a (177 0x00B1) + {0x04, 2, {0x1F2A, 0x0399, 0x0000}}, // 0x1f9a (178 0x00B2) + {0x40, 2, {0x1F22, 0x03B9, 0x0000}}, // 0x1f9a (179 0x00B3) + {0x28, 1, {0x1F93, 0x0000, 0x0000}}, // 0x1f9b (180 0x00B4) + {0x04, 2, {0x1F2B, 0x0399, 0x0000}}, // 0x1f9b (181 0x00B5) + {0x40, 2, {0x1F23, 0x03B9, 0x0000}}, // 0x1f9b (182 0x00B6) + {0x28, 1, {0x1F94, 0x0000, 0x0000}}, // 0x1f9c (183 0x00B7) + {0x04, 2, {0x1F2C, 0x0399, 0x0000}}, // 0x1f9c (184 0x00B8) + {0x40, 2, {0x1F24, 0x03B9, 0x0000}}, // 0x1f9c (185 0x00B9) + {0x28, 1, {0x1F95, 0x0000, 0x0000}}, // 0x1f9d (186 0x00BA) + {0x04, 2, {0x1F2D, 0x0399, 0x0000}}, // 0x1f9d (187 0x00BB) + {0x40, 2, {0x1F25, 0x03B9, 0x0000}}, // 0x1f9d (188 0x00BC) + {0x28, 1, {0x1F96, 0x0000, 0x0000}}, // 0x1f9e (189 0x00BD) + {0x04, 2, {0x1F2E, 0x0399, 0x0000}}, // 0x1f9e (190 0x00BE) + {0x40, 2, {0x1F26, 0x03B9, 0x0000}}, // 0x1f9e (191 0x00BF) + {0x28, 1, {0x1F97, 0x0000, 0x0000}}, // 0x1f9f (192 0x00C0) + {0x04, 2, {0x1F2F, 0x0399, 0x0000}}, // 0x1f9f (193 0x00C1) + {0x40, 2, {0x1F27, 0x03B9, 0x0000}}, // 0x1f9f (194 0x00C2) + {0x05, 2, {0x1F68, 0x0399, 0x0000}}, // 0x1fa0 (195 0x00C3) + {0x10, 1, {0x1FA8, 0x0000, 0x0000}}, // 0x1fa0 (196 0x00C4) + {0x40, 2, {0x1F60, 0x03B9, 0x0000}}, // 0x1fa0 (197 0x00C5) + {0x05, 2, {0x1F69, 0x0399, 0x0000}}, // 0x1fa1 (198 0x00C6) + {0x10, 1, {0x1FA9, 0x0000, 0x0000}}, // 0x1fa1 (199 0x00C7) + {0x40, 2, {0x1F61, 0x03B9, 0x0000}}, // 0x1fa1 (200 0x00C8) + {0x05, 2, {0x1F6A, 0x0399, 0x0000}}, // 0x1fa2 (201 0x00C9) + {0x10, 1, {0x1FAA, 0x0000, 0x0000}}, // 0x1fa2 (202 0x00CA) + {0x40, 2, {0x1F62, 0x03B9, 0x0000}}, // 0x1fa2 (203 0x00CB) + {0x05, 2, {0x1F6B, 0x0399, 0x0000}}, // 0x1fa3 (204 0x00CC) + {0x10, 1, {0x1FAB, 0x0000, 0x0000}}, // 0x1fa3 (205 0x00CD) + {0x40, 2, {0x1F63, 0x03B9, 0x0000}}, // 0x1fa3 (206 0x00CE) + {0x05, 2, {0x1F6C, 0x0399, 0x0000}}, // 0x1fa4 (207 0x00CF) + {0x10, 1, {0x1FAC, 0x0000, 0x0000}}, // 0x1fa4 (208 0x00D0) + {0x40, 2, {0x1F64, 0x03B9, 0x0000}}, // 0x1fa4 (209 0x00D1) + {0x05, 2, {0x1F6D, 0x0399, 0x0000}}, // 0x1fa5 (210 0x00D2) + {0x10, 1, {0x1FAD, 0x0000, 0x0000}}, // 0x1fa5 (211 0x00D3) + {0x40, 2, {0x1F65, 0x03B9, 0x0000}}, // 0x1fa5 (212 0x00D4) + {0x05, 2, {0x1F6E, 0x0399, 0x0000}}, // 0x1fa6 (213 0x00D5) + {0x10, 1, {0x1FAE, 0x0000, 0x0000}}, // 0x1fa6 (214 0x00D6) + {0x40, 2, {0x1F66, 0x03B9, 0x0000}}, // 0x1fa6 (215 0x00D7) + {0x05, 2, {0x1F6F, 0x0399, 0x0000}}, // 0x1fa7 (216 0x00D8) + {0x10, 1, {0x1FAF, 0x0000, 0x0000}}, // 0x1fa7 (217 0x00D9) + {0x40, 2, {0x1F67, 0x03B9, 0x0000}}, // 0x1fa7 (218 0x00DA) + {0x28, 1, {0x1FA0, 0x0000, 0x0000}}, // 0x1fa8 (219 0x00DB) + {0x04, 2, {0x1F68, 0x0399, 0x0000}}, // 0x1fa8 (220 0x00DC) + {0x40, 2, {0x1F60, 0x03B9, 0x0000}}, // 0x1fa8 (221 0x00DD) + {0x28, 1, {0x1FA1, 0x0000, 0x0000}}, // 0x1fa9 (222 0x00DE) + {0x04, 2, {0x1F69, 0x0399, 0x0000}}, // 0x1fa9 (223 0x00DF) + {0x40, 2, {0x1F61, 0x03B9, 0x0000}}, // 0x1fa9 (224 0x00E0) + {0x28, 1, {0x1FA2, 0x0000, 0x0000}}, // 0x1faa (225 0x00E1) + {0x04, 2, {0x1F6A, 0x0399, 0x0000}}, // 0x1faa (226 0x00E2) + {0x40, 2, {0x1F62, 0x03B9, 0x0000}}, // 0x1faa (227 0x00E3) + {0x28, 1, {0x1FA3, 0x0000, 0x0000}}, // 0x1fab (228 0x00E4) + {0x04, 2, {0x1F6B, 0x0399, 0x0000}}, // 0x1fab (229 0x00E5) + {0x40, 2, {0x1F63, 0x03B9, 0x0000}}, // 0x1fab (230 0x00E6) + {0x28, 1, {0x1FA4, 0x0000, 0x0000}}, // 0x1fac (231 0x00E7) + {0x04, 2, {0x1F6C, 0x0399, 0x0000}}, // 0x1fac (232 0x00E8) + {0x40, 2, {0x1F64, 0x03B9, 0x0000}}, // 0x1fac (233 0x00E9) + {0x28, 1, {0x1FA5, 0x0000, 0x0000}}, // 0x1fad (234 0x00EA) + {0x04, 2, {0x1F6D, 0x0399, 0x0000}}, // 0x1fad (235 0x00EB) + {0x40, 2, {0x1F65, 0x03B9, 0x0000}}, // 0x1fad (236 0x00EC) + {0x28, 1, {0x1FA6, 0x0000, 0x0000}}, // 0x1fae (237 0x00ED) + {0x04, 2, {0x1F6E, 0x0399, 0x0000}}, // 0x1fae (238 0x00EE) + {0x40, 2, {0x1F66, 0x03B9, 0x0000}}, // 0x1fae (239 0x00EF) + {0x28, 1, {0x1FA7, 0x0000, 0x0000}}, // 0x1faf (240 0x00F0) + {0x04, 2, {0x1F6F, 0x0399, 0x0000}}, // 0x1faf (241 0x00F1) + {0x40, 2, {0x1F67, 0x03B9, 0x0000}}, // 0x1faf (242 0x00F2) + {0x05, 2, {0x1FBA, 0x0399, 0x0000}}, // 0x1fb2 (243 0x00F3) + {0x10, 2, {0x1FBA, 0x0345, 0x0000}}, // 0x1fb2 (244 0x00F4) + {0x40, 2, {0x1F70, 0x03B9, 0x0000}}, // 0x1fb2 (245 0x00F5) + {0x05, 2, {0x0391, 0x0399, 0x0000}}, // 0x1fb3 (246 0x00F6) + {0x10, 1, {0x1FBC, 0x0000, 0x0000}}, // 0x1fb3 (247 0x00F7) + {0x40, 2, {0x03B1, 0x03B9, 0x0000}}, // 0x1fb3 (248 0x00F8) + {0x05, 2, {0x0386, 0x0399, 0x0000}}, // 0x1fb4 (249 0x00F9) + {0x10, 2, {0x0386, 0x0345, 0x0000}}, // 0x1fb4 (250 0x00FA) + {0x40, 2, {0x03AC, 0x03B9, 0x0000}}, // 0x1fb4 (251 0x00FB) + {0x15, 2, {0x0391, 0x0342, 0x0000}}, // 0x1fb6 (252 0x00FC) + {0x40, 2, {0x03B1, 0x0342, 0x0000}}, // 0x1fb6 (253 0x00FD) + {0x05, 3, {0x0391, 0x0342, 0x0399}}, // 0x1fb7 (254 0x00FE) + {0x10, 3, {0x0391, 0x0342, 0x0345}}, // 0x1fb7 (255 0x00FF) + {0x40, 3, {0x03B1, 0x0342, 0x03B9}}, // 0x1fb7 (256 0x0100) + {0x28, 1, {0x1FB3, 0x0000, 0x0000}}, // 0x1fbc (257 0x0101) + {0x04, 2, {0x0391, 0x0399, 0x0000}}, // 0x1fbc (258 0x0102) + {0x40, 2, {0x03B1, 0x03B9, 0x0000}}, // 0x1fbc (259 0x0103) + {0x15, 1, {0x0399, 0x0000, 0x0000}}, // 0x1fbe (260 0x0104) + {0x60, 1, {0x03B9, 0x0000, 0x0000}}, // 0x1fbe (261 0x0105) + {0x05, 2, {0x1FCA, 0x0399, 0x0000}}, // 0x1fc2 (262 0x0106) + {0x10, 2, {0x1FCA, 0x0345, 0x0000}}, // 0x1fc2 (263 0x0107) + {0x40, 2, {0x1F74, 0x03B9, 0x0000}}, // 0x1fc2 (264 0x0108) + {0x05, 2, {0x0397, 0x0399, 0x0000}}, // 0x1fc3 (265 0x0109) + {0x10, 1, {0x1FCC, 0x0000, 0x0000}}, // 0x1fc3 (266 0x010A) + {0x40, 2, {0x03B7, 0x03B9, 0x0000}}, // 0x1fc3 (267 0x010B) + {0x05, 2, {0x0389, 0x0399, 0x0000}}, // 0x1fc4 (268 0x010C) + {0x10, 2, {0x0389, 0x0345, 0x0000}}, // 0x1fc4 (269 0x010D) + {0x40, 2, {0x03AE, 0x03B9, 0x0000}}, // 0x1fc4 (270 0x010E) + {0x15, 2, {0x0397, 0x0342, 0x0000}}, // 0x1fc6 (271 0x010F) + {0x40, 2, {0x03B7, 0x0342, 0x0000}}, // 0x1fc6 (272 0x0110) + {0x05, 3, {0x0397, 0x0342, 0x0399}}, // 0x1fc7 (273 0x0111) + {0x10, 3, {0x0397, 0x0342, 0x0345}}, // 0x1fc7 (274 0x0112) + {0x40, 3, {0x03B7, 0x0342, 0x03B9}}, // 0x1fc7 (275 0x0113) + {0x28, 1, {0x1FC3, 0x0000, 0x0000}}, // 0x1fcc (276 0x0114) + {0x04, 2, {0x0397, 0x0399, 0x0000}}, // 0x1fcc (277 0x0115) + {0x40, 2, {0x03B7, 0x03B9, 0x0000}}, // 0x1fcc (278 0x0116) + {0x15, 3, {0x0399, 0x0308, 0x0300}}, // 0x1fd2 (279 0x0117) + {0x40, 3, {0x03B9, 0x0308, 0x0300}}, // 0x1fd2 (280 0x0118) + {0x15, 3, {0x0399, 0x0308, 0x0301}}, // 0x1fd3 (281 0x0119) + {0x40, 3, {0x03B9, 0x0308, 0x0301}}, // 0x1fd3 (282 0x011A) + {0x15, 2, {0x0399, 0x0342, 0x0000}}, // 0x1fd6 (283 0x011B) + {0x40, 2, {0x03B9, 0x0342, 0x0000}}, // 0x1fd6 (284 0x011C) + {0x15, 3, {0x0399, 0x0308, 0x0342}}, // 0x1fd7 (285 0x011D) + {0x40, 3, {0x03B9, 0x0308, 0x0342}}, // 0x1fd7 (286 0x011E) + {0x15, 3, {0x03A5, 0x0308, 0x0300}}, // 0x1fe2 (287 0x011F) + {0x40, 3, {0x03C5, 0x0308, 0x0300}}, // 0x1fe2 (288 0x0120) + {0x15, 3, {0x03A5, 0x0308, 0x0301}}, // 0x1fe3 (289 0x0121) + {0x40, 3, {0x03C5, 0x0308, 0x0301}}, // 0x1fe3 (290 0x0122) + {0x15, 2, {0x03A1, 0x0313, 0x0000}}, // 0x1fe4 (291 0x0123) + {0x40, 2, {0x03C1, 0x0313, 0x0000}}, // 0x1fe4 (292 0x0124) + {0x15, 2, {0x03A5, 0x0342, 0x0000}}, // 0x1fe6 (293 0x0125) + {0x40, 2, {0x03C5, 0x0342, 0x0000}}, // 0x1fe6 (294 0x0126) + {0x15, 3, {0x03A5, 0x0308, 0x0342}}, // 0x1fe7 (295 0x0127) + {0x40, 3, {0x03C5, 0x0308, 0x0342}}, // 0x1fe7 (296 0x0128) + {0x05, 2, {0x1FFA, 0x0399, 0x0000}}, // 0x1ff2 (297 0x0129) + {0x10, 2, {0x1FFA, 0x0345, 0x0000}}, // 0x1ff2 (298 0x012A) + {0x40, 2, {0x1F7C, 0x03B9, 0x0000}}, // 0x1ff2 (299 0x012B) + {0x05, 2, {0x03A9, 0x0399, 0x0000}}, // 0x1ff3 (300 0x012C) + {0x10, 1, {0x1FFC, 0x0000, 0x0000}}, // 0x1ff3 (301 0x012D) + {0x40, 2, {0x03C9, 0x03B9, 0x0000}}, // 0x1ff3 (302 0x012E) + {0x05, 2, {0x038F, 0x0399, 0x0000}}, // 0x1ff4 (303 0x012F) + {0x10, 2, {0x038F, 0x0345, 0x0000}}, // 0x1ff4 (304 0x0130) + {0x40, 2, {0x03CE, 0x03B9, 0x0000}}, // 0x1ff4 (305 0x0131) + {0x15, 2, {0x03A9, 0x0342, 0x0000}}, // 0x1ff6 (306 0x0132) + {0x40, 2, {0x03C9, 0x0342, 0x0000}}, // 0x1ff6 (307 0x0133) + {0x05, 3, {0x03A9, 0x0342, 0x0399}}, // 0x1ff7 (308 0x0134) + {0x10, 3, {0x03A9, 0x0342, 0x0345}}, // 0x1ff7 (309 0x0135) + {0x40, 3, {0x03C9, 0x0342, 0x03B9}}, // 0x1ff7 (310 0x0136) + {0x28, 1, {0x1FF3, 0x0000, 0x0000}}, // 0x1ffc (311 0x0137) + {0x04, 2, {0x03A9, 0x0399, 0x0000}}, // 0x1ffc (312 0x0138) + {0x40, 2, {0x03C9, 0x03B9, 0x0000}}, // 0x1ffc (313 0x0139) + {0x05, 2, {0x0046, 0x0046, 0x0000}}, // 0xfb00 (314 0x013A) + {0x10, 2, {0x0046, 0x0066, 0x0000}}, // 0xfb00 (315 0x013B) + {0x40, 2, {0x0066, 0x0066, 0x0000}}, // 0xfb00 (316 0x013C) + {0x05, 2, {0x0046, 0x0049, 0x0000}}, // 0xfb01 (317 0x013D) + {0x10, 2, {0x0046, 0x0069, 0x0000}}, // 0xfb01 (318 0x013E) + {0x40, 2, {0x0066, 0x0069, 0x0000}}, // 0xfb01 (319 0x013F) + {0x05, 2, {0x0046, 0x004C, 0x0000}}, // 0xfb02 (320 0x0140) + {0x10, 2, {0x0046, 0x006C, 0x0000}}, // 0xfb02 (321 0x0141) + {0x40, 2, {0x0066, 0x006C, 0x0000}}, // 0xfb02 (322 0x0142) + {0x05, 3, {0x0046, 0x0046, 0x0049}}, // 0xfb03 (323 0x0143) + {0x10, 3, {0x0046, 0x0066, 0x0069}}, // 0xfb03 (324 0x0144) + {0x40, 3, {0x0066, 0x0066, 0x0069}}, // 0xfb03 (325 0x0145) + {0x05, 3, {0x0046, 0x0046, 0x004C}}, // 0xfb04 (326 0x0146) + {0x10, 3, {0x0046, 0x0066, 0x006C}}, // 0xfb04 (327 0x0147) + {0x40, 3, {0x0066, 0x0066, 0x006C}}, // 0xfb04 (328 0x0148) + {0x05, 2, {0x0053, 0x0054, 0x0000}}, // 0xfb05 (329 0x0149) + {0x10, 2, {0x0053, 0x0074, 0x0000}}, // 0xfb05 (330 0x014A) + {0x40, 2, {0x0073, 0x0074, 0x0000}}, // 0xfb05 (331 0x014B) + {0x05, 2, {0x0053, 0x0054, 0x0000}}, // 0xfb06 (332 0x014C) + {0x10, 2, {0x0053, 0x0074, 0x0000}}, // 0xfb06 (333 0x014D) + {0x40, 2, {0x0073, 0x0074, 0x0000}}, // 0xfb06 (334 0x014E) + {0x05, 2, {0x0544, 0x0546, 0x0000}}, // 0xfb13 (335 0x014F) + {0x10, 2, {0x0544, 0x0576, 0x0000}}, // 0xfb13 (336 0x0150) + {0x40, 2, {0x0574, 0x0576, 0x0000}}, // 0xfb13 (337 0x0151) + {0x05, 2, {0x0544, 0x0535, 0x0000}}, // 0xfb14 (338 0x0152) + {0x10, 2, {0x0544, 0x0565, 0x0000}}, // 0xfb14 (339 0x0153) + {0x40, 2, {0x0574, 0x0565, 0x0000}}, // 0xfb14 (340 0x0154) + {0x05, 2, {0x0544, 0x053B, 0x0000}}, // 0xfb15 (341 0x0155) + {0x10, 2, {0x0544, 0x056B, 0x0000}}, // 0xfb15 (342 0x0156) + {0x40, 2, {0x0574, 0x056B, 0x0000}}, // 0xfb15 (343 0x0157) + {0x05, 2, {0x054E, 0x0546, 0x0000}}, // 0xfb16 (344 0x0158) + {0x10, 2, {0x054E, 0x0576, 0x0000}}, // 0xfb16 (345 0x0159) + {0x40, 2, {0x057E, 0x0576, 0x0000}}, // 0xfb16 (346 0x015A) + {0x05, 2, {0x0544, 0x053D, 0x0000}}, // 0xfb17 (347 0x015B) + {0x10, 2, {0x0544, 0x056D, 0x0000}}, // 0xfb17 (348 0x015C) + {0x40, 2, {0x0574, 0x056D, 0x0000}}, // 0xfb17 (349 0x015D) + {0x2a, 1, {0x00DF, 0x0000, 0x0000}}, // 0x1e9e (350 0x015E) + {0x40, 2, {0x0073, 0x0073, 0x0000}}, // 0x1e9e (351 0x015F) +}; + +/* Following code need special handling + 0x0069, 0x00CC, 0x00CD, 0x0128, 0x012E, 0x0130, 0x0049, 0x004A, 0x0307, 0x03A3, +*/ + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/oneToOneMapping.cxx b/i18nutil/source/utility/oneToOneMapping.cxx new file mode 100644 index 0000000000..fbb7054d91 --- /dev/null +++ b/i18nutil/source/utility/oneToOneMapping.cxx @@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <i18nutil/oneToOneMapping.hxx> + +namespace i18nutil { + +oneToOneMapping::oneToOneMapping( OneToOneMappingTable_t const *rpTable, const size_t rnBytes, const size_t rnUnitSize ) + : mpTable( rpTable ), + mnSize( rnBytes / rnUnitSize ) +{ +} + +oneToOneMapping::~oneToOneMapping() +{ +} + +sal_Unicode oneToOneMapping::find(const sal_Unicode nKey) const +{ + if( mpTable ) + { + // binary search + int bottom = 0; + int top = mnSize - 1; + + for (;;) { + const int current = (top + bottom) / 2; + if( nKey < mpTable[current].first ) + top = current - 1; + else if( nKey > mpTable[current].first ) + bottom = current + 1; + else + return mpTable[current].second; + + if( bottom > top ) + return nKey; + } + } + else + return nKey; +} + +oneToOneMappingWithFlag::oneToOneMappingWithFlag( UnicodePairWithFlag const *rpTableWF, const size_t rnSize, const UnicodePairFlag rnFlag ) + : oneToOneMapping( nullptr, rnSize, sizeof(UnicodePairWithFlag) ), + mpTableWF ( rpTableWF ), + mnFlag ( rnFlag ), + mbHasIndex( false ) +{ +} + +oneToOneMappingWithFlag::~oneToOneMappingWithFlag() +{ +} + +void oneToOneMappingWithFlag::makeIndex() +{ + if( mbHasIndex || !mpTableWF ) + return; + + int current = -1; + + for( size_t k = 0; k < mnSize; k++ ) + { + const int high = (mpTableWF[k].first >> 8) & 0xFF; + const int low = (mpTableWF[k].first) & 0xFF; + if( high != current ) + { + current = high; + mpIndex[high].reset(new UnicodePairWithFlag const *[256]); + + for (int j = 0; j < 256; ++j) + mpIndex[high][j] = nullptr; + } + mpIndex[high][low] = &mpTableWF[k]; + } + + mbHasIndex = true; +} + +sal_Unicode oneToOneMappingWithFlag::find( const sal_Unicode nKey ) const +{ + if( mpTableWF ) + { + if( mbHasIndex ) + { + // index search + int high, low; + high = (nKey >> 8) & 0xFF; + low = nKey & 0xFF; + if( mpIndex[high] != nullptr && + mpIndex[high][low] != nullptr && + mpIndex[high][low]->flag & mnFlag ) + return mpIndex[high][low]->second; + else + return nKey; + } + else + { + // binary search + int bottom = 0; + int top = mnSize - 1; + + for (;;) { + const int current = (top + bottom) / 2; + if( nKey < mpTableWF[current].first ) + top = current - 1; + else if( nKey > mpTableWF[current].first ) + bottom = current + 1; + else + { + if( mpTableWF[current].flag & mnFlag ) + return mpTableWF[current].second; + else + return nKey; + } + + if( bottom > top ) + return nKey; + } + } + } + else + return nKey; +} + + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/paper.cxx b/i18nutil/source/utility/paper.cxx new file mode 100644 index 0000000000..399b3295ed --- /dev/null +++ b/i18nutil/source/utility/paper.cxx @@ -0,0 +1,499 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + + +#include <officecfg/Setup.hxx> +#include <officecfg/System.hxx> +#include <sal/config.h> +#include <sal/macros.h> +#include <rtl/ustring.hxx> +#include <rtl/string.hxx> +#include <tools/long.hxx> + +#include <i18nutil/paper.hxx> + +#include <unotools/configmgr.hxx> +#include <com/sun/star/lang/Locale.hpp> + +#ifdef UNX +#include <stdio.h> +#include <locale.h> +#if defined(LC_PAPER) && defined(_GNU_SOURCE) +#include <langinfo.h> +#endif +#endif + +namespace { + +struct PageDesc +{ + tools::Long m_nWidth; + tools::Long m_nHeight; + const char *m_pPSName; + const char *m_pAltPSName; +}; + +} + +#define PT2MM100( v ) \ + tools::Long(((v) * 35.27777778) + 0.5) + +#define IN2MM100( v ) \ + (tools::Long(((v) * 2540) + 0.5)) + +#define MM2MM100( v ) \ + (tools::Long((v) * 100)) + +//PostScript Printer Description File Format Specification +//http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf +//https://web.archive.org/web/20040912070512/http://www.y-adagio.com/public/committees/docsii/doc_00-49/symp_ulaan/china_ppr.pdf (Kai) +//http://www.sls.psi.ch/controls/help/howto/Howto_Print_a_A0_Poster_at_WSLA_012_2.pdf (Dia) + +//!! The order of these entries must correspond to enum Paper in <i18nutil/paper.hxx> + +// see XclPaperSize pPaperSizeTable in calc and ApiPaperSize in filter +const PageDesc aDinTab[] = +{ + { MM2MM100( 841 ), MM2MM100( 1189 ), "A0", nullptr }, + { MM2MM100( 594 ), MM2MM100( 841 ), "A1", nullptr }, + { MM2MM100( 420 ), MM2MM100( 594 ), "A2", nullptr }, + { MM2MM100( 297 ), MM2MM100( 420 ), "A3", nullptr }, + { MM2MM100( 210 ), MM2MM100( 297 ), "A4", nullptr }, + { MM2MM100( 148 ), MM2MM100( 210 ), "A5", nullptr }, + { MM2MM100( 250 ), MM2MM100( 353 ), "ISOB4", nullptr }, + { MM2MM100( 176 ), MM2MM100( 250 ), "ISOB5", nullptr }, + { IN2MM100( 8.5 ), IN2MM100( 11 ), "Letter", "Note" }, + { IN2MM100( 8.5 ), IN2MM100( 14 ), "Legal", nullptr }, + { IN2MM100( 11 ), IN2MM100( 17 ), "Tabloid", "11x17" }, + { 0, 0, nullptr, nullptr }, //User + { MM2MM100( 125 ), MM2MM100( 176 ), "ISOB6", nullptr }, + { MM2MM100( 229 ), MM2MM100( 324 ), "EnvC4", "C4" }, + { MM2MM100( 162 ), MM2MM100( 229 ), "EnvC5", "C5" }, + { MM2MM100( 114 ), MM2MM100( 162 ), "EnvC6", "C6" }, + { MM2MM100( 114 ), MM2MM100( 229 ), "EnvC65", nullptr }, + { MM2MM100( 110 ), MM2MM100( 220 ), "EnvDL", "DL" }, + { MM2MM100( 180), MM2MM100( 270 ), nullptr, nullptr }, //Dia + { MM2MM100( 210), MM2MM100( 280 ), nullptr, nullptr }, //Screen 4:3 + { IN2MM100( 17 ), IN2MM100( 22 ), "AnsiC", "CSheet" }, + { IN2MM100( 22 ), IN2MM100( 34 ), "AnsiD", "DSheet" }, + { IN2MM100( 34 ), IN2MM100( 44 ), "AnsiE", "ESheet" }, + { IN2MM100( 7.25 ), IN2MM100( 10.5 ), "Executive", nullptr }, + //"Folio" is a different size in the PPD documentation than 8.5x11 + //This "FanFoldGermanLegal" is known in the Philippines as + //"Legal" paper or "Long Bond Paper". The "Legal" name causing untold + //misery, given the differently sized US "Legal" paper + { IN2MM100( 8.5 ), IN2MM100( 13 ), "FanFoldGermanLegal", nullptr }, + { IN2MM100( 3.875 ), IN2MM100( 7.5 ), "EnvMonarch", "Monarch" }, + { IN2MM100( 3.625 ), IN2MM100( 6.5 ), "EnvPersonal", "Personal" }, + { IN2MM100( 3.875 ), IN2MM100( 8.875 ), "Env9", nullptr }, + { IN2MM100( 4.125 ), IN2MM100( 9.5 ), "Env10", "Comm10" }, + { IN2MM100( 4.5 ), IN2MM100( 10.375 ), "Env11", nullptr }, + { IN2MM100( 4.75 ), IN2MM100( 11 ), "Env12", nullptr }, + { MM2MM100( 184 ), MM2MM100( 260 ), nullptr, nullptr }, //Kai16 / 16k + { MM2MM100( 130 ), MM2MM100( 184 ), nullptr, nullptr }, //Kai32 + { MM2MM100( 140 ), MM2MM100( 203 ), nullptr, nullptr }, //BigKai32 + { MM2MM100( 257 ), MM2MM100( 364 ), "B4", nullptr }, //JIS + { MM2MM100( 182 ), MM2MM100( 257 ), "B5", nullptr }, //JIS + { MM2MM100( 128 ), MM2MM100( 182 ), "B6", nullptr }, //JIS + { IN2MM100( 17 ), IN2MM100( 11 ), "Ledger", nullptr }, + { IN2MM100( 5.5 ), IN2MM100( 8.5 ), "Statement", nullptr }, + { PT2MM100( 610 ), PT2MM100( 780 ), "Quarto", nullptr }, + { IN2MM100( 10 ), IN2MM100( 14 ), "10x14", nullptr }, + { IN2MM100( 5.5 ), IN2MM100( 11.5 ), "Env14", nullptr }, + { MM2MM100( 324 ), MM2MM100( 458 ), "EnvC3", "C3" }, + { MM2MM100( 110 ), MM2MM100( 230 ), "EnvItalian", nullptr }, + { IN2MM100( 14.875 ),IN2MM100( 11 ), "FanFoldUS", nullptr }, + { IN2MM100( 8.5 ), IN2MM100( 13 ), "FanFoldGerman", nullptr }, + { MM2MM100( 100 ), MM2MM100( 148 ), "Postcard", nullptr }, + { IN2MM100( 9 ), IN2MM100( 11 ), "9x11", nullptr }, + { IN2MM100( 10 ), IN2MM100( 11 ), "10x11", nullptr }, + { IN2MM100( 15 ), IN2MM100( 11 ), "15x11", nullptr }, + { MM2MM100( 220 ), MM2MM100( 220 ), "EnvInvite", nullptr }, + { MM2MM100( 227 ), MM2MM100( 356 ), "SuperA", nullptr }, + { MM2MM100( 305 ), MM2MM100( 487 ), "SuperB", nullptr }, + { IN2MM100( 8.5 ), IN2MM100( 12.69 ), "LetterPlus", nullptr }, + { MM2MM100( 210 ), MM2MM100( 330 ), "A4Plus", nullptr }, + { MM2MM100( 200 ), MM2MM100( 148 ), "DoublePostcard", nullptr }, + { MM2MM100( 105 ), MM2MM100( 148 ), "A6", nullptr }, + { IN2MM100( 12 ), IN2MM100( 11 ), "12x11", nullptr }, + { MM2MM100( 74 ), MM2MM100( 105 ), "A7", nullptr }, + { MM2MM100( 52 ), MM2MM100( 74 ), "A8", nullptr }, + { MM2MM100( 37 ), MM2MM100( 52 ), "A9", nullptr }, + { MM2MM100( 26 ), MM2MM100( 37 ), "A10", nullptr }, + { MM2MM100( 1000 ), MM2MM100( 1414 ), "ISOB0", nullptr }, + { MM2MM100( 707 ), MM2MM100( 1000 ), "ISOB1", nullptr }, + { MM2MM100( 500 ), MM2MM100( 707 ), "ISOB2", nullptr }, + { MM2MM100( 353 ), MM2MM100( 500 ), "ISOB3", nullptr }, + { MM2MM100( 88 ), MM2MM100( 125 ), "ISOB7", nullptr }, + { MM2MM100( 62 ), MM2MM100( 88 ), "ISOB8", nullptr }, + { MM2MM100( 44 ), MM2MM100( 62 ), "ISOB9", nullptr }, + { MM2MM100( 31 ), MM2MM100( 44 ), "ISOB10", nullptr }, + { MM2MM100( 458 ), MM2MM100( 648 ), "EnvC2", "C2" }, + { MM2MM100( 81 ), MM2MM100( 114 ), "EnvC7", "C7" }, + { MM2MM100( 57 ), MM2MM100( 81 ), "EnvC8", "C8" }, + { IN2MM100( 9 ), IN2MM100( 12 ), "ARCHA", nullptr }, + { IN2MM100( 12 ), IN2MM100( 18 ), "ARCHB", nullptr }, + { IN2MM100( 18 ), IN2MM100( 24 ), "ARCHC", nullptr }, + { IN2MM100( 24 ), IN2MM100( 36 ), "ARCHD", nullptr }, + { IN2MM100( 36 ), IN2MM100( 48 ), "ARCHE", nullptr }, + { MM2MM100( 157.5), MM2MM100( 280 ), nullptr, nullptr }, //Screen 16:9 + { MM2MM100( 175 ), MM2MM100( 280 ), nullptr, nullptr }, //Screen 16:10 + { MM2MM100( 195 ), MM2MM100( 270 ), nullptr, nullptr }, // 16k + { MM2MM100( 197 ), MM2MM100( 273 ), nullptr, nullptr }, // 16k + { IN2MM100( 7.5 ), IN2MM100( 13.333 ), nullptr, nullptr }, //PowerPoint Widescreen + { IN2MM100( 7.5 ), IN2MM100( 10 ), nullptr, nullptr }, //PowerPoint On-screen Show (4:3) + { IN2MM100( 5.625 ), IN2MM100( 10 ), nullptr, nullptr }, //PowerPoint On-screen Show (16:9) + { IN2MM100( 6.25 ), IN2MM100( 10 ), nullptr, nullptr } //PowerPoint On-screen Show (16:10) + +}; + +const size_t nTabSize = SAL_N_ELEMENTS(aDinTab); + +// tdf#151107 make this not just large enough for rounding errors on our side +// but also large enough to match where the ppd side rounded up to the next +// point. Seen with C5/C6/C65 envelopes which can be found over 1 point away +// from the values in aDinTab +#define MAXSLOPPY PT2MM100(1.25) + +void PaperInfo::doSloppyFit(bool bAlsoTryRotated) +{ + if (m_eType != PAPER_USER) + return; + + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (i == PAPER_USER) continue; + + tools::Long lDiffW = std::abs(aDinTab[i].m_nWidth - m_nPaperWidth); + tools::Long lDiffH = std::abs(aDinTab[i].m_nHeight - m_nPaperHeight); + + if (lDiffW < MAXSLOPPY && lDiffH < MAXSLOPPY) + { + m_nPaperWidth = aDinTab[i].m_nWidth; + m_nPaperHeight = aDinTab[i].m_nHeight; + m_eType = static_cast<Paper>(i); + return; + } + } + + if (bAlsoTryRotated) + { + std::swap(m_nPaperWidth, m_nPaperHeight); + doSloppyFit(); + std::swap(m_nPaperWidth, m_nPaperHeight); + } +} + +bool PaperInfo::sloppyEqual(const PaperInfo &rOther) const +{ + return + ( + (std::abs(m_nPaperWidth - rOther.m_nPaperWidth) < MAXSLOPPY) && + (std::abs(m_nPaperHeight - rOther.m_nPaperHeight) < MAXSLOPPY) + ); +} + +tools::Long PaperInfo::sloppyFitPageDimension(tools::Long nDimension) +{ + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (i == PAPER_USER) continue; + tools::Long lDiff; + + lDiff = std::abs(aDinTab[i].m_nWidth - nDimension); + if ( lDiff < MAXSLOPPY ) + return aDinTab[i].m_nWidth; + + lDiff = std::abs(aDinTab[i].m_nHeight - nDimension); + if ( lDiff < MAXSLOPPY ) + return aDinTab[i].m_nHeight; + } + return nDimension; +} + +PaperInfo PaperInfo::getSystemDefaultPaper() +{ + if (utl::ConfigManager::IsFuzzing()) + return PaperInfo(PAPER_A4); + + OUString aLocaleStr = officecfg::Setup::L10N::ooSetupSystemLocale::get(); + +#ifdef UNX + // if set to "use system", get papersize from system + if (aLocaleStr.isEmpty()) + { + static bool bInitialized = false; + static PaperInfo aInstance(PAPER_A4); + + if (bInitialized) + return aInstance; + +#if ! defined(MACOSX) && ! defined(EMSCRIPTEN) + // try libpaper + // #i78617# workaround missing paperconf command + FILE* pPipe = popen( "paperconf 2>/dev/null", "r" ); + if( pPipe ) + { + Paper ePaper = PAPER_USER; + + char aBuffer[ 1024 ]; + aBuffer[0] = 0; + char *pBuffer = fgets( aBuffer, sizeof(aBuffer), pPipe ); + bool bOk = pclose(pPipe) == 0; + + if (bOk && pBuffer && *pBuffer != 0) + { + OString aPaper(pBuffer); + aPaper = aPaper.trim(); + static const struct { const char *pName; Paper ePaper; } aCustoms [] = + { + { "B0", PAPER_B0_ISO }, + { "B1", PAPER_B1_ISO }, + { "B2", PAPER_B2_ISO }, + { "B3", PAPER_B3_ISO }, + { "B4", PAPER_B4_ISO }, + { "B5", PAPER_B5_ISO }, + { "B6", PAPER_B6_ISO }, + { "B7", PAPER_B7_ISO }, + { "B8", PAPER_B8_ISO }, + { "B9", PAPER_B9_ISO }, + { "B10", PAPER_B10_ISO }, + { "folio", PAPER_FANFOLD_LEGAL_DE }, + { "flsa", PAPER_FANFOLD_LEGAL_DE }, + { "flse", PAPER_FANFOLD_LEGAL_DE } + }; + + bool bHalve = false; + + size_t const nExtraTabSize = SAL_N_ELEMENTS(aCustoms); + for (size_t i = 0; i < nExtraTabSize; ++i) + { + if (rtl_str_compareIgnoreAsciiCase(aCustoms[i].pName, aPaper.getStr()) == 0) + { + ePaper = aCustoms[i].ePaper; + break; + } + } + + if (ePaper == PAPER_USER) + { + bHalve = aPaper.startsWith("half", &aPaper); + ePaper = PaperInfo::fromPSName(aPaper); + } + + if (ePaper != PAPER_USER) + { + aInstance = PaperInfo(ePaper); + if (bHalve) + aInstance = PaperInfo(aInstance.getHeight()/2, aInstance.getWidth()); + bInitialized = true; + return aInstance; + } + } + } +#endif + +// _NL_PAPER_WIDTH / HEIGHT not available with android unified headers +#if defined(LC_PAPER) && defined(_GNU_SOURCE) && !defined(ANDROID) + // try LC_PAPER + locale_t loc = newlocale(LC_PAPER_MASK, "", static_cast<locale_t>(0)); + if (loc != static_cast<locale_t>(0)) + { + union paperword { char *string; int word; }; + paperword w, h; + w.string = nl_langinfo_l(_NL_PAPER_WIDTH, loc); + h.string = nl_langinfo_l(_NL_PAPER_HEIGHT, loc); + + freelocale(loc); + + //glibc stores sizes as integer mm units + w.word *= 100; + h.word *= 100; + + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (i == PAPER_USER) continue; + + //glibc stores sizes as integer mm units, and so is inaccurate. + //To find a standard paper size we calculate the standard paper + //sizes into equally inaccurate mm and compare + tools::Long width = (aDinTab[i].m_nWidth + 50) / 100; + tools::Long height = (aDinTab[i].m_nHeight + 50) / 100; + + if (width == w.word/100 && height == h.word/100) + { + w.word = aDinTab[i].m_nWidth; + h.word = aDinTab[i].m_nHeight; + break; + } + } + + aInstance = PaperInfo(w.word, h.word); + bInitialized = true; + return aInstance; + } +#endif + } +#endif + + // if set to "use system", try to get locale from system + if (aLocaleStr.isEmpty()) + aLocaleStr = officecfg::System::L10N::Locale::get(); + + static constexpr OUStringLiteral EN_US = u"en-US"; + if (aLocaleStr.isEmpty()) + aLocaleStr = EN_US; + + // convert locale string to locale struct + css::lang::Locale aSysLocale; + sal_Int32 nDashPos = aLocaleStr.indexOf( '-' ); + if( nDashPos < 0 ) nDashPos = aLocaleStr.getLength(); + aSysLocale.Language = aLocaleStr.copy( 0, nDashPos ); + if( nDashPos + 1 < aLocaleStr.getLength() ) + aSysLocale.Country = aLocaleStr.copy( nDashPos + 1 ); + + return PaperInfo::getDefaultPaperForLocale(aSysLocale); +} + +PaperInfo::PaperInfo(Paper eType) : m_eType(eType) +{ + static_assert( SAL_N_ELEMENTS(aDinTab) == NUM_PAPER_ENTRIES, + "mismatch between array entries and enum values" ); + + m_nPaperWidth = aDinTab[m_eType].m_nWidth; + m_nPaperHeight = aDinTab[m_eType].m_nHeight; +} + +PaperInfo::PaperInfo(tools::Long nPaperWidth, tools::Long nPaperHeight) + : m_eType(PAPER_USER), + m_nPaperWidth(nPaperWidth), + m_nPaperHeight(nPaperHeight) +{ + for ( size_t i = 0; i < nTabSize; ++i ) + { + if ( + (nPaperWidth == aDinTab[i].m_nWidth) && + (nPaperHeight == aDinTab[i].m_nHeight) + ) + { + m_eType = static_cast<Paper>(i); + break; + } + } +} + +OString PaperInfo::toPSName(Paper ePaper) +{ + return static_cast<size_t>(ePaper) < nTabSize && aDinTab[ePaper].m_pPSName ? OString(aDinTab[ePaper].m_pPSName) : OString(); +} + +Paper PaperInfo::fromPSName(const OString &rName) +{ + if (rName.isEmpty()) + return PAPER_USER; + + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (aDinTab[i].m_pPSName && + !rtl_str_compareIgnoreAsciiCase(aDinTab[i].m_pPSName, rName.getStr())) + { + return static_cast<Paper>(i); + } + else if (aDinTab[i].m_pAltPSName && + !rtl_str_compareIgnoreAsciiCase(aDinTab[i].m_pAltPSName, rName.getStr())) + { + return static_cast<Paper>(i); + } + } + + return PAPER_USER; +} + +//http://wiki.openoffice.org/wiki/DefaultPaperSize +//http://www.unicode.org/cldr/data/charts/supplemental/territory_language_information.html +//http://sourceware.org/git/?p=glibc.git;a=tree;f=localedata/locales +//http://en.wikipedia.org/wiki/Paper_size +//http://msdn.microsoft.com/en-us/library/cc195164.aspx +PaperInfo PaperInfo::getDefaultPaperForLocale( const css::lang::Locale & rLocale ) +{ + Paper eType = PAPER_A4; + + if ( + //United States, Letter + rLocale.Country == "US" || + //Puerto Rico: + // http://unicode.org/cldr/trac/ticket/1710 + // http://sources.redhat.com/ml/libc-hacker/2001-07/msg00046.html + rLocale.Country == "PR" || + //Canada: + // http://sources.redhat.com/ml/libc-hacker/2001-07/msg00053.html + rLocale.Country == "CA" || + //Venuzuela: + // http://unicode.org/cldr/trac/ticket/1710 + // https://www.redhat.com/archives/fedora-devel-list/2008-August/msg00019.html + rLocale.Country == "VE" || + //Chile: + // http://unicode.org/cldr/trac/ticket/1710 + // https://www.redhat.com/archives/fedora-devel-list/2008-August/msg00240.html + rLocale.Country == "CL" || + //Mexico: + // http://unicode.org/cldr/trac/ticket/1710 + // http://qa.openoffice.org/issues/show_bug.cgi?id=49739 + rLocale.Country == "MX" || + //Colombia: + // http://unicode.org/cldr/trac/ticket/1710 + // http://qa.openoffice.org/issues/show_bug.cgi?id=69703 + rLocale.Country == "CO" || + //Philippines: + // http://unicode.org/cldr/trac/ticket/1710 + // http://ubuntuliving.blogspot.com/2008/07/default-paper-size-in-evince.html + // http://www.gov.ph/faqs/driverslicense.asp + rLocale.Country == "PH" || + //Belize: + // http://unicode.org/cldr/trac/ticket/2585 + // http://www.belize.gov.bz/ct.asp?xItem=1666&ctNode=486&mp=27 + rLocale.Country == "BZ" || + //Costa Rica: + // http://unicode.org/cldr/trac/ticket/2585 + // http://sources.redhat.com/bugzilla/show_bug.cgi?id=11258 + rLocale.Country == "CR" || + //Guatemala: + // http://unicode.org/cldr/trac/ticket/2585 + // http://sources.redhat.com/bugzilla/show_bug.cgi?id=10936 + rLocale.Country == "GT" || + //Nicaragua: + // http://unicode.org/cldr/trac/ticket/2585 + rLocale.Country == "NI" || + //Panama: + // http://unicode.org/cldr/trac/ticket/2585 + // http://www.minsa.gob.pa/minsa/tl_files/documents/baner_informativo/INSTRUMENTO%20DE%20INVESTIGACION%20DE%20RAAV%202009.pdf + rLocale.Country == "PA" || + //El Salvador: + // http://unicode.org/cldr/trac/ticket/2585 + // http://www.tse.gob.sv + rLocale.Country == "SV" + ) + { + eType = PAPER_LETTER; + } + + return eType; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/scripttypedetector.cxx b/i18nutil/source/utility/scripttypedetector.cxx new file mode 100644 index 0000000000..5bc3f9bb2a --- /dev/null +++ b/i18nutil/source/utility/scripttypedetector.cxx @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <com/sun/star/i18n/ScriptDirection.hpp> +#include <com/sun/star/i18n/UnicodeScript.hpp> +#include <i18nutil/scripttypedetector.hxx> +#include <i18nutil/unicode.hxx> +#include <o3tl/safeint.hxx> + +using namespace com::sun::star::i18n; + +const sal_Int16 scriptDirection[] = { + ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_LEFT_TO_RIGHT = 0, + ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT = 1, + ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_EUROPEAN_NUMBER = 2, + ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_EUROPEAN_NUMBER_SEPARATOR = 3, + ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_EUROPEAN_NUMBER_TERMINATOR = 4, + ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_ARABIC_NUMBER = 5, + ScriptDirection::NEUTRAL, // DirectionProperty_COMMON_NUMBER_SEPARATOR = 6, + ScriptDirection::NEUTRAL, // DirectionProperty_BLOCK_SEPARATOR = 7, + ScriptDirection::NEUTRAL, // DirectionProperty_SEGMENT_SEPARATOR = 8, + ScriptDirection::NEUTRAL, // DirectionProperty_WHITE_SPACE_NEUTRAL = 9, + ScriptDirection::NEUTRAL, // DirectionProperty_OTHER_NEUTRAL = 10, + ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_LEFT_TO_RIGHT_EMBEDDING = 11, + ScriptDirection::LEFT_TO_RIGHT, // DirectionProperty_LEFT_TO_RIGHT_OVERRIDE = 12, + ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT_ARABIC = 13, + ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT_EMBEDDING = 14, + ScriptDirection::RIGHT_TO_LEFT, // DirectionProperty_RIGHT_TO_LEFT_OVERRIDE = 15, + ScriptDirection::NEUTRAL, // DirectionProperty_POP_DIRECTIONAL_FORMAT = 16, + ScriptDirection::NEUTRAL, // DirectionProperty_DIR_NON_SPACING_MARK = 17, + ScriptDirection::NEUTRAL, // DirectionProperty_BOUNDARY_NEUTRAL = 18, +}; + +sal_Int16 ScriptTypeDetector::getScriptDirection( std::u16string_view Text, sal_Int32 nPos, sal_Int16 defaultScriptDirection ) +{ + sal_Int16 dir = scriptDirection[unicode::getUnicodeDirection(Text[nPos])]; + return (dir == ScriptDirection::NEUTRAL) ? defaultScriptDirection : dir; +} + +// return value '-1' means either the direction on nPos is not same as scriptDirection or nPos is out of range. +sal_Int32 ScriptTypeDetector::beginOfScriptDirection( std::u16string_view Text, sal_Int32 nPos, sal_Int16 direction ) +{ + sal_Int32 cPos = nPos; + + if (cPos < static_cast<sal_Int32>(Text.size())) { + for (; cPos >= 0; cPos--) { + if (direction != getScriptDirection(Text, cPos, direction)) + break; + } + } + return cPos == nPos ? -1 : cPos + 1; +} + +sal_Int32 ScriptTypeDetector::endOfScriptDirection( std::u16string_view Text, sal_Int32 nPos, sal_Int16 direction ) +{ + sal_Int32 cPos = nPos; + sal_Int32 len = Text.size(); + + if (cPos >=0) { + for (; cPos < len; cPos++) { + if (direction != getScriptDirection(Text, cPos, direction)) + break; + } + } + return cPos == nPos ? -1 : cPos; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/unicode.cxx b/i18nutil/source/utility/unicode.cxx new file mode 100644 index 0000000000..e98afeeff3 --- /dev/null +++ b/i18nutil/source/utility/unicode.cxx @@ -0,0 +1,1319 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <com/sun/star/i18n/UnicodeType.hpp> +#include <com/sun/star/i18n/ScriptType.hpp> +#include <i18nlangtag/languagetag.hxx> +#include <i18nlangtag/languagetagicu.hxx> +#include <i18nutil/unicode.hxx> +#include <sal/log.hxx> +#include <unicode/numfmt.h> +#include <unicode/uchar.h> +#include "unicode_data.h" +#include <rtl/character.hxx> +#include <o3tl/string_view.hxx> +#include <memory> + +// Workaround for glibc braindamage: +// glibc 2.4's langinfo.h does "#define CURRENCY_SYMBOL __CURRENCY_SYMBOL" +// which (obviously) breaks UnicodeType::CURRENCY_SYMBOL +#undef CURRENCY_SYMBOL + +using namespace ::com::sun::star::i18n; + +template<class L, typename T> +static T getScriptType( const sal_Unicode ch, const L* typeList, T unknownType ) { + + sal_Int16 i = 0; + css::i18n::UnicodeScript type = typeList[0].to; + while (type < UnicodeScript_kScriptCount && ch > UnicodeScriptType[static_cast<int>(type)][UnicodeScriptTypeTo]) { + type = typeList[++i].to; + } + + return (type < UnicodeScript_kScriptCount && + ch >= UnicodeScriptType[static_cast<int>(typeList[i].from)][int(UnicodeScriptTypeFrom)]) ? + typeList[i].value : unknownType; +} + +sal_Int16 +unicode::getUnicodeScriptType( const sal_Unicode ch, const ScriptTypeList* typeList, sal_Int16 unknownType ) { + return getScriptType(ch, typeList, unknownType); +} + +sal_Unicode +unicode::getUnicodeScriptStart( UnicodeScript type) { + return UnicodeScriptType[static_cast<int>(type)][UnicodeScriptTypeFrom]; +} + +sal_Unicode +unicode::getUnicodeScriptEnd( UnicodeScript type) { + return UnicodeScriptType[static_cast<int>(type)][UnicodeScriptTypeTo]; +} + +sal_Int16 +unicode::getUnicodeType(const sal_uInt32 ch) +{ + static sal_uInt32 c = 0x00; + static sal_uInt32 r = 0x00; + + if (ch == c) return r; + else c = ch; + + switch (u_charType(ch)) + { + case U_UNASSIGNED: + r = css::i18n::UnicodeType::UNASSIGNED; + break; + case U_UPPERCASE_LETTER: + r = css::i18n::UnicodeType::UPPERCASE_LETTER; + break; + case U_LOWERCASE_LETTER: + r = css::i18n::UnicodeType::LOWERCASE_LETTER; + break; + case U_TITLECASE_LETTER: + r = css::i18n::UnicodeType::TITLECASE_LETTER; + break; + case U_MODIFIER_LETTER: + r = css::i18n::UnicodeType::MODIFIER_LETTER; + break; + case U_OTHER_LETTER: + r = css::i18n::UnicodeType::OTHER_LETTER; + break; + case U_NON_SPACING_MARK: + r = css::i18n::UnicodeType::NON_SPACING_MARK; + break; + case U_ENCLOSING_MARK: + r = css::i18n::UnicodeType::ENCLOSING_MARK; + break; + case U_COMBINING_SPACING_MARK: + r = css::i18n::UnicodeType::COMBINING_SPACING_MARK; + break; + case U_DECIMAL_DIGIT_NUMBER: + r = css::i18n::UnicodeType::DECIMAL_DIGIT_NUMBER; + break; + case U_LETTER_NUMBER: + r = css::i18n::UnicodeType::LETTER_NUMBER; + break; + case U_OTHER_NUMBER: + r = css::i18n::UnicodeType::OTHER_NUMBER; + break; + case U_SPACE_SEPARATOR: + r = css::i18n::UnicodeType::SPACE_SEPARATOR; + break; + case U_LINE_SEPARATOR: + r = css::i18n::UnicodeType::LINE_SEPARATOR; + break; + case U_PARAGRAPH_SEPARATOR: + r = css::i18n::UnicodeType::PARAGRAPH_SEPARATOR; + break; + case U_CONTROL_CHAR: + r = css::i18n::UnicodeType::CONTROL; + break; + case U_FORMAT_CHAR: + r = css::i18n::UnicodeType::FORMAT; + break; + case U_PRIVATE_USE_CHAR: + r = css::i18n::UnicodeType::PRIVATE_USE; + break; + case U_SURROGATE: + r = css::i18n::UnicodeType::SURROGATE; + break; + case U_DASH_PUNCTUATION: + r = css::i18n::UnicodeType::DASH_PUNCTUATION; + break; + case U_INITIAL_PUNCTUATION: + r = css::i18n::UnicodeType::INITIAL_PUNCTUATION; + break; + case U_FINAL_PUNCTUATION: + r = css::i18n::UnicodeType::FINAL_PUNCTUATION; + break; + case U_CONNECTOR_PUNCTUATION: + r = css::i18n::UnicodeType::CONNECTOR_PUNCTUATION; + break; + case U_OTHER_PUNCTUATION: + r = css::i18n::UnicodeType::OTHER_PUNCTUATION; + break; + case U_MATH_SYMBOL: + r = css::i18n::UnicodeType::MATH_SYMBOL; + break; + case U_CURRENCY_SYMBOL: + r = css::i18n::UnicodeType::CURRENCY_SYMBOL; + break; + case U_MODIFIER_SYMBOL: + r = css::i18n::UnicodeType::MODIFIER_SYMBOL; + break; + case U_OTHER_SYMBOL: + r = css::i18n::UnicodeType::OTHER_SYMBOL; + break; + case U_START_PUNCTUATION: + r = css::i18n::UnicodeType::START_PUNCTUATION; + break; + case U_END_PUNCTUATION: + r = css::i18n::UnicodeType::END_PUNCTUATION; + break; + } + + return r; +} + +sal_uInt8 +unicode::getUnicodeDirection( const sal_Unicode ch ) { + static sal_Unicode c = 0x00; + static sal_uInt8 r = 0x00; + + if (ch == c) return r; + else c = ch; + + sal_Int16 address = UnicodeDirectionIndex[ch >> 8]; + r = (address < UnicodeDirectionNumberBlock) + ? UnicodeDirectionBlockValue[address] + : UnicodeDirectionValue[((address - UnicodeDirectionNumberBlock) << 8) + (ch & 0xff)]; + return r; +} + +sal_uInt32 unicode::GetMirroredChar(sal_uInt32 nChar) { + nChar = u_charMirror(nChar); + return nChar; +} + +#define bit(name) (1U << name) + +#define UPPERMASK bit(UnicodeType::UPPERCASE_LETTER) + +#define LOWERMASK bit(UnicodeType::LOWERCASE_LETTER) + +#define TITLEMASK bit(UnicodeType::TITLECASE_LETTER) + +#define ALPHAMASK UPPERMASK|LOWERMASK|TITLEMASK|\ + bit(UnicodeType::MODIFIER_LETTER)|\ + bit(UnicodeType::OTHER_LETTER) + +#define SPACEMASK bit(UnicodeType::SPACE_SEPARATOR)|\ + bit(UnicodeType::LINE_SEPARATOR)|\ + bit(UnicodeType::PARAGRAPH_SEPARATOR) + +#define CONTROLMASK bit(UnicodeType::CONTROL)|\ + bit(UnicodeType::FORMAT)|\ + bit(UnicodeType::LINE_SEPARATOR)|\ + bit(UnicodeType::PARAGRAPH_SEPARATOR) + +#define IsType(func, mask) \ +bool func( const sal_uInt32 ch) {\ + return (bit(getUnicodeType(ch)) & (mask)) != 0;\ +} + +IsType(unicode::isControl, CONTROLMASK) +IsType(unicode::isAlpha, ALPHAMASK) +IsType(unicode::isSpace, SPACEMASK) + +#define CONTROLSPACE bit(0x09)|bit(0x0a)|bit(0x0b)|bit(0x0c)|bit(0x0d)|\ + bit(0x1c)|bit(0x1d)|bit(0x1e)|bit(0x1f) + +bool unicode::isWhiteSpace(const sal_uInt32 ch) +{ + return (ch != 0xa0 && isSpace(ch)) || (ch <= 0x1F && (bit(ch) & (CONTROLSPACE))); +} + +sal_Int16 unicode::getScriptClassFromUScriptCode(UScriptCode eScript) +{ + //See unicode/uscript.h + sal_Int16 nRet; + switch (eScript) + { + case USCRIPT_INVALID_CODE: + case USCRIPT_COMMON: + case USCRIPT_INHERITED: + case USCRIPT_UNWRITTEN_LANGUAGES: + case USCRIPT_UNKNOWN: + case USCRIPT_MATHEMATICAL_NOTATION: + case USCRIPT_SYMBOLS: + case USCRIPT_CODE_LIMIT: + nRet = ScriptType::WEAK; + break; + case USCRIPT_ARMENIAN: + case USCRIPT_CHEROKEE: + case USCRIPT_COPTIC: + case USCRIPT_CYRILLIC: + case USCRIPT_GEORGIAN: + case USCRIPT_GOTHIC: + case USCRIPT_GREEK: + case USCRIPT_LATIN: + case USCRIPT_OGHAM: + case USCRIPT_OLD_ITALIC: + case USCRIPT_RUNIC: + case USCRIPT_CANADIAN_ABORIGINAL: + case USCRIPT_BRAILLE: + case USCRIPT_CYPRIOT: + case USCRIPT_OSMANYA: + case USCRIPT_SHAVIAN: + case USCRIPT_KATAKANA_OR_HIRAGANA: + case USCRIPT_GLAGOLITIC: + case USCRIPT_CIRTH: + case USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC: + case USCRIPT_OLD_HUNGARIAN: + case USCRIPT_LATIN_FRAKTUR: + case USCRIPT_LATIN_GAELIC: + nRet = ScriptType::LATIN; + break; + case USCRIPT_BOPOMOFO: + case USCRIPT_HAN: + case USCRIPT_HANGUL: + case USCRIPT_HIRAGANA: + case USCRIPT_KATAKANA: + case USCRIPT_YI: + case USCRIPT_SIMPLIFIED_HAN: + case USCRIPT_TRADITIONAL_HAN: + case USCRIPT_JAPANESE: + case USCRIPT_KOREAN: + case USCRIPT_TANGUT: + case USCRIPT_KHITAN_SMALL_SCRIPT: + nRet = ScriptType::ASIAN; + break; + case USCRIPT_ARABIC: + case USCRIPT_BENGALI: + case USCRIPT_DESERET: + case USCRIPT_DEVANAGARI: + case USCRIPT_ETHIOPIC: + case USCRIPT_GUJARATI: + case USCRIPT_GURMUKHI: + case USCRIPT_HEBREW: + case USCRIPT_KANNADA: + case USCRIPT_KHMER: + case USCRIPT_LAO: + case USCRIPT_MALAYALAM: + case USCRIPT_MONGOLIAN: + case USCRIPT_MYANMAR: + case USCRIPT_ORIYA: + case USCRIPT_SINHALA: + case USCRIPT_SYRIAC: + case USCRIPT_TAMIL: + case USCRIPT_TELUGU: + case USCRIPT_THAANA: + case USCRIPT_THAI: + case USCRIPT_TIBETAN: + case USCRIPT_TAGALOG: + case USCRIPT_HANUNOO: + case USCRIPT_BUHID: + case USCRIPT_TAGBANWA: + case USCRIPT_LIMBU: + case USCRIPT_LINEAR_B: + case USCRIPT_TAI_LE: + case USCRIPT_UGARITIC: + case USCRIPT_BUGINESE: + case USCRIPT_KHAROSHTHI: + case USCRIPT_SYLOTI_NAGRI: + case USCRIPT_NEW_TAI_LUE: + case USCRIPT_TIFINAGH: + case USCRIPT_OLD_PERSIAN: + case USCRIPT_BALINESE: + case USCRIPT_BATAK: + case USCRIPT_BLISSYMBOLS: + case USCRIPT_BRAHMI: + case USCRIPT_CHAM: + case USCRIPT_DEMOTIC_EGYPTIAN: + case USCRIPT_HIERATIC_EGYPTIAN: + case USCRIPT_EGYPTIAN_HIEROGLYPHS: + case USCRIPT_KHUTSURI: + case USCRIPT_PAHAWH_HMONG: + case USCRIPT_HARAPPAN_INDUS: + case USCRIPT_JAVANESE: + case USCRIPT_KAYAH_LI: + case USCRIPT_LEPCHA: + case USCRIPT_LINEAR_A: + case USCRIPT_MANDAEAN: + case USCRIPT_MAYAN_HIEROGLYPHS: + case USCRIPT_MEROITIC: + case USCRIPT_NKO: + case USCRIPT_ORKHON: + case USCRIPT_OLD_PERMIC: + case USCRIPT_PHAGS_PA: + case USCRIPT_PHOENICIAN: + case USCRIPT_PHONETIC_POLLARD: + case USCRIPT_RONGORONGO: + case USCRIPT_SARATI: + case USCRIPT_ESTRANGELO_SYRIAC: + case USCRIPT_WESTERN_SYRIAC: + case USCRIPT_EASTERN_SYRIAC: + case USCRIPT_TENGWAR: + case USCRIPT_VAI: + case USCRIPT_VISIBLE_SPEECH: + case USCRIPT_CUNEIFORM: + case USCRIPT_CARIAN: + case USCRIPT_LANNA: + case USCRIPT_LYCIAN: + case USCRIPT_LYDIAN: + case USCRIPT_OL_CHIKI: + case USCRIPT_REJANG: + case USCRIPT_SAURASHTRA: + case USCRIPT_SIGN_WRITING: + case USCRIPT_SUNDANESE: + case USCRIPT_MOON: + case USCRIPT_MEITEI_MAYEK: + case USCRIPT_IMPERIAL_ARAMAIC: + case USCRIPT_AVESTAN: + case USCRIPT_CHAKMA: + case USCRIPT_KAITHI: + case USCRIPT_MANICHAEAN: + case USCRIPT_INSCRIPTIONAL_PAHLAVI: + case USCRIPT_PSALTER_PAHLAVI: + case USCRIPT_BOOK_PAHLAVI: + case USCRIPT_INSCRIPTIONAL_PARTHIAN: + case USCRIPT_SAMARITAN: + case USCRIPT_TAI_VIET: + case USCRIPT_BAMUM: + case USCRIPT_LISU: + case USCRIPT_NAKHI_GEBA: + case USCRIPT_OLD_SOUTH_ARABIAN: + case USCRIPT_BASSA_VAH: + case USCRIPT_DUPLOYAN_SHORTAND: + case USCRIPT_ELBASAN: + case USCRIPT_GRANTHA: + case USCRIPT_KPELLE: + case USCRIPT_LOMA: + case USCRIPT_MENDE: + case USCRIPT_MEROITIC_CURSIVE: + case USCRIPT_OLD_NORTH_ARABIAN: + case USCRIPT_NABATAEAN: + case USCRIPT_PALMYRENE: + case USCRIPT_SINDHI: + case USCRIPT_WARANG_CITI: + default: // anything new is going to be pretty wild + nRet = ScriptType::COMPLEX; + break; + } + return nRet; +} + +sal_Int16 unicode::getScriptClassFromLanguageTag( const LanguageTag& rLanguageTag ) +{ + constexpr int32_t nBuf = 42; + UScriptCode aBuf[nBuf]; + if (rLanguageTag.hasScript()) + { + aBuf[0] = static_cast<UScriptCode>(u_getPropertyValueEnum( UCHAR_SCRIPT, + OUStringToOString( rLanguageTag.getScript(), RTL_TEXTENCODING_ASCII_US).getStr())); + } + else + { + OUString aName; + if (rLanguageTag.getCountry().isEmpty()) + aName = rLanguageTag.getLanguage(); + else + aName = rLanguageTag.getLanguage() + "-" + rLanguageTag.getCountry(); + UErrorCode status = U_ZERO_ERROR; + const int32_t nScripts = uscript_getCode( + OUStringToOString( aName, RTL_TEXTENCODING_ASCII_US).getStr(), + aBuf, nBuf, &status); + // U_BUFFER_OVERFLOW_ERROR would be set with too many scripts for buffer + // and required capacity returned, but really.. + if (nScripts == 0 || !U_SUCCESS(status)) + return css::i18n::ScriptType::LATIN; + } + return getScriptClassFromUScriptCode( aBuf[0]); +} + +OString unicode::getExemplarLanguageForUScriptCode(UScriptCode eScript) +{ + OString sRet; + switch (eScript) + { + case USCRIPT_CODE_LIMIT: + case USCRIPT_INVALID_CODE: + sRet = "zxx"_ostr; + break; + case USCRIPT_COMMON: + case USCRIPT_INHERITED: + sRet = "und"_ostr; + break; + case USCRIPT_MATHEMATICAL_NOTATION: + case USCRIPT_SYMBOLS: + sRet = "zxx"_ostr; + break; + case USCRIPT_UNWRITTEN_LANGUAGES: + case USCRIPT_UNKNOWN: + sRet = "und"_ostr; + break; + case USCRIPT_ARABIC: + sRet = "ar"_ostr; + break; + case USCRIPT_ARMENIAN: + sRet = "hy"_ostr; + break; + case USCRIPT_BENGALI: + sRet = "bn"_ostr; + break; + case USCRIPT_BOPOMOFO: + sRet = "zh"_ostr; + break; + case USCRIPT_CHEROKEE: + sRet = "chr"_ostr; + break; + case USCRIPT_COPTIC: + sRet = "cop"_ostr; + break; + case USCRIPT_CYRILLIC: + sRet = "ru"_ostr; + break; + case USCRIPT_DESERET: + sRet = "en"_ostr; + break; + case USCRIPT_DEVANAGARI: + sRet = "hi"_ostr; + break; + case USCRIPT_ETHIOPIC: + sRet = "am"_ostr; + break; + case USCRIPT_GEORGIAN: + sRet = "ka"_ostr; + break; + case USCRIPT_GOTHIC: + sRet = "got"_ostr; + break; + case USCRIPT_GREEK: + sRet = "el"_ostr; + break; + case USCRIPT_GUJARATI: + sRet = "gu"_ostr; + break; + case USCRIPT_GURMUKHI: + sRet = "pa"_ostr; + break; + case USCRIPT_HAN: + sRet = "zh"_ostr; + break; + case USCRIPT_HANGUL: + sRet = "ko"_ostr; + break; + case USCRIPT_HEBREW: + sRet = "hr"_ostr; + break; + case USCRIPT_HIRAGANA: + sRet = "ja"_ostr; + break; + case USCRIPT_KANNADA: + sRet = "kn"_ostr; + break; + case USCRIPT_KATAKANA: + sRet = "ja"_ostr; + break; + case USCRIPT_KHMER: + sRet = "km"_ostr; + break; + case USCRIPT_LAO: + sRet = "lo"_ostr; + break; + case USCRIPT_LATIN: + sRet = "en"_ostr; + break; + case USCRIPT_MALAYALAM: + sRet = "ml"_ostr; + break; + case USCRIPT_MONGOLIAN: + sRet = "mn"_ostr; + break; + case USCRIPT_MYANMAR: + sRet = "my"_ostr; + break; + case USCRIPT_OGHAM: + sRet = "pgl"_ostr; + break; + case USCRIPT_OLD_ITALIC: + sRet = "osc"_ostr; + break; + case USCRIPT_ORIYA: + sRet = "or"_ostr; + break; + case USCRIPT_RUNIC: + sRet = "ang"_ostr; + break; + case USCRIPT_SINHALA: + sRet = "si"_ostr; + break; + case USCRIPT_SYRIAC: + sRet = "syr"_ostr; + break; + case USCRIPT_TAMIL: + sRet = "ta"_ostr; + break; + case USCRIPT_TELUGU: + sRet = "te"_ostr; + break; + case USCRIPT_THAANA: + sRet = "dv"_ostr; + break; + case USCRIPT_THAI: + sRet = "th"_ostr; + break; + case USCRIPT_TIBETAN: + sRet = "bo"_ostr; + break; + case USCRIPT_CANADIAN_ABORIGINAL: + sRet = "iu"_ostr; + break; + case USCRIPT_YI: + sRet = "ii"_ostr; + break; + case USCRIPT_TAGALOG: + sRet = "tl"_ostr; + break; + case USCRIPT_HANUNOO: + sRet = "hnn"_ostr; + break; + case USCRIPT_BUHID: + sRet = "bku"_ostr; + break; + case USCRIPT_TAGBANWA: + sRet = "tbw"_ostr; + break; + case USCRIPT_BRAILLE: + sRet = "en"_ostr; + break; + case USCRIPT_CYPRIOT: + sRet = "ecy"_ostr; + break; + case USCRIPT_LIMBU: + sRet = "lif"_ostr; + break; + case USCRIPT_LINEAR_B: + sRet = "gmy"_ostr; + break; + case USCRIPT_OSMANYA: + sRet = "so"_ostr; + break; + case USCRIPT_SHAVIAN: + sRet = "en"_ostr; + break; + case USCRIPT_TAI_LE: + sRet = "tdd"_ostr; + break; + case USCRIPT_UGARITIC: + sRet = "uga"_ostr; + break; + case USCRIPT_KATAKANA_OR_HIRAGANA: + sRet = "ja"_ostr; + break; + case USCRIPT_BUGINESE: + sRet = "bug"_ostr; + break; + case USCRIPT_GLAGOLITIC: + sRet = "ch"_ostr; + break; + case USCRIPT_KHAROSHTHI: + sRet = "pra"_ostr; + break; + case USCRIPT_SYLOTI_NAGRI: + sRet = "syl"_ostr; + break; + case USCRIPT_NEW_TAI_LUE: + sRet = "khb"_ostr; + break; + case USCRIPT_TIFINAGH: + sRet = "tmh"_ostr; + break; + case USCRIPT_OLD_PERSIAN: + sRet = "peo"_ostr; + break; + case USCRIPT_BALINESE: + sRet = "ban"_ostr; + break; + case USCRIPT_BATAK: + sRet = "btk"_ostr; + break; + case USCRIPT_BLISSYMBOLS: + sRet = "en"_ostr; + break; + case USCRIPT_BRAHMI: + sRet = "pra"_ostr; + break; + case USCRIPT_CHAM: + sRet = "cja"_ostr; + break; + case USCRIPT_CIRTH: + sRet = "sjn"_ostr; + break; + case USCRIPT_OLD_CHURCH_SLAVONIC_CYRILLIC: + sRet = "cu"_ostr; + break; + case USCRIPT_DEMOTIC_EGYPTIAN: + case USCRIPT_HIERATIC_EGYPTIAN: + case USCRIPT_EGYPTIAN_HIEROGLYPHS: + sRet = "egy"_ostr; + break; + case USCRIPT_KHUTSURI: + sRet = "ka"_ostr; + break; + case USCRIPT_SIMPLIFIED_HAN: + sRet = "zh"_ostr; + break; + case USCRIPT_TRADITIONAL_HAN: + sRet = "zh"_ostr; + break; + case USCRIPT_PAHAWH_HMONG: + sRet = "blu"_ostr; + break; + case USCRIPT_OLD_HUNGARIAN: + sRet = "ohu"_ostr; + break; + case USCRIPT_HARAPPAN_INDUS: + sRet = "xiv"_ostr; + break; + case USCRIPT_JAVANESE: + sRet = "kaw"_ostr; + break; + case USCRIPT_KAYAH_LI: + sRet = "eky"_ostr; + break; + case USCRIPT_LATIN_FRAKTUR: + sRet = "de"_ostr; + break; + case USCRIPT_LATIN_GAELIC: + sRet = "ga"_ostr; + break; + case USCRIPT_LEPCHA: + sRet = "lep"_ostr; + break; + case USCRIPT_LINEAR_A: + sRet = "ecr"_ostr; + break; + case USCRIPT_MAYAN_HIEROGLYPHS: + sRet = "myn"_ostr; + break; + case USCRIPT_MEROITIC: + sRet = "xmr"_ostr; + break; + case USCRIPT_NKO: + sRet = "nqo"_ostr; + break; + case USCRIPT_ORKHON: + sRet = "otk"_ostr; + break; + case USCRIPT_OLD_PERMIC: + sRet = "kv"_ostr; + break; + case USCRIPT_PHAGS_PA: + sRet = "xng"_ostr; + break; + case USCRIPT_PHOENICIAN: + sRet = "phn"_ostr; + break; + case USCRIPT_PHONETIC_POLLARD: + sRet = "hmd"_ostr; + break; + case USCRIPT_RONGORONGO: + sRet = "rap"_ostr; + break; + case USCRIPT_SARATI: + sRet = "qya"_ostr; + break; + case USCRIPT_ESTRANGELO_SYRIAC: + sRet = "syr"_ostr; + break; + case USCRIPT_WESTERN_SYRIAC: + sRet = "tru"_ostr; + break; + case USCRIPT_EASTERN_SYRIAC: + sRet = "aii"_ostr; + break; + case USCRIPT_TENGWAR: + sRet = "sjn"_ostr; + break; + case USCRIPT_VAI: + sRet = "vai"_ostr; + break; + case USCRIPT_VISIBLE_SPEECH: + sRet = "en"_ostr; + break; + case USCRIPT_CUNEIFORM: + sRet = "akk"_ostr; + break; + case USCRIPT_CARIAN: + sRet = "xcr"_ostr; + break; + case USCRIPT_JAPANESE: + sRet = "ja"_ostr; + break; + case USCRIPT_LANNA: + sRet = "nod"_ostr; + break; + case USCRIPT_LYCIAN: + sRet = "xlc"_ostr; + break; + case USCRIPT_LYDIAN: + sRet = "xld"_ostr; + break; + case USCRIPT_OL_CHIKI: + sRet = "sat"_ostr; + break; + case USCRIPT_REJANG: + sRet = "rej"_ostr; + break; + case USCRIPT_SAURASHTRA: + sRet = "saz"_ostr; + break; + case USCRIPT_SIGN_WRITING: + sRet = "en"_ostr; + break; + case USCRIPT_SUNDANESE: + sRet = "su"_ostr; + break; + case USCRIPT_MOON: + sRet = "en"_ostr; + break; + case USCRIPT_MEITEI_MAYEK: + sRet = "mni"_ostr; + break; + case USCRIPT_IMPERIAL_ARAMAIC: + sRet = "arc"_ostr; + break; + case USCRIPT_AVESTAN: + sRet = "ae"_ostr; + break; + case USCRIPT_CHAKMA: + sRet = "ccp"_ostr; + break; + case USCRIPT_KOREAN: + sRet = "ko"_ostr; + break; + case USCRIPT_KAITHI: + sRet = "awa"_ostr; + break; + case USCRIPT_MANICHAEAN: + sRet = "xmn"_ostr; + break; + case USCRIPT_INSCRIPTIONAL_PAHLAVI: + case USCRIPT_PSALTER_PAHLAVI: + case USCRIPT_BOOK_PAHLAVI: + case USCRIPT_INSCRIPTIONAL_PARTHIAN: + sRet = "xpr"_ostr; + break; + case USCRIPT_SAMARITAN: + sRet = "heb"_ostr; + break; + case USCRIPT_TAI_VIET: + sRet = "blt"_ostr; + break; + case USCRIPT_MANDAEAN: /* Aliased to USCRIPT_MANDAIC in icu 4.6. */ + sRet = "mic"_ostr; + break; + case USCRIPT_NABATAEAN: + sRet = "mis-Nbat"_ostr; // Uncoded with script + break; + case USCRIPT_PALMYRENE: + sRet = "mis-Palm"_ostr; // Uncoded with script + break; + case USCRIPT_BAMUM: + sRet = "bax"_ostr; + break; + case USCRIPT_LISU: + sRet = "lis"_ostr; + break; + case USCRIPT_NAKHI_GEBA: + sRet = "nxq"_ostr; + break; + case USCRIPT_OLD_SOUTH_ARABIAN: + sRet = "xsa"_ostr; + break; + case USCRIPT_BASSA_VAH: + sRet = "bsq"_ostr; + break; + case USCRIPT_DUPLOYAN_SHORTAND: + sRet = "fr"_ostr; + break; + case USCRIPT_ELBASAN: + sRet = "sq"_ostr; + break; + case USCRIPT_GRANTHA: + sRet = "ta"_ostr; + break; + case USCRIPT_KPELLE: + sRet = "kpe"_ostr; + break; + case USCRIPT_LOMA: + sRet = "lom"_ostr; + break; + case USCRIPT_MENDE: + sRet = "men"_ostr; + break; + case USCRIPT_MEROITIC_CURSIVE: + sRet = "xmr"_ostr; + break; + case USCRIPT_OLD_NORTH_ARABIAN: + sRet = "xna"_ostr; + break; + case USCRIPT_SINDHI: + sRet = "sd"_ostr; + break; + case USCRIPT_WARANG_CITI: + sRet = "hoc"_ostr; + break; + case USCRIPT_AFAKA: + sRet = "djk"_ostr; + break; + case USCRIPT_JURCHEN: + sRet = "juc"_ostr; + break; + case USCRIPT_MRO: + sRet = "cmr"_ostr; + break; + case USCRIPT_NUSHU: + sRet = "mis-Nshu"_ostr; // Uncoded with script + break; + case USCRIPT_SHARADA: + sRet = "sa"_ostr; + break; + case USCRIPT_SORA_SOMPENG: + sRet = "srb"_ostr; + break; + case USCRIPT_TAKRI: + sRet = "doi"_ostr; + break; + case USCRIPT_TANGUT: + sRet = "txg"_ostr; + break; + case USCRIPT_WOLEAI: + sRet = "woe"_ostr; + break; + case USCRIPT_ANATOLIAN_HIEROGLYPHS: + sRet = "hlu"_ostr; + break; + case USCRIPT_KHOJKI: + sRet = "gu"_ostr; + break; + case USCRIPT_TIRHUTA: + sRet = "mai"_ostr; + break; + case USCRIPT_CAUCASIAN_ALBANIAN: + sRet = "xag"_ostr; + break; + case USCRIPT_MAHAJANI: + sRet = "mwr"_ostr; + break; + case USCRIPT_AHOM: + sRet = "aho"_ostr; + break; + case USCRIPT_HATRAN: + sRet = "qly-Hatr"_ostr; + break; + case USCRIPT_MODI: + sRet = "mr-Modi"_ostr; + break; + case USCRIPT_MULTANI: + sRet = "skr-Mutl"_ostr; + break; + case USCRIPT_PAU_CIN_HAU: + sRet = "ctd-Pauc"_ostr; + break; + case USCRIPT_SIDDHAM: + sRet = "sa-Sidd"_ostr; + break; + case USCRIPT_ADLAM: + sRet = "mis-Adlm"_ostr; // Adlam for Fulani, no language code + break; + case USCRIPT_BHAIKSUKI: + sRet = "mis-Bhks"_ostr; // Bhaiksuki for some Buddhist texts, no language code + break; + case USCRIPT_MARCHEN: + sRet = "bo-Marc"_ostr; + break; + case USCRIPT_NEWA: + sRet = "new-Newa"_ostr; + break; + case USCRIPT_OSAGE: + sRet = "osa-Osge"_ostr; + break; + case USCRIPT_HAN_WITH_BOPOMOFO: + sRet = "mis-Hanb"_ostr; // Han with Bopomofo, zh-Hanb ? + break; + case USCRIPT_JAMO: + sRet = "ko"_ostr; // Jamo - elements of Hangul Syllables + break; + case USCRIPT_SYMBOLS_EMOJI: + sRet = "mis-Zsye"_ostr; // Emoji variant + break; + case USCRIPT_MASARAM_GONDI: + sRet = "gon-Gonm"_ostr; // macro language code, could be wsg,esg,gno + break; + case USCRIPT_SOYOMBO: + sRet = "mn-Soyo"_ostr; // abugida to write Mongolian, also Tibetan and Sanskrit + break; + case USCRIPT_ZANABAZAR_SQUARE: + sRet = "mn-Zanb"_ostr; // abugida to write Mongolian + break; + case USCRIPT_DOGRA: + sRet = "dgo"_ostr; // Dogri proper + break; + case USCRIPT_GUNJALA_GONDI: + sRet = "wsg"_ostr; // Adilabad Gondi + break; + case USCRIPT_MAKASAR: + sRet = "mak"_ostr; + break; + case USCRIPT_MEDEFAIDRIN: + sRet = "dmf-Medf"_ostr; + break; + case USCRIPT_HANIFI_ROHINGYA: + sRet = "rhg"_ostr; + break; + case USCRIPT_SOGDIAN: + sRet = "sog"_ostr; + break; + case USCRIPT_OLD_SOGDIAN: + sRet = "sog"_ostr; + break; + case USCRIPT_ELYMAIC: + sRet = "arc-Elym"_ostr; + break; + case USCRIPT_NYIAKENG_PUACHUE_HMONG: + sRet = "hmn-Hmnp"_ostr; // macrolanguage code + break; + case USCRIPT_NANDINAGARI: + sRet = "sa-Nand"_ostr; + break; + case USCRIPT_WANCHO: + sRet = "nnp-Wcho"_ostr; + break; + case USCRIPT_CHORASMIAN: + sRet = "xco-Chrs"_ostr; + break; + case USCRIPT_DIVES_AKURU: + sRet = "dv-Diak"_ostr; + break; + case USCRIPT_KHITAN_SMALL_SCRIPT: + sRet = "zkt-Kits"_ostr; + break; + case USCRIPT_YEZIDI: + sRet = "kmr-Yezi"_ostr; + break; +#if (U_ICU_VERSION_MAJOR_NUM >= 70) + case USCRIPT_CYPRO_MINOAN: + sRet = "mis-Cpmn"_ostr; // Uncoded with script + break; + case USCRIPT_OLD_UYGHUR: + sRet = "oui-Ougr"_ostr; + break; + case USCRIPT_TANGSA: + sRet = "nst-Tnsa"_ostr; + break; + case USCRIPT_TOTO: + sRet = "txo-Toto"_ostr; + break; + case USCRIPT_VITHKUQI: + sRet = "sq-Vith"_ostr; // macrolanguage code + break; +#endif +#if (U_ICU_VERSION_MAJOR_NUM >= 72) + case USCRIPT_KAWI: + sRet = "mis-Kawi"_ostr; // Uncoded with script + break; + case USCRIPT_NAG_MUNDARI: + sRet = "unr-Nagm"_ostr; + break; +#endif + } + return sRet; +} + +//Format a number as a percentage according to the rules of the given +//language, e.g. 100 -> "100%" for en-US vs "100 %" for de-DE +OUString unicode::formatPercent(double dNumber, + const LanguageTag &rLangTag) +{ + // get a currency formatter for this locale ID + UErrorCode errorCode=U_ZERO_ERROR; + + LanguageTag aLangTag(rLangTag); + + // As of CLDR Version 24 these languages were not listed as using spacing + // between number and % but are reported as such by our l10n groups + // http://www.unicode.org/cldr/charts/24/by_type/numbers.number_formatting_patterns.html + // so format using French which has the desired rules + if (aLangTag.getLanguage() == "es" || aLangTag.getLanguage() == "sl") + aLangTag.reset("fr-FR"); + + icu::Locale aLocale = LanguageTagIcu::getIcuLocale(aLangTag); + + std::unique_ptr<icu::NumberFormat> xF( + icu::NumberFormat::createPercentInstance(aLocale, errorCode)); + if(U_FAILURE(errorCode)) + { + SAL_WARN("i18n", "icu::NumberFormat::createPercentInstance failed"); + return OUString::number(dNumber) + "%"; + } + + icu::UnicodeString output; + xF->format(dNumber/100, output); + OUString aRet(reinterpret_cast<const sal_Unicode *>(output.getBuffer()), + output.length()); + if (rLangTag.getLanguage() == "de") + { + //narrow no-break space instead of (normal) no-break space + return aRet.replace(0x00A0, 0x202F); + } + return aRet; +} + +bool ToggleUnicodeCodepoint::AllowMoreInput(sal_Unicode uChar) +{ + //arbitrarily chosen maximum length allowed - normal max usage would be around 30. + if( maInput.getLength() > 255 ) + mbAllowMoreChars = false; + + if( !mbAllowMoreChars ) + return false; + + bool bPreventNonHex = false; + if( maInput.indexOf("U+") != -1 ) + bPreventNonHex = true; + + switch ( unicode::getUnicodeType(uChar) ) + { + case css::i18n::UnicodeType::SURROGATE: + if( bPreventNonHex ) + { + mbAllowMoreChars = false; + return false; + } + + if( rtl::isLowSurrogate(uChar) && maUtf16.isEmpty() && maInput.isEmpty() ) + { + maUtf16.append(uChar); + return true; + } + if( rtl::isHighSurrogate(uChar) && maInput.isEmpty() ) + maUtf16.insert(0, uChar ); + //end of hex strings, or unexpected order of high/low, so don't accept more + if( !maUtf16.isEmpty() ) + maInput.append(maUtf16); + if( !maCombining.isEmpty() ) + maInput.append(maCombining); + mbAllowMoreChars = false; + break; + + case css::i18n::UnicodeType::NON_SPACING_MARK: + case css::i18n::UnicodeType::COMBINING_SPACING_MARK: + if( bPreventNonHex ) + { + mbAllowMoreChars = false; + return false; + } + + //extreme edge case: already invalid high/low surrogates with preceding combining chars, and now an extra combining mark. + if( !maUtf16.isEmpty() ) + { + maInput = maUtf16; + if( !maCombining.isEmpty() ) + maInput.append(maCombining); + mbAllowMoreChars = false; + return false; + } + maCombining.insert(0, uChar); + break; + + default: + //extreme edge case: already invalid high/low surrogates with preceding combining chars, and now an extra character. + if( !maUtf16.isEmpty() ) + { + maInput = maUtf16; + if( !maCombining.isEmpty() ) + maInput.append(maCombining); + mbAllowMoreChars = false; + return false; + } + + if( !maCombining.isEmpty() ) + { + maCombining.insert(0, uChar); + maInput = maCombining; + mbAllowMoreChars = false; + return false; + } + + // 0 - 1f are control characters. Do not process those. + if( uChar < 0x20 ) + { + mbAllowMoreChars = false; + return false; + } + + switch( uChar ) + { + case 'u': + case 'U': + // U+ notation found. Continue looking for another one. + if( mbRequiresU ) + { + mbRequiresU = false; + maInput.insert(0,"U+"); + } + // treat as a normal character + else + { + mbAllowMoreChars = false; + if( !bPreventNonHex ) + maInput.insertUtf32(0, uChar); + } + break; + case '+': + // + already found: skip when not U, or edge case of +U+xxxx + if( mbRequiresU || (maInput.indexOf("U+") == 0) ) + mbAllowMoreChars = false; + // hex chars followed by '+' - now require a 'U' + else if ( !maInput.isEmpty() ) + mbRequiresU = true; + // treat as a normal character + else + { + mbAllowMoreChars = false; + if( !bPreventNonHex ) + maInput.insertUtf32(0, uChar); + } + break; + default: + // + already found. Since not U, cancel further input + if( mbRequiresU ) + mbAllowMoreChars = false; + // maximum digits per notation is 8: only one notation + else if( maInput.indexOf("U+") == -1 && maInput.getLength() == 8 ) + mbAllowMoreChars = false; + // maximum digits per notation is 8: previous notation found + else if( maInput.indexOf("U+") == 8 ) + mbAllowMoreChars = false; + // a hex character. Add to string. + else if( rtl::isAsciiHexDigit(uChar) ) + { + mbIsHexString = true; + maInput.insertUtf32(0, uChar); + } + // not a hex character: stop input. keep if it is the first input provided + else + { + mbAllowMoreChars = false; + if( maInput.isEmpty() ) + maInput.insertUtf32(0, uChar); + } + } + } + return mbAllowMoreChars; +} + +OUString ToggleUnicodeCodepoint::StringToReplace() +{ + if( maInput.isEmpty() ) + { + //edge case - input finished with incomplete low surrogate or combining characters without a base + if( mbAllowMoreChars ) + { + if( !maUtf16.isEmpty() ) + maInput = maUtf16; + if( !maCombining.isEmpty() ) + maInput.append(maCombining); + } + return maInput.toString(); + } + + if( !mbIsHexString ) + return maInput.toString(); + + //this function potentially modifies the input string. Prevent addition of further characters + mbAllowMoreChars = false; + + //validate unicode notation. + OUString sIn; + sal_uInt32 nUnicode = 0; + sal_Int32 nUPlus = maInput.indexOf("U+"); + //if U+ notation used, strip off all extra chars added not in U+ notation + if( nUPlus != -1 ) + { + maInput.remove(0, nUPlus); + sIn = maInput.copy(2).makeStringAndClear(); + nUPlus = sIn.indexOf("U+"); + } + else + sIn = maInput.toString(); + while( nUPlus != -1 ) + { + nUnicode = o3tl::toUInt32(sIn.subView(0, nUPlus), 16); + //prevent creating control characters or invalid Unicode values + if( !rtl::isUnicodeCodePoint(nUnicode) || nUnicode < 0x20 ) + maInput = sIn.subView(nUPlus); + sIn = sIn.copy(nUPlus+2); + nUPlus = sIn.indexOf("U+"); + } + + nUnicode = sIn.toUInt32(16); + if( !rtl::isUnicodeCodePoint(nUnicode) || nUnicode < 0x20 ) + maInput.truncate().append( sIn[sIn.getLength()-1] ); + return maInput.toString(); +} + +sal_uInt32 ToggleUnicodeCodepoint::CharsToDelete() +{ + OUString sIn = StringToReplace(); + sal_Int32 nPos = 0; + sal_uInt32 counter = 0; + while( nPos < sIn.getLength() ) + { + sIn.iterateCodePoints(&nPos); + ++counter; + } + return counter; +} + +OUString ToggleUnicodeCodepoint::ReplacementString() +{ + OUString sIn = StringToReplace(); + OUStringBuffer output = ""; + sal_Int32 nUPlus = sIn.indexOf("U+"); + // convert from hex notation to glyph + if( nUPlus != -1 || (sIn.getLength() > 1 && mbIsHexString) ) + { + sal_uInt32 nUnicode = 0; + if( nUPlus == 0) + { + sIn = sIn.copy(2); + nUPlus = sIn.indexOf("U+"); + } + while( nUPlus > 0 ) + { + nUnicode = o3tl::toUInt32(sIn.subView(0, nUPlus), 16); + output.appendUtf32( nUnicode ); + + sIn = sIn.copy(nUPlus+2); + nUPlus = sIn.indexOf("U+"); + } + nUnicode = sIn.toUInt32(16); + output.appendUtf32( nUnicode ); + } + // convert from glyph to hex notation + else + { + sal_Int32 nPos = 0; + while( nPos < sIn.getLength() ) + { + OUStringBuffer aTmp = OUString::number(sIn.iterateCodePoints(&nPos),16); + //pad with zeros - minimum length of 4. + for( sal_Int32 i = 4 - aTmp.getLength(); i > 0; --i ) + aTmp.insert( 0,"0" ); + output.append( "U+" + aTmp ); + } + } + return output.makeStringAndClear(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/unicode_data.h b/i18nutil/source/utility/unicode_data.h new file mode 100644 index 0000000000..af23f95488 --- /dev/null +++ b/i18nutil/source/utility/unicode_data.h @@ -0,0 +1,763 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_I18NUTIL_SOURCE_UTILITY_UNICODE_DATA_H +#define INCLUDED_I18NUTIL_SOURCE_UTILITY_UNICODE_DATA_H + +#include <sal/types.h> + + +#define UnicodeDirectionNumberBlock 3 + +const sal_Int8 UnicodeDirectionIndex[] = { + 0x03, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, // 0000 - 07ff + 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, // 0800 - 0fff + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, // 1000 - 17ff + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, // 1800 - 1fff + 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, // 2000 - 27ff + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1f, // 2800 - 2fff + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3000 - 37ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 3800 - 3fff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 4000 - 47ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 4800 - 4fff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 5000 - 57ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 5800 - 5fff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 6000 - 67ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 6800 - 6fff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 7000 - 77ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 7800 - 7fff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 8000 - 87ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 8800 - 8fff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9000 - 97ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9800 - 9fff + 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, // a000 - a7ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // a800 - afff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // b000 - b7ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // b800 - bfff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // c000 - c7ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // c800 - cfff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // d000 - d7ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // d800 - dfff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // e000 - e7ff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // e800 - efff + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // f000 - f7ff + 0x00, 0x00, 0x00, 0x22, 0x02, 0x23, 0x24, 0x25, // f800 - ffff +}; + + +const sal_Int8 UnicodeDirectionBlockValue[] = { + 0, 10, 13, +}; + + +const sal_Int8 UnicodeDirectionValue[] = { + 18,18,18,18,18,18,18,18,18, 8, 7, 8, 9, 7,18,18,// 0000 - 000f + 18,18,18,18,18,18,18,18,18,18,18,18, 7, 7, 7, 8,// 0010 - 001f + 9,10,10, 4, 4, 4,10,10,10,10,10, 4, 6, 4, 6, 3,// 0020 - 002f + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,10,10,10,10,10,// 0030 - 003f + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0040 - 004f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10,10,// 0050 - 005f + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0060 - 006f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10,18,// 0070 - 007f + 18,18,18,18,18, 7,18,18,18,18,18,18,18,18,18,18,// 0080 - 008f + 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,// 0090 - 009f + 6,10, 4, 4, 4, 4,10,10,10,10, 0,10,10,10,10,10,// 00a0 - 00af + 4, 4, 2, 2,10, 0,10,10,10, 2, 0,10,10,10,10,10,// 00b0 - 00bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 00c0 - 00cf + 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0, 0,// 00d0 - 00df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 00e0 - 00ef + 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0, 0,// 00f0 - 00ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0200 - 020f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0210 - 021f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0220 - 022f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0230 - 023f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0240 - 024f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0250 - 025f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0260 - 026f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0270 - 027f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0280 - 028f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0290 - 029f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 02a0 - 02af + 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0,// 02b0 - 02bf + 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 02c0 - 02cf + 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 02d0 - 02df + 0, 0, 0, 0, 0,10,10,10,10,10,10,10,10,10, 0, 0,// 02e0 - 02ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 02f0 - 02ff + + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0300 - 030f + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0310 - 031f + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0320 - 032f + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0330 - 033f + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, 0,// 0340 - 034f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0350 - 035f + 17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0360 - 036f + 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,10, 0,// 0370 - 037f + 0, 0, 0, 0,10,10, 0,10, 0, 0, 0, 0, 0, 0, 0, 0,// 0380 - 038f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0390 - 039f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03a0 - 03af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03b0 - 03bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03c0 - 03cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03d0 - 03df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03e0 - 03ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 03f0 - 03ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0400 - 040f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0410 - 041f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0420 - 042f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0430 - 043f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0440 - 044f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0450 - 045f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0460 - 046f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0470 - 047f + 0, 0, 0,17,17,17,17, 0,17,17, 0, 0, 0, 0, 0, 0,// 0480 - 048f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0490 - 049f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04a0 - 04af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04b0 - 04bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04c0 - 04cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04d0 - 04df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04e0 - 04ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 04f0 - 04ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0500 - 050f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0510 - 051f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0520 - 052f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0530 - 053f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0540 - 054f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0550 - 055f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0560 - 056f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0570 - 057f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0,// 0580 - 058f + 0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0590 - 059f + 17,17, 0,17,17,17,17,17,17,17,17,17,17,17,17,17,// 05a0 - 05af + 17,17,17,17,17,17,17,17,17,17, 0,17,17,17, 1,17,// 05b0 - 05bf + 1,17,17, 1,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 05c0 - 05cf + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,// 05d0 - 05df + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,// 05e0 - 05ef + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 05f0 - 05ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,// 0600 - 060f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13, 0, 0, 0,13,// 0610 - 061f + 0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0620 - 062f + 13,13,13,13,13,13,13,13,13,13,13, 0, 0, 0, 0, 0,// 0630 - 063f + 13,13,13,13,13,13,13,13,13,13,13,17,17,17,17,17,// 0640 - 064f + 17,17,17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0650 - 065f + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5,13, 0, 0,// 0660 - 066f + 17,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0670 - 067f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0680 - 068f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0690 - 069f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 06a0 - 06af + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 06b0 - 06bf + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 06c0 - 06cf + 13,13,13,13,13,13,17,17,17,17,17,17,17,17,17,17,// 06d0 - 06df + 17,17,17,17,17,13,13,17,17,10,17,17,17,17, 0, 0,// 06e0 - 06ef + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,13,13,13,13,13, 0,// 06f0 - 06ff + + 13,13,13,13,13,13,13,13,13,13,13,13,13,13, 0,18,// 0700 - 070f + 13,17,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0710 - 071f + 13,13,13,13,13,13,13,13,13,13,13,13,13, 0, 0, 0,// 0720 - 072f + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0730 - 073f + 17,17,17,17,17,17,17,17,17,17,17, 0, 0, 0, 0, 0,// 0740 - 074f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0750 - 075f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0760 - 076f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0770 - 077f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0780 - 078f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// 0790 - 079f + 13,13,13,13,13,13,17,17,17,17,17,17,17,17,17,17,// 07a0 - 07af + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07b0 - 07bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07c0 - 07cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07d0 - 07df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07e0 - 07ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 07f0 - 07ff + + 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0900 - 090f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0910 - 091f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0920 - 092f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 0930 - 093f + 0,17,17,17,17,17,17,17,17, 0, 0, 0, 0,17, 0, 0,// 0940 - 094f + 0,17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0950 - 095f + 0, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0960 - 096f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0970 - 097f + 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0980 - 098f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0990 - 099f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09a0 - 09af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 09b0 - 09bf + 0,17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 09c0 - 09cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09d0 - 09df + 0, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09e0 - 09ef + 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 09f0 - 09ff + + 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a00 - 0a0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a10 - 0a1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a20 - 0a2f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 0a30 - 0a3f + 0,17,17, 0, 0, 0, 0,17,17, 0, 0,17,17,17, 0, 0,// 0a40 - 0a4f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a50 - 0a5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a60 - 0a6f + 17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a70 - 0a7f + 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a80 - 0a8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0a90 - 0a9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0aa0 - 0aaf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0,// 0ab0 - 0abf + 0,17,17,17,17,17, 0,17,17, 0, 0, 0, 0,17, 0, 0,// 0ac0 - 0acf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ad0 - 0adf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ae0 - 0aef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0af0 - 0aff + + 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b00 - 0b0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b10 - 0b1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b20 - 0b2f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,17,// 0b30 - 0b3f + 0,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 0b40 - 0b4f + 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b50 - 0b5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b60 - 0b6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b70 - 0b7f + 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b80 - 0b8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0b90 - 0b9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ba0 - 0baf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0bb0 - 0bbf + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 0bc0 - 0bcf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0bd0 - 0bdf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0be0 - 0bef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0bf0 - 0bff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c00 - 0c0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c10 - 0c1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c20 - 0c2f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,// 0c30 - 0c3f + 17, 0, 0, 0, 0, 0,17,17,17, 0,17,17,17,17, 0, 0,// 0c40 - 0c4f + 0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c50 - 0c5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c60 - 0c6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c70 - 0c7f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c80 - 0c8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0c90 - 0c9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ca0 - 0caf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,// 0cb0 - 0cbf + 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0,17,17, 0, 0,// 0cc0 - 0ccf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0cd0 - 0cdf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ce0 - 0cef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0cf0 - 0cff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d00 - 0d0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d10 - 0d1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d20 - 0d2f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d30 - 0d3f + 0,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0,// 0d40 - 0d4f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d50 - 0d5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d60 - 0d6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d70 - 0d7f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d80 - 0d8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0d90 - 0d9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0da0 - 0daf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0db0 - 0dbf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0,// 0dc0 - 0dcf + 0, 0,17,17,17, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0dd0 - 0ddf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0de0 - 0def + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0df0 - 0dff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e00 - 0e0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e10 - 0e1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e20 - 0e2f + 0,17, 0, 0,17,17,17,17,17,17,17, 0, 0, 0, 0, 4,// 0e30 - 0e3f + 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17,17,17, 0,// 0e40 - 0e4f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e50 - 0e5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e60 - 0e6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e70 - 0e7f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e80 - 0e8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0e90 - 0e9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ea0 - 0eaf + 0,17, 0, 0,17,17,17,17,17,17, 0,17,17, 0, 0, 0,// 0eb0 - 0ebf + 0, 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17, 0, 0,// 0ec0 - 0ecf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ed0 - 0edf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ee0 - 0eef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ef0 - 0eff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f00 - 0f0f + 0, 0, 0, 0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0, 0,// 0f10 - 0f1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f20 - 0f2f + 0, 0, 0, 0, 0,17, 0,17, 0,17,10,10,10,10, 0, 0,// 0f30 - 0f3f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f40 - 0f4f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f50 - 0f5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0f60 - 0f6f + 0,17,17,17,17,17,17,17,17,17,17,17,17,17,17, 0,// 0f70 - 0f7f + 17,17,17,17,17, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0,// 0f80 - 0f8f + 17,17,17,17,17,17,17,17, 0,17,17,17,17,17,17,17,// 0f90 - 0f9f + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 0fa0 - 0faf + 17,17,17,17,17,17,17,17,17,17,17,17,17, 0, 0, 0,// 0fb0 - 0fbf + 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0fc0 - 0fcf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0fd0 - 0fdf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0fe0 - 0fef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 0ff0 - 0fff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1000 - 100f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1010 - 101f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,17,// 1020 - 102f + 17, 0,17, 0, 0, 0,17,17, 0,17, 0, 0, 0, 0, 0, 0,// 1030 - 103f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1040 - 104f + 0, 0, 0, 0, 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0, 0,// 1050 - 105f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1060 - 106f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1070 - 107f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1080 - 108f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1090 - 109f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10a0 - 10af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10b0 - 10bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10c0 - 10cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10d0 - 10df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10e0 - 10ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 10f0 - 10ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1600 - 160f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1610 - 161f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1620 - 162f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1630 - 163f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1640 - 164f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1650 - 165f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1660 - 166f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1670 - 167f + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1680 - 168f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0,// 1690 - 169f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16a0 - 16af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16b0 - 16bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16c0 - 16cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16d0 - 16df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16e0 - 16ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 16f0 - 16ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1700 - 170f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1710 - 171f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1720 - 172f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1730 - 173f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1740 - 174f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1750 - 175f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1760 - 176f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1770 - 177f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1780 - 178f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1790 - 179f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 17a0 - 17af + 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17,17, 0, 0,// 17b0 - 17bf + 0, 0, 0, 0, 0, 0,17, 0, 0,17,17,17,17,17,17,17,// 17c0 - 17cf + 17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,// 17d0 - 17df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 17e0 - 17ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 17f0 - 17ff + + 10,10,10,10,10,10,10,10,10,10,10,18,18,18,18, 0,// 1800 - 180f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1810 - 181f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1820 - 182f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1830 - 183f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1840 - 184f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1850 - 185f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1860 - 186f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1870 - 187f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1880 - 188f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1890 - 189f + 0, 0, 0, 0, 0, 0, 0, 0, 0,17, 0, 0, 0, 0, 0, 0,// 18a0 - 18af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18b0 - 18bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18c0 - 18cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18d0 - 18df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18e0 - 18ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 18f0 - 18ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f00 - 1f0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f10 - 1f1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f20 - 1f2f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f30 - 1f3f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f40 - 1f4f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f50 - 1f5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f60 - 1f6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f70 - 1f7f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f80 - 1f8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1f90 - 1f9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 1fa0 - 1faf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0,10,// 1fb0 - 1fbf + 10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,// 1fc0 - 1fcf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,// 1fd0 - 1fdf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,// 1fe0 - 1fef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0,// 1ff0 - 1fff + + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,18,18,18, 0, 1,// 2000 - 200f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2010 - 201f + 10,10,10,10,10,10,10,10, 9, 7,11,14,16,12,15, 9,// 2020 - 202f + 4, 4, 4, 4, 4,10,10,10,10,10,10,10,10,10,10,10,// 2030 - 203f + 10,10,10,10,10,10,10, 0,10,10,10,10,10,10, 0, 0,// 2040 - 204f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2050 - 205f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,18,18,18,18,18,18,// 2060 - 206f + 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 4, 4,10,10,10, 0,// 2070 - 207f + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4,10,10,10, 0,// 2080 - 208f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2090 - 209f + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,// 20a0 - 20af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20b0 - 20bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20c0 - 20cf + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,// 20d0 - 20df + 17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20e0 - 20ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 20f0 - 20ff + + 10,10, 0,10,10,10,10, 0,10,10, 0, 0, 0, 0, 0, 0,// 2100 - 210f + 0, 0, 0, 0,10, 0,10,10,10, 0, 0, 0, 0, 0,10,10,// 2110 - 211f + 10,10,10,10, 0,10, 0,10, 0,10, 0, 0, 0, 0, 4, 0,// 2120 - 212f + 0, 0,10, 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0,// 2130 - 213f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2140 - 214f + 0, 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2150 - 215f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2160 - 216f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2170 - 217f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2180 - 218f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2190 - 219f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21a0 - 21af + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21b0 - 21bf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21c0 - 21cf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21d0 - 21df + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 21e0 - 21ef + 10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 21f0 - 21ff + + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2200 - 220f + 10,10, 4, 4,10,10,10,10,10,10,10,10,10,10,10,10,// 2210 - 221f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2220 - 222f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2230 - 223f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2240 - 224f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2250 - 225f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2260 - 226f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2270 - 227f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2280 - 228f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2290 - 229f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22a0 - 22af + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22b0 - 22bf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22c0 - 22cf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22d0 - 22df + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 22e0 - 22ef + 10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 22f0 - 22ff + + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2300 - 230f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2310 - 231f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2320 - 232f + 10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2330 - 233f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2340 - 234f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2350 - 235f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2360 - 236f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0,10,10,10,// 2370 - 237f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2380 - 238f + 10,10,10,10,10, 0,10,10,10,10,10, 0, 0, 0, 0, 0,// 2390 - 239f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23a0 - 23af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23b0 - 23bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23c0 - 23cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23d0 - 23df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23e0 - 23ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 23f0 - 23ff + + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2400 - 240f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2410 - 241f + 10,10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2420 - 242f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2430 - 243f + 10,10,10,10,10,10,10,10,10,10,10, 0, 0, 0, 0, 0,// 2440 - 244f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2450 - 245f + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,// 2460 - 246f + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,// 2470 - 247f + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,// 2480 - 248f + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,// 2490 - 249f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24a0 - 24af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24b0 - 24bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24c0 - 24cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24d0 - 24df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,// 24e0 - 24ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 24f0 - 24ff + + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2500 - 250f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2510 - 251f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2520 - 252f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2530 - 253f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2540 - 254f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2550 - 255f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2560 - 256f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2570 - 257f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2580 - 258f + 10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2590 - 259f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25a0 - 25af + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25b0 - 25bf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25c0 - 25cf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25d0 - 25df + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 25e0 - 25ef + 10,10,10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0,// 25f0 - 25ff + + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2600 - 260f + 10,10,10,10, 0, 0, 0, 0, 0,10,10,10,10,10,10,10,// 2610 - 261f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2620 - 262f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2630 - 263f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2640 - 264f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2650 - 265f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2660 - 266f + 10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2670 - 267f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2680 - 268f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2690 - 269f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26a0 - 26af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26b0 - 26bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26c0 - 26cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26d0 - 26df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26e0 - 26ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 26f0 - 26ff + + 0,10,10,10,10, 0,10,10,10,10, 0, 0,10,10,10,10,// 2700 - 270f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2710 - 271f + 10,10,10,10,10,10,10,10, 0,10,10,10,10,10,10,10,// 2720 - 272f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2730 - 273f + 10,10,10,10,10,10,10,10,10,10,10,10, 0,10, 0,10,// 2740 - 274f + 10,10,10, 0, 0, 0,10, 0,10,10,10,10,10,10,10, 0,// 2750 - 275f + 0,10,10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0,// 2760 - 276f + 0, 0, 0, 0, 0, 0,10,10,10,10,10,10,10,10,10,10,// 2770 - 277f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2780 - 278f + 10,10,10,10,10, 0, 0, 0,10,10,10,10,10,10,10,10,// 2790 - 279f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 27a0 - 27af + 0,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 0,// 27b0 - 27bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27c0 - 27cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27d0 - 27df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27e0 - 27ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 27f0 - 27ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e00 - 2e0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e10 - 2e1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e20 - 2e2f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e30 - 2e3f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e40 - 2e4f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e50 - 2e5f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e60 - 2e6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2e70 - 2e7f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2e80 - 2e8f + 10,10,10,10,10,10,10,10,10,10, 0,10,10,10,10,10,// 2e90 - 2e9f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ea0 - 2eaf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2eb0 - 2ebf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ec0 - 2ecf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ed0 - 2edf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2ee0 - 2eef + 10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2ef0 - 2eff + + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f00 - 2f0f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f10 - 2f1f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f20 - 2f2f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f30 - 2f3f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f40 - 2f4f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f50 - 2f5f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f60 - 2f6f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f70 - 2f7f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f80 - 2f8f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2f90 - 2f9f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2fa0 - 2faf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2fb0 - 2fbf + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 2fc0 - 2fcf + 10,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2fd0 - 2fdf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 2fe0 - 2fef + 10,10,10,10,10,10,10,10,10,10,10,10, 0, 0, 0, 0,// 2ff0 - 2fff + + 9,10,10,10,10, 0, 0, 0,10,10,10,10,10,10,10,10,// 3000 - 300f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// 3010 - 301f + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,17,17,17,17,// 3020 - 302f + 10, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0,10,10,// 3030 - 303f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3040 - 304f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3050 - 305f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3060 - 306f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3070 - 307f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 3080 - 308f + 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17,10,10, 0, 0, 0,// 3090 - 309f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30a0 - 30af + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30b0 - 30bf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30c0 - 30cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30d0 - 30df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// 30e0 - 30ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0,// 30f0 - 30ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a400 - a40f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a410 - a41f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a420 - a42f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a430 - a43f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a440 - a44f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a450 - a45f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a460 - a46f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a470 - a47f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a480 - a48f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// a490 - a49f + 10,10, 0, 0,10,10,10,10,10,10,10,10,10,10,10,10,// a4a0 - a4af + 10,10,10,10, 0,10,10,10,10,10,10,10,10,10,10,10,// a4b0 - a4bf + 10, 0,10,10,10, 0,10, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4c0 - a4cf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4d0 - a4df + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4e0 - a4ef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// a4f0 - a4ff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fb00 - fb0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,17, 1,// fb10 - fb1f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1,// fb20 - fb2f + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0,// fb30 - fb3f + 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,// fb40 - fb4f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb50 - fb5f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb60 - fb6f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb70 - fb7f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb80 - fb8f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fb90 - fb9f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fba0 - fbaf + 13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fbb0 - fbbf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fbc0 - fbcf + 0, 0, 0,13,13,13,13,13,13,13,13,13,13,13,13,13,// fbd0 - fbdf + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fbe0 - fbef + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fbf0 - fbff + + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd00 - fd0f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd10 - fd1f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd20 - fd2f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,10,// fd30 - fd3f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fd40 - fd4f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd50 - fd5f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd60 - fd6f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd70 - fd7f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd80 - fd8f + 0, 0,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fd90 - fd9f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fda0 - fdaf + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fdb0 - fdbf + 13,13,13,13,13,13,13,13, 0, 0, 0, 0, 0, 0, 0, 0,// fdc0 - fdcf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fdd0 - fddf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fde0 - fdef + 13,13,13,13,13,13,13,13,13,13,13,13, 0, 0, 0, 0,// fdf0 - fdff + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fe00 - fe0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fe10 - fe1f + 17,17,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// fe20 - fe2f + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,// fe30 - fe3f + 10,10,10,10,10, 0, 0, 0, 0,10,10,10,10,10,10,10,// fe40 - fe4f + 6,10, 6, 0,10, 6,10,10,10,10,10,10,10,10,10, 4,// fe50 - fe5f + 10,10, 4, 4,10,10,10, 0,10, 4, 4,10, 0, 0, 0, 0,// fe60 - fe6f + 13,13,13, 0,13, 0,13,13,13,13,13,13,13,13,13,13,// fe70 - fe7f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fe80 - fe8f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fe90 - fe9f + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fea0 - feaf + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// feb0 - febf + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fec0 - fecf + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fed0 - fedf + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,// fee0 - feef + 13,13,13,13,13,13,13,13,13,13,13,13,13, 0, 0,18,// fef0 - feff + + 0,10,10, 4, 4, 4,10,10,10,10,10, 4, 6, 4, 6, 3,// ff00 - ff0f + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,10,10,10,10,10,// ff10 - ff1f + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff20 - ff2f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10,10,// ff30 - ff3f + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff40 - ff4f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10,10,10, 0,// ff50 - ff5f + 0,10,10,10,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff60 - ff6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff70 - ff7f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff80 - ff8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ff90 - ff9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffa0 - ffaf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffb0 - ffbf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffc0 - ffcf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,// ffd0 - ffdf + 4, 4,10,10,10, 4, 4, 0,10,10,10,10,10,10,10, 0,// ffe0 - ffef + 0, 0, 0, 0, 0, 0, 0, 0, 0,18,18,18,10,10, 0, 0,// fff0 - ffff + +}; + + +#define UnicodeScriptTypeFrom 0 +#define UnicodeScriptTypeTo 1 + +const sal_Unicode UnicodeScriptType[][2] = { + {0x0000, 0x007f}, // 0. Basic Latin + {0x0080, 0x00ff}, // 1. Latin-1 Supplement + {0x0100, 0x017f}, // 2. Latin Extended-A + {0x0180, 0x024f}, // 3. Latin Extended-B + {0x0250, 0x02af}, // 4. IPA Extensions + {0x02b0, 0x02ff}, // 5. Spacing Modifier Letters + {0x0300, 0x036f}, // 6. Combining Diacritical Marks + {0x0370, 0x03ff}, // 7. Greek + {0x0400, 0x04ff}, // 8. Cyrillic + {0x0530, 0x058f}, // 9. Armenian + {0x0590, 0x05ff}, // 10. Hebrew + {0x0600, 0x06ff}, // 11. Arabic + {0x0700, 0x074f}, // 12. Syriac + {0x0780, 0x07bf}, // 13. Thaana + {0x0900, 0x097f}, // 14. Devanagari + {0x0980, 0x09ff}, // 15. Bengali + {0x0a00, 0x0a7f}, // 16. Gurmukhi + {0x0a80, 0x0aff}, // 17. Gujarati + {0x0b00, 0x0b7f}, // 18. Odia + {0x0b80, 0x0bff}, // 19. Tamil + {0x0c00, 0x0c7f}, // 20. Telugu + {0x0c80, 0x0cff}, // 21. Kannada + {0x0d00, 0x0d7f}, // 22. Malayalam + {0x0d80, 0x0dff}, // 23. Sinhala + {0x0e00, 0x0e7f}, // 24. Thai + {0x0e80, 0x0eff}, // 25. Lao + {0x0f00, 0x0fff}, // 26. Tibetan + {0x1000, 0x109f}, // 27. Myanmar + {0x10a0, 0x10ff}, // 28. Georgian + {0x1100, 0x11ff}, // 29. Hangul Jamo + {0x1200, 0x137f}, // 30. Ethiopic + {0x13a0, 0x13ff}, // 31. Cherokee + {0x1400, 0x167f}, // 32. Unified Canadian Aboriginal Syllabics + {0x1680, 0x169f}, // 33. Ogham + {0x16a0, 0x16ff}, // 34. Runic + {0x1780, 0x17ff}, // 35. Khmer + {0x1800, 0x18af}, // 36. Mongolian + {0x1e00, 0x1eff}, // 37. Latin Extended Additional + {0x1f00, 0x1fff}, // 38. Greek Extended + {0x2000, 0x206f}, // 39. General Punctuation + {0x2070, 0x209f}, // 40. Superscripts and Subscripts + {0x20a0, 0x20cf}, // 41. Currency Symbols + {0x20d0, 0x20ff}, // 42. Combining Marks for Symbols + {0x2100, 0x214f}, // 43. Letterlike Symbols + {0x2150, 0x218f}, // 44. Number Forms + {0x2190, 0x21ff}, // 45. Arrows + {0x2200, 0x22ff}, // 46. Mathematical Operators + {0x2300, 0x23ff}, // 47. Miscellaneous Technical + {0x2400, 0x243f}, // 48. Control Pictures + {0x2440, 0x245f}, // 49. Optical Character Recognition + {0x2460, 0x24ff}, // 50. Enclosed Alphanumerics + {0x2500, 0x257f}, // 51. Box Drawing + {0x2580, 0x259f}, // 52. Block Elements + {0x25a0, 0x25ff}, // 53. Geometric Shapes + {0x2600, 0x26ff}, // 54. Miscellaneous Symbols + {0x2700, 0x27bf}, // 55. Dingbats + {0x2800, 0x28ff}, // 56. Braille Patterns + {0x2e80, 0x2eff}, // 57. CJK Radicals Supplement + {0x2f00, 0x2fdf}, // 58. Kangxi Radicals + {0x2ff0, 0x2fff}, // 59. Ideographic Description Characters + {0x3000, 0x303f}, // 60. CJK Symbols and Punctuation + {0x3040, 0x309f}, // 61. Hiragana + {0x30a0, 0x30ff}, // 62. Katakana + {0x3100, 0x312f}, // 63. Bopomofo + {0x3130, 0x318f}, // 64. Hangul Compatibility Jamo + {0x3190, 0x319f}, // 65. Kanbun + {0x31a0, 0x31bf}, // 66. Bopomofo Extended + {0x3200, 0x32ff}, // 67. Enclosed CJK Letters and Months + {0x3300, 0x33ff}, // 68. CJK Compatibility + {0x3400, 0x4db5}, // 69. CJK Unified Ideographs Extension A + {0x4e00, 0x9fff}, // 70. CJK Unified Ideographs + {0xa000, 0xa48f}, // 71. Yi Syllables + {0xa490, 0xa4cf}, // 72. Yi Radicals + {0xac00, 0xd7a3}, // 73. Hangul Syllables + {0xd800, 0xdb7f}, // 74. High Surrogates + {0xdb80, 0xdbff}, // 75. High Private Use Surrogates + {0xdc00, 0xdfff}, // 76. Low Surrogates + {0xe000, 0xf8ff}, // 77. Private Use + {0xf900, 0xfaff}, // 78. CJK Compatibility Ideographs + {0xfb00, 0xfb4f}, // 79. Alphabetic Presentation Forms + {0xfb50, 0xfdff}, // 80. Arabic Presentation Forms-A + {0xfe20, 0xfe2f}, // 81. Combining Half Marks + {0xfe30, 0xfe4f}, // 82. CJK Compatibility Forms + {0xfe50, 0xfe6f}, // 83. Small Form Variants + {0xfe70, 0xfefe}, // 84. Arabic Presentation Forms-B + {0xfeff, 0xfeff}, // 85. kNoScript + {0xff00, 0xffef}, // 85. Halfwidth and Fullwidth Forms +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/widthfolding.cxx b/i18nutil/source/utility/widthfolding.cxx new file mode 100644 index 0000000000..6a1b52d161 --- /dev/null +++ b/i18nutil/source/utility/widthfolding.cxx @@ -0,0 +1,244 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <i18nutil/widthfolding.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include "widthfolding_data.h" + +using namespace com::sun::star::uno; + + +namespace i18nutil { + +sal_Unicode widthfolding::decompose_ja_voiced_sound_marksChar2Char (sal_Unicode inChar) +{ + if (0x30a0 <= inChar && inChar <= 0x30ff) { + sal_Int16 i = inChar - 0x3040; + if (decomposition_table[i].decomposited_character_1) + return 0xFFFF; + } + return inChar; +} + +/** + * Decompose Japanese specific voiced and semi-voiced sound marks. + */ +OUString widthfolding::decompose_ja_voiced_sound_marks (const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, Sequence< sal_Int32 >* pOffset ) +{ + // Create a string buffer which can hold nCount * 2 + 1 characters. + // Its size may become double of nCount. + // The reference count is 1 now. + rtl_uString * newStr = rtl_uString_alloc(nCount * 2); + + sal_Int32 *p = nullptr; + sal_Int32 position = 0; + if (pOffset) { + // Allocate double of nCount length to offset argument. + pOffset->realloc( nCount * 2 ); + p = pOffset->getArray(); + position = startPos; + } + + // Prepare pointers of unicode character arrays. + const sal_Unicode* src = inStr.getStr() + startPos; + sal_Unicode* dst = newStr->buffer; + + // Decomposition: GA --> KA + voice-mark + while (nCount -- > 0) { + sal_Unicode c = *src++; + // see http://charts.unicode.org/Web/U3040.html Hiragana (U+3040..U+309F) + // see http://charts.unicode.org/Web/U30A0.html Katakana (U+30A0..U+30FF) + // Hiragana is not applied to decomposition. + // Only Katakana is applied to decomposition + if (0x30a0 <= c && c <= 0x30ff) { + int i = int(c - 0x3040); + sal_Unicode first = decomposition_table[i].decomposited_character_1; + if (first != 0x0000) { + *dst ++ = first; + *dst ++ = decomposition_table[i].decomposited_character_2; // second + if (pOffset) { + *p ++ = position; + *p ++ = position ++; + } + continue; + } + } + *dst ++ = c; + if (pOffset) + *p ++ = position ++; + } + *dst = u'\0'; + + newStr->length = sal_Int32(dst - newStr->buffer); + if (pOffset) + pOffset->realloc(newStr->length); + return OUString(newStr, SAL_NO_ACQUIRE); // take ownership +} + +oneToOneMapping& widthfolding::getfull2halfTable() +{ + static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_NORMAL); + table.makeIndex(); + return table; +} + +/** + * Compose Japanese specific voiced and semi-voiced sound marks. + */ +OUString widthfolding::compose_ja_voiced_sound_marks (const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, Sequence< sal_Int32 >* pOffset, sal_Int32 nFlags ) +{ + // Create a string buffer which can hold nCount + 1 characters. + // Its size may become equal to nCount or smaller. + // The reference count is 1 now. + rtl_uString * newStr = rtl_uString_alloc(nCount); + + // Prepare pointers of unicode character arrays. + const sal_Unicode* src = inStr.getStr() + startPos; + sal_Unicode* dst = newStr->buffer; + + // This conversion algorithm requires at least one character. + if (nCount > 0) { + + // .. .. KA VOICE .. .. + // ^ ^ + // previousChar currentChar + // ^ + // position + // + // will be converted to + // .. .. GA .. .. + + sal_Int32 *p = nullptr; + sal_Int32 position = 0; + if (pOffset) { + // Allocate nCount length to offset argument. + pOffset->realloc( nCount ); + p = pOffset->getArray(); + position = startPos; + } + + // + sal_Unicode previousChar = *src ++; + sal_Unicode currentChar; + + // Composition: KA + voice-mark --> GA + while (-- nCount > 0) { + currentChar = *src ++; + // see http://charts.unicode.org/Web/U3040.html Hiragana (U+3040..U+309F) + // see http://charts.unicode.org/Web/U30A0.html Katakana (U+30A0..U+30FF) + // 0x3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + // 0x309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + // 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK + // 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + int j = currentChar - 0x3099; // 0x3099, 0x309a, 0x309b, 0x309c ? + + if (2 <= j && j <= 3) // 0x309b or 0x309c + j -= 2; + + if (0 <= j && j <= 1) { + // 0 addresses a code point regarding 0x3099 or 0x309b (voiced sound mark), + // 1 is 0x309a or 0x309c (semi-voiced sound mark) + int i = int(previousChar - 0x3040); // i acts as an index of array + bool bCompose = false; + + if (0 <= i && i <= (0x30ff - 0x3040) && composition_table[i][j]) + bCompose = true; + + // not to use combined KATAKANA LETTER VU + if ( previousChar == 0x30a6 && (nFlags & WIDTHFOLDING_DONT_USE_COMBINED_VU) ) + bCompose = false; + + if( bCompose ){ + if (pOffset) { + position ++; + *p ++ = position ++; + } + *dst ++ = composition_table[i][j]; + previousChar = *src ++; + nCount --; + continue; + } + } + if (pOffset) + *p ++ = position ++; + *dst ++ = previousChar; + previousChar = currentChar; + } + + if (nCount == 0) { + if (pOffset) + *p = position; + *dst ++ = previousChar; + } + + *dst = u'\0'; + + newStr->length = sal_Int32(dst - newStr->buffer); + } + if (pOffset) + pOffset->realloc(newStr->length); + return OUString(newStr, SAL_NO_ACQUIRE); // take ownership +} + +oneToOneMapping& widthfolding::gethalf2fullTable() +{ + static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_NORMAL); + table.makeIndex(); + return table; +} + +sal_Unicode widthfolding::getCompositionChar(sal_Unicode c1, sal_Unicode c2) +{ + return composition_table[c1 - 0x3040][c2 - 0x3099]; +} + + +oneToOneMapping& widthfolding::getfull2halfTableForASC() +{ + static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_ASC_FUNCTION); + table.makeIndex(); + + return table; +} + +oneToOneMapping& widthfolding::gethalf2fullTableForJIS() +{ + static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_JIS_FUNCTION); + table.makeIndex(); + + return table; +} + +oneToOneMapping& widthfolding::getfullKana2halfKanaTable() +{ + static oneToOneMappingWithFlag table(full2half, sizeof(full2half), FULL2HALF_KATAKANA_ONLY); + table.makeIndex(); + return table; +} + +oneToOneMapping& widthfolding::gethalfKana2fullKanaTable() +{ + static oneToOneMappingWithFlag table(half2full, sizeof(half2full), HALF2FULL_KATAKANA_ONLY); + table.makeIndex(); + return table; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18nutil/source/utility/widthfolding_data.h b/i18nutil/source/utility/widthfolding_data.h new file mode 100644 index 0000000000..26ead65d04 --- /dev/null +++ b/i18nutil/source/utility/widthfolding_data.h @@ -0,0 +1,941 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef INCLUDED_I18NUTIL_SOURCE_UTILITY_WIDTHFOLDING_DATA_H +#define INCLUDED_I18NUTIL_SOURCE_UTILITY_WIDTHFOLDING_DATA_H + +#include <i18nutil/oneToOneMapping.hxx> + +namespace i18nutil { + +/* + Unicode Normalization Forms + http://www.unicode.org/unicode/reports/tr15/index.html + http://www.w3.org/International/charlint/ +*/ + +typedef struct { + sal_Unicode decomposited_character_1; + sal_Unicode decomposited_character_2; +} decomposition_table_entry_t; + +// bluedwarf: 0x3099 (COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK) +// => 0x309b (KATAKANA-HIRAGANA VOICED SOUND MARK) +// +// 0x309a (COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) +// => 0x309c (KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) +// +// the combining characters shouldn't be used +const decomposition_table_entry_t decomposition_table[] = { + { 0x0000, 0x0000 }, // 0x3040 + { 0x0000, 0x0000 }, // 0x3041 HIRAGANA LETTER SMALL A + { 0x0000, 0x0000 }, // 0x3042 HIRAGANA LETTER A + { 0x0000, 0x0000 }, // 0x3043 HIRAGANA LETTER SMALL I + { 0x0000, 0x0000 }, // 0x3044 HIRAGANA LETTER I + { 0x0000, 0x0000 }, // 0x3045 HIRAGANA LETTER SMALL U + { 0x0000, 0x0000 }, // 0x3046 HIRAGANA LETTER U + { 0x0000, 0x0000 }, // 0x3047 HIRAGANA LETTER SMALL E + { 0x0000, 0x0000 }, // 0x3048 HIRAGANA LETTER E + { 0x0000, 0x0000 }, // 0x3049 HIRAGANA LETTER SMALL O + { 0x0000, 0x0000 }, // 0x304a HIRAGANA LETTER O + { 0x0000, 0x0000 }, // 0x304b HIRAGANA LETTER KA + { 0x304b, 0x309b }, // 0x304c HIRAGANA LETTER GA --> HIRAGANA LETTER KA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x304d HIRAGANA LETTER KI + { 0x304d, 0x309b }, // 0x304e HIRAGANA LETTER GI --> HIRAGANA LETTER KI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x304f HIRAGANA LETTER KU + { 0x304f, 0x309b }, // 0x3050 HIRAGANA LETTER GU --> HIRAGANA LETTER KU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3051 HIRAGANA LETTER KE + { 0x3051, 0x309b }, // 0x3052 HIRAGANA LETTER GE --> HIRAGANA LETTER KE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3053 HIRAGANA LETTER KO + { 0x3053, 0x309b }, // 0x3054 HIRAGANA LETTER GO --> HIRAGANA LETTER KO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3055 HIRAGANA LETTER SA + { 0x3055, 0x309b }, // 0x3056 HIRAGANA LETTER ZA --> HIRAGANA LETTER SA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3057 HIRAGANA LETTER SI + { 0x3057, 0x309b }, // 0x3058 HIRAGANA LETTER ZI --> HIRAGANA LETTER SI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3059 HIRAGANA LETTER SU + { 0x3059, 0x309b }, // 0x305a HIRAGANA LETTER ZU --> HIRAGANA LETTER SU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x305b HIRAGANA LETTER SE + { 0x305b, 0x309b }, // 0x305c HIRAGANA LETTER ZE --> HIRAGANA LETTER SE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x305d HIRAGANA LETTER SO + { 0x305d, 0x309b }, // 0x305e HIRAGANA LETTER ZO --> HIRAGANA LETTER SO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x305f HIRAGANA LETTER TA + { 0x305f, 0x309b }, // 0x3060 HIRAGANA LETTER DA --> HIRAGANA LETTER TA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3061 HIRAGANA LETTER TI + { 0x3061, 0x309b }, // 0x3062 HIRAGANA LETTER DI --> HIRAGANA LETTER TI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3063 HIRAGANA LETTER SMALL TU + { 0x0000, 0x0000 }, // 0x3064 HIRAGANA LETTER TU + { 0x3064, 0x309b }, // 0x3065 HIRAGANA LETTER DU --> HIRAGANA LETTER TU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3066 HIRAGANA LETTER TE + { 0x3066, 0x309b }, // 0x3067 HIRAGANA LETTER DE --> HIRAGANA LETTER TE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3068 HIRAGANA LETTER TO + { 0x3068, 0x309b }, // 0x3069 HIRAGANA LETTER DO --> HIRAGANA LETTER TO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x306a HIRAGANA LETTER NA + { 0x0000, 0x0000 }, // 0x306b HIRAGANA LETTER NI + { 0x0000, 0x0000 }, // 0x306c HIRAGANA LETTER NU + { 0x0000, 0x0000 }, // 0x306d HIRAGANA LETTER NE + { 0x0000, 0x0000 }, // 0x306e HIRAGANA LETTER NO + { 0x0000, 0x0000 }, // 0x306f HIRAGANA LETTER HA + { 0x306f, 0x309b }, // 0x3070 HIRAGANA LETTER BA --> HIRAGANA LETTER HA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x306f, 0x309c }, // 0x3071 HIRAGANA LETTER PA --> HIRAGANA LETTER HA + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3072 HIRAGANA LETTER HI + { 0x3072, 0x309b }, // 0x3073 HIRAGANA LETTER BI --> HIRAGANA LETTER HI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x3072, 0x309c }, // 0x3074 HIRAGANA LETTER PI --> HIRAGANA LETTER HI + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3075 HIRAGANA LETTER HU + { 0x3075, 0x309b }, // 0x3076 HIRAGANA LETTER BU --> HIRAGANA LETTER HU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x3075, 0x309c }, // 0x3077 HIRAGANA LETTER PU --> HIRAGANA LETTER HU + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3078 HIRAGANA LETTER HE + { 0x3078, 0x309b }, // 0x3079 HIRAGANA LETTER BE --> HIRAGANA LETTER HE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x3078, 0x309c }, // 0x307a HIRAGANA LETTER PE --> HIRAGANA LETTER HE + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x307b HIRAGANA LETTER HO + { 0x307b, 0x309b }, // 0x307c HIRAGANA LETTER BO --> HIRAGANA LETTER HO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x307b, 0x309c }, // 0x307d HIRAGANA LETTER PO --> HIRAGANA LETTER HO + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x307e HIRAGANA LETTER MA + { 0x0000, 0x0000 }, // 0x307f HIRAGANA LETTER MI + { 0x0000, 0x0000 }, // 0x3080 HIRAGANA LETTER MU + { 0x0000, 0x0000 }, // 0x3081 HIRAGANA LETTER ME + { 0x0000, 0x0000 }, // 0x3082 HIRAGANA LETTER MO + { 0x0000, 0x0000 }, // 0x3083 HIRAGANA LETTER SMALL YA + { 0x0000, 0x0000 }, // 0x3084 HIRAGANA LETTER YA + { 0x0000, 0x0000 }, // 0x3085 HIRAGANA LETTER SMALL YU + { 0x0000, 0x0000 }, // 0x3086 HIRAGANA LETTER YU + { 0x0000, 0x0000 }, // 0x3087 HIRAGANA LETTER SMALL YO + { 0x0000, 0x0000 }, // 0x3088 HIRAGANA LETTER YO + { 0x0000, 0x0000 }, // 0x3089 HIRAGANA LETTER RA + { 0x0000, 0x0000 }, // 0x308a HIRAGANA LETTER RI + { 0x0000, 0x0000 }, // 0x308b HIRAGANA LETTER RU + { 0x0000, 0x0000 }, // 0x308c HIRAGANA LETTER RE + { 0x0000, 0x0000 }, // 0x308d HIRAGANA LETTER RO + { 0x0000, 0x0000 }, // 0x308e HIRAGANA LETTER SMALL WA + { 0x0000, 0x0000 }, // 0x308f HIRAGANA LETTER WA + { 0x0000, 0x0000 }, // 0x3090 HIRAGANA LETTER WI + { 0x0000, 0x0000 }, // 0x3091 HIRAGANA LETTER WE + { 0x0000, 0x0000 }, // 0x3092 HIRAGANA LETTER WO + { 0x0000, 0x0000 }, // 0x3093 HIRAGANA LETTER N + { 0x3046, 0x309b }, // 0x3094 HIRAGANA LETTER VU --> HIRAGANA LETTER U + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x3095 + { 0x0000, 0x0000 }, // 0x3096 + { 0x0000, 0x0000 }, // 0x3097 + { 0x0000, 0x0000 }, // 0x3098 + { 0x0000, 0x0000 }, // 0x3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309d HIRAGANA ITERATION MARK + { 0x0000, 0x0000 }, // 0x309e HIRAGANA VOICED ITERATION MARK + { 0x0000, 0x0000 }, // 0x309f + { 0x0000, 0x0000 }, // 0x30a0 + { 0x0000, 0x0000 }, // 0x30a1 KATAKANA LETTER SMALL A + { 0x0000, 0x0000 }, // 0x30a2 KATAKANA LETTER A + { 0x0000, 0x0000 }, // 0x30a3 KATAKANA LETTER SMALL I + { 0x0000, 0x0000 }, // 0x30a4 KATAKANA LETTER I + { 0x0000, 0x0000 }, // 0x30a5 KATAKANA LETTER SMALL U + { 0x0000, 0x0000 }, // 0x30a6 KATAKANA LETTER U + { 0x0000, 0x0000 }, // 0x30a7 KATAKANA LETTER SMALL E + { 0x0000, 0x0000 }, // 0x30a8 KATAKANA LETTER E + { 0x0000, 0x0000 }, // 0x30a9 KATAKANA LETTER SMALL O + { 0x0000, 0x0000 }, // 0x30aa KATAKANA LETTER O + { 0x0000, 0x0000 }, // 0x30ab KATAKANA LETTER KA + { 0x30ab, 0x309b }, // 0x30ac KATAKANA LETTER GA --> KATAKANA LETTER KA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30ad KATAKANA LETTER KI + { 0x30ad, 0x309b }, // 0x30ae KATAKANA LETTER GI --> KATAKANA LETTER KI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30af KATAKANA LETTER KU + { 0x30af, 0x309b }, // 0x30b0 KATAKANA LETTER GU --> KATAKANA LETTER KU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30b1 KATAKANA LETTER KE + { 0x30b1, 0x309b }, // 0x30b2 KATAKANA LETTER GE --> KATAKANA LETTER KE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30b3 KATAKANA LETTER KO + { 0x30b3, 0x309b }, // 0x30b4 KATAKANA LETTER GO --> KATAKANA LETTER KO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30b5 KATAKANA LETTER SA + { 0x30b5, 0x309b }, // 0x30b6 KATAKANA LETTER ZA --> KATAKANA LETTER SA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30b7 KATAKANA LETTER SI + { 0x30b7, 0x309b }, // 0x30b8 KATAKANA LETTER ZI --> KATAKANA LETTER SI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30b9 KATAKANA LETTER SU + { 0x30b9, 0x309b }, // 0x30ba KATAKANA LETTER ZU --> KATAKANA LETTER SU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30bb KATAKANA LETTER SE + { 0x30bb, 0x309b }, // 0x30bc KATAKANA LETTER ZE --> KATAKANA LETTER SE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30bd KATAKANA LETTER SO + { 0x30bd, 0x309b }, // 0x30be KATAKANA LETTER ZO --> KATAKANA LETTER SO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30bf KATAKANA LETTER TA + { 0x30bf, 0x309b }, // 0x30c0 KATAKANA LETTER DA --> KATAKANA LETTER TA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30c1 KATAKANA LETTER TI + { 0x30c1, 0x309b }, // 0x30c2 KATAKANA LETTER DI --> KATAKANA LETTER TI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30c3 KATAKANA LETTER SMALL TU + { 0x0000, 0x0000 }, // 0x30c4 KATAKANA LETTER TU + { 0x30c4, 0x309b }, // 0x30c5 KATAKANA LETTER DU --> KATAKANA LETTER TU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30c6 KATAKANA LETTER TE + { 0x30c6, 0x309b }, // 0x30c7 KATAKANA LETTER DE --> KATAKANA LETTER TE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30c8 KATAKANA LETTER TO + { 0x30c8, 0x309b }, // 0x30c9 KATAKANA LETTER DO --> KATAKANA LETTER TO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30ca KATAKANA LETTER NA + { 0x0000, 0x0000 }, // 0x30cb KATAKANA LETTER NI + { 0x0000, 0x0000 }, // 0x30cc KATAKANA LETTER NU + { 0x0000, 0x0000 }, // 0x30cd KATAKANA LETTER NE + { 0x0000, 0x0000 }, // 0x30ce KATAKANA LETTER NO + { 0x0000, 0x0000 }, // 0x30cf KATAKANA LETTER HA + { 0x30cf, 0x309b }, // 0x30d0 KATAKANA LETTER BA --> KATAKANA LETTER HA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30cf, 0x309c }, // 0x30d1 KATAKANA LETTER PA --> KATAKANA LETTER HA + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30d2 KATAKANA LETTER HI + { 0x30d2, 0x309b }, // 0x30d3 KATAKANA LETTER BI --> KATAKANA LETTER HI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30d2, 0x309c }, // 0x30d4 KATAKANA LETTER PI --> KATAKANA LETTER HI + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30d5 KATAKANA LETTER HU + { 0x30d5, 0x309b }, // 0x30d6 KATAKANA LETTER BU --> KATAKANA LETTER HU + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30d5, 0x309c }, // 0x30d7 KATAKANA LETTER PU --> KATAKANA LETTER HU + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30d8 KATAKANA LETTER HE + { 0x30d8, 0x309b }, // 0x30d9 KATAKANA LETTER BE --> KATAKANA LETTER HE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30d8, 0x309c }, // 0x30da KATAKANA LETTER PE --> KATAKANA LETTER HE + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30db KATAKANA LETTER HO + { 0x30db, 0x309b }, // 0x30dc KATAKANA LETTER BO --> KATAKANA LETTER HO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30db, 0x309c }, // 0x30dd KATAKANA LETTER PO --> KATAKANA LETTER HO + COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30de KATAKANA LETTER MA + { 0x0000, 0x0000 }, // 0x30df KATAKANA LETTER MI + { 0x0000, 0x0000 }, // 0x30e0 KATAKANA LETTER MU + { 0x0000, 0x0000 }, // 0x30e1 KATAKANA LETTER ME + { 0x0000, 0x0000 }, // 0x30e2 KATAKANA LETTER MO + { 0x0000, 0x0000 }, // 0x30e3 KATAKANA LETTER SMALL YA + { 0x0000, 0x0000 }, // 0x30e4 KATAKANA LETTER YA + { 0x0000, 0x0000 }, // 0x30e5 KATAKANA LETTER SMALL YU + { 0x0000, 0x0000 }, // 0x30e6 KATAKANA LETTER YU + { 0x0000, 0x0000 }, // 0x30e7 KATAKANA LETTER SMALL YO + { 0x0000, 0x0000 }, // 0x30e8 KATAKANA LETTER YO + { 0x0000, 0x0000 }, // 0x30e9 KATAKANA LETTER RA + { 0x0000, 0x0000 }, // 0x30ea KATAKANA LETTER RI + { 0x0000, 0x0000 }, // 0x30eb KATAKANA LETTER RU + { 0x0000, 0x0000 }, // 0x30ec KATAKANA LETTER RE + { 0x0000, 0x0000 }, // 0x30ed KATAKANA LETTER RO + { 0x0000, 0x0000 }, // 0x30ee KATAKANA LETTER SMALL WA + { 0x0000, 0x0000 }, // 0x30ef KATAKANA LETTER WA + { 0x0000, 0x0000 }, // 0x30f0 KATAKANA LETTER WI + { 0x0000, 0x0000 }, // 0x30f1 KATAKANA LETTER WE + { 0x0000, 0x0000 }, // 0x30f2 KATAKANA LETTER WO + { 0x0000, 0x0000 }, // 0x30f3 KATAKANA LETTER N + { 0x30a6, 0x309b }, // 0x30f4 KATAKANA LETTER VU --> KATAKANA LETTER U + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30f5 KATAKANA LETTER SMALL KA + { 0x0000, 0x0000 }, // 0x30f6 KATAKANA LETTER SMALL KE + { 0x30ef, 0x309b }, // 0x30f7 KATAKANA LETTER VA --> KATAKANA LETTER WA + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30f0, 0x309b }, // 0x30f8 KATAKANA LETTER VI --> KATAKANA LETTER WI + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30f1, 0x309b }, // 0x30f9 KATAKANA LETTER VE --> KATAKANA LETTER WE + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x30f2, 0x309b }, // 0x30fa KATAKANA LETTER VO --> KATAKANA LETTER WO + COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x30fb KATAKANA MIDDLE DOT + { 0x0000, 0x0000 }, // 0x30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK + { 0x0000, 0x0000 }, // 0x30fd KATAKANA ITERATION MARK + { 0x0000, 0x0000 }, // 0x30fe KATAKANA VOICED ITERATION MARK + { 0x0000, 0x0000 } // 0x30ff +}; + + +/* + Halfwidth and Fullwidth Forms (U+FF00..U+FFEF) + ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.txt + ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html + http://charts.unicode.org/Web/UFF00.html +*/ + +#define FULL2HALF_NORMAL 0x01 +#define FULL2HALF_ASC_FUNCTION 0x02 +#define FULL2HALF_KATAKANA_ONLY 0x04 + +UnicodePairWithFlag const full2half[] = { + { 0x2015, 0xFF70, FULL2HALF_ASC_FUNCTION }, // HORIZONTAL BAR --> KATAKANA-HIRAGANA PROLONGED SOUND MARK + { 0x2018, 0x0060, FULL2HALF_ASC_FUNCTION }, // LEFT SINGLE QUOTATION MARK => GRAVE ACCENT + { 0x2019, 0x0027, FULL2HALF_ASC_FUNCTION }, // RIGHT SINGLE QUOTATION MARK => APOSTROPHE + { 0x201D, 0x0022, FULL2HALF_ASC_FUNCTION }, // RIGHT DOUBLE QUOTATION MARK => QUOTATION MARK + { 0x2190, 0xFFE9, FULL2HALF_NORMAL }, // LEFTWARDS ARROW --> HALFWIDTH LEFTWARDS ARROW + { 0x2191, 0xFFEA, FULL2HALF_NORMAL }, // UPWARDS ARROW --> HALFWIDTH UPWARDS ARROW + { 0x2192, 0xFFEB, FULL2HALF_NORMAL }, // RIGHTWARDS ARROW --> HALFWIDTH RIGHTWARDS ARROW + { 0x2193, 0xFFEC, FULL2HALF_NORMAL }, // DOWNWARDS ARROW --> HALFWIDTH DOWNWARDS ARROW + { 0x2502, 0xFFE8, FULL2HALF_NORMAL }, // BOX DRAWINGS LIGHT VERTICAL --> HALFWIDTH FORMS LIGHT VERTICAL + { 0x25A0, 0xFFED, FULL2HALF_NORMAL }, // BLACK SQUARE --> HALFWIDTH BLACK SQUARE + { 0x25CB, 0xFFEE, FULL2HALF_NORMAL }, // WHITE CIRCLE --> HALFWIDTH WHITE CIRCLE + { 0x3000, 0x0020, FULL2HALF_NORMAL }, // IDEOGRAPHIC SPACE --> SPACE + { 0x3001, 0xFF64, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // IDEOGRAPHIC COMMA --> HALFWIDTH IDEOGRAPHIC COMMA + { 0x3002, 0xFF61, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // IDEOGRAPHIC FULL STOP --> HALFWIDTH IDEOGRAPHIC FULL STOP + { 0x300C, 0xFF62, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // LEFT CORNER BRACKET --> HALFWIDTH LEFT CORNER BRACKET + { 0x300D, 0xFF63, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // RIGHT CORNER BRACKET --> HALFWIDTH RIGHT CORNER BRACKET + { 0x3099, 0xFF9E, FULL2HALF_NORMAL }, // COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK --> HALFWIDTH KATAKANA VOICED SOUND MARK + { 0x309A, 0xFF9F, FULL2HALF_NORMAL }, // COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK --> HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + +// bluedwarf: Added normal (semi-)voiced sound mark + { 0x309B, 0xFF9E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA-HIRAGANA VOICED SOUND MARK --> HALFWIDTH KATAKANA VOICED SOUND MARK + { 0x309C, 0xFF9F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK --> HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + + { 0x30A1, 0xFF67, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL A --> HALFWIDTH KATAKANA LETTER SMALL A + { 0x30A2, 0xFF71, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER A --> HALFWIDTH KATAKANA LETTER A + { 0x30A3, 0xFF68, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL I --> HALFWIDTH KATAKANA LETTER SMALL I + { 0x30A4, 0xFF72, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER I --> HALFWIDTH KATAKANA LETTER I + { 0x30A5, 0xFF69, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL U --> HALFWIDTH KATAKANA LETTER SMALL U + { 0x30A6, 0xFF73, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER U --> HALFWIDTH KATAKANA LETTER U + { 0x30A7, 0xFF6A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL E --> HALFWIDTH KATAKANA LETTER SMALL E + { 0x30A8, 0xFF74, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER E --> HALFWIDTH KATAKANA LETTER E + { 0x30A9, 0xFF6B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL O --> HALFWIDTH KATAKANA LETTER SMALL O + { 0x30AA, 0xFF75, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER O --> HALFWIDTH KATAKANA LETTER O + { 0x30AB, 0xFF76, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KA --> HALFWIDTH KATAKANA LETTER KA + { 0x30AD, 0xFF77, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KI --> HALFWIDTH KATAKANA LETTER KI + { 0x30AF, 0xFF78, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KU --> HALFWIDTH KATAKANA LETTER KU + { 0x30B1, 0xFF79, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KE --> HALFWIDTH KATAKANA LETTER KE + { 0x30B3, 0xFF7A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER KO --> HALFWIDTH KATAKANA LETTER KO + { 0x30B5, 0xFF7B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SA --> HALFWIDTH KATAKANA LETTER SA + { 0x30B7, 0xFF7C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SI --> HALFWIDTH KATAKANA LETTER SI + { 0x30B9, 0xFF7D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SU --> HALFWIDTH KATAKANA LETTER SU + { 0x30BB, 0xFF7E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SE --> HALFWIDTH KATAKANA LETTER SE + { 0x30BD, 0xFF7F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SO --> HALFWIDTH KATAKANA LETTER SO + { 0x30BF, 0xFF80, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TA --> HALFWIDTH KATAKANA LETTER TA + { 0x30C1, 0xFF81, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TI --> HALFWIDTH KATAKANA LETTER TI + { 0x30C3, 0xFF6F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL TU --> HALFWIDTH KATAKANA LETTER SMALL TU + { 0x30C4, 0xFF82, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TU --> HALFWIDTH KATAKANA LETTER TU + { 0x30C6, 0xFF83, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TE --> HALFWIDTH KATAKANA LETTER TE + { 0x30C8, 0xFF84, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER TO --> HALFWIDTH KATAKANA LETTER TO + { 0x30CA, 0xFF85, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NA --> HALFWIDTH KATAKANA LETTER NA + { 0x30CB, 0xFF86, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NI --> HALFWIDTH KATAKANA LETTER NI + { 0x30CC, 0xFF87, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NU --> HALFWIDTH KATAKANA LETTER NU + { 0x30CD, 0xFF88, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NE --> HALFWIDTH KATAKANA LETTER NE + { 0x30CE, 0xFF89, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER NO --> HALFWIDTH KATAKANA LETTER NO + { 0x30CF, 0xFF8A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HA --> HALFWIDTH KATAKANA LETTER HA + { 0x30D2, 0xFF8B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HI --> HALFWIDTH KATAKANA LETTER HI + { 0x30D5, 0xFF8C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HU --> HALFWIDTH KATAKANA LETTER HU + { 0x30D8, 0xFF8D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HE --> HALFWIDTH KATAKANA LETTER HE + { 0x30DB, 0xFF8E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER HO --> HALFWIDTH KATAKANA LETTER HO + { 0x30DE, 0xFF8F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MA --> HALFWIDTH KATAKANA LETTER MA + { 0x30DF, 0xFF90, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MI --> HALFWIDTH KATAKANA LETTER MI + { 0x30E0, 0xFF91, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MU --> HALFWIDTH KATAKANA LETTER MU + { 0x30E1, 0xFF92, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER ME --> HALFWIDTH KATAKANA LETTER ME + { 0x30E2, 0xFF93, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER MO --> HALFWIDTH KATAKANA LETTER MO + { 0x30E3, 0xFF6C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL YA --> HALFWIDTH KATAKANA LETTER SMALL YA + { 0x30E4, 0xFF94, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER YA --> HALFWIDTH KATAKANA LETTER YA + { 0x30E5, 0xFF6D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL YU --> HALFWIDTH KATAKANA LETTER SMALL YU + { 0x30E6, 0xFF95, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER YU --> HALFWIDTH KATAKANA LETTER YU + { 0x30E7, 0xFF6E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER SMALL YO --> HALFWIDTH KATAKANA LETTER SMALL YO + { 0x30E8, 0xFF96, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER YO --> HALFWIDTH KATAKANA LETTER YO + { 0x30E9, 0xFF97, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RA --> HALFWIDTH KATAKANA LETTER RA + { 0x30EA, 0xFF98, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RI --> HALFWIDTH KATAKANA LETTER RI + { 0x30EB, 0xFF99, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RU --> HALFWIDTH KATAKANA LETTER RU + { 0x30EC, 0xFF9A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RE --> HALFWIDTH KATAKANA LETTER RE + { 0x30ED, 0xFF9B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER RO --> HALFWIDTH KATAKANA LETTER RO + { 0x30EF, 0xFF9C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER WA --> HALFWIDTH KATAKANA LETTER WA + { 0x30F2, 0xFF66, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER WO --> HALFWIDTH KATAKANA LETTER WO + { 0x30F3, 0xFF9D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION | FULL2HALF_KATAKANA_ONLY }, // KATAKANA LETTER N --> HALFWIDTH KATAKANA LETTER N + { 0x30FB, 0xFF65, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // KATAKANA MIDDLE DOT --> HALFWIDTH KATAKANA MIDDLE DOT + { 0x30FC, 0xFF70, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // KATAKANA-HIRAGANA PROLONGED SOUND MARK --> HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + { 0x3131, 0xFFA1, FULL2HALF_NORMAL }, // HANGUL LETTER KIYEOK --> HALFWIDTH HANGUL LETTER KIYEOK + { 0x3132, 0xFFA2, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGKIYEOK --> HALFWIDTH HANGUL LETTER SSANGKIYEOK + { 0x3133, 0xFFA3, FULL2HALF_NORMAL }, // HANGUL LETTER KIYEOK-SIOS --> HALFWIDTH HANGUL LETTER KIYEOK-SIOS + { 0x3134, 0xFFA4, FULL2HALF_NORMAL }, // HANGUL LETTER NIEUN --> HALFWIDTH HANGUL LETTER NIEUN + { 0x3135, 0xFFA5, FULL2HALF_NORMAL }, // HANGUL LETTER NIEUN-CIEUC --> HALFWIDTH HANGUL LETTER NIEUN-CIEUC + { 0x3136, 0xFFA6, FULL2HALF_NORMAL }, // HANGUL LETTER NIEUN-HIEUH --> HALFWIDTH HANGUL LETTER NIEUN-HIEUH + { 0x3137, 0xFFA7, FULL2HALF_NORMAL }, // HANGUL LETTER TIKEUT --> HALFWIDTH HANGUL LETTER TIKEUT + { 0x3138, 0xFFA8, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGTIKEUT --> HALFWIDTH HANGUL LETTER SSANGTIKEUT + { 0x3139, 0xFFA9, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL --> HALFWIDTH HANGUL LETTER RIEUL + { 0x313A, 0xFFAA, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-KIYEOK --> HALFWIDTH HANGUL LETTER RIEUL-KIYEOK + { 0x313B, 0xFFAB, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-MIEUM --> HALFWIDTH HANGUL LETTER RIEUL-MIEUM + { 0x313C, 0xFFAC, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-PIEUP --> HALFWIDTH HANGUL LETTER RIEUL-PIEUP + { 0x313D, 0xFFAD, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-SIOS --> HALFWIDTH HANGUL LETTER RIEUL-SIOS + { 0x313E, 0xFFAE, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-THIEUTH --> HALFWIDTH HANGUL LETTER RIEUL-THIEUTH + { 0x313F, 0xFFAF, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-PHIEUPH --> HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH + { 0x3140, 0xFFB0, FULL2HALF_NORMAL }, // HANGUL LETTER RIEUL-HIEUH --> HALFWIDTH HANGUL LETTER RIEUL-HIEUH + { 0x3141, 0xFFB1, FULL2HALF_NORMAL }, // HANGUL LETTER MIEUM --> HALFWIDTH HANGUL LETTER MIEUM + { 0x3142, 0xFFB2, FULL2HALF_NORMAL }, // HANGUL LETTER PIEUP --> HALFWIDTH HANGUL LETTER PIEUP + { 0x3143, 0xFFB3, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGPIEUP --> HALFWIDTH HANGUL LETTER SSANGPIEUP + { 0x3144, 0xFFB4, FULL2HALF_NORMAL }, // HANGUL LETTER PIEUP-SIOS --> HALFWIDTH HANGUL LETTER PIEUP-SIOS + { 0x3145, 0xFFB5, FULL2HALF_NORMAL }, // HANGUL LETTER SIOS --> HALFWIDTH HANGUL LETTER SIOS + { 0x3146, 0xFFB6, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGSIOS --> HALFWIDTH HANGUL LETTER SSANGSIOS + { 0x3147, 0xFFB7, FULL2HALF_NORMAL }, // HANGUL LETTER IEUNG --> HALFWIDTH HANGUL LETTER IEUNG + { 0x3148, 0xFFB8, FULL2HALF_NORMAL }, // HANGUL LETTER CIEUC --> HALFWIDTH HANGUL LETTER CIEUC + { 0x3149, 0xFFB9, FULL2HALF_NORMAL }, // HANGUL LETTER SSANGCIEUC --> HALFWIDTH HANGUL LETTER SSANGCIEUC + { 0x314A, 0xFFBA, FULL2HALF_NORMAL }, // HANGUL LETTER CHIEUCH --> HALFWIDTH HANGUL LETTER CHIEUCH + { 0x314B, 0xFFBB, FULL2HALF_NORMAL }, // HANGUL LETTER KHIEUKH --> HALFWIDTH HANGUL LETTER KHIEUKH + { 0x314C, 0xFFBC, FULL2HALF_NORMAL }, // HANGUL LETTER THIEUTH --> HALFWIDTH HANGUL LETTER THIEUTH + { 0x314D, 0xFFBD, FULL2HALF_NORMAL }, // HANGUL LETTER PHIEUPH --> HALFWIDTH HANGUL LETTER PHIEUPH + { 0x314E, 0xFFBE, FULL2HALF_NORMAL }, // HANGUL LETTER HIEUH --> HALFWIDTH HANGUL LETTER HIEUH + { 0x314F, 0xFFC2, FULL2HALF_NORMAL }, // HANGUL LETTER A --> HALFWIDTH HANGUL LETTER A + { 0x3150, 0xFFC3, FULL2HALF_NORMAL }, // HANGUL LETTER AE --> HALFWIDTH HANGUL LETTER AE + { 0x3151, 0xFFC4, FULL2HALF_NORMAL }, // HANGUL LETTER YA --> HALFWIDTH HANGUL LETTER YA + { 0x3152, 0xFFC5, FULL2HALF_NORMAL }, // HANGUL LETTER YAE --> HALFWIDTH HANGUL LETTER YAE + { 0x3153, 0xFFC6, FULL2HALF_NORMAL }, // HANGUL LETTER EO --> HALFWIDTH HANGUL LETTER EO + { 0x3154, 0xFFC7, FULL2HALF_NORMAL }, // HANGUL LETTER E --> HALFWIDTH HANGUL LETTER E + { 0x3155, 0xFFCA, FULL2HALF_NORMAL }, // HANGUL LETTER YEO --> HALFWIDTH HANGUL LETTER YEO + { 0x3156, 0xFFCB, FULL2HALF_NORMAL }, // HANGUL LETTER YE --> HALFWIDTH HANGUL LETTER YE + { 0x3157, 0xFFCC, FULL2HALF_NORMAL }, // HANGUL LETTER O --> HALFWIDTH HANGUL LETTER O + { 0x3158, 0xFFCD, FULL2HALF_NORMAL }, // HANGUL LETTER WA --> HALFWIDTH HANGUL LETTER WA + { 0x3159, 0xFFCE, FULL2HALF_NORMAL }, // HANGUL LETTER WAE --> HALFWIDTH HANGUL LETTER WAE + { 0x315A, 0xFFCF, FULL2HALF_NORMAL }, // HANGUL LETTER OE --> HALFWIDTH HANGUL LETTER OE + { 0x315B, 0xFFD2, FULL2HALF_NORMAL }, // HANGUL LETTER YO --> HALFWIDTH HANGUL LETTER YO + { 0x315C, 0xFFD3, FULL2HALF_NORMAL }, // HANGUL LETTER U --> HALFWIDTH HANGUL LETTER U + { 0x315D, 0xFFD4, FULL2HALF_NORMAL }, // HANGUL LETTER WEO --> HALFWIDTH HANGUL LETTER WEO + { 0x315E, 0xFFD5, FULL2HALF_NORMAL }, // HANGUL LETTER WE --> HALFWIDTH HANGUL LETTER WE + { 0x315F, 0xFFD6, FULL2HALF_NORMAL }, // HANGUL LETTER WI --> HALFWIDTH HANGUL LETTER WI + { 0x3160, 0xFFD7, FULL2HALF_NORMAL }, // HANGUL LETTER YU --> HALFWIDTH HANGUL LETTER YU + { 0x3161, 0xFFDA, FULL2HALF_NORMAL }, // HANGUL LETTER EU --> HALFWIDTH HANGUL LETTER EU + { 0x3162, 0xFFDB, FULL2HALF_NORMAL }, // HANGUL LETTER YI --> HALFWIDTH HANGUL LETTER YI + { 0x3163, 0xFFDC, FULL2HALF_NORMAL }, // HANGUL LETTER I --> HALFWIDTH HANGUL LETTER I + { 0x3164, 0xFFA0, FULL2HALF_NORMAL }, // HANGUL FILLER --> HALFWIDTH HANGUL FILLER + { 0xFF01, 0x0021, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH EXCLAMATION MARK --> EXCLAMATION MARK + { 0xFF02, 0x0022, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH QUOTATION MARK --> QUOTATION MARK + { 0xFF03, 0x0023, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH NUMBER SIGN --> NUMBER SIGN + { 0xFF04, 0x0024, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DOLLAR SIGN --> DOLLAR SIGN + { 0xFF05, 0x0025, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH PERCENT SIGN --> PERCENT SIGN + { 0xFF06, 0x0026, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH AMPERSAND --> AMPERSAND + { 0xFF07, 0x0027, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH APOSTROPHE --> APOSTROPHE + { 0xFF08, 0x0028, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LEFT PARENTHESIS --> LEFT PARENTHESIS + { 0xFF09, 0x0029, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH RIGHT PARENTHESIS --> RIGHT PARENTHESIS + { 0xFF0A, 0x002A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH ASTERISK --> ASTERISK + { 0xFF0B, 0x002B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH PLUS SIGN --> PLUS SIGN + { 0xFF0C, 0x002C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH COMMA --> COMMA + { 0xFF0D, 0x002D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH HYPHEN-MINUS --> HYPHEN-MINUS + { 0xFF0E, 0x002E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH FULL STOP --> FULL STOP + { 0xFF0F, 0x002F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH SOLIDUS --> SOLIDUS + { 0xFF10, 0x0030, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT ZERO --> DIGIT ZERO + { 0xFF11, 0x0031, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT ONE --> DIGIT ONE + { 0xFF12, 0x0032, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT TWO --> DIGIT TWO + { 0xFF13, 0x0033, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT THREE --> DIGIT THREE + { 0xFF14, 0x0034, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT FOUR --> DIGIT FOUR + { 0xFF15, 0x0035, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT FIVE --> DIGIT FIVE + { 0xFF16, 0x0036, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT SIX --> DIGIT SIX + { 0xFF17, 0x0037, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT SEVEN --> DIGIT SEVEN + { 0xFF18, 0x0038, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT EIGHT --> DIGIT EIGHT + { 0xFF19, 0x0039, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH DIGIT NINE --> DIGIT NINE + { 0xFF1A, 0x003A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH COLON --> COLON + { 0xFF1B, 0x003B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH SEMICOLON --> SEMICOLON + { 0xFF1C, 0x003C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LESS-THAN SIGN --> LESS-THAN SIGN + { 0xFF1D, 0x003D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH EQUALS SIGN --> EQUALS SIGN + { 0xFF1E, 0x003E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH GREATER-THAN SIGN --> GREATER-THAN SIGN + { 0xFF1F, 0x003F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH QUESTION MARK --> QUESTION MARK + { 0xFF20, 0x0040, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH COMMERCIAL AT --> COMMERCIAL AT + { 0xFF21, 0x0041, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER A --> LATIN CAPITAL LETTER A + { 0xFF22, 0x0042, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER B --> LATIN CAPITAL LETTER B + { 0xFF23, 0x0043, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER C --> LATIN CAPITAL LETTER C + { 0xFF24, 0x0044, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER D --> LATIN CAPITAL LETTER D + { 0xFF25, 0x0045, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER E --> LATIN CAPITAL LETTER E + { 0xFF26, 0x0046, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER F --> LATIN CAPITAL LETTER F + { 0xFF27, 0x0047, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER G --> LATIN CAPITAL LETTER G + { 0xFF28, 0x0048, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER H --> LATIN CAPITAL LETTER H + { 0xFF29, 0x0049, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER I --> LATIN CAPITAL LETTER I + { 0xFF2A, 0x004A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER J --> LATIN CAPITAL LETTER J + { 0xFF2B, 0x004B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER K --> LATIN CAPITAL LETTER K + { 0xFF2C, 0x004C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER L --> LATIN CAPITAL LETTER L + { 0xFF2D, 0x004D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER M --> LATIN CAPITAL LETTER M + { 0xFF2E, 0x004E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER N --> LATIN CAPITAL LETTER N + { 0xFF2F, 0x004F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER O --> LATIN CAPITAL LETTER O + { 0xFF30, 0x0050, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER P --> LATIN CAPITAL LETTER P + { 0xFF31, 0x0051, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER Q --> LATIN CAPITAL LETTER Q + { 0xFF32, 0x0052, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER R --> LATIN CAPITAL LETTER R + { 0xFF33, 0x0053, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER S --> LATIN CAPITAL LETTER S + { 0xFF34, 0x0054, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER T --> LATIN CAPITAL LETTER T + { 0xFF35, 0x0055, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER U --> LATIN CAPITAL LETTER U + { 0xFF36, 0x0056, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER V --> LATIN CAPITAL LETTER V + { 0xFF37, 0x0057, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER W --> LATIN CAPITAL LETTER W + { 0xFF38, 0x0058, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER X --> LATIN CAPITAL LETTER X + { 0xFF39, 0x0059, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER Y --> LATIN CAPITAL LETTER Y + { 0xFF3A, 0x005A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN CAPITAL LETTER Z --> LATIN CAPITAL LETTER Z + { 0xFF3B, 0x005B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LEFT SQUARE BRACKET --> LEFT SQUARE BRACKET + { 0xFF3C, 0x005C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH REVERSE SOLIDUS --> REVERSE SOLIDUS + { 0xFF3D, 0x005D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH RIGHT SQUARE BRACKET --> RIGHT SQUARE BRACKET + { 0xFF3E, 0x005E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH CIRCUMFLEX ACCENT --> CIRCUMFLEX ACCENT + { 0xFF3F, 0x005F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LOW LINE --> LOW LINE + { 0xFF40, 0x0060, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH GRAVE ACCENT --> GRAVE ACCENT + { 0xFF41, 0x0061, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER A --> LATIN SMALL LETTER A + { 0xFF42, 0x0062, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER B --> LATIN SMALL LETTER B + { 0xFF43, 0x0063, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER C --> LATIN SMALL LETTER C + { 0xFF44, 0x0064, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER D --> LATIN SMALL LETTER D + { 0xFF45, 0x0065, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER E --> LATIN SMALL LETTER E + { 0xFF46, 0x0066, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER F --> LATIN SMALL LETTER F + { 0xFF47, 0x0067, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER G --> LATIN SMALL LETTER G + { 0xFF48, 0x0068, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER H --> LATIN SMALL LETTER H + { 0xFF49, 0x0069, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER I --> LATIN SMALL LETTER I + { 0xFF4A, 0x006A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER J --> LATIN SMALL LETTER J + { 0xFF4B, 0x006B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER K --> LATIN SMALL LETTER K + { 0xFF4C, 0x006C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER L --> LATIN SMALL LETTER L + { 0xFF4D, 0x006D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER M --> LATIN SMALL LETTER M + { 0xFF4E, 0x006E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER N --> LATIN SMALL LETTER N + { 0xFF4F, 0x006F, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER O --> LATIN SMALL LETTER O + { 0xFF50, 0x0070, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER P --> LATIN SMALL LETTER P + { 0xFF51, 0x0071, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER Q --> LATIN SMALL LETTER Q + { 0xFF52, 0x0072, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER R --> LATIN SMALL LETTER R + { 0xFF53, 0x0073, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER S --> LATIN SMALL LETTER S + { 0xFF54, 0x0074, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER T --> LATIN SMALL LETTER T + { 0xFF55, 0x0075, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER U --> LATIN SMALL LETTER U + { 0xFF56, 0x0076, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER V --> LATIN SMALL LETTER V + { 0xFF57, 0x0077, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER W --> LATIN SMALL LETTER W + { 0xFF58, 0x0078, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER X --> LATIN SMALL LETTER X + { 0xFF59, 0x0079, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER Y --> LATIN SMALL LETTER Y + { 0xFF5A, 0x007A, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LATIN SMALL LETTER Z --> LATIN SMALL LETTER Z + { 0xFF5B, 0x007B, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH LEFT CURLY BRACKET --> LEFT CURLY BRACKET + { 0xFF5C, 0x007C, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH VERTICAL LINE --> VERTICAL LINE + { 0xFF5D, 0x007D, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH RIGHT CURLY BRACKET --> RIGHT CURLY BRACKET + { 0xFF5E, 0x007E, FULL2HALF_NORMAL | FULL2HALF_ASC_FUNCTION }, // FULLWIDTH TILDE --> TILDE + { 0xFFE0, 0x00A2, FULL2HALF_NORMAL }, // FULLWIDTH CENT SIGN --> CENT SIGN + { 0xFFE1, 0x00A3, FULL2HALF_NORMAL }, // FULLWIDTH POUND SIGN --> POUND SIGN + { 0xFFE2, 0x00AC, FULL2HALF_NORMAL }, // FULLWIDTH NOT SIGN --> NOT SIGN + { 0xFFE3, 0x00AF, FULL2HALF_NORMAL }, // FULLWIDTH MACRON --> MACRON + { 0xFFE4, 0x00A6, FULL2HALF_NORMAL }, // FULLWIDTH BROKEN BAR --> BROKEN BAR + { 0xFFE5, 0x00A5, FULL2HALF_NORMAL }, // FULLWIDTH YEN SIGN --> YEN SIGN + { 0xFFE5, 0x005C, FULL2HALF_ASC_FUNCTION }, // FULLWIDTH YEN SIGN --> REVERSE SOLIDUS, exceptional conversion + { 0xFFE6, 0x20A9, FULL2HALF_NORMAL }, // FULLWIDTH WON SIGN --> WON SIGN +}; + +/* + Unicode Normalization Forms + http://www.unicode.org/unicode/reports/tr15/index.html + http://www.w3.org/International/charlint/ +*/ + +const sal_Unicode composition_table[][2] = { + { 0x0000, 0x0000 }, // 0x3040 + { 0x0000, 0x0000 }, // 0x3041 HIRAGANA LETTER SMALL A + { 0x0000, 0x0000 }, // 0x3042 HIRAGANA LETTER A + { 0x0000, 0x0000 }, // 0x3043 HIRAGANA LETTER SMALL I + { 0x0000, 0x0000 }, // 0x3044 HIRAGANA LETTER I + { 0x0000, 0x0000 }, // 0x3045 HIRAGANA LETTER SMALL U + { 0x3094, 0x0000 }, // 0x3046 HIRAGANA LETTER U --> HIRAGANA LETTER VU + { 0x0000, 0x0000 }, // 0x3047 HIRAGANA LETTER SMALL E + { 0x0000, 0x0000 }, // 0x3048 HIRAGANA LETTER E + { 0x0000, 0x0000 }, // 0x3049 HIRAGANA LETTER SMALL O + { 0x0000, 0x0000 }, // 0x304a HIRAGANA LETTER O + { 0x304c, 0x0000 }, // 0x304b HIRAGANA LETTER KA --> HIRAGANA LETTER GA + { 0x0000, 0x0000 }, // 0x304c HIRAGANA LETTER GA + { 0x304e, 0x0000 }, // 0x304d HIRAGANA LETTER KI --> HIRAGANA LETTER GI + { 0x0000, 0x0000 }, // 0x304e HIRAGANA LETTER GI + { 0x3050, 0x0000 }, // 0x304f HIRAGANA LETTER KU --> HIRAGANA LETTER GU + { 0x0000, 0x0000 }, // 0x3050 HIRAGANA LETTER GU + { 0x3052, 0x0000 }, // 0x3051 HIRAGANA LETTER KE --> HIRAGANA LETTER GE + { 0x0000, 0x0000 }, // 0x3052 HIRAGANA LETTER GE + { 0x3054, 0x0000 }, // 0x3053 HIRAGANA LETTER KO --> HIRAGANA LETTER GO + { 0x0000, 0x0000 }, // 0x3054 HIRAGANA LETTER GO + { 0x3056, 0x0000 }, // 0x3055 HIRAGANA LETTER SA --> HIRAGANA LETTER ZA + { 0x0000, 0x0000 }, // 0x3056 HIRAGANA LETTER ZA + { 0x3058, 0x0000 }, // 0x3057 HIRAGANA LETTER SI --> HIRAGANA LETTER ZI + { 0x0000, 0x0000 }, // 0x3058 HIRAGANA LETTER ZI + { 0x305a, 0x0000 }, // 0x3059 HIRAGANA LETTER SU --> HIRAGANA LETTER ZU + { 0x0000, 0x0000 }, // 0x305a HIRAGANA LETTER ZU + { 0x305c, 0x0000 }, // 0x305b HIRAGANA LETTER SE --> HIRAGANA LETTER ZE + { 0x0000, 0x0000 }, // 0x305c HIRAGANA LETTER ZE + { 0x305e, 0x0000 }, // 0x305d HIRAGANA LETTER SO --> HIRAGANA LETTER ZO + { 0x0000, 0x0000 }, // 0x305e HIRAGANA LETTER ZO + { 0x3060, 0x0000 }, // 0x305f HIRAGANA LETTER TA --> HIRAGANA LETTER DA + { 0x0000, 0x0000 }, // 0x3060 HIRAGANA LETTER DA + { 0x3062, 0x0000 }, // 0x3061 HIRAGANA LETTER TI --> HIRAGANA LETTER DI + { 0x0000, 0x0000 }, // 0x3062 HIRAGANA LETTER DI + { 0x0000, 0x0000 }, // 0x3063 HIRAGANA LETTER SMALL TU + { 0x3065, 0x0000 }, // 0x3064 HIRAGANA LETTER TU --> HIRAGANA LETTER DU + { 0x0000, 0x0000 }, // 0x3065 HIRAGANA LETTER DU + { 0x3067, 0x0000 }, // 0x3066 HIRAGANA LETTER TE --> HIRAGANA LETTER DE + { 0x0000, 0x0000 }, // 0x3067 HIRAGANA LETTER DE + { 0x3069, 0x0000 }, // 0x3068 HIRAGANA LETTER TO --> HIRAGANA LETTER DO + { 0x0000, 0x0000 }, // 0x3069 HIRAGANA LETTER DO + { 0x0000, 0x0000 }, // 0x306a HIRAGANA LETTER NA + { 0x0000, 0x0000 }, // 0x306b HIRAGANA LETTER NI + { 0x0000, 0x0000 }, // 0x306c HIRAGANA LETTER NU + { 0x0000, 0x0000 }, // 0x306d HIRAGANA LETTER NE + { 0x0000, 0x0000 }, // 0x306e HIRAGANA LETTER NO + { 0x3070, 0x3071 }, // 0x306f HIRAGANA LETTER HA --> HIRAGANA LETTER BA or HIRAGANA LETTER PA + { 0x0000, 0x0000 }, // 0x3070 HIRAGANA LETTER BA + { 0x0000, 0x0000 }, // 0x3071 HIRAGANA LETTER PA + { 0x3073, 0x3074 }, // 0x3072 HIRAGANA LETTER HI --> HIRAGANA LETTER BI or HIRAGANA LETTER PI + { 0x0000, 0x0000 }, // 0x3073 HIRAGANA LETTER BI + { 0x0000, 0x0000 }, // 0x3074 HIRAGANA LETTER PI + { 0x3076, 0x3077 }, // 0x3075 HIRAGANA LETTER HU --> HIRAGANA LETTER BU or HIRAGANA LETTER PU + { 0x0000, 0x0000 }, // 0x3076 HIRAGANA LETTER BU + { 0x0000, 0x0000 }, // 0x3077 HIRAGANA LETTER PU + { 0x3079, 0x307a }, // 0x3078 HIRAGANA LETTER HE --> HIRAGANA LETTER BE or HIRAGANA LETTER PE + { 0x0000, 0x0000 }, // 0x3079 HIRAGANA LETTER BE + { 0x0000, 0x0000 }, // 0x307a HIRAGANA LETTER PE + { 0x307c, 0x307d }, // 0x307b HIRAGANA LETTER HO --> HIRAGANA LETTER BO or HIRAGANA LETTER PO + { 0x0000, 0x0000 }, // 0x307c HIRAGANA LETTER BO + { 0x0000, 0x0000 }, // 0x307d HIRAGANA LETTER PO + { 0x0000, 0x0000 }, // 0x307e HIRAGANA LETTER MA + { 0x0000, 0x0000 }, // 0x307f HIRAGANA LETTER MI + { 0x0000, 0x0000 }, // 0x3080 HIRAGANA LETTER MU + { 0x0000, 0x0000 }, // 0x3081 HIRAGANA LETTER ME + { 0x0000, 0x0000 }, // 0x3082 HIRAGANA LETTER MO + { 0x0000, 0x0000 }, // 0x3083 HIRAGANA LETTER SMALL YA + { 0x0000, 0x0000 }, // 0x3084 HIRAGANA LETTER YA + { 0x0000, 0x0000 }, // 0x3085 HIRAGANA LETTER SMALL YU + { 0x0000, 0x0000 }, // 0x3086 HIRAGANA LETTER YU + { 0x0000, 0x0000 }, // 0x3087 HIRAGANA LETTER SMALL YO + { 0x0000, 0x0000 }, // 0x3088 HIRAGANA LETTER YO + { 0x0000, 0x0000 }, // 0x3089 HIRAGANA LETTER RA + { 0x0000, 0x0000 }, // 0x308a HIRAGANA LETTER RI + { 0x0000, 0x0000 }, // 0x308b HIRAGANA LETTER RU + { 0x0000, 0x0000 }, // 0x308c HIRAGANA LETTER RE + { 0x0000, 0x0000 }, // 0x308d HIRAGANA LETTER RO + { 0x0000, 0x0000 }, // 0x308e HIRAGANA LETTER SMALL WA + { 0x0000, 0x0000 }, // 0x308f HIRAGANA LETTER WA + { 0x0000, 0x0000 }, // 0x3090 HIRAGANA LETTER WI + { 0x0000, 0x0000 }, // 0x3091 HIRAGANA LETTER WE + { 0x0000, 0x0000 }, // 0x3092 HIRAGANA LETTER WO + { 0x0000, 0x0000 }, // 0x3093 HIRAGANA LETTER N + { 0x0000, 0x0000 }, // 0x3094 HIRAGANA LETTER VU + { 0x0000, 0x0000 }, // 0x3095 + { 0x0000, 0x0000 }, // 0x3096 + { 0x0000, 0x0000 }, // 0x3097 + { 0x0000, 0x0000 }, // 0x3098 + { 0x0000, 0x0000 }, // 0x3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309a COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0x0000, 0x0000 }, // 0x309d HIRAGANA ITERATION MARK + { 0x0000, 0x0000 }, // 0x309e HIRAGANA VOICED ITERATION MARK + { 0x0000, 0x0000 }, // 0x309f + { 0x0000, 0x0000 }, // 0x30a0 + { 0x0000, 0x0000 }, // 0x30a1 KATAKANA LETTER SMALL A + { 0x0000, 0x0000 }, // 0x30a2 KATAKANA LETTER A + { 0x0000, 0x0000 }, // 0x30a3 KATAKANA LETTER SMALL I + { 0x0000, 0x0000 }, // 0x30a4 KATAKANA LETTER I + { 0x0000, 0x0000 }, // 0x30a5 KATAKANA LETTER SMALL U + { 0x30f4, 0x0000 }, // 0x30a6 KATAKANA LETTER U --> KATAKANA LETTER VU + { 0x0000, 0x0000 }, // 0x30a7 KATAKANA LETTER SMALL E + { 0x0000, 0x0000 }, // 0x30a8 KATAKANA LETTER E + { 0x0000, 0x0000 }, // 0x30a9 KATAKANA LETTER SMALL O + { 0x0000, 0x0000 }, // 0x30aa KATAKANA LETTER O + { 0x30ac, 0x0000 }, // 0x30ab KATAKANA LETTER KA --> KATAKANA LETTER GA + { 0x0000, 0x0000 }, // 0x30ac KATAKANA LETTER GA + { 0x30ae, 0x0000 }, // 0x30ad KATAKANA LETTER KI --> KATAKANA LETTER GI + { 0x0000, 0x0000 }, // 0x30ae KATAKANA LETTER GI + { 0x30b0, 0x0000 }, // 0x30af KATAKANA LETTER KU --> KATAKANA LETTER GU + { 0x0000, 0x0000 }, // 0x30b0 KATAKANA LETTER GU + { 0x30b2, 0x0000 }, // 0x30b1 KATAKANA LETTER KE --> KATAKANA LETTER GE + { 0x0000, 0x0000 }, // 0x30b2 KATAKANA LETTER GE + { 0x30b4, 0x0000 }, // 0x30b3 KATAKANA LETTER KO --> KATAKANA LETTER GO + { 0x0000, 0x0000 }, // 0x30b4 KATAKANA LETTER GO + { 0x30b6, 0x0000 }, // 0x30b5 KATAKANA LETTER SA --> KATAKANA LETTER ZA + { 0x0000, 0x0000 }, // 0x30b6 KATAKANA LETTER ZA + { 0x30b8, 0x0000 }, // 0x30b7 KATAKANA LETTER SI --> KATAKANA LETTER ZI + { 0x0000, 0x0000 }, // 0x30b8 KATAKANA LETTER ZI + { 0x30ba, 0x0000 }, // 0x30b9 KATAKANA LETTER SU --> KATAKANA LETTER ZU + { 0x0000, 0x0000 }, // 0x30ba KATAKANA LETTER ZU + { 0x30bc, 0x0000 }, // 0x30bb KATAKANA LETTER SE --> KATAKANA LETTER ZE + { 0x0000, 0x0000 }, // 0x30bc KATAKANA LETTER ZE + { 0x30be, 0x0000 }, // 0x30bd KATAKANA LETTER SO --> KATAKANA LETTER ZO + { 0x0000, 0x0000 }, // 0x30be KATAKANA LETTER ZO + { 0x30c0, 0x0000 }, // 0x30bf KATAKANA LETTER TA --> KATAKANA LETTER DA + { 0x0000, 0x0000 }, // 0x30c0 KATAKANA LETTER DA + { 0x30c2, 0x0000 }, // 0x30c1 KATAKANA LETTER TI --> KATAKANA LETTER DI + { 0x0000, 0x0000 }, // 0x30c2 KATAKANA LETTER DI + { 0x0000, 0x0000 }, // 0x30c3 KATAKANA LETTER SMALL TU + { 0x30c5, 0x0000 }, // 0x30c4 KATAKANA LETTER TU --> KATAKANA LETTER DU + { 0x0000, 0x0000 }, // 0x30c5 KATAKANA LETTER DU + { 0x30c7, 0x0000 }, // 0x30c6 KATAKANA LETTER TE --> KATAKANA LETTER DE + { 0x0000, 0x0000 }, // 0x30c7 KATAKANA LETTER DE + { 0x30c9, 0x0000 }, // 0x30c8 KATAKANA LETTER TO --> KATAKANA LETTER DO + { 0x0000, 0x0000 }, // 0x30c9 KATAKANA LETTER DO + { 0x0000, 0x0000 }, // 0x30ca KATAKANA LETTER NA + { 0x0000, 0x0000 }, // 0x30cb KATAKANA LETTER NI + { 0x0000, 0x0000 }, // 0x30cc KATAKANA LETTER NU + { 0x0000, 0x0000 }, // 0x30cd KATAKANA LETTER NE + { 0x0000, 0x0000 }, // 0x30ce KATAKANA LETTER NO + { 0x30d0, 0x30d1 }, // 0x30cf KATAKANA LETTER HA --> KATAKANA LETTER BA or KATAKANA LETTER PA + { 0x0000, 0x0000 }, // 0x30d0 KATAKANA LETTER BA + { 0x0000, 0x0000 }, // 0x30d1 KATAKANA LETTER PA + { 0x30d3, 0x30d4 }, // 0x30d2 KATAKANA LETTER HI --> KATAKANA LETTER BI or KATAKANA LETTER PI + { 0x0000, 0x0000 }, // 0x30d3 KATAKANA LETTER BI + { 0x0000, 0x0000 }, // 0x30d4 KATAKANA LETTER PI + { 0x30d6, 0x30d7 }, // 0x30d5 KATAKANA LETTER HU --> KATAKANA LETTER BU or KATAKANA LETTER PU + { 0x0000, 0x0000 }, // 0x30d6 KATAKANA LETTER BU + { 0x0000, 0x0000 }, // 0x30d7 KATAKANA LETTER PU + { 0x30d9, 0x30da }, // 0x30d8 KATAKANA LETTER HE --> KATAKANA LETTER BE or KATAKANA LETTER PE + { 0x0000, 0x0000 }, // 0x30d9 KATAKANA LETTER BE + { 0x0000, 0x0000 }, // 0x30da KATAKANA LETTER PE + { 0x30dc, 0x30dd }, // 0x30db KATAKANA LETTER HO --> KATAKANA LETTER BO or KATAKANA LETTER PO + { 0x0000, 0x0000 }, // 0x30dc KATAKANA LETTER BO + { 0x0000, 0x0000 }, // 0x30dd KATAKANA LETTER PO + { 0x0000, 0x0000 }, // 0x30de KATAKANA LETTER MA + { 0x0000, 0x0000 }, // 0x30df KATAKANA LETTER MI + { 0x0000, 0x0000 }, // 0x30e0 KATAKANA LETTER MU + { 0x0000, 0x0000 }, // 0x30e1 KATAKANA LETTER ME + { 0x0000, 0x0000 }, // 0x30e2 KATAKANA LETTER MO + { 0x0000, 0x0000 }, // 0x30e3 KATAKANA LETTER SMALL YA + { 0x0000, 0x0000 }, // 0x30e4 KATAKANA LETTER YA + { 0x0000, 0x0000 }, // 0x30e5 KATAKANA LETTER SMALL YU + { 0x0000, 0x0000 }, // 0x30e6 KATAKANA LETTER YU + { 0x0000, 0x0000 }, // 0x30e7 KATAKANA LETTER SMALL YO + { 0x0000, 0x0000 }, // 0x30e8 KATAKANA LETTER YO + { 0x0000, 0x0000 }, // 0x30e9 KATAKANA LETTER RA + { 0x0000, 0x0000 }, // 0x30ea KATAKANA LETTER RI + { 0x0000, 0x0000 }, // 0x30eb KATAKANA LETTER RU + { 0x0000, 0x0000 }, // 0x30ec KATAKANA LETTER RE + { 0x0000, 0x0000 }, // 0x30ed KATAKANA LETTER RO + { 0x0000, 0x0000 }, // 0x30ee KATAKANA LETTER SMALL WA + { 0x30f7, 0x0000 }, // 0x30ef KATAKANA LETTER WA --> KATAKANA LETTER VA + { 0x30f8, 0x0000 }, // 0x30f0 KATAKANA LETTER WI --> KATAKANA LETTER VI + { 0x30f9, 0x0000 }, // 0x30f1 KATAKANA LETTER WE --> KATAKANA LETTER VE + { 0x30fa, 0x0000 }, // 0x30f2 KATAKANA LETTER WO --> KATAKANA LETTER VO + { 0x0000, 0x0000 }, // 0x30f3 KATAKANA LETTER N + { 0x0000, 0x0000 }, // 0x30f4 KATAKANA LETTER VU + { 0x0000, 0x0000 }, // 0x30f5 KATAKANA LETTER SMALL KA + { 0x0000, 0x0000 }, // 0x30f6 KATAKANA LETTER SMALL KE + { 0x0000, 0x0000 }, // 0x30f7 KATAKANA LETTER VA + { 0x0000, 0x0000 }, // 0x30f8 KATAKANA LETTER VI + { 0x0000, 0x0000 }, // 0x30f9 KATAKANA LETTER VE + { 0x0000, 0x0000 }, // 0x30fa KATAKANA LETTER VO + { 0x0000, 0x0000 }, // 0x30fb KATAKANA MIDDLE DOT + { 0x0000, 0x0000 }, // 0x30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK + { 0x0000, 0x0000 }, // 0x30fd KATAKANA ITERATION MARK + { 0x0000, 0x0000 }, // 0x30fe KATAKANA VOICED ITERATION MARK + { 0x0000, 0x0000 } // 0x30ff +}; + + +/* + Halfwidth and Fullwidth Forms (U+FF00..U+FFEF) + ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.txt + ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html + http://charts.unicode.org/Web/UFF00.html +*/ + +#define HALF2FULL_NORMAL 0x01 +#define HALF2FULL_JIS_FUNCTION 0x02 +#define HALF2FULL_KATAKANA_ONLY 0x04 + +UnicodePairWithFlag const half2full[] = { + { 0x0020, 0x3000, HALF2FULL_NORMAL }, // SPACE --> IDEOGRAPHIC SPACE + { 0x0021, 0xFF01, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // EXCLAMATION MARK --> FULLWIDTH EXCLAMATION MARK + { 0x0022, 0xFF02, HALF2FULL_NORMAL }, // QUOTATION MARK --> FULLWIDTH QUOTATION MARK + { 0x0022, 0x201D, HALF2FULL_JIS_FUNCTION }, // QUOTATION MARK --> RIGHT DOUBLE QUOTATION MARK, exceptional conversion + { 0x0023, 0xFF03, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // NUMBER SIGN --> FULLWIDTH NUMBER SIGN + { 0x0024, 0xFF04, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DOLLAR SIGN --> FULLWIDTH DOLLAR SIGN + { 0x0025, 0xFF05, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // PERCENT SIGN --> FULLWIDTH PERCENT SIGN + { 0x0026, 0xFF06, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // AMPERSAND --> FULLWIDTH AMPERSAND + { 0x0027, 0xFF07, HALF2FULL_NORMAL }, // APOSTROPHE --> FULLWIDTH APOSTROPHE + { 0x0027, 0x2019, HALF2FULL_JIS_FUNCTION }, // APOSTROPHE --> RIGHT SINGLE QUOTATION MARK, exceptional conversion + { 0x0028, 0xFF08, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LEFT PARENTHESIS --> FULLWIDTH LEFT PARENTHESIS + { 0x0029, 0xFF09, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // RIGHT PARENTHESIS --> FULLWIDTH RIGHT PARENTHESIS + { 0x002A, 0xFF0A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // ASTERISK --> FULLWIDTH ASTERISK + { 0x002B, 0xFF0B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // PLUS SIGN --> FULLWIDTH PLUS SIGN + { 0x002C, 0xFF0C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // COMMA --> FULLWIDTH COMMA + { 0x002D, 0xFF0D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // MINUS HYPHEN --> FULLWIDTH MINUS HYPHEN + { 0x002E, 0xFF0E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // FULL STOP --> FULLWIDTH FULL STOP + { 0x002F, 0xFF0F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // SOLIDUS --> FULLWIDTH SOLIDUS + { 0x0030, 0xFF10, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT ZERO --> FULLWIDTH DIGIT ZERO + { 0x0031, 0xFF11, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT ONE --> FULLWIDTH DIGIT ONE + { 0x0032, 0xFF12, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT TWO --> FULLWIDTH DIGIT TWO + { 0x0033, 0xFF13, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT THREE --> FULLWIDTH DIGIT THREE + { 0x0034, 0xFF14, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT FOUR --> FULLWIDTH DIGIT FOUR + { 0x0035, 0xFF15, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT FIVE --> FULLWIDTH DIGIT FIVE + { 0x0036, 0xFF16, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT SIX --> FULLWIDTH DIGIT SIX + { 0x0037, 0xFF17, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT SEVEN --> FULLWIDTH DIGIT SEVEN + { 0x0038, 0xFF18, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT EIGHT --> FULLWIDTH DIGIT EIGHT + { 0x0039, 0xFF19, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // DIGIT NINE --> FULLWIDTH DIGIT NINE + { 0x003A, 0xFF1A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // COLON --> FULLWIDTH COLON + { 0x003B, 0xFF1B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // SEMICOLON --> FULLWIDTH SEMICOLON + { 0x003C, 0xFF1C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LESS-THAN SIGN --> FULLWIDTH LESS-THAN SIGN + { 0x003D, 0xFF1D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // EQUALS SIGN --> FULLWIDTH EQUALS SIGN + { 0x003E, 0xFF1E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // GREATER-THAN SIGN --> FULLWIDTH GREATER-THAN SIGN + { 0x003F, 0xFF1F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // QUESTION MARK --> FULLWIDTH QUESTION MARK + { 0x0040, 0xFF20, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // COMMERCIAL AT --> FULLWIDTH COMMERCIAL AT + { 0x0041, 0xFF21, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER A --> FULLWIDTH LATIN CAPITAL LETTER A + { 0x0042, 0xFF22, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER B --> FULLWIDTH LATIN CAPITAL LETTER B + { 0x0043, 0xFF23, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER C --> FULLWIDTH LATIN CAPITAL LETTER C + { 0x0044, 0xFF24, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER D --> FULLWIDTH LATIN CAPITAL LETTER D + { 0x0045, 0xFF25, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER E --> FULLWIDTH LATIN CAPITAL LETTER E + { 0x0046, 0xFF26, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER F --> FULLWIDTH LATIN CAPITAL LETTER F + { 0x0047, 0xFF27, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER G --> FULLWIDTH LATIN CAPITAL LETTER G + { 0x0048, 0xFF28, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER H --> FULLWIDTH LATIN CAPITAL LETTER H + { 0x0049, 0xFF29, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER I --> FULLWIDTH LATIN CAPITAL LETTER I + { 0x004A, 0xFF2A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER J --> FULLWIDTH LATIN CAPITAL LETTER J + { 0x004B, 0xFF2B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER K --> FULLWIDTH LATIN CAPITAL LETTER K + { 0x004C, 0xFF2C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER L --> FULLWIDTH LATIN CAPITAL LETTER L + { 0x004D, 0xFF2D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER M --> FULLWIDTH LATIN CAPITAL LETTER M + { 0x004E, 0xFF2E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER N --> FULLWIDTH LATIN CAPITAL LETTER N + { 0x004F, 0xFF2F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER O --> FULLWIDTH LATIN CAPITAL LETTER O + { 0x0050, 0xFF30, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER P --> FULLWIDTH LATIN CAPITAL LETTER P + { 0x0051, 0xFF31, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER Q --> FULLWIDTH LATIN CAPITAL LETTER Q + { 0x0052, 0xFF32, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER R --> FULLWIDTH LATIN CAPITAL LETTER R + { 0x0053, 0xFF33, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER S --> FULLWIDTH LATIN CAPITAL LETTER S + { 0x0054, 0xFF34, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER T --> FULLWIDTH LATIN CAPITAL LETTER T + { 0x0055, 0xFF35, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER U --> FULLWIDTH LATIN CAPITAL LETTER U + { 0x0056, 0xFF36, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER V --> FULLWIDTH LATIN CAPITAL LETTER V + { 0x0057, 0xFF37, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER W --> FULLWIDTH LATIN CAPITAL LETTER W + { 0x0058, 0xFF38, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER X --> FULLWIDTH LATIN CAPITAL LETTER X + { 0x0059, 0xFF39, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER Y --> FULLWIDTH LATIN CAPITAL LETTER Y + { 0x005A, 0xFF3A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN CAPITAL LETTER Z --> FULLWIDTH LATIN CAPITAL LETTER Z + { 0x005B, 0xFF3B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LEFT SQUARE BRACKET --> FULLWIDTH LEFT SQUARE BRACKET + { 0x005C, 0xFF3C, HALF2FULL_NORMAL }, // REVERSE SOLIDUS --> FULLWIDTH REVERSE SOLIDUS + { 0x005C, 0xFFE5, HALF2FULL_JIS_FUNCTION }, // REVERSE SOLIDUS --> FULLWIDTH YEN SIGN, exceptional conversion + { 0x005D, 0xFF3D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // RIGHT SQUARE BRACKET --> FULLWIDTH RIGHT SQUARE BRACKET + { 0x005E, 0xFF3E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // CIRCUMFLEX ACCENT --> FULLWIDTH CIRCUMFLEX ACCENT + { 0x005F, 0xFF3F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LOW LINE --> FULLWIDTH LOW LINE + { 0x0060, 0xFF40, HALF2FULL_NORMAL }, // GRAVE ACCENT --> FULLWIDTH GRAVE ACCENT + { 0x0060, 0x2018, HALF2FULL_JIS_FUNCTION }, // GRAVE ACCENT --> LEFT SINGLE QUOTATION MARK, exceptional conversion + { 0x0061, 0xFF41, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER A --> FULLWIDTH LATIN SMALL LETTER A + { 0x0062, 0xFF42, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER B --> FULLWIDTH LATIN SMALL LETTER B + { 0x0063, 0xFF43, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER C --> FULLWIDTH LATIN SMALL LETTER C + { 0x0064, 0xFF44, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER D --> FULLWIDTH LATIN SMALL LETTER D + { 0x0065, 0xFF45, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER E --> FULLWIDTH LATIN SMALL LETTER E + { 0x0066, 0xFF46, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER F --> FULLWIDTH LATIN SMALL LETTER F + { 0x0067, 0xFF47, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER G --> FULLWIDTH LATIN SMALL LETTER G + { 0x0068, 0xFF48, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER H --> FULLWIDTH LATIN SMALL LETTER H + { 0x0069, 0xFF49, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER I --> FULLWIDTH LATIN SMALL LETTER I + { 0x006A, 0xFF4A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER J --> FULLWIDTH LATIN SMALL LETTER J + { 0x006B, 0xFF4B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER K --> FULLWIDTH LATIN SMALL LETTER K + { 0x006C, 0xFF4C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER L --> FULLWIDTH LATIN SMALL LETTER L + { 0x006D, 0xFF4D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER M --> FULLWIDTH LATIN SMALL LETTER M + { 0x006E, 0xFF4E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER N --> FULLWIDTH LATIN SMALL LETTER N + { 0x006F, 0xFF4F, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER O --> FULLWIDTH LATIN SMALL LETTER O + { 0x0070, 0xFF50, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER P --> FULLWIDTH LATIN SMALL LETTER P + { 0x0071, 0xFF51, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER Q --> FULLWIDTH LATIN SMALL LETTER Q + { 0x0072, 0xFF52, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER R --> FULLWIDTH LATIN SMALL LETTER R + { 0x0073, 0xFF53, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER S --> FULLWIDTH LATIN SMALL LETTER S + { 0x0074, 0xFF54, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER T --> FULLWIDTH LATIN SMALL LETTER T + { 0x0075, 0xFF55, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER U --> FULLWIDTH LATIN SMALL LETTER U + { 0x0076, 0xFF56, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER V --> FULLWIDTH LATIN SMALL LETTER V + { 0x0077, 0xFF57, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER W --> FULLWIDTH LATIN SMALL LETTER W + { 0x0078, 0xFF58, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER X --> FULLWIDTH LATIN SMALL LETTER X + { 0x0079, 0xFF59, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER Y --> FULLWIDTH LATIN SMALL LETTER Y + { 0x007A, 0xFF5A, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LATIN SMALL LETTER Z --> FULLWIDTH LATIN SMALL LETTER Z + { 0x007B, 0xFF5B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // LEFT CURLY BRACKET --> FULLWIDTH LEFT CURLY BRACKET + { 0x007C, 0xFF5C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // VERTICAL LINE --> FULLWIDTH VERTICAL LINE + { 0x007D, 0xFF5D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // RIGHT CURLY BRACKET --> FULLWIDTH RIGHT CURLY BRACKET + { 0x007E, 0xFF5E, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // TILDE --> FULLWIDTH TILDE + { 0x00A2, 0xFFE0, HALF2FULL_NORMAL }, // CENT SIGN --> FULLWIDTH CENT SIGN + { 0x00A3, 0xFFE1, HALF2FULL_NORMAL }, // POUND SIGN --> FULLWIDTH POUND SIGN + { 0x00A5, 0xFFE5, HALF2FULL_NORMAL }, // YEN SIGN --> FULLWIDTH YEN SIGN + { 0x00A6, 0xFFE4, HALF2FULL_NORMAL }, // BROKEN BAR --> FULLWIDTH BROKEN BAR + { 0x00AC, 0xFFE2, HALF2FULL_NORMAL }, // NOT SIGN --> FULLWIDTH NOT SIGN + { 0x00AF, 0xFFE3, HALF2FULL_NORMAL }, // MACRON --> FULLWIDTH MACRON + { 0x20A9, 0xFFE6, HALF2FULL_NORMAL }, // WON SIGN --> FULLWIDTH WON SIGN + { 0xFF61, 0x3002, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH IDEOGRAPHIC FULL STOP --> IDEOGRAPHIC FULL STOP + { 0xFF62, 0x300C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH LEFT CORNER BRACKET --> LEFT CORNER BRACKET + { 0xFF63, 0x300D, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH RIGHT CORNER BRACKET --> RIGHT CORNER BRACKET + { 0xFF64, 0x3001, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH IDEOGRAPHIC COMMA --> IDEOGRAPHIC COMMA + { 0xFF65, 0x30FB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH KATAKANA MIDDLE DOT --> KATAKANA MIDDLE DOT + { 0xFF66, 0x30F2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER WO --> KATAKANA LETTER WO + { 0xFF67, 0x30A1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL A --> KATAKANA LETTER SMALL A + { 0xFF68, 0x30A3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL I --> KATAKANA LETTER SMALL I + { 0xFF69, 0x30A5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL U --> KATAKANA LETTER SMALL U + { 0xFF6A, 0x30A7, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL E --> KATAKANA LETTER SMALL E + { 0xFF6B, 0x30A9, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL O --> KATAKANA LETTER SMALL O + { 0xFF6C, 0x30E3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL YA --> KATAKANA LETTER SMALL YA + { 0xFF6D, 0x30E5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL YU --> KATAKANA LETTER SMALL YU + { 0xFF6E, 0x30E7, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL YO --> KATAKANA LETTER SMALL YO + { 0xFF6F, 0x30C3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SMALL TU --> KATAKANA LETTER SMALL TU + { 0xFF70, 0x30FC, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION }, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK --> KATAKANA-HIRAGANA PROLONGED SOUND MARK + { 0xFF71, 0x30A2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER A --> KATAKANA LETTER A + { 0xFF72, 0x30A4, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER I --> KATAKANA LETTER I + { 0xFF73, 0x30A6, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER U --> KATAKANA LETTER U + { 0xFF74, 0x30A8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER E --> KATAKANA LETTER E + { 0xFF75, 0x30AA, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER O --> KATAKANA LETTER O + { 0xFF76, 0x30AB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KA --> KATAKANA LETTER KA + { 0xFF77, 0x30AD, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KI --> KATAKANA LETTER KI + { 0xFF78, 0x30AF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KU --> KATAKANA LETTER KU + { 0xFF79, 0x30B1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KE --> KATAKANA LETTER KE + { 0xFF7A, 0x30B3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER KO --> KATAKANA LETTER KO + { 0xFF7B, 0x30B5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SA --> KATAKANA LETTER SA + { 0xFF7C, 0x30B7, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SI --> KATAKANA LETTER SI + { 0xFF7D, 0x30B9, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SU --> KATAKANA LETTER SU + { 0xFF7E, 0x30BB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SE --> KATAKANA LETTER SE + { 0xFF7F, 0x30BD, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER SO --> KATAKANA LETTER SO + { 0xFF80, 0x30BF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TA --> KATAKANA LETTER TA + { 0xFF81, 0x30C1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TI --> KATAKANA LETTER TI + { 0xFF82, 0x30C4, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TU --> KATAKANA LETTER TU + { 0xFF83, 0x30C6, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TE --> KATAKANA LETTER TE + { 0xFF84, 0x30C8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER TO --> KATAKANA LETTER TO + { 0xFF85, 0x30CA, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NA --> KATAKANA LETTER NA + { 0xFF86, 0x30CB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NI --> KATAKANA LETTER NI + { 0xFF87, 0x30CC, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NU --> KATAKANA LETTER NU + { 0xFF88, 0x30CD, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NE --> KATAKANA LETTER NE + { 0xFF89, 0x30CE, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER NO --> KATAKANA LETTER NO + { 0xFF8A, 0x30CF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HA --> KATAKANA LETTER HA + { 0xFF8B, 0x30D2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HI --> KATAKANA LETTER HI + { 0xFF8C, 0x30D5, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HU --> KATAKANA LETTER HU + { 0xFF8D, 0x30D8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HE --> KATAKANA LETTER HE + { 0xFF8E, 0x30DB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER HO --> KATAKANA LETTER HO + { 0xFF8F, 0x30DE, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MA --> KATAKANA LETTER MA + { 0xFF90, 0x30DF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MI --> KATAKANA LETTER MI + { 0xFF91, 0x30E0, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MU --> KATAKANA LETTER MU + { 0xFF92, 0x30E1, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER ME --> KATAKANA LETTER ME + { 0xFF93, 0x30E2, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER MO --> KATAKANA LETTER MO + { 0xFF94, 0x30E4, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER YA --> KATAKANA LETTER YA + { 0xFF95, 0x30E6, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER YU --> KATAKANA LETTER YU + { 0xFF96, 0x30E8, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER YO --> KATAKANA LETTER YO + { 0xFF97, 0x30E9, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RA --> KATAKANA LETTER RA + { 0xFF98, 0x30EA, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RI --> KATAKANA LETTER RI + { 0xFF99, 0x30EB, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RU --> KATAKANA LETTER RU + { 0xFF9A, 0x30EC, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RE --> KATAKANA LETTER RE + { 0xFF9B, 0x30ED, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER RO --> KATAKANA LETTER RO + { 0xFF9C, 0x30EF, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER WA --> KATAKANA LETTER WA + { 0xFF9D, 0x30F3, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA LETTER N --> KATAKANA LETTER N + +// bluedwarf: A combination character cannot be used solely +// { 0xFF9E, 0x3099, HALF2FULL_NORMAL }, // HALFWIDTH KATAKANA VOICED SOUND MARK --> COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK +// { 0xFF9F, 0x309A, HALF2FULL_NORMAL }, // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK --> COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + { 0xFF9E, 0x309B, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA VOICED SOUND MARK --> KATAKANA-HIRAGANA VOICED SOUND MARK + { 0xFF9F, 0x309C, HALF2FULL_NORMAL | HALF2FULL_JIS_FUNCTION | HALF2FULL_KATAKANA_ONLY }, // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK --> KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + + { 0xFFA0, 0x3164, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL FILLER --> HANGUL FILLER + { 0xFFA1, 0x3131, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER KIYEOK --> HANGUL LETTER KIYEOK + { 0xFFA2, 0x3132, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGKIYEOK --> HANGUL LETTER SSANGKIYEOK + { 0xFFA3, 0x3133, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER KIYEOK-SIOS --> HANGUL LETTER KIYEOK-SIOS + { 0xFFA4, 0x3134, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER NIEUN --> HANGUL LETTER NIEUN + { 0xFFA5, 0x3135, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER NIEUN-CIEUC --> HANGUL LETTER NIEUN-CIEUC + { 0xFFA6, 0x3136, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER NIEUN-HIEUH --> HANGUL LETTER NIEUN-HIEUH + { 0xFFA7, 0x3137, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER TIKEUT --> HANGUL LETTER TIKEUT + { 0xFFA8, 0x3138, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGTIKEUT --> HANGUL LETTER SSANGTIKEUT + { 0xFFA9, 0x3139, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL --> HANGUL LETTER RIEUL + { 0xFFAA, 0x313A, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-KIYEOK --> HANGUL LETTER RIEUL-KIYEOK + { 0xFFAB, 0x313B, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-MIEUM --> HANGUL LETTER RIEUL-MIEUM + { 0xFFAC, 0x313C, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-PIEUP --> HANGUL LETTER RIEUL-PIEUP + { 0xFFAD, 0x313D, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-SIOS --> HANGUL LETTER RIEUL-SIOS + { 0xFFAE, 0x313E, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-THIEUTH --> HANGUL LETTER RIEUL-THIEUTH + { 0xFFAF, 0x313F, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH --> HANGUL LETTER RIEUL-PHIEUPH + { 0xFFB0, 0x3140, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER RIEUL-HIEUH --> HANGUL LETTER RIEUL-HIEUH + { 0xFFB1, 0x3141, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER MIEUM --> HANGUL LETTER MIEUM + { 0xFFB2, 0x3142, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER PIEUP --> HANGUL LETTER PIEUP + { 0xFFB3, 0x3143, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGPIEUP --> HANGUL LETTER SSANGPIEUP + { 0xFFB4, 0x3144, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER PIEUP-SIOS --> HANGUL LETTER PIEUP-SIOS + { 0xFFB5, 0x3145, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SIOS --> HANGUL LETTER SIOS + { 0xFFB6, 0x3146, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGSIOS --> HANGUL LETTER SSANGSIOS + { 0xFFB7, 0x3147, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER IEUNG --> HANGUL LETTER IEUNG + { 0xFFB8, 0x3148, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER CIEUC --> HANGUL LETTER CIEUC + { 0xFFB9, 0x3149, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER SSANGCIEUC --> HANGUL LETTER SSANGCIEUC + { 0xFFBA, 0x314A, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER CHIEUCH --> HANGUL LETTER CHIEUCH + { 0xFFBB, 0x314B, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER KHIEUKH --> HANGUL LETTER KHIEUKH + { 0xFFBC, 0x314C, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER THIEUTH --> HANGUL LETTER THIEUTH + { 0xFFBD, 0x314D, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER PHIEUPH --> HANGUL LETTER PHIEUPH + { 0xFFBE, 0x314E, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER HIEUH --> HANGUL LETTER HIEUH + { 0xFFC2, 0x314F, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER A --> HANGUL LETTER A + { 0xFFC3, 0x3150, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER AE --> HANGUL LETTER AE + { 0xFFC4, 0x3151, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YA --> HANGUL LETTER YA + { 0xFFC5, 0x3152, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YAE --> HANGUL LETTER YAE + { 0xFFC6, 0x3153, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER EO --> HANGUL LETTER EO + { 0xFFC7, 0x3154, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER E --> HANGUL LETTER E + { 0xFFCA, 0x3155, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YEO --> HANGUL LETTER YEO + { 0xFFCB, 0x3156, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YE --> HANGUL LETTER YE + { 0xFFCC, 0x3157, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER O --> HANGUL LETTER O + { 0xFFCD, 0x3158, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WA --> HANGUL LETTER WA + { 0xFFCE, 0x3159, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WAE --> HANGUL LETTER WAE + { 0xFFCF, 0x315A, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER OE --> HANGUL LETTER OE + { 0xFFD2, 0x315B, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YO --> HANGUL LETTER YO + { 0xFFD3, 0x315C, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER U --> HANGUL LETTER U + { 0xFFD4, 0x315D, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WEO --> HANGUL LETTER WEO + { 0xFFD5, 0x315E, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WE --> HANGUL LETTER WE + { 0xFFD6, 0x315F, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER WI --> HANGUL LETTER WI + { 0xFFD7, 0x3160, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YU --> HANGUL LETTER YU + { 0xFFDA, 0x3161, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER EU --> HANGUL LETTER EU + { 0xFFDB, 0x3162, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER YI --> HANGUL LETTER YI + { 0xFFDC, 0x3163, HALF2FULL_NORMAL }, // HALFWIDTH HANGUL LETTER I --> HANGUL LETTER I + { 0xFFE8, 0x2502, HALF2FULL_NORMAL }, // HALFWIDTH FORMS LIGHT VERTICAL --> BOX DRAWINGS LIGHT VERTICAL + { 0xFFE9, 0x2190, HALF2FULL_NORMAL }, // HALFWIDTH LEFTWARDS ARROW --> LEFTWARDS ARROW + { 0xFFEA, 0x2191, HALF2FULL_NORMAL }, // HALFWIDTH UPWARDS ARROW --> UPWARDS ARROW + { 0xFFEB, 0x2192, HALF2FULL_NORMAL }, // HALFWIDTH RIGHTWARDS ARROW --> RIGHTWARDS ARROW + { 0xFFEC, 0x2193, HALF2FULL_NORMAL }, // HALFWIDTH DOWNWARDS ARROW --> DOWNWARDS ARROW + { 0xFFED, 0x25A0, HALF2FULL_NORMAL }, // HALFWIDTH BLACK SQUARE --> BLACK SQUARE + { 0xFFEE, 0x25CB, HALF2FULL_NORMAL }, // HALFWIDTH WHITE CIRCLE --> WHITE CIRCLE +}; + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |