diff --git a/.gitmodules b/.gitmodules index 57306103a..6274b5410 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "lib/FFXIVClientStructs"] path = lib/FFXIVClientStructs url = https://github.com/goatcorp/FFXIVClientStructs.git +[submodule "lib/Nomade040-nmd"] + path = lib/Nomade040-nmd + url = https://github.com/Nomade040/nmd diff --git a/Dalamud.Boot/Dalamud.Boot.vcxproj b/Dalamud.Boot/Dalamud.Boot.vcxproj index 0629d4466..993b2caa2 100644 --- a/Dalamud.Boot/Dalamud.Boot.vcxproj +++ b/Dalamud.Boot/Dalamud.Boot.vcxproj @@ -58,6 +58,7 @@ true false _DEBUG;%(PreprocessorDefinitions) + Use false @@ -69,6 +70,7 @@ true true NDEBUG;%(PreprocessorDefinitions) + Use true @@ -91,22 +93,24 @@ NotUsing NotUsing + + + + + + NotUsing + NotUsing + Create Create - - Use - Use - + Use Use - - Use - Use - + @@ -114,8 +118,14 @@ + + + + + + diff --git a/Dalamud.Boot/Dalamud.Boot.vcxproj.filters b/Dalamud.Boot/Dalamud.Boot.vcxproj.filters index ad673c2d4..b6991f9eb 100644 --- a/Dalamud.Boot/Dalamud.Boot.vcxproj.filters +++ b/Dalamud.Boot/Dalamud.Boot.vcxproj.filters @@ -8,14 +8,14 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + {0c915688-91ea-431f-8b68-845cad422a50} + Dalamud.Boot DLL - - Dalamud.Boot DLL - Dalamud.Boot DLL @@ -28,6 +28,24 @@ CoreCLR + + Project Files + + + Project Files + + + Dalamud.Boot DLL + + + Dalamud.Boot DLL + + + Dalamud.Boot DLL + + + Dalamud.Boot DLL + @@ -49,6 +67,24 @@ Dalamud.Boot DLL + Project Files + + + Dalamud.Boot DLL + + + Dalamud.Boot DLL + + + Dalamud.Boot DLL + + + Dalamud.Boot DLL + + + Dalamud.Boot DLL + + Dalamud.Boot DLL diff --git a/Dalamud.Boot/bootconfig.h b/Dalamud.Boot/bootconfig.h new file mode 100644 index 000000000..667369212 --- /dev/null +++ b/Dalamud.Boot/bootconfig.h @@ -0,0 +1,25 @@ +#pragma once + +#include "utils.h" + +namespace bootconfig { + inline bool is_wait_messagebox() { + return utils::get_env(L"DALAMUD_WAIT_MESSAGEBOX"); + } + + inline bool is_show_console() { + return utils::get_env(L"DALAMUD_SHOW_CONSOLE"); + } + + inline bool is_wait_debugger() { + return utils::get_env(L"DALAMUD_WAIT_DEBUGGER"); + } + + inline bool is_veh_enabled() { + return utils::get_env(L"DALAMUD_IS_VEH"); + } + + inline bool is_veh_full() { + return utils::get_env("DALAMUD_IS_VEH_FULL"); + } +} diff --git a/Dalamud.Boot/dllmain.cpp b/Dalamud.Boot/dllmain.cpp index 2ad8bb20d..64e2b41be 100644 --- a/Dalamud.Boot/dllmain.cpp +++ b/Dalamud.Boot/dllmain.cpp @@ -1,86 +1,40 @@ #include "pch.h" +#include "bootconfig.h" +#include "logging.h" #include "veh.h" +#include "xivfixes.h" HMODULE g_hModule; +HINSTANCE g_hGameInstance = GetModuleHandleW(nullptr); -bool check_env_var(std::string name) -{ - size_t required_size; - getenv_s(&required_size, nullptr, 0, name.c_str()); - if (required_size > 0) - { - if (char* is_no_veh = static_cast(malloc(required_size * sizeof(char)))) - { - getenv_s(&required_size, is_no_veh, required_size, name.c_str()); - auto result = _stricmp(is_no_veh, "true"); - free(is_no_veh); - if (result == 0) - return true; - } +DllExport DWORD WINAPI Initialize(LPVOID lpParam, HANDLE hMainThreadContinue) { + if (bootconfig::is_show_console()) + ConsoleSetup(L"Dalamud Boot"); + + if (bootconfig::is_wait_messagebox()) + MessageBoxW(nullptr, L"Press OK to continue", L"Dalamud Boot", MB_OK); + + try { + xivfixes::apply_all(true); + } catch (const std::exception& e) { + logging::print("Failed to do general fixups. Some things might not work."); + logging::print("Error: {}", e.what()); } - return false; -} + logging::print("Dalamud.Boot Injectable, (c) 2021 XIVLauncher Contributors"); + logging::print("Built at : " __DATE__ "@" __TIME__); -bool is_running_on_linux() -{ - size_t required_size; - getenv_s(&required_size, nullptr, 0, "XL_WINEONLINUX"); - if (required_size > 0) - { - if (char* is_wine_on_linux = static_cast(malloc(required_size * sizeof(char)))) - { - getenv_s(&required_size, is_wine_on_linux, required_size, "XL_WINEONLINUX"); - auto result = _stricmp(is_wine_on_linux, "true"); - free(is_wine_on_linux); - if (result == 0) - return true; - } - } - - HMODULE hntdll = GetModuleHandleW(L"ntdll.dll"); - if (!hntdll) // not running on NT - return true; - - FARPROC pwine_get_version = GetProcAddress(hntdll, "wine_get_version"); - FARPROC pwine_get_host_version = GetProcAddress(hntdll, "wine_get_host_version"); - - return pwine_get_version != nullptr || pwine_get_host_version != nullptr; -} - -bool is_veh_enabled() -{ - return check_env_var("DALAMUD_IS_VEH"); -} - -bool is_full_dumps() -{ - return check_env_var("DALAMUD_IS_VEH_FULL"); -} - -DllExport DWORD WINAPI Initialize(LPVOID lpParam, HANDLE hMainThreadContinue) -{ - #ifndef NDEBUG - ConsoleSetup(L"Dalamud Boot"); - #endif - - printf("Dalamud.Boot Injectable, (c) 2021 XIVLauncher Contributors\nBuilt at: %s@%s\n\n", __DATE__, __TIME__); - - if (check_env_var("DALAMUD_WAIT_DEBUGGER")) - { - printf("Waiting for debugger to attach...\n"); + if (bootconfig::is_wait_debugger()) { + logging::print("Waiting for debugger to attach..."); while (!IsDebuggerPresent()) Sleep(100); - printf("Debugger attached.\n"); + logging::print("Debugger attached."); } - wchar_t _module_path[MAX_PATH]; - GetModuleFileNameW(g_hModule, _module_path, sizeof _module_path / 2); - std::filesystem::path fs_module_path(_module_path); - - std::wstring runtimeconfig_path = _wcsdup(fs_module_path.replace_filename(L"Dalamud.runtimeconfig.json").c_str()); - std::wstring module_path = _wcsdup(fs_module_path.replace_filename(L"Dalamud.dll").c_str()); + const auto fs_module_path = utils::get_module_path(g_hModule); + const auto runtimeconfig_path = std::filesystem::path(fs_module_path).replace_filename(L"Dalamud.runtimeconfig.json").wstring(); + const auto module_path = std::filesystem::path(fs_module_path).replace_filename(L"Dalamud.dll").wstring(); // ============================== CLR ========================================= // @@ -97,39 +51,28 @@ DllExport DWORD WINAPI Initialize(LPVOID lpParam, HANDLE hMainThreadContinue) if (result != 0) return result; - typedef void (CORECLR_DELEGATE_CALLTYPE* custom_component_entry_point_fn)(LPVOID, HANDLE); - custom_component_entry_point_fn entrypoint_fn = reinterpret_cast(entrypoint_vfn); + using custom_component_entry_point_fn = void (CORECLR_DELEGATE_CALLTYPE*)(LPVOID, HANDLE); + const auto entrypoint_fn = reinterpret_cast(entrypoint_vfn); // ============================== VEH ======================================== // - printf("Initializing VEH... "); - if(is_running_on_linux()) - { - printf("VEH was disabled, running on linux\n"); - } - else if (is_veh_enabled()) - { - if (veh::add_handler(is_full_dumps())) - printf("Done!\n"); - else printf("Failed!\n"); - } - else - { - printf("VEH was disabled manually\n"); + logging::print("Initializing VEH..."); + if (utils::is_running_on_linux()) { + logging::print("=> VEH was disabled, running on linux"); + } else if (bootconfig::is_veh_enabled()) { + if (veh::add_handler(bootconfig::is_veh_full())) + logging::print("=> Done!"); + else + logging::print("=> Failed!"); + } else { + logging::print("VEH was disabled manually"); } // ============================== Dalamud ==================================== // - printf("Initializing Dalamud... "); + logging::print("Initializing Dalamud..."); entrypoint_fn(lpParam, hMainThreadContinue); - printf("Done!\n"); - - #ifndef NDEBUG - fclose(stdin); - fclose(stdout); - fclose(stderr); - FreeConsole(); - #endif + logging::print("Done!"); return 0; } @@ -137,12 +80,12 @@ DllExport DWORD WINAPI Initialize(LPVOID lpParam, HANDLE hMainThreadContinue) BOOL APIENTRY DllMain(const HMODULE hModule, const DWORD dwReason, LPVOID lpReserved) { DisableThreadLibraryCalls(hModule); - switch (dwReason) - { + switch (dwReason) { case DLL_PROCESS_ATTACH: g_hModule = hModule; break; case DLL_PROCESS_DETACH: + xivfixes::apply_all(false); veh::remove_handler(); break; } diff --git a/Dalamud.Boot/hooks.h b/Dalamud.Boot/hooks.h new file mode 100644 index 000000000..ac8f93b21 --- /dev/null +++ b/Dalamud.Boot/hooks.h @@ -0,0 +1,136 @@ +#pragma once + +#include + +#include "utils.h" + +namespace hooks { + template + class base_hook; + + template + class base_hook { + using TFn = TReturn(TArgs...); + + private: + TFn* const m_pfnOriginal; + utils::thunk m_thunk; + + public: + base_hook(TFn* pfnOriginal) + : m_pfnOriginal(pfnOriginal) + , m_thunk(m_pfnOriginal) { + } + + virtual ~base_hook() = default; + + virtual void set_detour(std::function fn) { + if (!fn) + m_thunk.set_target(m_pfnOriginal); + else + m_thunk.set_target(std::move(fn)); + } + + virtual TReturn call_original(TArgs... args) { + return m_pfnOriginal(std::forward(args)...); + } + + protected: + TFn* get_original() const { + return m_pfnOriginal; + } + + TFn* get_thunk() const { + return m_thunk.get_thunk(); + } + }; + + template + class import_hook : public base_hook { + using Base = base_hook; + + TFn** const m_ppfnImportTableItem; + + public: + import_hook(TFn** ppfnImportTableItem) + : Base(*ppfnImportTableItem) + , m_ppfnImportTableItem(ppfnImportTableItem) { + + const utils::memory_tenderizer tenderizer(ppfnImportTableItem, sizeof * ppfnImportTableItem, PAGE_READWRITE); + *ppfnImportTableItem = Base::get_thunk(); + } + + import_hook(const char* pcszDllName, const char* pcszFunctionName, int hintOrOrdinal) + : import_hook(utils::get_imported_function_pointer(GetModuleHandleW(nullptr), pcszDllName, pcszFunctionName, hintOrOrdinal)) { + } + + ~import_hook() override { + const utils::memory_tenderizer tenderizer(m_ppfnImportTableItem, sizeof * m_ppfnImportTableItem, PAGE_READWRITE); + + *m_ppfnImportTableItem = Base::get_original(); + } + }; + + template + class export_hook : public base_hook { + using Base = base_hook; + + static constexpr uint8_t DetouringThunkTemplate[12]{ + 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // movabs rax, 0x0000000000000000 + 0xFF, 0xE0, // jmp rax + }; + + TFn* const m_pfnExportThunk; + uint8_t s_originalThunk[sizeof DetouringThunkTemplate]{}; + + public: + export_hook(TFn* pfnExportThunk) + : Base(reinterpret_cast(utils::resolve_unconditional_jump_target(pfnExportThunk))) + , m_pfnExportThunk(pfnExportThunk) { + auto pExportThunk = reinterpret_cast(pfnExportThunk); + + // Make it writeable. + const utils::memory_tenderizer tenderizer(pfnExportThunk, sizeof DetouringThunkTemplate, PAGE_EXECUTE_READWRITE); + + // Back up original thunk bytes. + memcpy(s_originalThunk, pExportThunk, sizeof s_originalThunk); + + // Write thunk template. + memcpy(pExportThunk, DetouringThunkTemplate, sizeof DetouringThunkTemplate); + + // Write target address. + *reinterpret_cast(&pExportThunk[2]) = Base::get_thunk(); + } + + ~export_hook() override { + const utils::memory_tenderizer tenderizer(m_pfnExportThunk, sizeof DetouringThunkTemplate, PAGE_EXECUTE_READWRITE); + + // Restore original thunk bytes. + memcpy(m_pfnExportThunk, s_originalThunk, sizeof s_originalThunk); + + // Clear state. + memset(s_originalThunk, 0, sizeof s_originalThunk); + } + }; + + class wndproc_hook : public base_hook> { + using Base = base_hook>; + + const HWND s_hwnd; + + public: + wndproc_hook(HWND hwnd) + : Base(reinterpret_cast(GetWindowLongPtrW(hwnd, GWLP_WNDPROC))) + , s_hwnd(hwnd) { + SetWindowLongPtrW(hwnd, GWLP_WNDPROC, reinterpret_cast(Base::get_thunk())); + } + + ~wndproc_hook() override { + SetWindowLongPtrW(s_hwnd, GWLP_WNDPROC, reinterpret_cast(Base::get_original())); + } + + LRESULT call_original(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) override { + return CallWindowProcW(Base::get_original(), hwnd, msg, wParam, lParam); + } + }; +} diff --git a/Dalamud.Boot/logging.cpp b/Dalamud.Boot/logging.cpp new file mode 100644 index 000000000..925fcdb18 --- /dev/null +++ b/Dalamud.Boot/logging.cpp @@ -0,0 +1,35 @@ +#include "pch.h" +#include "logging.h" + +void logging::print(Level level, const char* s) { + SYSTEMTIME st; + GetLocalTime(&st); + + std::string estr; + switch (level) { + case Verbose: + estr = std::format("[{:02}:{:02}:{:02} CPP/VRB] {}\n", st.wHour, st.wMinute, st.wSecond, s); + break; + case Debug: + estr = std::format("[{:02}:{:02}:{:02} CPP/DBG] {}\n", st.wHour, st.wMinute, st.wSecond, s); + break; + case Info: + estr = std::format("[{:02}:{:02}:{:02} CPP/INF] {}\n", st.wHour, st.wMinute, st.wSecond, s); + break; + case Warning: + estr = std::format("[{:02}:{:02}:{:02} CPP/WRN] {}\n", st.wHour, st.wMinute, st.wSecond, s); + break; + case Error: + estr = std::format("[{:02}:{:02}:{:02} CPP/ERR] {}\n", st.wHour, st.wMinute, st.wSecond, s); + break; + case Fatal: + estr = std::format("[{:02}:{:02}:{:02} CPP/FTL] {}\n", st.wHour, st.wMinute, st.wSecond, s); + break; + default: + estr = std::format("[{:02}:{:02}:{:02} CPP/???] {}\n", st.wHour, st.wMinute, st.wSecond, s); + break; + } + + DWORD wr; + WriteFile(GetStdHandle(STD_ERROR_HANDLE), &estr[0], static_cast(estr.size()), &wr, nullptr); +} diff --git a/Dalamud.Boot/logging.h b/Dalamud.Boot/logging.h new file mode 100644 index 000000000..a9b88d605 --- /dev/null +++ b/Dalamud.Boot/logging.h @@ -0,0 +1,59 @@ +#pragma once + +#include +#include +#include + +#include "unicode.h" + +namespace logging { + enum Level : int { + Verbose = 0, + V = 0, + Debug = 1, + D = 1, + Info = 2, + I = 2, + Warning = 3, + W = 3, + Error = 4, + E = 4, + Fatal = 5, + F = 5, + }; + + void print(Level level, const char* s); + + inline void print(Level level, const wchar_t* s) { + const auto cs = unicode::convert(s); + print(level, cs.c_str()); + } + + inline void print(Level level, const std::string& s) { + print(level, s.c_str()); + } + + inline void print(Level level, const std::wstring& s) { + print(level, s.c_str()); + } + + template + inline void print(const T* s) { + print(level, s); + } + + template + inline void print(Level level, const char* pcszFormat, Arg arg1, Args...args) { + print(level, std::format(pcszFormat, std::forward(arg1), std::forward(args)...)); + } + + template + inline void print(Level level, const wchar_t* pcszFormat, Arg arg1, Args...args) { + print(level, std::format(pcszFormat, std::forward(arg1), std::forward(args)...)); + } + + template>> + inline void print(const T* pcszFormat, Arg arg1, Args...args) { + print(level, std::format(pcszFormat, std::forward(arg1), std::forward(args)...)); + } +}; diff --git a/Dalamud.Boot/pch.h b/Dalamud.Boot/pch.h index 3c2bd6c4b..01cb992a0 100644 --- a/Dalamud.Boot/pch.h +++ b/Dalamud.Boot/pch.h @@ -8,7 +8,8 @@ #define PCH_H // Exclude rarely-used stuff from Windows headers -#define WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX // Windows Header Files #include @@ -17,6 +18,10 @@ #include #include #include +#include + +// MSVC Compiler Intrinsic +#include // C++ Standard Libraries #include @@ -24,18 +29,32 @@ #include #include #include +#include +#include +#include #include +#include #include +#include + +// https://www.akenotsuki.com/misc/srell/en/ +#include "../lib/srell3_009/single-header/srell.hpp" + +// https://github.com/Nomade040/nmd +#include "../lib/Nomade040-nmd/nmd_assembly.h" // https://github.com/dotnet/coreclr -#include "..\lib\CoreCLR\CoreCLR.h" -#include "..\lib\CoreCLR\boot.h" +#include "../lib/CoreCLR/CoreCLR.h" +#include "../lib/CoreCLR/boot.h" + +#include "unicode.h" // Commonly used macros #define DllExport extern "C" __declspec(dllexport) // Global variables extern HMODULE g_hModule; +extern HINSTANCE g_hGameInstance; extern std::optional g_clr; #endif //PCH_H diff --git a/Dalamud.Boot/pch_nmd_assembly_impl.cpp b/Dalamud.Boot/pch_nmd_assembly_impl.cpp new file mode 100644 index 000000000..6f3af675a --- /dev/null +++ b/Dalamud.Boot/pch_nmd_assembly_impl.cpp @@ -0,0 +1,2 @@ +#define NMD_ASSEMBLY_IMPLEMENTATION +#include "../lib/Nomade040-nmd/nmd_assembly.h" diff --git a/Dalamud.Boot/rewrite_entrypoint.cpp b/Dalamud.Boot/rewrite_entrypoint.cpp index 4092a39bc..d01f05b2a 100644 --- a/Dalamud.Boot/rewrite_entrypoint.cpp +++ b/Dalamud.Boot/rewrite_entrypoint.cpp @@ -1,5 +1,7 @@ #include "pch.h" +#include "logging.h" + DllExport DWORD WINAPI Initialize(LPVOID lpParam, HANDLE hMainThreadContinue); struct RewrittenEntryPointParameters { @@ -231,8 +233,8 @@ void* get_mapped_image_base_address(HANDLE hProcess, const std::filesystem::path return mbi.AllocationBase; - } catch (const std::filesystem::filesystem_error& e) { - printf("%s", e.what()); + } catch (const std::exception& e) { + logging::print("Failed to check memory block 0x{:X}(len=0x{:X}): {}", mbi.BaseAddress, mbi.RegionSize, e.what()); continue; } } diff --git a/Dalamud.Boot/unicode.cpp b/Dalamud.Boot/unicode.cpp new file mode 100644 index 000000000..9d66d29f2 --- /dev/null +++ b/Dalamud.Boot/unicode.cpp @@ -0,0 +1,235 @@ +#include "pch.h" + +#include "unicode.h" + +size_t unicode::decode(EncodingTag, char32_t& out, const char8_t* in, size_t nRemainingBytes, bool strict) { + if (nRemainingBytes == 0) { + out = 0; + return 0; + } + + if (0 == (*in & 0x80)) { + out = *in; + return 1; + } + + if (0xC0 == (*in & 0xE0)) { + if (nRemainingBytes < 2) goto invalid; + if (0x80 != (in[1] & 0xC0)) goto invalid; + out = ( + ((static_cast(in[0]) & 0x1F) << 6) | + ((static_cast(in[1]) & 0x3F) << 0)); + return 2; + } + + if (0xE0 == (*in & 0xF0)) { + if (nRemainingBytes < 3) goto invalid; + if (0x80 != (in[1] & 0xC0)) goto invalid; + if (0x80 != (in[2] & 0xC0)) goto invalid; + out = static_cast( + ((static_cast(in[0]) & 0x0F) << 12) | + ((static_cast(in[1]) & 0x3F) << 6) | + ((static_cast(in[2]) & 0x3F) << 0)); + return 3; + } + + if (0xF0 == (*in & 0xF8)) { + if (nRemainingBytes < 4) goto invalid; + if (0x80 != (in[1] & 0xC0)) goto invalid; + if (0x80 != (in[2] & 0xC0)) goto invalid; + if (0x80 != (in[3] & 0xC0)) goto invalid; + out = ( + ((static_cast(in[0]) & 0x07) << 18) | + ((static_cast(in[1]) & 0x3F) << 12) | + ((static_cast(in[2]) & 0x3F) << 6) | + ((static_cast(in[3]) & 0x3F) << 0)); + return 4; + } + + if (!strict) { + if (0xF8 == (*in & 0xFC)) { + if (nRemainingBytes < 5) goto invalid; + if (0x80 != (in[1] & 0xC0)) goto invalid; + if (0x80 != (in[2] & 0xC0)) goto invalid; + if (0x80 != (in[3] & 0xC0)) goto invalid; + if (0x80 != (in[4] & 0xC0)) goto invalid; + out = ( + ((static_cast(in[0]) & 0x07) << 24) | + ((static_cast(in[1]) & 0x3F) << 18) | + ((static_cast(in[2]) & 0x3F) << 12) | + ((static_cast(in[3]) & 0x3F) << 6) | + ((static_cast(in[4]) & 0x3F) << 0)); + return 4; + } + + if (0xFC == (*in & 0xFE)) { + if (nRemainingBytes < 6) goto invalid; + if (0x80 != (in[1] & 0xC0)) goto invalid; + if (0x80 != (in[2] & 0xC0)) goto invalid; + if (0x80 != (in[3] & 0xC0)) goto invalid; + if (0x80 != (in[4] & 0xC0)) goto invalid; + if (0x80 != (in[5] & 0xC0)) goto invalid; + out = ( + ((static_cast(in[0]) & 0x07) << 30) | + ((static_cast(in[1]) & 0x3F) << 24) | + ((static_cast(in[2]) & 0x3F) << 18) | + ((static_cast(in[3]) & 0x3F) << 12) | + ((static_cast(in[4]) & 0x3F) << 6) | + ((static_cast(in[5]) & 0x3F) << 0)); + return 5; + } + } + +invalid: + out = UReplacement; + return 1; +} + +size_t unicode::decode(EncodingTag, char32_t& out, const char16_t* in, size_t nRemainingBytes, bool strict) { + if (nRemainingBytes == 0) { + out = 0; + return 0; + } + + if ((*in & 0xFC00) == 0xD800) { + if (nRemainingBytes < 2 || (in[1] & 0xFC00) != 0xDC00) + goto invalid; + out = 0x10000 + ( + ((static_cast(in[0]) & 0x03FF) << 10) | + ((static_cast(in[1]) & 0x03FF) << 0) + ); + return 2; + } + + if (0xD800 <= *in && *in <= 0xDFFF && strict) + out = UReplacement; + else + out = *in; + return 1; + +invalid: + out = UReplacement; + return 1; +} + +size_t unicode::decode(EncodingTag, char32_t& out, const char32_t* in, size_t nRemainingBytes, bool strict) { + if (nRemainingBytes == 0) { + out = 0; + return 0; + } + + out = *in; + return 1; +} + +size_t unicode::decode(EncodingTag, char32_t& out, const char* in, size_t nRemainingBytes, bool strict) { + return decode(EncodingTag(), out, reinterpret_cast(in), nRemainingBytes, strict); +} + +size_t unicode::decode(EncodingTag, char32_t& out, const wchar_t* in, size_t nRemainingBytes, bool strict) { + return decode(EncodingTag(), out, reinterpret_cast(in), nRemainingBytes, strict); +} + +size_t unicode::encode(EncodingTag, char8_t* ptr, char32_t c, bool strict) { + if (c < (1 << 7)) { + if (ptr) + *(ptr++) = static_cast(c); + return 1; + } + + if (c < (1 << (5 + 6))) { + if (ptr) { + *(ptr++) = 0xC0 | static_cast(c >> 6); + *(ptr++) = 0x80 | static_cast((c >> 0) & 0x3F); + } + return 2; + } + if (c < (1 << (4 + 6 + 6))) { + if (ptr) { + *(ptr++) = 0xE0 | static_cast(c >> 12); + *(ptr++) = 0x80 | static_cast((c >> 6) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 0) & 0x3F); + } + return 3; + } + + if (c < (1 << (3 + 6 + 6 + 6))) { + if (ptr) { + *(ptr++) = 0xF0 | static_cast(c >> 18); + *(ptr++) = 0x80 | static_cast((c >> 12) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 6) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 0) & 0x3F); + } + return 4; + } + + if (strict) { + if (ptr) { // Replacement character U+FFFD + *(ptr++) = 0xEF; + *(ptr++) = 0xBF; + *(ptr++) = 0xBD; + } + return 3; + } + + if (c < (1 << (3 + 6 + 6 + 6 + 6))) { + if (ptr) { + *(ptr++) = 0xF8 | static_cast(c >> 24); + *(ptr++) = 0x80 | static_cast((c >> 18) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 12) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 6) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 0) & 0x3F); + } + return 5; + } + + if (ptr) { + *(ptr++) = 0xFC | static_cast(c >> 30); + *(ptr++) = 0x80 | static_cast((c >> 24) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 18) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 12) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 6) & 0x3F); + *(ptr++) = 0x80 | static_cast((c >> 0) & 0x3F); + } + return 6; +} + +size_t unicode::encode(EncodingTag, char16_t* ptr, char32_t c, bool strict) { + if (c < 0x10000) { + if (ptr) { + if (0xD800 <= c && c <= 0xDFFF && strict) + *(ptr++) = 0xFFFD; + else + *(ptr++) = static_cast(c); + } + return 1; + } + + c -= 0x10000; + + if (c < (1 << 20)) { + if (ptr) { + *(ptr++) = 0xD800 | static_cast((c >> 10) & 0x3FF); + *(ptr++) = 0xDC00 | static_cast((c >> 0) & 0x3FF); + } + return 2; + } + + if (ptr) + *(ptr++) = 0xFFFD; + return 1; +} + +size_t unicode::encode(EncodingTag, char32_t* ptr, char32_t c, bool strict) { + if (ptr) + *ptr = c; + return 1; +} + +size_t unicode::encode(EncodingTag, char* ptr, char32_t c, bool strict) { + return encode(EncodingTag(), reinterpret_cast(ptr), c, strict); +} + +size_t unicode::encode(EncodingTag, wchar_t* ptr, char32_t c, bool strict) { + return encode(EncodingTag(), reinterpret_cast(ptr), c, strict); +} diff --git a/Dalamud.Boot/unicode.h b/Dalamud.Boot/unicode.h new file mode 100644 index 000000000..53e584eeb --- /dev/null +++ b/Dalamud.Boot/unicode.h @@ -0,0 +1,92 @@ +#pragma once + +#include +#include +#include +#include + +namespace unicode { + constexpr char32_t UReplacement = U'\uFFFD'; + constexpr char32_t UInvalid = U'\uFFFF'; + + template struct EncodingTag {}; + + size_t decode(EncodingTag, char32_t& out, const char8_t* in, size_t nRemainingBytes, bool strict); + + size_t decode(EncodingTag, char32_t& out, const char16_t* in, size_t nRemainingBytes, bool strict); + + size_t decode(EncodingTag, char32_t& out, const char32_t* in, size_t nRemainingBytes, bool strict); + + size_t decode(EncodingTag, char32_t& out, const char* in, size_t nRemainingBytes, bool strict); + + size_t decode(EncodingTag, char32_t& out, const wchar_t* in, size_t nRemainingBytes, bool strict); + + template + inline size_t decode(char32_t& out, const T* in, size_t nRemainingBytes, bool strict = true) { + return decode(EncodingTag(), out, in, nRemainingBytes, strict); + } + + size_t encode(EncodingTag, char8_t* ptr, char32_t c, bool strict); + + size_t encode(EncodingTag, char16_t* ptr, char32_t c, bool strict); + + size_t encode(EncodingTag, char32_t* ptr, char32_t c, bool strict); + + size_t encode(EncodingTag, char* ptr, char32_t c, bool strict); + + size_t encode(EncodingTag, wchar_t* ptr, char32_t c, bool strict); + + template + inline size_t encode(T* ptr, char32_t c, bool strict = true) { + return encode(EncodingTag(), ptr, c, strict); + } + + template> + inline TTo& convert(TTo& out, const std::basic_string_view& in, bool strict = true) { + out.reserve(out.size() + in.size() * 4 / sizeof(in[0]) / sizeof(out[0])); + + char32_t c{}; + for (size_t decLen = 0, decIdx = 0; decIdx < in.size() && (decLen = unicode::decode(c, &in[decIdx], in.size() - decIdx, strict)); decIdx += decLen) { + const auto encIdx = out.size(); + const auto encLen = unicode::encode(nullptr, c, strict); + out.resize(encIdx + encLen); + unicode::encode(&out[encIdx], c, strict); + } + + return out; + } + + template, class TFromAlloc = std::allocator> + inline TTo& convert(TTo& out, const std::basic_string& in, bool strict = true) { + return convert(out, std::basic_string_view(in), strict); + } + + template>> + inline TTo& convert(TTo& out, const TFromElem* in, size_t length = (std::numeric_limits::max)(), bool strict = true) { + if (length == (std::numeric_limits::max)()) + length = std::char_traits::length(in); + + return convert(out, std::basic_string_view(in, length), strict); + } + + template> + inline TTo convert(const std::basic_string_view& in, bool strict = true) { + TTo out{}; + return convert(out, in, strict); + } + + template, class TFromAlloc = std::allocator> + inline TTo convert(const std::basic_string& in, bool strict = true) { + TTo out{}; + return convert(out, std::basic_string_view(in), strict); + } + + template>> + inline TTo convert(const TFromElem* in, size_t length = (std::numeric_limits::max)(), bool strict = true) { + if (length == (std::numeric_limits::max)()) + length = std::char_traits::length(in); + + TTo out{}; + return convert(out, std::basic_string_view(in, length), strict); + } +} diff --git a/Dalamud.Boot/utils.cpp b/Dalamud.Boot/utils.cpp new file mode 100644 index 000000000..7294fab08 --- /dev/null +++ b/Dalamud.Boot/utils.cpp @@ -0,0 +1,434 @@ +#include "pch.h" + +#include "utils.h" + +utils::signature_finder& utils::signature_finder::look_in(const void* pFirst, size_t length) { + if (length) + m_ranges.emplace_back(std::span(reinterpret_cast(pFirst), length)); + + return *this; +} + +utils::signature_finder& utils::signature_finder::look_in(const void* pFirst, const void* pLast) { + return look_in(pFirst, reinterpret_cast(pLast) - reinterpret_cast(pFirst)); +} + +utils::signature_finder& utils::signature_finder::look_in(HMODULE hModule, const char* sectionName) { + const auto pcBaseAddress = reinterpret_cast(hModule); + const auto& dosHeader = *reinterpret_cast(&pcBaseAddress[0]); + const auto& ntHeader32 = *reinterpret_cast(&pcBaseAddress[dosHeader.e_lfanew]); + // Since this does not refer to OptionalHeader32/64 else than its offset, we can use either. + const auto sections = std::span(IMAGE_FIRST_SECTION(&ntHeader32), ntHeader32.FileHeader.NumberOfSections); + for (const auto& section : sections) { + if (strncmp(reinterpret_cast(section.Name), sectionName, IMAGE_SIZEOF_SHORT_NAME) == 0) + look_in(pcBaseAddress + section.VirtualAddress, section.Misc.VirtualSize); + } + return *this; +} + +utils::signature_finder& utils::signature_finder::look_for(std::string_view pattern, std::string_view mask, char cExactMatch, char cWildcard) { + if (pattern.size() != mask.size()) + throw std::runtime_error("Length of pattern does not match the length of mask."); + + std::string buf; + buf.reserve(pattern.size() * 4); + for (size_t i = 0; i < pattern.size(); i++) { + const auto c = pattern[i]; + if (mask[i] == cWildcard) { + buf.push_back('.'); + } else if (mask[i] == cExactMatch) { + buf.push_back('\\'); + buf.push_back('x'); + buf.push_back((c >> 4) < 10 ? (c >> 4) - 10 : 'A' + (c >> 4) - 10); + buf.push_back((c & 15) < 10 ? (c & 15) - 10 : 'A' + (c & 15) - 10); + } + } + m_patterns.emplace_back(buf); + return *this; +} + +utils::signature_finder& utils::signature_finder::look_for(std::string_view pattern, char wildcardMask) { + std::string buf; + buf.reserve(pattern.size() * 4); + for (const auto& c : pattern) { + if (c == wildcardMask) { + buf.push_back('.'); + } else { + buf.push_back('\\'); + buf.push_back('x'); + buf.push_back((c >> 4) < 10 ? '0' + (c >> 4) : 'A' + (c >> 4) - 10); + buf.push_back((c & 15) < 10 ? '0' + (c & 15) : 'A' + (c & 15) - 10); + } + } + m_patterns.emplace_back(buf); + return *this; +} + +utils::signature_finder& utils::signature_finder::look_for(std::string_view pattern) { + std::string buf; + buf.reserve(pattern.size() * 4); + for (const auto& c : pattern) { + buf.push_back('\\'); + buf.push_back('x'); + buf.push_back((c >> 4) < 10 ? '0' + (c >> 4) : 'A' + (c >> 4) - 10); + buf.push_back((c & 15) < 10 ? '0' + (c & 15) : 'A' + (c & 15) - 10); + } + m_patterns.emplace_back(buf); + return *this; +} + +utils::signature_finder& utils::signature_finder::look_for_hex(std::string_view pattern) { + std::string buf; + buf.reserve(pattern.size()); + bool bHighByte = true; + for (size_t i = 0; i < pattern.size(); i++) { + int n = -1; + if ('0' <= pattern[i] && pattern[i] <= '9') + n = pattern[i] - '0'; + else if ('a' <= pattern[i] && pattern[i] <= 'f') + n = 10 + pattern[i] - 'A'; + else if ('A' <= pattern[i] && pattern[i] <= 'F') + n = 10 + pattern[i] - 'A'; + else if (pattern[i] == '?' && i + 1 < pattern.size() && pattern[i + 1] == '?') { + i++; + n = -2; + } else if (pattern[i] == '?') + n = -2; + + if (n == -1) + continue; + else if (n == -2) { + if (!bHighByte) { + buf.insert(buf.begin() + buf.size() - 1, '0'); + bHighByte = true; + } + buf.push_back('.'); + continue; + } + + if (bHighByte) { + buf.push_back('\\'); + buf.push_back('x'); + } + buf.push_back(pattern[i]); + bHighByte = !bHighByte; + } + m_patterns.emplace_back(buf); + return *this; +} + +std::vector utils::signature_finder::find(size_t minCount, size_t maxCount, bool bErrorOnMoreThanMaximum) const { + std::vector res; + + for (const auto& rangeSpan : m_ranges) { + for (size_t patternIndex = 0; patternIndex < m_patterns.size(); patternIndex++) { + srell::match_results::iterator> matches; + auto ptr = rangeSpan.begin(); + for (size_t matchIndex = 0;; ptr = matches[0].first + 1, matchIndex++) { + if (!m_patterns[patternIndex].search(ptr, rangeSpan.end(), rangeSpan.begin(), matches, srell::regex_constants::match_flag_type::match_default)) + break; + + for (size_t captureIndex = 0; captureIndex < matches.size(); captureIndex++) { + const auto& capture = matches[captureIndex]; + res.emplace_back( + std::span(capture.first, capture.second), + patternIndex, + matchIndex, + captureIndex); + + if (bErrorOnMoreThanMaximum) { + if (res.size() > maxCount) + throw std::runtime_error(std::format("Found {} result(s), wanted at most {} results", res.size(), maxCount)); + } else if (res.size() == maxCount) + return res; + } + } + } + } + + if (res.size() < minCount) + throw std::runtime_error(std::format("Found {} result(s), wanted at least {} results", res.size(), minCount)); + + return res; +} + +std::span utils::signature_finder::find_one() const { + return find(1, 1, false).front().Match; +} + +utils::memory_tenderizer::memory_tenderizer(const void* pAddress, size_t length, DWORD dwNewProtect) : m_data(reinterpret_cast(const_cast(pAddress)), length) { + try { + for (auto pCoveredAddress = &m_data[0]; + pCoveredAddress < &m_data[0] + m_data.size(); + pCoveredAddress = reinterpret_cast(m_regions.back().BaseAddress) + m_regions.back().RegionSize) { + + MEMORY_BASIC_INFORMATION region{}; + if (!VirtualQuery(pCoveredAddress, ®ion, sizeof region)) { + throw std::runtime_error(std::format( + "VirtualQuery(addr=0x{:X}, ..., cb={}) failed with Win32 code 0x{:X}", + reinterpret_cast(pCoveredAddress), + sizeof region, + GetLastError())); + } + + if (!VirtualProtect(region.BaseAddress, region.RegionSize, dwNewProtect, ®ion.Protect)) { + throw std::runtime_error(std::format( + "(Change)VirtualProtect(addr=0x{:X}, size=0x{:X}, ..., ...) failed with Win32 code 0x{:X}", + reinterpret_cast(region.BaseAddress), + region.RegionSize, + GetLastError())); + } + + m_regions.emplace_back(region); + } + + } catch (...) { + for (auto& region : std::ranges::reverse_view(m_regions)) { + if (!VirtualProtect(region.BaseAddress, region.RegionSize, region.Protect, ®ion.Protect)) { + // Could not restore; fast fail + __fastfail(GetLastError()); + } + } + + throw; + } +} + +utils::memory_tenderizer::~memory_tenderizer() { + for (auto& region : std::ranges::reverse_view(m_regions)) { + if (!VirtualProtect(region.BaseAddress, region.RegionSize, region.Protect, ®ion.Protect)) { + // Could not restore; fast fail + __fastfail(GetLastError()); + } + } +} + +std::shared_ptr utils::allocate_executable_heap(size_t len) { + static std::weak_ptr s_hHeap; + + std::shared_ptr hHeap; + if (hHeap = s_hHeap.lock(); !hHeap) { + static std::mutex m_mtx; + const auto lock = std::lock_guard(m_mtx); + + if (hHeap = s_hHeap.lock(); !hHeap) { + if (const auto hHeapRaw = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0); hHeapRaw) + s_hHeap = hHeap = std::shared_ptr(hHeapRaw, HeapDestroy); + else + throw std::runtime_error("Failed to create heap."); + } + } + + const auto pAllocRaw = HeapAlloc(hHeap.get(), 0, len); + if (!pAllocRaw) + throw std::runtime_error("Failed to allocate memory."); + + return { + pAllocRaw, + [hHeap = std::move(hHeap)](void* pAddress) { HeapFree(hHeap.get(), 0, pAddress); }, + }; +} + +void* utils::resolve_unconditional_jump_target(void* pfn) { + const auto bytes = reinterpret_cast(pfn); + + // JMP QWORD PTR [RIP + int32] + // 48 FF 25 ?? ?? ?? ?? + if (bytes[0] == 0x48 && bytes[1] == 0xFF && bytes[2] == 0x25) + return *reinterpret_cast(&bytes[7 + *reinterpret_cast(&bytes[3])]); + + throw std::runtime_error("Unexpected thunk bytes."); +} + +template +static bool find_imported_function_pointer_helper(const char* pcBaseAddress, const IMAGE_IMPORT_DESCRIPTOR& desc, const IMAGE_DATA_DIRECTORY& dir, std::string_view reqFunc, uint32_t hintOrOrdinal, void*& ppFunctionAddress) { + const auto importLookupsOversizedSpan = std::span(reinterpret_cast(&pcBaseAddress[desc.OriginalFirstThunk]), (dir.Size - desc.OriginalFirstThunk) / sizeof TEntryType); + const auto importAddressesOversizedSpan = std::span(reinterpret_cast(&pcBaseAddress[desc.FirstThunk]), (dir.Size - desc.FirstThunk) / sizeof TEntryType); + + for (size_t i = 0, i_ = (std::min)(importLookupsOversizedSpan.size(), importAddressesOversizedSpan.size()); i < i_ && importLookupsOversizedSpan[i] && importAddressesOversizedSpan[i]; i++) { + const auto& importLookup = importLookupsOversizedSpan[i]; + const auto& importAddress = importAddressesOversizedSpan[i]; + const auto& importByName = *reinterpret_cast(&pcBaseAddress[importLookup]); + + // Is this entry importing by ordinals? A lot of socket functions are the case. + if (IMAGE_SNAP_BY_ORDINAL32(importLookup)) { + + // Is this the entry? + if (!hintOrOrdinal || IMAGE_ORDINAL32(importLookup) != hintOrOrdinal) + continue; + + // Is this entry not importing by ordinals, and are we using hint exclusively to find the entry? + } else if (reqFunc.empty()) { + + // Is this the entry? + if (importByName.Hint != hintOrOrdinal) + continue; + + } else { + + // Name must be contained in this directory. + auto currFunc = std::string_view(importByName.Name, (std::min)(&pcBaseAddress[dir.Size] - importByName.Name, reqFunc.size())); + currFunc = currFunc.substr(0, strnlen(currFunc.data(), currFunc.size())); + + // Is this the entry? (Case sensitive) + if (reqFunc != currFunc) + continue; + } + + // Found the entry; return the address of the pointer to the target function. + ppFunctionAddress = const_cast(reinterpret_cast(&importAddress)); + return true; + } + + return false; +} + +bool utils::find_imported_function_pointer(HMODULE hModule, const char* pcszDllName, const char* pcszFunctionName, uint32_t hintOrOrdinal, void*& ppFunctionAddress) { + const auto requestedDllName = std::string_view(pcszDllName, strlen(pcszDllName)); + const auto requestedFunctionName = pcszFunctionName ? std::string_view(pcszFunctionName, strlen(pcszFunctionName)) : std::string_view(); + + ppFunctionAddress = nullptr; + + const auto pcBaseAddress = reinterpret_cast(hModule); + const auto& dosHeader = *reinterpret_cast(&pcBaseAddress[0]); + const auto& ntHeader32 = *reinterpret_cast(&pcBaseAddress[dosHeader.e_lfanew]); + const auto& ntHeader64 = *reinterpret_cast(&pcBaseAddress[dosHeader.e_lfanew]); + const auto bPE32 = ntHeader32.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC; + const auto pDirectory = bPE32 + ? &ntHeader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] + : &ntHeader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; + + // There should always be an import directory, but the world may break down anytime nowadays. + if (!pDirectory) + return false; + + // This span might be too long in terms of meaningful data; it only serves to prevent accessing memory outsides boundaries. + const auto importDescriptorsOversizedSpan = std::span(reinterpret_cast(&pcBaseAddress[pDirectory->VirtualAddress]), pDirectory->Size / sizeof IMAGE_IMPORT_DESCRIPTOR); + for (const auto& importDescriptor : importDescriptorsOversizedSpan) { + + // Having all zero values signals the end of the table. We didn't find anything. + if (!importDescriptor.OriginalFirstThunk && !importDescriptor.TimeDateStamp && !importDescriptor.ForwarderChain && !importDescriptor.FirstThunk) + return false; + + // Skip invalid entries, just in case. + if (!importDescriptor.Name || !importDescriptor.OriginalFirstThunk) + continue; + + // Name must be contained in this directory. + if (importDescriptor.Name < pDirectory->VirtualAddress) + continue; + auto currentDllName = std::string_view(&pcBaseAddress[importDescriptor.Name], (std::min)(pDirectory->Size - importDescriptor.Name, requestedDllName.size())); + currentDllName = currentDllName.substr(0, strnlen(currentDllName.data(), currentDllName.size())); + + // Is this entry about the DLL that we're looking for? (Case insensitive) + if (requestedDllName.size() != currentDllName.size() || _strcmpi(requestedDllName.data(), currentDllName.data())) + continue; + + if (bPE32 && find_imported_function_pointer_helper(pcBaseAddress, importDescriptor, *pDirectory, requestedFunctionName, hintOrOrdinal, ppFunctionAddress)) + return true; + else if (!bPE32 && find_imported_function_pointer_helper(pcBaseAddress, importDescriptor, *pDirectory, requestedFunctionName, hintOrOrdinal, ppFunctionAddress)) + return true; + } + + // Found nothing. + return false; +} + +void* utils::get_imported_function_pointer(HMODULE hModule, const char* pcszDllName, const char* pcszFunctionName, uint32_t hintOrOrdinal) { + if (void* ppImportTableItem{}; find_imported_function_pointer(GetModuleHandleW(nullptr), pcszDllName, pcszFunctionName, hintOrOrdinal, ppImportTableItem)) + return ppImportTableItem; + + throw std::runtime_error("Failed to find import for kernel32!OpenProcess."); +} + +std::shared_ptr utils::create_thunk(void* pfnFunction, void* pThis, uint64_t placeholderValue) { + const auto pcBaseFn = reinterpret_cast(pfnFunction); + auto sourceCode = std::vector(pcBaseFn, pcBaseFn + 256); + + size_t i = 0; + auto placeholderFound = false; + for (nmd_x86_instruction instruction{}; ; i += instruction.length) { + if (i == sourceCode.size() || !nmd_x86_decode(&sourceCode[i], sourceCode.size() - i, &instruction, NMD_X86_MODE_64, NMD_X86_DECODER_FLAGS_ALL)) { + sourceCode.insert(sourceCode.end(), &pcBaseFn[sourceCode.size()], &pcBaseFn[sourceCode.size() + 512]); + if (!nmd_x86_decode(&sourceCode[i], sourceCode.size() - i, &instruction, NMD_X86_MODE_64, NMD_X86_DECODER_FLAGS_ALL)) + throw std::runtime_error("Failed to find detour function"); + } + + if (instruction.opcode == 0xCC) + throw std::runtime_error("Failed to find detour function"); + + // msvc debugger related + if ((instruction.group & NMD_GROUP_CALL) && (instruction.imm_mask & NMD_X86_IMM_ANY)) + std::fill_n(&sourceCode[i], instruction.length, 0x90); + + if ((instruction.group & NMD_GROUP_JUMP) || (instruction.group & NMD_GROUP_RET)) { + sourceCode.resize(i + instruction.length); + break; + } + + if (instruction.opcode == 0xB8 // mov , + && (instruction.imm_mask & NMD_X86_IMM64) + && instruction.immediate == placeholderValue) { + *reinterpret_cast(&sourceCode[i + instruction.length - 8]) = pThis; + placeholderFound = true; + } + } + + if (!placeholderFound) + throw std::runtime_error("Failed to find detour function"); + + return allocate_executable_heap(std::span(sourceCode)); +} + +template<> +std::wstring utils::get_env(const wchar_t* pcwzName) { + std::wstring buf(GetEnvironmentVariableW(pcwzName, nullptr, 0) + 1, L'\0'); + buf.resize(GetEnvironmentVariableW(pcwzName, &buf[0], static_cast(buf.size()))); + return buf; +} + +template<> +std::string utils::get_env(const wchar_t* pcwzName) { + return unicode::convert(get_env(pcwzName)); +} + +template<> +bool utils::get_env(const wchar_t* pcwzName) { + auto env = get_env(pcwzName); + const auto trimmed = trim(std::wstring_view(env)); + for (auto& c : env) { + if (c < 255) + c = std::tolower(c); + } + return trimmed == L"1" + || trimmed == L"true" + || trimmed == L"t" + || trimmed == L"yes" + || trimmed == L"y"; +} + +bool utils::is_running_on_linux() { + if (get_env(L"XL_WINEONLINUX")) + return true; + HMODULE hntdll = GetModuleHandleW(L"ntdll.dll"); + if (!hntdll) + return true; + if (GetProcAddress(hntdll, "wine_get_version")) + return true; + if (GetProcAddress(hntdll, "wine_get_host_version")) + return true; + return false; +} + +std::filesystem::path utils::get_module_path(HMODULE hModule) { + std::wstring buf(MAX_PATH, L'\0'); + while (true) { + if (const auto res = GetModuleFileNameW(hModule, &buf[0], static_cast(buf.size())); !res) + throw std::runtime_error(std::format("GetModuleFileName failure: 0x{:X}", GetLastError())); + else if (res < buf.size()) { + buf.resize(res); + return buf; + } else + buf.resize(buf.size() * 2); + } +} diff --git a/Dalamud.Boot/utils.h b/Dalamud.Boot/utils.h new file mode 100644 index 000000000..9180e0c8e --- /dev/null +++ b/Dalamud.Boot/utils.h @@ -0,0 +1,155 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "unicode.h" + +namespace utils { + class signature_finder { + std::vector> m_ranges; + std::vector m_patterns; + + public: + signature_finder& look_in(const void* pFirst, size_t length); + signature_finder& look_in(const void* pFirst, const void* pLast); + signature_finder& look_in(HMODULE hModule, const char* sectionName); + + signature_finder& look_for(std::string_view pattern, std::string_view mask, char cExactMatch = 'x', char cWildcard = '.'); + signature_finder& look_for(std::string_view pattern, char wildcardMask); + signature_finder& look_for(std::string_view pattern); + signature_finder& look_for_hex(std::string_view pattern); + + template + signature_finder& look_for(char pattern[len]) { + static_assert(len == 5); + } + + struct result { + std::span Match; + size_t PatternIndex; + size_t MatchIndex; + size_t CaptureIndex; + }; + + std::vector find(size_t minCount, size_t maxCount, bool bErrorOnMoreThanMaximum) const; + + std::span find_one() const; + }; + + class memory_tenderizer { + std::span m_data; + std::vector m_regions; + + public: + memory_tenderizer(const void* pAddress, size_t length, DWORD dwNewProtect); + + template&& std::is_standard_layout_v>> + memory_tenderizer(const T& object, DWORD dwNewProtect) : memory_tenderizer(&object, sizeof T, dwNewProtect) {} + + template + memory_tenderizer(std::span s, DWORD dwNewProtect) : memory_tenderizer(&s[0], s.size(), dwNewProtect) {} + + ~memory_tenderizer(); + }; + + void* resolve_unconditional_jump_target(void* pfn); + + bool find_imported_function_pointer(HMODULE hModule, const char* pcszDllName, const char* pcszFunctionName, uint32_t hintOrOrdinal, void*& ppFunctionAddress); + + void* get_imported_function_pointer(HMODULE hModule, const char* pcszDllName, const char* pcszFunctionName, uint32_t hintOrOrdinal); + + template + TFn** get_imported_function_pointer(HMODULE hModule, const char* pcszDllName, const char* pcszFunctionName, uint32_t hintOrOrdinal) { + return reinterpret_cast(get_imported_function_pointer(hModule, pcszDllName, pcszFunctionName, hintOrOrdinal)); + } + + std::shared_ptr allocate_executable_heap(size_t len); + + template + std::shared_ptr allocate_executable_heap(std::span data) { + auto res = allocate_executable_heap(data.size_bytes()); + memcpy(res.get(), data.data(), data.size_bytes()); + return res; + } + + std::shared_ptr create_thunk(void* pfnFunction, void* pThis, uint64_t placeholderValue); + + template + class thunk; + + template + class thunk { + using TFn = TReturn(TArgs...); + + static constexpr uint64_t Placeholder = 0xCC90CC90CC90CC90ULL; + + const std::shared_ptr m_pThunk; + std::function m_fnTarget; + + public: + thunk(std::function target) + : m_pThunk(utils::create_thunk(&detour_static, this, Placeholder)) + , m_fnTarget(std::move(target)) { + } + + void set_target(std::function detour) { + m_fnTarget = std::move(detour); + } + + TFn* get_thunk() const { + return reinterpret_cast(m_pThunk.get()); + } + + private: + // mark it as virtual to prevent compiler from inlining + virtual TReturn detour(TArgs... args) { + return m_fnTarget(std::forward(args)...); + } + + static TReturn detour_static(TArgs... args) { + const volatile auto pThis = reinterpret_cast*>(Placeholder); + return pThis->detour(args...); + } + }; + + template + std::basic_string_view trim(std::basic_string_view view, bool left = true, bool right = true) { + if (left) { + while (!view.empty() && (view.front() < 255 && std::isspace(view.front()))) + view = view.substr(1); + } + if (right) { + while (!view.empty() && (view.back() < 255 && std::isspace(view.back()))) + view = view.substr(0, view.size() - 1); + } + return view; + } + + template + T get_env(const wchar_t* pcwzName) { + static_assert(false); + } + + template<> + std::wstring get_env(const wchar_t* pcwzName); + + template<> + std::string get_env(const wchar_t* pcwzName); + + template<> + bool get_env(const wchar_t* pcwzName); + + template + T get_env(const char* pcszName) { + return get_env(unicode::convert(pcszName).c_str()); + } + + bool is_running_on_linux(); + + std::filesystem::path get_module_path(HMODULE hModule); +} diff --git a/Dalamud.Boot/xivfixes.cpp b/Dalamud.Boot/xivfixes.cpp new file mode 100644 index 000000000..0c29e7d10 --- /dev/null +++ b/Dalamud.Boot/xivfixes.cpp @@ -0,0 +1,132 @@ +#include "pch.h" + +#include "xivfixes.h" + +#include "hooks.h" +#include "logging.h" +#include "utils.h" + +using TFnGetInputDeviceManager = void* (); +static TFnGetInputDeviceManager* GetGetInputDeviceManager(HWND hwnd) { + static TFnGetInputDeviceManager* pCached = nullptr; + if (pCached) + return pCached; + + char szClassName[256]; + GetClassNameA(hwnd, szClassName, static_cast(sizeof szClassName)); + + WNDCLASSEXA wcx{}; + GetClassInfoExA(g_hGameInstance, szClassName, &wcx); + const auto match = utils::signature_finder() + .look_in(g_hGameInstance, ".text") + .look_for_hex("41 81 fe 19 02 00 00 0f 87 ?? ?? 00 00 0f 84 ?? ?? 00 00") + .find_one(); + + auto ptr = match.data() + match.size() + *reinterpret_cast(match.data() + match.size() - 4); + ptr += 4; // CMP RBX, 0x7 + ptr += 2; // JNZ + ptr += 7; // MOV RCX, + ptr += 3; // TEST RCX, RCX + ptr += 2; // JZ + ptr += 5; // CALL + ptr += *reinterpret_cast(ptr - 4); + + return pCached = reinterpret_cast(ptr); +} + +void xivfixes::prevent_devicechange_crashes(bool bApply) { + static const char* LogTag = "[xivfixes:prevent_devicechange_crashes]"; + static std::optional> s_hookCreateWindowExA; + static std::optional s_hookWndProc; + + if (bApply) { + s_hookCreateWindowExA.emplace("user32.dll", "CreateWindowExA", 0); + s_hookCreateWindowExA->set_detour([](DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)->HWND { + const auto hWnd = s_hookCreateWindowExA->call_original(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + + if (!hWnd + || hInstance != g_hGameInstance + || 0 != strcmp(lpClassName, "FFXIVGAME")) + return hWnd; + + logging::print("{} CreateWindow(0x{:08X}, \"{}\", \"{}\", 0x{:08X}, {}, {}, {}, {}, 0x{:X}, 0x{:X}, 0x{:X}, 0x{:X}) called; unhooking CreateWindowExA and hooking WndProc.", + LogTag, dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, reinterpret_cast(hWndParent), reinterpret_cast(hMenu), reinterpret_cast(hInstance), reinterpret_cast(lpParam)); + + s_hookCreateWindowExA.reset(); + + s_hookWndProc.emplace(hWnd); + s_hookWndProc->set_detour([](HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -> LRESULT { + if (uMsg == WM_DEVICECHANGE && wParam == DBT_DEVNODES_CHANGED) { + if (!GetGetInputDeviceManager(hWnd)()) { + logging::print("{} WndProc(0x{:X}, WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, {}) called but the game does not have InputDeviceManager initialized; doing nothing.", LogTag, reinterpret_cast(hWnd), lParam); + return 0; + } + } + + return s_hookWndProc->call_original(hWnd, uMsg, wParam, lParam); + }); + + return hWnd; + }); + + } else { + logging::print("{} Disable", LogTag); + + s_hookCreateWindowExA.reset(); + + // This will effectively revert any other WndProc alterations, including Dalamud. + s_hookWndProc.reset(); + } +} + +void xivfixes::disable_game_openprocess_access_check(bool bApply) { + static const char* LogTag = "[xivfixes:disable_game_openprocess_access_check]"; + static std::optional> hook; + + if (bApply) { + hook.emplace("kernel32.dll", "OpenProcess", 0); + hook->set_detour([](DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)->HANDLE { + if (dwProcessId == GetCurrentProcessId()) { + logging::print("{} OpenProcess(0{:08X}, {}, {}) was invoked by thread {}.", LogTag, dwDesiredAccess, bInheritHandle, dwProcessId, GetCurrentThreadId()); + + // Prevent game from feeling unsafe that it restarts + if (dwDesiredAccess & PROCESS_VM_WRITE) { + logging::print("{} Returning failure with last error code set to ERROR_ACCESS_DENIED(5).", LogTag); + SetLastError(ERROR_ACCESS_DENIED); + return {}; + } + } + + return hook->call_original(dwDesiredAccess, bInheritHandle, dwProcessId); + }); + + } else { + logging::print("{} Disable", LogTag); + hook.reset(); + } +} + +void xivfixes::redirect_openprocess(bool bApply) { + static const char* LogTag = "[xivfixes:redirect_openprocess]"; + static std::optional> hook; + + if (bApply) { + logging::print("{} Enable", LogTag); + hook.emplace(::OpenProcess); + hook->set_detour([](DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)->HANDLE { + if (dwProcessId == GetCurrentProcessId()) { + logging::print("{} OpenProcess(0{:08X}, {}, {}) was invoked by thread {}. Redirecting to DuplicateHandle.", LogTag, dwDesiredAccess, bInheritHandle, dwProcessId, GetCurrentThreadId()); + + if (HANDLE res; DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &res, dwDesiredAccess, bInheritHandle, 0)) + return res; + + return {}; + } + return hook->call_original(dwDesiredAccess, bInheritHandle, dwProcessId); + }); + + } else { + logging::print("{} Disable", LogTag); + hook.reset(); + } +} diff --git a/Dalamud.Boot/xivfixes.h b/Dalamud.Boot/xivfixes.h new file mode 100644 index 000000000..ff617bee8 --- /dev/null +++ b/Dalamud.Boot/xivfixes.h @@ -0,0 +1,13 @@ +#pragma once + +namespace xivfixes { + void prevent_devicechange_crashes(bool bApply); + void disable_game_openprocess_access_check(bool bApply); + void redirect_openprocess(bool bApply); + + inline void apply_all(bool bApply) { + prevent_devicechange_crashes(bApply); + disable_game_openprocess_access_check(bApply); + redirect_openprocess(bApply); + } +} diff --git a/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj b/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj index ecd572daf..a553f5ef7 100644 --- a/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj +++ b/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj @@ -88,16 +88,20 @@ + + + + - + diff --git a/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj.filters b/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj.filters index 75b1bf84e..8f4372d89 100644 --- a/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj.filters +++ b/Dalamud.Injector.Boot/Dalamud.Injector.Boot.vcxproj.filters @@ -34,11 +34,14 @@ Source Files + + Source Files + + + Source Files + - - Header Files - Header Files @@ -51,5 +54,14 @@ Header Files + + Header Files + + + Header Files + + + Header Files + \ No newline at end of file diff --git a/Dalamud.Injector.Boot/main.cpp b/Dalamud.Injector.Boot/main.cpp index cf5a95b5c..49c020093 100644 --- a/Dalamud.Injector.Boot/main.cpp +++ b/Dalamud.Injector.Boot/main.cpp @@ -3,12 +3,14 @@ #include #include #include +#include "..\Dalamud.Boot\logging.h" #include "..\lib\CoreCLR\CoreCLR.h" #include "..\lib\CoreCLR\boot.h" int wmain(int argc, wchar_t** argv) { - printf("Dalamud.Injector, (c) 2021 XIVLauncher Contributors\nBuilt at: %s@%s\n\n", __DATE__, __TIME__); + logging::print("Dalamud Injector, (c) 2021 XIVLauncher Contributors"); + logging::print("Built at : " __DATE__ "@" __TIME__); wchar_t _module_path[MAX_PATH]; GetModuleFileNameW(NULL, _module_path, sizeof _module_path / 2); @@ -35,9 +37,9 @@ int wmain(int argc, wchar_t** argv) typedef void (CORECLR_DELEGATE_CALLTYPE* custom_component_entry_point_fn)(int, wchar_t**); custom_component_entry_point_fn entrypoint_fn = reinterpret_cast(entrypoint_vfn); - printf("Running Dalamud Injector...\n"); + logging::print("Running Dalamud Injector..."); entrypoint_fn(argc, argv); - printf("Done!\n"); + logging::print("Done!"); return 0; } diff --git a/Dalamud.Injector.Boot/pch.h b/Dalamud.Injector.Boot/pch.h new file mode 100644 index 000000000..6f70f09be --- /dev/null +++ b/Dalamud.Injector.Boot/pch.h @@ -0,0 +1 @@ +#pragma once diff --git a/Dalamud.Injector/EntryPoint.cs b/Dalamud.Injector/EntryPoint.cs index 4bbdad68b..411509110 100644 --- a/Dalamud.Injector/EntryPoint.cs +++ b/Dalamud.Injector/EntryPoint.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; @@ -324,7 +325,7 @@ namespace Dalamud.Injector Console.WriteLine("{0} help [command]", exeName); if (particularCommand is null or "inject") - Console.WriteLine("{0} inject [-h/--help] [-a/--all] [--warn] [pid1] [pid2] [pid3] ...", exeName); + Console.WriteLine("{0} inject [-h/--help] [-a/--all] [--warn] [--fix-acl] [--se-debug-privilege] [pid1] [pid2] [pid3] ...", exeName); if (particularCommand is null or "launch") { @@ -332,7 +333,7 @@ namespace Dalamud.Injector Console.WriteLine("{0} [-g path/to/ffxiv_dx11.exe] [--game=path/to/ffxiv_dx11.exe]", exeSpaces); Console.WriteLine("{0} [-m entrypoint|inject] [--mode=entrypoint|inject]", exeSpaces); Console.WriteLine("{0} [--handle-owner=inherited-handle-value]", exeSpaces); - Console.WriteLine("{0} [--without-dalamud]", exeSpaces); + Console.WriteLine("{0} [--without-dalamud] [--no-fix-acl]", exeSpaces); Console.WriteLine("{0} [-- game_arg1=value1 game_arg2=value2 ...]", exeSpaces); } @@ -351,6 +352,8 @@ namespace Dalamud.Injector var targetProcessSpecified = false; var warnManualInjection = false; var showHelp = args.Count <= 2; + var tryFixAcl = false; + var tryClaimSeDebugPrivilege = false; for (var i = 2; i < args.Count; i++) { @@ -378,6 +381,14 @@ namespace Dalamud.Injector targetProcessSpecified = true; processes.AddRange(Process.GetProcessesByName("ffxiv_dx11")); } + else if (args[i] == "--fix-acl" || args[i] == "--acl-fix") + { + tryFixAcl = true; + } + else if (args[i] == "--se-debug-privilege") + { + tryClaimSeDebugPrivilege = true; + } else if (args[i] == "--warn") { warnManualInjection = true; @@ -416,8 +427,21 @@ namespace Dalamud.Injector } } + if (tryClaimSeDebugPrivilege) + { + try + { + NativeAclFix.ClaimSeDebug(); + Log.Information("SeDebugPrivilege claimed."); + } + catch (Win32Exception e2) + { + Log.Warning(e2, "Failed to claim SeDebugPrivilege"); + } + } + foreach (var process in processes) - Inject(process, AdjustStartInfo(dalamudStartInfo, process.MainModule.FileName)); + Inject(process, AdjustStartInfo(dalamudStartInfo, process.MainModule.FileName), tryFixAcl); return 0; } @@ -431,6 +455,7 @@ namespace Dalamud.Injector var showHelp = args.Count <= 2; var handleOwner = IntPtr.Zero; var withoutDalamud = false; + var noFixAcl = false; var parsingGameArgument = false; for (var i = 2; i < args.Count; i++) @@ -447,6 +472,8 @@ namespace Dalamud.Injector useFakeArguments = true; else if (args[i] == "--without-dalamud") withoutDalamud = true; + else if (args[i] == "--no-fix-acl" || args[i] == "--no-acl-fix") + noFixAcl = true; else if (args[i] == "-g") gamePath = args[++i]; else if (args[i].StartsWith("--game=")) @@ -547,7 +574,7 @@ namespace Dalamud.Injector } var gameArgumentString = string.Join(" ", gameArguments.Select(x => EncodeParameterArgument(x))); - var process = NativeAclFix.LaunchGame(Path.GetDirectoryName(gamePath), gamePath, gameArgumentString, (Process p) => + var process = NativeAclFix.LaunchGame(Path.GetDirectoryName(gamePath), gamePath, gameArgumentString, noFixAcl, (Process p) => { if (!withoutDalamud && mode == "entrypoint") { @@ -565,7 +592,7 @@ namespace Dalamud.Injector { var startInfo = AdjustStartInfo(dalamudStartInfo, gamePath); Log.Information("Using start info: {0}", JsonConvert.SerializeObject(startInfo)); - Inject(process, startInfo); + Inject(process, startInfo, false); } var processHandleForOwner = IntPtr.Zero; @@ -647,8 +674,20 @@ namespace Dalamud.Injector }; } - private static void Inject(Process process, DalamudStartInfo startInfo) + private static void Inject(Process process, DalamudStartInfo startInfo, bool tryFixAcl = false) { + if (tryFixAcl) + { + try + { + NativeAclFix.CopyAclFromSelfToTargetProcess(process.SafeHandle.DangerousGetHandle()); + } + catch (Win32Exception e1) + { + Log.Warning(e1, "Failed to copy ACL"); + } + } + var bootName = "Dalamud.Boot.dll"; var bootPath = Path.GetFullPath(bootName); diff --git a/Dalamud.Injector/NativeAclFix.cs b/Dalamud.Injector/NativeAclFix.cs index f79c05756..89041ba1e 100644 --- a/Dalamud.Injector/NativeAclFix.cs +++ b/Dalamud.Injector/NativeAclFix.cs @@ -22,41 +22,46 @@ namespace Dalamud.Injector /// The working directory. /// The path to the executable file. /// Arguments to pass to the executable file. + /// Don't actually fix the ACL. /// Action to execute before the process is started. /// The started process. /// Thrown when a win32 error occurs. /// Thrown when the process did not start correctly. - public static Process LaunchGame(string workingDir, string exePath, string arguments, Action beforeResume) + public static Process LaunchGame(string workingDir, string exePath, string arguments, bool dontFixAcl, Action beforeResume) { Process process = null; - - var userName = Environment.UserName; - - var pExplicitAccess = default(PInvoke.EXPLICIT_ACCESS); - PInvoke.BuildExplicitAccessWithName( - ref pExplicitAccess, - userName, - PInvoke.STANDARD_RIGHTS_ALL | PInvoke.SPECIFIC_RIGHTS_ALL & ~PInvoke.PROCESS_VM_WRITE, - PInvoke.GRANT_ACCESS, - 0); - - if (PInvoke.SetEntriesInAcl(1, ref pExplicitAccess, IntPtr.Zero, out var newAcl) != 0) + + var psecDesc = IntPtr.Zero; + if (!dontFixAcl) { - throw new Win32Exception(Marshal.GetLastWin32Error()); - } + var userName = Environment.UserName; - if (!PInvoke.InitializeSecurityDescriptor(out var secDesc, PInvoke.SECURITY_DESCRIPTOR_REVISION)) - { - throw new Win32Exception(Marshal.GetLastWin32Error()); - } + var pExplicitAccess = default(PInvoke.EXPLICIT_ACCESS); + PInvoke.BuildExplicitAccessWithName( + ref pExplicitAccess, + userName, + PInvoke.STANDARD_RIGHTS_ALL | PInvoke.SPECIFIC_RIGHTS_ALL & ~PInvoke.PROCESS_VM_WRITE, + PInvoke.GRANT_ACCESS, + 0); - if (!PInvoke.SetSecurityDescriptorDacl(ref secDesc, true, newAcl, false)) - { - throw new Win32Exception(Marshal.GetLastWin32Error()); - } + if (PInvoke.SetEntriesInAcl(1, ref pExplicitAccess, IntPtr.Zero, out var newAcl) != 0) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } - var psecDesc = Marshal.AllocHGlobal(Marshal.SizeOf()); - Marshal.StructureToPtr(secDesc, psecDesc, true); + if (!PInvoke.InitializeSecurityDescriptor(out var secDesc, PInvoke.SECURITY_DESCRIPTOR_REVISION)) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + if (!PInvoke.SetSecurityDescriptorDacl(ref secDesc, true, newAcl, false)) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + psecDesc = Marshal.AllocHGlobal(Marshal.SizeOf()); + Marshal.StructureToPtr(secDesc, psecDesc, true); + } var lpProcessInformation = default(PInvoke.PROCESS_INFORMATION); try @@ -109,7 +114,8 @@ namespace Dalamud.Injector Environment.SetEnvironmentVariable("__COMPAT_LAYER", compatLayerPrev); } - DisableSeDebug(lpProcessInformation.hProcess); + if (!dontFixAcl) + DisableSeDebug(lpProcessInformation.hProcess); process = new ExistingProcess(lpProcessInformation.hProcess); @@ -133,30 +139,8 @@ namespace Dalamud.Injector throw new GameExitedException(); } - if (PInvoke.GetSecurityInfo( - PInvoke.GetCurrentProcess(), - PInvoke.SE_OBJECT_TYPE.SE_KERNEL_OBJECT, - PInvoke.SECURITY_INFORMATION.DACL_SECURITY_INFORMATION, - IntPtr.Zero, - IntPtr.Zero, - out var pACL, - IntPtr.Zero, - IntPtr.Zero) != 0) - { - throw new Win32Exception(Marshal.GetLastWin32Error()); - } - - if (PInvoke.SetSecurityInfo( - lpProcessInformation.hProcess, - PInvoke.SE_OBJECT_TYPE.SE_KERNEL_OBJECT, - PInvoke.SECURITY_INFORMATION.DACL_SECURITY_INFORMATION | PInvoke.SECURITY_INFORMATION.UNPROTECTED_DACL_SECURITY_INFORMATION, - IntPtr.Zero, - IntPtr.Zero, - pACL, - IntPtr.Zero) != 0) - { - throw new Win32Exception(Marshal.GetLastWin32Error()); - } + if (!dontFixAcl) + CopyAclFromSelfToTargetProcess(lpProcessInformation.hProcess); } catch (Exception ex) { @@ -175,13 +159,91 @@ namespace Dalamud.Injector } finally { - Marshal.FreeHGlobal(psecDesc); + if (psecDesc != IntPtr.Zero) + Marshal.FreeHGlobal(psecDesc); PInvoke.CloseHandle(lpProcessInformation.hThread); } return process; } + /// + /// Copies ACL of current process to the target process. + /// + /// Native handle to the target process. + /// Thrown when a win32 error occurs. + public static void CopyAclFromSelfToTargetProcess(IntPtr hProcess) + { + if (PInvoke.GetSecurityInfo( + PInvoke.GetCurrentProcess(), + PInvoke.SE_OBJECT_TYPE.SE_KERNEL_OBJECT, + PInvoke.SECURITY_INFORMATION.DACL_SECURITY_INFORMATION, + IntPtr.Zero, + IntPtr.Zero, + out var pACL, + IntPtr.Zero, + IntPtr.Zero) != 0) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + if (PInvoke.SetSecurityInfo( + hProcess, + PInvoke.SE_OBJECT_TYPE.SE_KERNEL_OBJECT, + PInvoke.SECURITY_INFORMATION.DACL_SECURITY_INFORMATION | PInvoke.SECURITY_INFORMATION.UNPROTECTED_DACL_SECURITY_INFORMATION, + IntPtr.Zero, + IntPtr.Zero, + pACL, + IntPtr.Zero) != 0) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } + } + + public static void ClaimSeDebug() + { + var hToken = PInvoke.INVALID_HANDLE_VALUE; + try + { + if (!PInvoke.OpenThreadToken(PInvoke.GetCurrentThread(), PInvoke.TOKEN_QUERY | PInvoke.TOKEN_ADJUST_PRIVILEGES, false, out hToken)) + { + if (Marshal.GetLastWin32Error() != PInvoke.ERROR_NO_TOKEN) + throw new Exception("ClaimSeDebug.OpenProcessToken#1", new Win32Exception(Marshal.GetLastWin32Error())); + + if (!PInvoke.ImpersonateSelf(PInvoke.SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation)) + throw new Exception("ClaimSeDebug.ImpersonateSelf", new Win32Exception(Marshal.GetLastWin32Error())); + + if (!PInvoke.OpenThreadToken(PInvoke.GetCurrentThread(), PInvoke.TOKEN_QUERY | PInvoke.TOKEN_ADJUST_PRIVILEGES, false, out hToken)) + throw new Exception("ClaimSeDebug.OpenProcessToken#2", new Win32Exception(Marshal.GetLastWin32Error())); + } + + var luidDebugPrivilege = default(PInvoke.LUID); + if (!PInvoke.LookupPrivilegeValue(null, PInvoke.SE_DEBUG_NAME, ref luidDebugPrivilege)) + throw new Exception("ClaimSeDebug.LookupPrivilegeValue", new Win32Exception(Marshal.GetLastWin32Error())); + + var tpLookup = new PInvoke.TOKEN_PRIVILEGES() + { + PrivilegeCount = 1, + Privileges = new PInvoke.LUID_AND_ATTRIBUTES[1] + { + new PInvoke.LUID_AND_ATTRIBUTES() + { + Luid = luidDebugPrivilege, + Attributes = PInvoke.SE_PRIVILEGE_ENABLED, + }, + }, + }; + + if (!PInvoke.AdjustTokenPrivileges(hToken, false, ref tpLookup, 0, IntPtr.Zero, IntPtr.Zero)) + throw new Exception("ClaimSeDebug.AdjustTokenPrivileges", new Win32Exception(Marshal.GetLastWin32Error())); + } + finally + { + if (hToken != PInvoke.INVALID_HANDLE_VALUE && hToken != IntPtr.Zero) + PInvoke.CloseHandle(hToken); + } + } + private static void DisableSeDebug(IntPtr processHandle) { if (!PInvoke.OpenProcessToken(processHandle, PInvoke.TOKEN_QUERY | PInvoke.TOKEN_ADJUST_PRIVILEGES, out var tokenHandle)) @@ -190,7 +252,7 @@ namespace Dalamud.Injector } var luidDebugPrivilege = default(PInvoke.LUID); - if (!PInvoke.LookupPrivilegeValue(null, "SeDebugPrivilege", ref luidDebugPrivilege)) + if (!PInvoke.LookupPrivilegeValue(null, PInvoke.SE_DEBUG_NAME, ref luidDebugPrivilege)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } @@ -222,7 +284,7 @@ namespace Dalamud.Injector tokenPrivileges.Privileges[0].Luid = luidDebugPrivilege; tokenPrivileges.Privileges[0].Attributes = PInvoke.SE_PRIVILEGE_REMOVED; - if (!PInvoke.AdjustTokenPrivileges(tokenHandle, false, ref tokenPrivileges, 0, IntPtr.Zero, 0)) + if (!PInvoke.AdjustTokenPrivileges(tokenHandle, false, ref tokenPrivileges, 0, IntPtr.Zero, IntPtr.Zero)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } @@ -271,6 +333,10 @@ namespace Dalamud.Injector private static class PInvoke { #region Constants + public static readonly IntPtr INVALID_HANDLE_VALUE = new(-1); + + public const string SE_DEBUG_NAME = "SeDebugPrivilege"; + public const UInt32 STANDARD_RIGHTS_ALL = 0x001F0000; public const UInt32 SPECIFIC_RIGHTS_ALL = 0x0000FFFF; public const UInt32 PROCESS_VM_WRITE = 0x0020; @@ -289,6 +355,8 @@ namespace Dalamud.Injector public const UInt32 SE_PRIVILEGE_ENABLED = 0x00000002; public const UInt32 SE_PRIVILEGE_REMOVED = 0x00000004; + public const UInt32 ERROR_NO_TOKEN = 0x000003F0; + public enum MULTIPLE_TRUSTEE_OPERATION { NO_MULTIPLE_TRUSTEE, @@ -345,6 +413,14 @@ namespace Dalamud.Injector UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000, PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000, } + + public enum SECURITY_IMPERSONATION_LEVEL + { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation + } #endregion #region Methods @@ -395,12 +471,24 @@ namespace Dalamud.Injector [DllImport("kernel32.dll", SetLastError = true)] public static extern uint ResumeThread(IntPtr hThread); + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool ImpersonateSelf( + SECURITY_IMPERSONATION_LEVEL impersonationLevel + ); + [DllImport("advapi32.dll", SetLastError = true)] public static extern bool OpenProcessToken( IntPtr processHandle, UInt32 desiredAccess, out IntPtr tokenHandle); + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool OpenThreadToken( + IntPtr ThreadHandle, + uint DesiredAccess, + bool OpenAsSelf, + out IntPtr TokenHandle); + [DllImport("advapi32.dll", SetLastError = true)] public static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref LUID lpLuid); @@ -415,9 +503,9 @@ namespace Dalamud.Injector IntPtr tokenHandle, bool disableAllPrivileges, ref TOKEN_PRIVILEGES newState, - UInt32 bufferLengthInBytes, + int cbPreviousState, IntPtr previousState, - UInt32 returnLengthInBytes); + IntPtr cbOutPreviousState); [DllImport("advapi32.dll", SetLastError = true)] public static extern uint GetSecurityInfo( @@ -443,6 +531,9 @@ namespace Dalamud.Injector [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr GetCurrentProcess(); + [DllImport("kernel32.dll", SetLastError = true)] + public static extern IntPtr GetCurrentThread(); + [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr hWndChildAfter, string className, IntPtr windowTitle); diff --git a/lib/CoreCLR/CoreCLR.cpp b/lib/CoreCLR/CoreCLR.cpp index 53288f94f..6e36443e2 100644 --- a/lib/CoreCLR/CoreCLR.cpp +++ b/lib/CoreCLR/CoreCLR.cpp @@ -5,6 +5,7 @@ #include #include #include "nethost/nethost.h" +#include "..\..\Dalamud.Boot\logging.h" CoreCLR::CoreCLR(void* calling_module) : m_calling_module(calling_module) @@ -82,7 +83,7 @@ int CoreCLR::load_runtime(const std::wstring& runtime_config_path, const struct // Success_HostAlreadyInitialized if (result == 1) { - printf("Success_HostAlreadyInitialized (0x1) "); + logging::print("Success_HostAlreadyInitialized (0x1)"); result = 0; } diff --git a/lib/CoreCLR/boot.cpp b/lib/CoreCLR/boot.cpp index 0ff9a00a0..74e488b2a 100644 --- a/lib/CoreCLR/boot.cpp +++ b/lib/CoreCLR/boot.cpp @@ -5,6 +5,7 @@ #include #include #include "CoreCLR.h" +#include "..\..\Dalamud.Boot\logging.h" FILE* g_CmdStream; void ConsoleSetup(const std::wstring console_name) @@ -16,6 +17,7 @@ void ConsoleSetup(const std::wstring console_name) freopen_s(&g_CmdStream, "CONOUT$", "w", stdout); freopen_s(&g_CmdStream, "CONOUT$", "w", stderr); freopen_s(&g_CmdStream, "CONIN$", "r", stdin); + SetConsoleOutputCP(CP_UTF8); } void ConsoleTeardown() @@ -61,7 +63,7 @@ int InitializeClrAndGetEntryPoint( if (result != 0) { - printf("Error: Unable to get RoamingAppData path (err=%d)\n", result); + logging::print("Unable to get RoamingAppData path (err={})", result); return result; } @@ -71,13 +73,13 @@ int InitializeClrAndGetEntryPoint( // =========================================================================== // - wprintf(L"with dotnet_path: %s\n", dotnet_path); - wprintf(L"with config_path: %s\n", runtimeconfig_path.c_str()); - wprintf(L"with module_path: %s\n", module_path.c_str()); + logging::print(L"with dotnet_path: %s", dotnet_path); + logging::print(L"with config_path: %s", runtimeconfig_path.c_str()); + logging::print(L"with module_path: %s", module_path.c_str()); if (!std::filesystem::exists(dotnet_path)) { - printf("Error: Unable to find .NET runtime path\n"); + logging::print("Error: Unable to find .NET runtime path"); return 1; } @@ -88,13 +90,13 @@ int InitializeClrAndGetEntryPoint( dotnet_path, }; - printf("Loading hostfxr... "); + logging::print("Loading hostfxr..."); if ((result = g_clr->load_hostfxr(&init_parameters)) != 0) { - printf("\nError: Failed to load the `hostfxr` library (err=0x%08x)\n", result); + logging::print("Failed to load the `hostfxr` library (err=0x{:08x})", result); return result; } - printf("Done!\n"); + logging::print("Done!"); // =========================================================================== // @@ -105,17 +107,17 @@ int InitializeClrAndGetEntryPoint( dotnet_path, }; - printf("Loading coreclr... "); + logging::print("Loading coreclr... "); if ((result = g_clr->load_runtime(runtimeconfig_path, &runtime_parameters)) != 0) { - printf("\nError: Failed to load coreclr (err=%d)\n", result); + logging::print("Failed to load coreclr (err={})", result); return result; } - printf("Done!\n"); + logging::print("Done!"); // =========================================================================== // - printf("Loading module... "); + logging::print("Loading module..."); if ((result = g_clr->load_assembly_and_get_function_pointer( module_path.c_str(), entrypoint_assembly_name.c_str(), @@ -123,10 +125,10 @@ int InitializeClrAndGetEntryPoint( entrypoint_delegate_type_name.c_str(), nullptr, entrypoint_fn)) != 0) { - printf("\nError: Failed to load module (err=%d)\n", result); + logging::print("Failed to load module (err={})", result); return result; } - printf("Done!\n"); + logging::print("Done!"); // =========================================================================== // diff --git a/lib/Nomade040-nmd b/lib/Nomade040-nmd new file mode 160000 index 000000000..33ac3b62c --- /dev/null +++ b/lib/Nomade040-nmd @@ -0,0 +1 @@ +Subproject commit 33ac3b62c7d1eb28ae6b71d4dd78aa133ef96488 diff --git a/lib/srell3_009/history_en.txt b/lib/srell3_009/history_en.txt new file mode 100644 index 000000000..edc391c4b --- /dev/null +++ b/lib/srell3_009/history_en.txt @@ -0,0 +1,484 @@ +20220511; version 3.009: + * Fixed an optimisation bug that caused /abcd|ab/ not to match "abc". + +20220504; version 3.008: + * Fixed the behaviour of [^\P{...}] when the icase flag is set, as it + behaved similarly to the one in v-mode that has been proposed in + TC39. + +20220429; version 3.007: + * Further modification to the counter mechanism. + +20220428; version 3.006: + * Modified the mechanism of the counter used for repetition. + * Re-removed the implementation of linear search for small character + classes. + +20220424; version 3.005: + * Fixed a bug that caused /(?<=$.*)/ not to match the end of "a" when + the multiline flag is set + * Preparations for \A, \z, (?m:) that have been proposed in TC39. + +20220420; version 3.004: + * Added a new optimisation for /A*B/ and /A+B/ where a character class + A overlaps a character or character class B, such as /[A-Za-z]+ing/, + /".*"/. + +20220416; version 3.003: + * Combined two optimisation functions into one. + * Reduced the amount of code for lookaround (lookahead and lookbehind) + assertions. + +20220416; version 3.002: + * Fixed a bug that caused regex_match or regex_search with the + match_continuous flag being set to fail when the entry point + selector introduced in version 3.000 was used internally. + +20211025; version 3.001: + * Removed the code for splitting counter as it seemed to be no effect + or to make performance a bit worse. + * Fixed potential bugs. + * Minor improvements. + +20211023; version 3.000: + * Updated srell_ucfdata2.hpp and srell_updata.hpp to support Unicode + 14.0.0. + * Updated unicode/updataout.cpp to support Unicode 14. (Support in + advance new script names that are expected to be available in RegExp + of ECMAScript 2022). + * Changed the type used to store a Unicode value when char32_t is not + available, from an "unsigned integer type with width of at least 21 + bits" to a "one of at least 32 bits". + * Changed the type used to store a repetition count or character class + number when char32_t is not available, from "unsigned int" to + "unsigned integer type of at least 32-bit width". + * Added overflow check in the function that translates digits into a + numeric value. For example, while up to the previous version + /a{0,4294967297}/ was treated as /a{0,1}/ because of overflow when + the unsigned int type is 32-bit width, SRELL now throws error_brace + in cases like this. + * Fixed a bug that caused /[^;]*^;?/ not to match the beginning of an + input string when the multiline flag is not set. + * Implemented a very simple and limited entry point selector. + +20211004; version 2.930: + * Added new typedefs whose prefix is u1632w- and support UTF-16 or + UTF-32 depending on the value of WCHAR_MAX. (When 0xFFFF <= + WCHAR_MAX < 0x10FFFF, u1632w- types are aliases of u16w- types. + When 0x10FFFF <= WCHAR_MAX, u1632w- types are aliases of u32w- + types). + * Reduced the amount of memory used for Eytzinger layout search. + * Various improvements. (Some of them are based on suggestions to NIRE + by Marko Njezic). + +20210624; version 2.920: + * Added a new optimisation for the quantifier '?' (I.e., {0,1}). + * Changed the version number of the ECMAScript specification + referenced in misc/sample01.cpp to 2021. + +20210429; version 2.912: + * Fixed another bug in the optimisation introduced in version 2.900, + which caused /aa|a|aa/ not to match "a" (Thanks to Jan Schrötter for + the report). + Incidentally, this optimisation can be disabled by defining + SRELLDBG_NO_BRANCH_OPT2 prior to including srell.hpp. + +20210424; version 2.911: + * Fixed a bug in the optimisation introduced in version 2.900, which + caused /abc|ab|ac/ not to match "ac". (Thanks for the bug report [As + my email to the reporter was rejected by the email server and + returned, it is unclear whether mentioning the name here is okay + with the reporter. So, I refrain]). + +20210407; version 2.910: + * Fixed a potential memory leak in move assignment operators used by + the pattern compiler since 2.900. (Thanks to Michal Švec for the + report). + +20210214; version 2.901: + * Removed redundant template specialisations. + +20210214; version 2.900: + * Added a new optimisation for the alternative expression that consist + of string literals, such as /abc|abd|acde/. + * Fixed the problem that brought u(8|16)[cs]regex_(token_)?iterator + (i.e., regex (token) iterators specialised for char8_t or char16_t) + to a compile error. + * Minor improvements. + +20210131; version 2.810: + * Improved internal UTF-8 iterators. + +20200724; version 2.800: + * Introduced the Eytzinger layout for binary search in the character + class. + * Reimplemented linear search for small character classes. + * Modified handling of the property data used for parsing the name for + a named capturing group. Now they are loaded only when needed + instead of being loaded into an instance of basic_regex always. + +20200714; version 2.730: + * Added code to prevent redundant save and restore operations when + nested capturing round brackets are processed. + * Improved regex_iterator. + +20200703; version 2.720: + * Improved case-insensitive (icase) search using the + Boyer-Moore-Horspool algorithm for UTF-8 string that includes + non-ASCII characters or UTF-16 string that includes non-BMP + characters. + * Fixed a bug that caused regex_iterator->prefix().first to point to + the beginning of the subject string instead of the end of the + previous match (regression introduced in version 2.650, when + three-iterators overloads were added to regex_search()). + * In accordance with the fix above, when a three-iterators version of + regex_search() is called, now match_results.position() returns a + distance from the position passed to as the lookbehind limit (3rd + param of regex_search) and match_results.prefix().first points to + the position passed to as the beginning of the subject string (1st + param of regex_search). + * Fixed a bug that could cause a valid UTF-8 sequence being adjacent + to an invalid UTF-8 sequence to be skipped when the BMH algorithm + was used (regression introduced in version 2.630, when UTF-8 + handling was modified). + +20200701; version 2.710: + * Minor modifications to Boyer-Moore-Horspool search. + +20200630; version 2.700: + * Optimisation adjustments. + +20200620: version 2.651: + * Move the group name validity check to after parsing the \u escape. + * Updated misc/sample01.cpp to version 1.103. Changed the version + number of the ECMAScript specification referenced by to 2020 (ES11). + +20200618: version 2.650: + * To element access functions in match_results, added overload + functions for specifying the group name by a pointer. + * When a three-iterators version of regex_search() is used, SRELL now + sets match_results::prefix::first to the position passed to as the + lookbehind limit (third param) instead of the position passed to as + the beginning of the subject (first param). + * Removed some operations that seem to be redundant. + +20200601: version 2.643: + * Added "inline" to operators in syntax_option_type and + match_flag_type types, based on a report that it is needed not to + cause the multiple definition error. + * Minor improvements. + +20200530: version 2.642: + * Reduced the size of memory allocated by the basic_regex instance. + +20200528: version 2.641: + * The fix in 2.640 was incomplete. Fixed the optimisation bug 1 again. + * Optimisation adjustments. + +20200516: version 2.640: + * Fixed an optimisation bug 1: It was possible for regex_match to pass + the end of a subject string under certain conditions. + * Fixed an optimisation bug 2: ^ and $ were not given a chance to + match an appropriate position in some cases when the multiline flag + is set to true. + * Updated srell_ucfdata2.hpp and srell_updata.hpp. + +20200509: version 2.630: + * SRELL's pattern compiler no longer permits invalid UTF-8 sequences + in regular expressions. It throws regex_utf8. (Invalid UTF-8 + sequences in the subject string are not treated as an error.) + * Fixed BMH search functions not to include extra (invalid) UTF-8 + trailing bytes following the real matched substring, in a returned + result. + * Fixed minor issues: 1) basic_regex.flags() did not return the + correct value in some cases, 2) match_results.format() did not + replace $ with an empty string when any capturing group whose + name is NAME did not exist. + +20200502: version 2.620: + * Removed methods used for match_continuous and regex_match in the + class for the Boyer-Moore-Horspool algorithm. Now SRELL always uses + the automaton like earlier versions when they are processed. + * Some clean-ups. + +20200428: version 2.611: + * Fixed a bug that caused /\d*/ not to match the head of "abc" but to + match the end of it. (regression introduced in version 2.210.) + +20200426: version 2.610: + * Fixed a bug that caused case-insensitive (icase) BMH search to skip + a matched sequence at the beginning of the entire text, when 1) + search is done against UTF-8 or UTF-16 text, and 2) the searched + pattern ends with a character that consists of multiple code units + in that encoding. + * Now SRELL parses a capturing group name according to the ECMA + specification and strictly checks its validity. Group names like + /(?<,>...)/ cause regex_error. + +20200418: version 2.600: + * To pass to regex_search() directly the limit of a sequence until + where the automaton can lookbehind, added three-iterators versions + of regex_search(). + * [Breaking Change] Removed the match_lblim_avail flag from + match_flag_type and the lookbehind_limit member from match_results + which were added in version 2.300. + * Updated srell_ucfdata2.hpp and srell_updata.hpp to support Unicode + 13.0.0. + * Updated unicode/updataout.cpp to support Unicode 13. (Support in + advance new script names that will be available in RegExp of + ECMAScript 2020). + +20191118: version 2.500: + * Modified basic_regex to hold precomputed tables for icase matching, + instead of creating them from case folding data when its instance is + first created. + * In accordance with the change above, srell_ucfdata.hpp and + ucfdataout.cpp that outputs the former were replaced with + srell_ucfdata2.hpp that holds precomputed tables and ucfdataout2.cpp + that outputs the former. + * Changed the method of character class matching from linear search to + binary search. + * Changed the timing of optimisation of a character class from "when a + closing bracket ']' is found" to "every time a character or + character range is pushed to its character class array". + * Removed all asserts. + * Modified the pattern compiler to interpret sequential \uHHHH escapes + as a Unicode code point value if they represent a valid surrogate + pair. (By this change, incompatibilities with the ECMAScript + specification disappeared.) + * Fixed the position of an endif directive that caused a compiler + error when -DSRELL_NO_NAMEDCAPTURE is specified. + * Updated updataout.cpp to version 1.101. + * Added a standalone version of SRELL in the single-header directory. + +20190914: version 2.401: + * Reduced the size of basic_regex. (It was bloated by my carelessness + when support for Unicode property escapes was added). + * Improved basic_regex::swap(). + +20190907: version 2.400: + * Improved the performance of character class matching. + * Modified the pattern compiler to interpret the \u escape sequence in + the group name in accordance with the ECMAScript specification. + * Updated ucfdataout.cpp to version 1.200. A new member has been added + to the unicode_casefolding class in srell_ucfdata.hpp that + ucfdataout.cpp generates. + Because SRELL 2.400 and later need this added member, they cannot be + used with srell_ucfdata.hpp output by ucfdataout.cpp version 1.101 + or earlier. (No problem in using an older version of SRELL with a + newer version of srell_ucfdata.hpp). + * Some clean-ups and improvements. + +20190902: version 2.304: + * Fixed regex_iterator that had been broken by the code clean-up in + version 2.303. + +20190810: version 2.303: + * Refixed the problem that was fixed in version 2.302 as the fix was + incomplete. + * Cleaned up code. + +20190809: version 2.302: + * Bug fix: When (?...) has a quantifier, strings captured by round + brackets inside it were not cleared in each repetition but carried + over to the next loop. For example, + /(?:(ab)|(cd))+/.exec("abcd") returned ["abcd", "ab", "cd"], instead + of ["abcd", undefined, "cd"]. (The latter is correct). + * Updated misc/sample01.cpp to version 1.102. Rewrote the chapter + numbers in accordance with ECMAScript 2019 (ES10). + +20190724: version 2.301: + * In accordance with the ECMAScript spec, restricted the characters + which can be escaped by '\', to the following fifteen characters: + ^$\.*+?()[]{}|/ + Only in the character class, i.e., inside [], '-' also becomes a + member of the group. + +20190717: version 2.300: + * Added a feature for specifying the limit until where the automaton + can lookbehind, separated from the beginning of a target sequence. + (Addition of the match_lblim_avail flag to match_flag_type and the + lookbehind_limit member to match_results). + And, lookbehind_limit of match_results being private and used + internally in regex_iterator is also set in its constructor. + * Removed order restriction of capturing parentheses and + backreferences, in accordance with the ECMAScript spec. Now /\1(.)/, + /(?<=(.)\1)/, and /\k(?.)/ are all okay. + * Updated misc/sample01.cpp to version 1.101. Added one compliance + test from misc.js. + +20190714: version 2.230: + * Improved the performance of searching when regular expressions begin + with a character or character class followed by a '*' or '+'. (E.g., + /[A-Za-z]+ing/). + +20190707: version 2.221: + * Changed the feature test macro used for checking availability of + std::u8string, from __cpp_char8_t to __cpp_lib_char8_t. + * When icase specified, if all characters in a character class become + the same character as a result of case-folding, the pattern compiler + has been changed to convert the character class to the character + literal (e.g., /r[Ss\u017F]t/i -> /rst/i). + * Fixed a minor issue. + +20190617: version 2.220: + * Changed the internal representation of repetition in the case that + it becomes more compact by not using the counter. + * Fixed an optimisation bug that caused searching for /a{1,2}?b/ + against "aab" to return "ab" instead of "aab". (Condition: a + character or character class with a non-greedy quantifier is + followed by its exclusive character or character class). + +20190613: version 2.210: + * Improved a method of matching for expressions like /ab|cd|ef/ (where + string literals separaterd by '|' begin with a character exclusive + to each other). + +20190603: version 2.202: + * Fixed a bug that caused regex_match to behave like regex_search in + the situation where the BMH algorithm is used. + +20190531: version 2.200: + * For searching with a ordinary (non-regex) string, added an + implementation based on the Boyer-Moore-Horspool algorithm. + * Improved UTF-8 iterators. + * Fixed behaviours of \b and \B when icase specified, to match /.\B./i + against "s\u017F". + * Fixed minor issues. + +20190508: version 2.100: + * Fixed a bug that caused failure of capturing when 1) a pair of + capturing brackets exists in a lookbehind assertion, and 2) variable + length expressions exist in both the left side of and the inside of + the pair of brackets. E.g., given "1053" =~ /(?<=(\d+)(\d+))$/, no + appropriate string was set for $2. + * Updated srell_ucfdata.hpp and srell_updata.hpp to support Unicode + 12.1.0. + * Updated unicode/updataout.cpp to support Unicode 12. (Support in + advance a new binary property and new script names that will be + available in RegExp of ECMAScript 2019 and new script names that are + anticipated to be available in RegExp of ECMAScript 2020). + * Changed the newline character in srell.hpp from CR+LF to LF. + * Modified unicode/*.cpp to output LF as a newline instead of CR+LF. + * Updated misc/sample01.cpp to version 1.100: + 1. Rewrote the chapter numbers in subtitles of compliance tests, in + accordance with ECMAScript 2018 Language Specification (ES9). + (The old chapter numbers were based on ECMAScript specifications + up to version 5.1). + 2. Added one compliance test from ECMAScript 2018 Language + Specification 21.2.2.3, NOTE. + * Modified the macros for detecting C++11 features. + * Changed the method of the character class. + * For all the constructors and assign functions of basic_regex to have + a default argument for flag_type, reimplemented syntax_option_type + and match_flag_type (missed changes between TR1 -> C++11). + * Experimental support for the char8_t type. If a compiler supports + char8_t (detected by the __cpp_char8_t macro), classes whose names + have the "u8-" prefix accept a sequence of char8_t and handle it as + a UTF-8 string. If char8_t is not supported, the classes handle a + sequence of char as a UTF-8 string, as before. + * As classes that always handle a sequence of char as a UTF-8 string, + new classes whose names have the "u8c-" prefix were added. They + correspond to the classes having the "u8-" prefix in their names up + to version 2.002: + * u8cregex; u8ccmatch, u8csmatch; u8ccsub_match, u8cssub_match; + u8ccregex_iterator, u8csregex_iterator; u8ccregex_token_iterator, + u8csregex_token_iterator. + +20180717: version 2.002: + * Changed the maximum number of hexdigits in \u{h...} from six to + 'unlimited' in accordance with the ECMAScript specification. ("one + to six hexadecimal digits" of the old implementation was based on + the proposal document). + * Updated updataout.cpp to version 1.001. Encounting unknown + (newly-encoded) script names is no longer treated as an error. + * Updated srell_ucfdata.hpp and srell_updata.hpp to support Unicode + 11.0.0. + +20180204: version 2.001: + * When icase is specified, [\W] (a character class containing \W) no + longer matches any of [KkSs\u017F\u212A] (ecma262 issue #512). + +20180127: version 2.000: + * Added the following features that are to be included into RegExp of + ECMAScript 2018: + * New syntax option flag for '.' to match every code point, dotall, + was added to srell::regex_constants as a value of + syntax_option_type and to srell::basic_regex as a value of + flag_type. + * New expressions to support the Unicode property, \p{...} and + \P{...}. + * Named capture groups (?...) and the new expression for + backreference to a named capture group, \k. + * The behaviors of lookbehind assertions changed. Now both (?<=...) + and (?" to compile() in basic_regex::assign(). + 2. Implemented operator=() functions explicitly instead of using + default ones generated automatically. + * unicode/ucfdataout.cpp revised and updated to version 1.001. + +20140622; version 1.101: + Updated srell_ucfdata.hpp to support Unicode 7.0.0. + +20121118; version 1.100: + The first released version. + diff --git a/lib/srell3_009/history_ja.txt b/lib/srell3_009/history_ja.txt new file mode 100644 index 000000000..1267b42af --- /dev/null +++ b/lib/srell3_009/history_ja.txt @@ -0,0 +1,421 @@ +20220511; version 3.009: + ・最適化バグにより /abcd|ab/ が "abc" にマッチしなかった問題を修正。 + +20220504; version 3.008: + ・icase指定時の[^\P{...}]の振る舞いが、TC39で提案中のv-modeのそれに近 + いものになっていた問題を修正。 + +20220429; version 3.007: + ・カウンタの仕組みをさらに変更。 + +20220428; version 3.006: + ・繰り返し処理用のカウンタを調整。 + ・小さな文字クラス用の線形探索を再削除。 + +20220424; version 3.005: + ・multiline指定時に /(?<=$.*)/ が "a" の終わりにマッチしなかった問題を + 修正。 + ・TC39で提案中の\A, \z, (?m:)の準備。 + +20220420; version 3.004: + ・'*' または '+' 付きの文字クラスが後続する文字または文字クラスと排他 + 的になっていない表現用の最適化処理を追加。例:/[A-Za-z]+ing/, + /".*"/ など。 + +20220416; version 3.003: + ・2つの最適化函数を1つに統合。 + ・先読み (lookahead)・戻り読み (lookbehind) 用のコード量を削減。 + +20220416; version 3.002: + ・3.000で導入した簡易エントリーポイント選択の使用時に、regex_matchや + match_continuousフラグが指定されたregex_searchが機能しない場合があっ + た問題を修正。 + +20211025; version 3.001: + ・カウンタ分割を廃止。効果がないかむしろ若干速度が低下しているように見 + えるため。 + ・潜在的なバグを修正。 + ・その他細かな改良など。 + +20211023; version 3.000: + ・srell_ucfdata2.hppとsrell_updata.hppとをUnicode 14.0.0対応に更新。 + ・unicode/updataout.cppをUnicode 14対応に更新(ECMAScript 2022で対応さ + れる見込みのスクリプト名の先行対応)。 + ・char32_t未対応のコンパイラでUnicode値を保持するため内部で使用する型 + を「21ビット以上あるunsigned整数型」から「32ビット以上あるunsigned整 + 数型」に変更。 + ・char32_t未対応のコンパイラで繰り返し回数や文字クラス番号を保持するの + に使う型を「unsigned int」から「32ビット以上あるunsigned整数型」に変 + 更。 + ・数値用パーザにoverflowチェックを追加。例:unsigned int型が32ビットの + 幅の時、前の版まで /a{0,4294967297}/ は /a{0,1}/ 相当になってしまっ + ていましたが、前記のチェックを入れたことによりこのような場合には + error_braceがthrowされるようになっています。 + ・非multilineモード時に /[^;]*^;?/ が入力文字列の先頭にマッチしなかっ + たバグを修正。 + ・ごく簡易なエントリーポイント選択を実装。 + +20211004; version 2.930: + ・WCHAR_MAXの値に基づいてUTF-16/UTF-32対応が切り替わるu1632w-型を新規 + に追加(WCHAR_MAXが0xFFFF以上・0x10FFFF未満ならu1632w-型はu16w-型の + 別名となり、WCHAR_MAXが0x10FFFF以上ならu1632w-型はu32w-型の別名とな + ります)。 + ・Eytzinger layout検索時に使われるメモリ使用量を削減。 + ・その他細かな改良など(いくつかはNIREに対するMarko Njezic氏の改善案に + 基づきます)。 + +20210624; version 2.920: + ・?({0,1}相当)用の最適化処理を追加。 + ・misc/sample01.cpp内で参照しているECMAScript仕様書の版を2021に変更。 + +20210429; version 2.912: + ・2.900で導入した最適化処理のバグにより /aa|a|aa/ が "a" にマッチしな + くなっていた問題を修正(報告してくださったJan Schrötter氏に感謝しま + す)。 + ちなみにこの最適化処理は、srell.hppをincludeする前に + SRELLDBG_NO_BRANCH_OPT2マクロを定義しておくと無効化できます。 + +20210424; version 2.911: + ・2.900で導入した最適化処理内の不用意な行削除が原因で、/abc|ab|ac/ が + "ac" に対してマッチしなくなっていた問題を修正(バグ報告に感謝します)。 + +20210407; version 2.910: + ・2.900以降、パターンコンパイラ内部でmove代入演算子が使われる時にメモ + リリークしていた問題を修正(報告してくださったMichal Švec氏に感謝し + ます)。 + +20210214; version 2.901: + ・不要なテンプレートの特殊化を削除。 + +20210214; version 2.900: + ・文字列のみからなる選択(例:/abc|abd|acde/)用の最適化処理を新規に追 + 加。 + ・u(8|16)[cs]regex_(token_)?iteratorがコンパイルエラーとなり使用できな + かった問題を修正。 + ・その他細かな改良など。 + +20210131; version 2.810: + ・UTF-8用内部iteratorの改良。 + +20200724; version 2.800: + ・文字クラスの二分探索にEytzinger layoutを導入。 + ・小さな文字クラス用に線形探索を再実装。 + ・名前付き括弧の名前部分をパーズするためのプロパティーデータの扱いを変 + 更。basic_regex型インスタンス内に読み込むのを止めて、必要な時のみ読 + み込むように。 + +20200714; version 2.730: + ・入れ子になった捕獲括弧で冗長な退避・復元処理をせぬように変更。 + ・regex_iteratorの改良。 + +20200703; version 2.720: + ・非ASCII文字を含むUTF-8文字列または非BMPの文字を含むUTF-16文字列を、 + Boyer-Moore-Horspoolアルゴリズムを用いて、大文字小文字の区別無しで + (icase/case-insensitiveで) 検索する場合の処理の改良。 + ・Version 2.650での変更により、regex_iterator->prefix().firstが前回マ + ッチした位置の終端ではなく文字列全体の最初を指すようにになってしまっ + ていたのを修正。 + ・上記修正に合わせて3イテレータ版のregex_search()が呼ばれる場合、 + match_results.position()は戻り読みの逆行限界として渡された位置 + (regex_searchの第3引数)を起点とした位置を返し、 + match_results.prefix().firstは検索開始位置(同第1引数)を指すように + 変更。 + ・BMH検索時に、不正なUTF-8シークウェンスの前後にある有効なシークウェン + スが読み飛ばされてしまう問題を修正(2.630でUTF-8の処理方法を変えた時 + に混入したバグ)。 + +20200701; version 2.710: + ・Boyer-Moore-Horspool検索の調整。 + +20200630; version 2.700: + ・最適化処理の調整。 + +20200620: version 2.651: + ・グループ名のチェックを行う位置を\uエスケープの解釈後に移動。 + ・misc/sample01.cppをversion 1.103に更新。参照しているECMAScript仕様書 + の版を2020(ES11)に変更。 + +20200618: version 2.650: + ・名前付き括弧に捕獲された文字列へのアクセス用函数に、グループ名をポイ + ンタで指定するoverloadをmatch_resultsに追加。 + ・3イテレータ版のregex_search()使用時には、検索の開始位置ではなく戻り + 読み (lookbehind) の逆行限界として渡された位置のほうを + match_results::prefix::firstにセットするよう変更。 + ・不要と思われる処理をいくつか削除。 + +20200601: version 2.643: + ・syntax_option_typeおよびmatch_flag_typeのoperator函数にinline指定を + 追加(これがないとリンク時に多重定義エラーが出ることがあるとのご指摘 + がありました)。 + ・その他細かな改良など。 + +20200530: version 2.642: + ・basic_regex型インスタンスが確保するメモリのサイズを削減。 + +20200528: version 2.641: + ・2.640での修正1が不完全であったため再修正。 + ・最適化処理の調整。 + +20200516: version 2.640: + ・最適化バグの修正1: regex_matchが入力文字列の終端を通り過ぎてしまうこ + とがあった問題を修正。 + ・最適化バグの修正2: multilineフラグ指定時に ^ や $ が適切な位置でのマ + ッチングをさせてもらえなくなってしまっていた問題を修正。 + ・srell_ucfdata2.hppとsrell_updata.hppとを更新。 + +20200509: version 2.630: + ・正規表現中に不正なUTF-8のシークウェンスがあった場合、パターンコンパ + イラがregex_utf8をthrowするように仕様変更(検索対象文字列中に不正な + UTF-8の並びがあってもエラー扱いされません)。 + ・UTF-8でBMH検索が行われる際、マッチした箇所の直後に余分な後続 + (trailing) バイトが続いていた場合にその部分もマッチング結果に含めて + しまう問題を修正。 + ・basic_regex.flags() が正しい値を返さないことがあったのを修正。 + ・正規表現中で実際には使われていないグループ名 (NAME) を + match_results.format()に渡す書式文字列の中で$のようにして指定 + すると、その部分が空文字に置換されずそのまま残ってしまう問題を修正。 + +20200502: version 2.620: + ・Boyer-Moore-Horspoolアルゴリズム用クラスからmatch_continuous指定時用 + およびregex_match用の函数を削除。これらの処理時は以前のようにオート + マトンを使うように変更。 + ・その他クリーンナップ。 + +20200428: version 2.611: + ・/\d*/ が "abc" の冒頭にマッチせず末尾にマッチする問題を修正(Version + 2.210で混入したバグ)。 + +20200426: version 2.610: + ・Case-insensitive (icase) なBMH検索が行われる際、探している文字列が検 + 索対象テキスト全体の先頭にあった場合に読み飛ばされてしまうことがある + バグを修正(UTF-8またはUTF-16で、検索文字列の末尾が複数のコードユニ + ットからなる文字である場合に発生)。 + ・キャプチャグループ名のパーズをECMAScriptの仕様書通りきっちり行うよう + に変更。これにより、前の版までは受理されていた /(?<,>...)/ のような + グループ名はregex_errorがthrowされるように。 + +20200418: version 2.600: + ・戻り読み (lookbehind) の逆行限界を直接regex_search()に渡せるように + 3イテレータ版のregex_search()を追加。 + ・[非互換変更] 2.300で導入したmatch_flag_typeのmatch_lblim_availフラグ + と、match_resultsのlookbehind_limitメンバとを廃止。 + ・srell_ucfdata2.hppとsrell_updata.hppとをUnicode 13.0.0対応に更新。 + ・unicode/updataout.cppをUnicode 13対応に更新(ECMAScript 2020で対応さ + れる見込みのスクリプト名の先行対応)。 + +20191118: version 2.500: + ・初めてbasic_regex型インスタンスが作られた時にcase foldingデータから + icaseマッチング用テーブルを展開するのに代えて、最初から計算済みテー + ブルを保持しているように仕様変更。 + ・上記変更に併せてsrell_ucfdata.hppおよびそれを出力するucfdataout.cpp + はお役御免とし、代わりに展開済みicase用テーブルを保持する + srell_ucfdata2.hppとそれを出力するucfdataout2.cppとを追加。 + ・文字クラスの照合方法を線形探索から二分探索に変更。 + ・文字クラスの最適化処理のタイミングを「']' が見つかった時にまとめて一 + 括」から「文字または文字コードの範囲をpushするたびごと逐次」に変更。 + ・assertをすべて削除。 + ・連続する\uHHHHがサロゲートペアをなしている場合はUnicode値として解釈 + するように変更(これによりECMAScript仕様との相違はなくなりました)。 + ・SRELL_NO_NAMEDCAPTUREマクロ使用時にコンパイルエラーが出ていたのを修 + 正。 + ・updataout.cppを1.101にヴァージョンアップ。 + ・単体版のsrellを追加(single-headerディレクトリ内)。 + +20190914: version 2.401: + ・basic_regex型インスタンスのサイズを削減(Unicode property escapes対 + 応時にうっかり膨張させてしまっていました)。 + ・basic_regex::swap()の改良。 + +20190907: version 2.400: + ・文字クラスの照合速度を改善。 + ・パターンコンパイル時にグループ名中の\uエスケープを解釈するように変更 + (ECMAScriptの仕様に準拠)。 + ・ucfdataout.cppを1.200にヴァージョンアップ。このプログラムが出力する + srell_ucfdata.hpp中のunicode_casefoldingクラスに、新たにメンバ変数が + 追加されました。 + SRELL 2.400以降はこの追加されたメンバ変数をコンパイル時に必要とする + ため、ucfdataout.cpp 1.101以前によって出力されたsrell_ucfdata.hppを + SRELL 2.400以降で使うことはできません(古いSRELLで新しい + srell_ucfdata.hppを使うことは可)。 + ・その他コードの整理や改良など。 + +20190902: version 2.304: + ・Version 2.303のコード整理で壊れてしまっていたregex_iteratorを修復。 + +20190810: version 2.303: + ・2.302の修正が不完全であったため再修正。 + ・その他コードの整理。 + +20190809: version 2.302: + ・(?...) に繰り返し指定がついている時、内側の括弧によって捕獲された文 + 字列がループごとにクリアされず持ち越されていたバグを修正。 + 例:/(?:(ab)|(cd))+/.exec("abcd") → 1番括弧はundefinedになるはずが + "ab"になってしまっていた。 + ・misc/sample01.cppをversion 1.102に更新。テスト名中の章番号を + ECMAScript 2019 (ES10) 準拠に変更 + +20190724: version 2.301: + ・ECMAScriptの仕様に準じて、\でエスケープ可能な文字の種類を次の15字に + 限定。^$\.*+?()[]{}|/ + 文字クラス内([]内)ではこの15字に加えて '-' も対象に。 + +20190717: version 2.300: + ・検索対象範囲とは別に、戻り読み (lookbehind) の逆行限界を指定できる機 + 能を追加(match_flag_typeへのmatch_lblim_availフラグの追加と + match_resultsへのlookbehind_limitメンバの追加)。 + これに併せてregex_iteratorのコンストラクタ内でも、内部で使うprivate + なmatch_results型インスタンスのlookbehind_limitメンバに値を設定する + ように変更。 + ・ECMAScriptの仕様に合わせて、後方参照が対応する捕獲括弧より先に出現し + てもエラー扱いせぬように変更。/\1(.)/, /(?<=(.)\1)/, /\k(?.)/ + などすべてOKに。 + ・misc/sample01.cppをversion 1.101に更新。misc.jsより準拠テストを1つ追 + 加。 + +20190714: version 2.230: + ・正規表現が '*' か '+' かを伴う文字または文字クラスで始まる場合の検索 + 速度を改善(例:/[A-Za-z]+ing/)。 + +20190707: version 2.221: + ・std::u8stringの利用可否は__cpp_char8_tではなく__cpp_lib_char8_tを用 + いて判断するように変更。 + ・icase指定時にcase-folding処理をした結果、文字クラス内の文字がすべて + 同じ文字になった場合には、文字クラスを解消して文字リテラルとして処理 + するように変更。例:/r[Ss\u017F]t/i → /rst/i。 + ・その他問題を修正。 + +20190617: version 2.220: + ・カウンタを使わぬほうが内部表現がコンパクトになる繰り返しはカウンタを + 使わぬように変更。 + ・最適化バグにより、/a{1,2}?b/.exec("aab") が "aab" ではなく "ab" を返 + していたのを修正(発生条件:最短一致優先の回数指定が付いている文字ま + たは文字クラスの後ろに、その文字集合と排他的な文字または文字クラスが + 続いている場合)。 + +20190613: version 2.210: + ・/ab|cd|ef/ のような表現('|' で区切られている文字列の先頭文字が互い + に排他的な場合)の照合方法を改良。 + +20190603: version 2.202: + ・BMHアルゴリズムが使われる状況で、regex_matchがregex_search相当の処理 + をしてしまうバグを修正。 + +20190531: version 2.200: + ・通常の(正規表現ではない)テキスト検索用に、Boyer-Moore-Horspoolアル + ゴリズムに基づく実装を追加。 + ・UTF-8用iteratorの改良。 + ・icase指定時の\b/\Bの挙動を修正。/.\B./i が "s\u017F" にマッチするよ + うに。 + ・その他問題を修正。 + +20190508: version 2.100: + ・Lookbehind中に文字列のキャプチャがあり、かつその中および左方に可変長 + の正規表現があった場合、文字列の捕獲に失敗することがあったのを修正。 + 例:"1053" =~ /(?<=(\d+)(\d+))$/ で$2に適切な文字列がセットされず。 + ・srell_ucfdata.hppとsrell_updata.hppとをUnicode 12.1.0対応に更新。 + ・unicode/updataout.cppをUnicode 12対応に更新(ECMAScript 2020で対応さ + れる見込みのスクリプト名の先行対応)。 + ・srell.hpp中の改行コードをCR+LFからLFに変更。 + ・unicode/*.cppが出力するファイルの改行コードをCR+LFからLFに変更。 + ・misc/sample01.cppをversion 1.010に更新。 + 1. テスト名中の章番号をECMAScript 2018 (ES9) 準拠に変更(前版までは + ECMAScript 5.1までの章番号準拠でした)。 + 2. ECMAScript 2018規格の2.2.2.3 NOTEから準拠テストを1つ追加。 + ・C++11の機能の使用可否を判定するマクロを変更。 + ・文字クラスの処理方法を変更。 + ・basic_regexの全コンストラクタと全assign函数とでflag_typeのdefault引 + 数を指定できるように、syntax_option_typeとmatch_flag_typeとを再実装 + (TR1→C++11間の変更の見落とし)。 + ・char8_t型に試験対応。コンパイラがchar8_tに対応している場合 + (__cpp_char8_tマクロ定義の有無で判断)、"u8-"というprefixの付いた + クラスは「char8_t型文字列を受け取り、それをUTF-8として扱う」ように。 + char8_tに未対応の場合は従来通り、char型文字列をUTF-8として処理。 + ・常に「char型文字列をUTF-8として扱う」クラスとして新規に"u8c-"という + prefixに付いたクラスを追加。2.002までの"u8-"付きクラス相当。 + ・u8cregex; u8ccmatch, u8csmatch; u8ccsub_match, u8cssub_match; + u8ccregex_iterator, u8csregex_iterator; u8ccregex_token_iterator, + u8csregex_token_iterator. + +20180717: version 2.002: + ・ECMAScriptの仕様に合わせて \u{h...} の h... 部分の最大桁数を6から無 + 制限に変更(変更前の1~6桁というのは提案書に基づく実装でした)。 + ・updataout.cppを1.001に更新。新規に追加されたスクリプト名をエラー扱い + せぬように修整。 + ・srell_ucfdata.hppとsrell_updata.hppとをUnicode 11.0.0対応に更新。 + +20180204: version 2.001: + ・icase指定時に、[\W](\Wを含む文字class)が [KkSs\u017F\u212A] のいず + れにもマッチせぬよう変更(関連:ecma262 issue #512)。 + +20180127; version 2.000: + ・ECMAScript 2018のRegExpに追加されることになった次の機能を実装: + ・'.' があらゆるコードポイントにマッチするようにするための指定 + "dotall" フラグを、srell::regex_constants内の syntax_option_type + および srell::basic_regex内の flag_type に追加。 + ・Unicode property用の表現、\p{...} と \P{...} とを追加。 + ・名前付きキャプチャ (?...) と、名前付きキャプチャによって捕獲 + された文字列を後方参照するための正規表現、\k とを追加。 + ・戻り読み (lookbehind) の振る舞いを変更。(?<=...), (?" を追加。 + 2. operator=() 函数を明示的に実装。 + ・unicode/ucfdataout.cppをversion 1.001 に。 + +20140622; version 1.101: + srell_ucfdata.hppをUnicode 7.0.0対応に。 + +20121118; version 1.100: + 最初のリリース版。 + diff --git a/lib/srell3_009/license.txt b/lib/srell3_009/license.txt new file mode 100644 index 000000000..7f754a995 --- /dev/null +++ b/lib/srell3_009/license.txt @@ -0,0 +1,32 @@ +/***************************************************************************** +** +** SRELL (std::regex-like library) version 3.009 +** +** Copyright (c) 2012-2022, Nozomu Katoo. All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS +** IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +****************************************************************************** +**/ + diff --git a/lib/srell3_009/misc/sample01.cpp b/lib/srell3_009/misc/sample01.cpp new file mode 100644 index 000000000..71859e61c --- /dev/null +++ b/lib/srell3_009/misc/sample01.cpp @@ -0,0 +1,379 @@ +// +// A sample program for SRELL (tests and benchmarks). +// 2021/06/24; version 1.104 +// +// Macro Options: +// -DSTD_REGEX: std::regex used. +// -DBOOST_REGEX: boost::regex used. +// -DBOOST_XPRESSIVE: boost::xpressive used. +// unspecified or others: SRELL used. +// + +#include +#include +#include +#include +#include + +#if defined(STD_REGEX) + #include + #define RE_PREFIX std + #pragma message("std::regex selected.") +#elif defined(BOOST_REGEX) + #include + #define RE_PREFIX boost + #pragma message("boost::regex selected.") +#elif defined(BOOST_XPRESSIVE) + #include + #define RE_PREFIX boost::xpressive + #pragma message("boost::xpressive selected.") +#else + #include "../srell.hpp" + #define RE_PREFIX srell + #pragma message("srell selected.") +#endif + +bool test(const std::string &str, const std::string &exp, const unsigned int max, const std::vector *const expected = NULL) +{ +#if !defined(BOOST_XPRESSIVE) + RE_PREFIX::regex re; +#else + boost::xpressive::cregex re; +#endif + RE_PREFIX::cmatch mr; + bool b = false; + unsigned int num_of_failures = 0; + + try + { + std::string matched; + std::string msg; + +#if !defined(BOOST_XPRESSIVE) + re.assign(exp, RE_PREFIX::regex::ECMAScript); +#else + re = boost::xpressive::cregex::compile(exp, boost::xpressive::cregex::ECMAScript | boost::xpressive::cregex::not_dot_newline); +#endif + + const clock_t st = std::clock(); + + for (unsigned int i = 0; i < max; i++) +#if !defined(BOOST_REGEX) + b = RE_PREFIX::regex_search(str.c_str(), str.c_str() + str.size(), mr, re); +#else + b = RE_PREFIX::regex_search(str.c_str(), str.c_str() + str.size(), mr, re, boost::regex_constants::match_not_dot_newline); +#endif + + const clock_t ed = std::clock(); + +// std::fprintf(stdout, "\t\"%s\" =~ /%s/\n", str.c_str(), exp.c_str()); // Perl 5 style. + std::fprintf(stdout, "\t/%s/.exec(\"%s\");\n", exp.c_str(), str.c_str()); // ECMAScript style. + if (max > 1) + std::fprintf(stdout, "\t%u times\n", max); + std::fprintf(stdout, "\t%s (%ld msec)\n", b ? "Found" : "Not Found", static_cast(static_cast(ed - st) * 1000 / CLOCKS_PER_SEC)); + + for (RE_PREFIX::cmatch::size_type i = 0; i < mr.size(); ++i) + { + if (i) + std::fprintf(stdout, "\t$%u = ", i); + else + std::fputs("\t$& = ", stdout); + if (mr[i].matched) + { + matched = mr[i].str(); + msg = '"' + matched + '"' + " (%u+%u)"; + } + else + msg = matched = "(undefined)"; + + if (expected) + { + if (i < expected->size()) + { + if (matched == expected->operator[](i)) + msg += "; passed!"; + else + { + msg += "; failed... (expected: \"" + expected->operator[](i) + "\")"; + ++num_of_failures; + } + } + else + { + msg += "; failed..."; // should not exist. + ++num_of_failures; + } + } + msg += '\n'; + std::fprintf(stdout, msg.c_str(), mr.position(i), mr.length(i)); + } + + if (!num_of_failures && expected->size() != mr.size()) + ++num_of_failures; + + std::fprintf(stdout, "Result: %s.\n\n", num_of_failures ? "failed" : "passed"); + return num_of_failures == 0; + } + catch (const RE_PREFIX::regex_error &e) + { + std::fprintf(stdout, "Error (regex_error): %d \"%s\"\n\n", e.code(), e.what()); + } + catch (const std::exception &e) + { + std::fprintf(stdout, "Error (std::exception): \"%s\"\n\n", e.what()); + } + return false; +} + + +int main() +{ + const unsigned int count = 100000; + std::string exp; + std::string str; + std::vector expected; + unsigned int num_of_tests = 0; + unsigned int num_of_tests_passed = 0; + unsigned int num_of_benches = 0; + unsigned int num_of_benches_passed = 0; + + std::fputs("Test 1 (ECMAScript 2021 Language Specification 22.2.2.3, NOTE)\n", stdout); + str = "abc"; + exp = "((a)|(ab))((c)|(bc))"; + expected.resize(7); + expected[0] = "abc"; + expected[1] = "a"; + expected[2] = "a"; + expected[3] = "(undefined)"; + expected[4] = "bc"; + expected[5] = "(undefined)"; + expected[6] = "bc"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 2a (ECMAScript 2021 Language Specification 22.2.2.5.1, NOTE 2)\n", stdout); + str = "abcdefghi"; + exp = "a[a-z]{2,4}"; + expected.resize(1); + expected[0] = "abcde"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 2b (ECMAScript 2021 Language Specification 22.2.2.5.1, NOTE 2)\n", stdout); + str = "abcdefghi"; + exp = "a[a-z]{2,4}?"; + expected[0] = "abc"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 3 (ECMAScript 2021 Language Specification 22.2.2.5.1, NOTE 2)\n", stdout); + str = "aabaac"; + exp = "(aa|aabaac|ba|b|c)*"; + expected.resize(2); + expected[0] = "aaba"; + expected[1] = "ba"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 4 (ECMAScript 2021 Language Specification 22.2.2.5.1, NOTE 3)\n", stdout); + str = "zaacbbbcac"; + exp = "(z)((a+)?(b+)?(c))*"; + expected.resize(6); + expected[0] = "zaacbbbcac"; + expected[1] = "z"; + expected[2] = "ac"; + expected[3] = "a"; + expected[4] = "(undefined)"; + expected[5] = "c"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 5a (ECMAScript 2021 Language Specification 22.2.2.5.1, NOTE 4)\n", stdout); + str = "b"; + exp = "(a*)*"; + expected.resize(2); + expected[0] = ""; + expected[1] = ""; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 5b (ECMAScript 2021 Language Specification 22.2.2.5.1, NOTE 4)\n", stdout); + str = "baaaac"; + exp = "(a*)b\\1+"; + expected[0] = "b"; + expected[1] = ""; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 6a (ECMAScript 2021 Language Specification 22.2.2.8.2, NOTE 2)\n", stdout); + str = "baaabac"; + exp = "(?=(a+))"; + expected[0] = ""; + expected[1] = "aaa"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 6b (ECMAScript 2021 Language Specification 22.2.2.8.2, NOTE 2)\n", stdout); + str = "baaabac"; + exp = "(?=(a+))a*b\\1"; + expected[0] = "aba"; + expected[1] = "a"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 7 (ECMAScript 2021 Language Specification 22.2.2.8.2, NOTE 3)\n", stdout); + str = "baaabaac"; + exp = "(.*?)a(?!(a+)b\\2c)\\2(.*)"; + expected.resize(4); + expected[0] = "baaabaac"; + expected[1] = "ba"; + expected[2] = "(undefined)"; + expected[3] = "abaac"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + + std::fputs("Test 8 (from https://github.com/tc39/test262/tree/master/test/built-ins/RegExp/lookBehind/misc.js)\n", stdout); + str = "abc"; + exp = "(abc\\1)"; + expected.resize(2); + expected[0] = "abc"; + expected[1] = "abc"; + if (test(str, exp, 1, &expected)) + ++num_of_tests_passed; + ++num_of_tests; + +#ifndef SKIP_BENCHMARK + + std::fputs("Benchmark 01\n", stdout); + //0123456 + str = "aaaabaa"; + exp = "^(.*)*b\\1$"; + expected.resize(2); + expected[0] = "aaaabaa"; + expected[1] = "aa"; + if (test(str, exp, count, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 02\n", stdout); + //012345678 + str = "aaaabaaaa"; + exp = "^(.*)*b\\1\\1$"; + expected[0] = "aaaabaaaa"; + expected[1] = "aa"; + if (test(str, exp, count, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 03\n", stdout); + //01 + str = "ab"; + exp = "(.*?)*b\\1"; + expected[0] = "b"; + expected[1] = ""; + if (test(str, exp, count * 10, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 04\n", stdout); + //01234567 + str = "acaaabbb"; + exp = "(a(.)a|\\2(.)b){2}"; + expected.resize(4); + expected[0] = "aaabb"; + expected[1] = "bb"; + expected[2] = "(undefined)"; + expected[3] = "b"; + if (test(str, exp, count * 10, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 05\n", stdout); + str = "aabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaa"; + exp = "(a*)(b)*\\1\\1\\1"; + expected.resize(3); + expected[0] = "aabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaa"; + expected[1] = "aa"; + expected[2] = "b"; + if (test(str, exp, count, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 06a\n", stdout); + str = "aaaaaaaaaab"; + exp = "(.*)*b"; + expected.resize(2); + expected[0] = "aaaaaaaaaab"; + expected[1] = "aaaaaaaaaa"; + if (test(str, exp, count * 10, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 06b\n", stdout); + str = "aaaaaaaaaab"; + exp = "(.*)+b"; + if (test(str, exp, count * 10, &expected)) // the same results expected. + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 06c\n", stdout); + str = "aaaaaaaaaab"; + exp = "(.*){2,}b"; + expected[1] = ""; + if (test(str, exp, count * 10, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 07\n", stdout); + str = "aaaaaaaaaabc"; + exp = "(?=(a+))(abc)"; + expected.resize(3); + expected[0] = "abc"; + expected[1] = "a"; + expected[2] = "abc"; + if (test(str, exp, count, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 08\n", stdout); + str = "1234-5678-1234-456"; + exp = "(\\d{4}[-]){3}\\d{3,4}"; + expected.resize(2); + expected[0] = "1234-5678-1234-456"; + expected[1] = "1234-"; + if (test(str, exp, count * 5, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + + std::fputs("Benchmark 09\n", stdout); + str = "aaaaaaaaaaaaaaaaaaaaa"; + exp = "(.*)*b"; + expected.resize(0); + if (test(str, exp, 1, &expected)) + ++num_of_benches_passed; + ++num_of_benches; + +#endif // !defined(SKIP_BENCHMARK) + + std::fprintf(stdout, "Results of tests: %u/%u passed.\n", num_of_tests_passed, num_of_tests); + std::fprintf(stdout, "Results of benchmarks: %u/%u passed.\n", num_of_benches_passed, num_of_benches); + +return 0; + + std::fputs("Benchmark 10\n", stdout); + str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz"; + exp = "(x+y*)+a"; + test(str, exp, 1); + + return 0; +} diff --git a/lib/srell3_009/readme_en.txt b/lib/srell3_009/readme_en.txt new file mode 100644 index 000000000..2416aca56 --- /dev/null +++ b/lib/srell3_009/readme_en.txt @@ -0,0 +1,21 @@ +How to Use + + Put the following three files in one directory, and include srell.hpp. + 1. srell.hpp + 2. srell_ucfdata2.hpp (data for case folding) + 3. srell_updata.hpp (data for Unicode properties) + +The files in the following directories are supplements. As SRELL does not use +them, it is safe to remove them. + +* misc + Contains a source code file for a simple test and benchmark program. + +* single-header + Contains a standalone version of srell.hpp into which srell_ucfdata2.hpp + and srell_updata.hpp have been merged. + +* unicode + Contains source code files for programs that generate srell_ucfdata.hpp and + srell_update.hpp from latest Unicode data text files. + diff --git a/lib/srell3_009/readme_ja.txt b/lib/srell3_009/readme_ja.txt new file mode 100644 index 000000000..f71040a57 --- /dev/null +++ b/lib/srell3_009/readme_ja.txt @@ -0,0 +1,23 @@ +■使用法 + +次のファイルを同じディレクトリに置き、srell.hppをincludeするだけです。 +・srell.hpp +・srell_ucfdata2.hpp(case folding用データ) +・srell_updata.hpp(Unicode property用データ) + +■付属物 +以下のディレクトリ内にあるものはおまけのようなものです。 +SRELL側からは参照していませんので、削除してしまってもライブラリの動作に +影響はありません。 + +・misc + 簡単なテスト及びベンチマークプログラムのソースが入っています。 + +・single-header + srell.hppの中にsrell_ucfdata2.hppとsrell_updata.hppとを統合してしまい、 + これ単体で使用できるようにしたstandalone版が入っています。 + +・unicode + 最新のUnicodeデータからsrell_ucfdata.hpp及びsrell_updata.hppを作るため + のプログラムのソースが入っています。 + diff --git a/lib/srell3_009/single-header/srell.hpp b/lib/srell3_009/single-header/srell.hpp new file mode 100644 index 000000000..2816c44e2 --- /dev/null +++ b/lib/srell3_009/single-header/srell.hpp @@ -0,0 +1,18361 @@ +/***************************************************************************** +** +** SRELL (std::regex-like library) version 3.009 +** +** Copyright (c) 2012-2022, Nozomu Katoo. All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS +** IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +****************************************************************************** +**/ + +#ifndef SRELL_REGEX_TEMPLATE_LIBRARY +#define SRELL_REGEX_TEMPLATE_LIBRARY + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cpp_unicode_characters + #ifndef SRELL_CPP11_CHAR1632_ENABLED + #define SRELL_CPP11_CHAR1632_ENABLED + #endif +#endif +#ifdef __cpp_initializer_lists +#include + #ifndef SRELL_CPP11_INITIALIZER_LIST_ENABLED + #define SRELL_CPP11_INITIALIZER_LIST_ENABLED + #endif +#endif +#ifdef __cpp_rvalue_references + #ifndef SRELL_CPP11_MOVE_ENABLED + #define SRELL_CPP11_MOVE_ENABLED + #endif +#endif +#ifdef SRELL_CPP11_MOVE_ENABLED + #if defined(_MSC_VER) && _MSC_VER < 1900 + #define SRELL_NOEXCEPT + #else + #define SRELL_NOEXCEPT noexcept + #endif +#endif +#ifdef __cpp_char8_t + #ifndef SRELL_CPP20_CHAR8_ENABLED + #ifdef __cpp_lib_char8_t + #define SRELL_CPP20_CHAR8_ENABLED 2 + #else + #define SRELL_CPP20_CHAR8_ENABLED 1 + #endif + #endif +#endif + +// The following SRELL_NO_* macros would be useful when wanting to +// reduce the size of a binary by turning off some feature(s). + +#ifdef SRELL_NO_UNICODE_DATA + +// Prevents Unicode data used for icase (case-insensitive) matching +// from being output into a resulting binary. In this case only the +// ASCII characters are case-folded when icase matching is performed +// (i.e., [A-Z] -> [a-z] only). +#define SRELL_NO_UNICODE_ICASE + +// Disables the Unicode property (\p{...} and \P{...}) and prevents +// Unicode property data from being output into a resulting binary. +#define SRELL_NO_UNICODE_PROPERTY +#endif + +// Prevents icase matching specific functions into a resulting binary. +// In this case the icase flag is ignored and icase matching becomes +// unavailable. +#ifdef SRELL_NO_ICASE +#ifndef SRELL_NO_UNICODE_ICASE +#define SRELL_NO_UNICODE_ICASE +#endif +#endif + +// This macro might be removed in the future. +#ifdef SRELL_V1_COMPATIBLE +#ifndef SRELL_NO_UNICODE_PROPERTY +#define SRELL_NO_UNICODE_PROPERTY +#endif +#define SRELL_NO_NAMEDCAPTURE +#define SRELL_NO_SINGLELINE +#define SRELL_FIXEDWIDTHLOOKBEHIND +#endif + +namespace srell +{ +// ["regex_constants.h" ... + + namespace regex_constants + { + enum syntax_option_type + { + icase = 1 << 0, + nosubs = 1 << 1, + optimize = 1 << 2, + collate = 1 << 3, + ECMAScript = 1 << 4, + basic = 1 << 5, + extended = 1 << 6, + awk = 1 << 7, + grep = 1 << 8, + egrep = 1 << 9, + multiline = 1 << 10, + + // SRELL's extension. + dotall = 1 << 11 // singleline. + }; + + inline syntax_option_type operator&(const syntax_option_type left, const syntax_option_type right) + { + return static_cast(static_cast(left) & static_cast(right)); + } + inline syntax_option_type operator|(const syntax_option_type left, const syntax_option_type right) + { + return static_cast(static_cast(left) | static_cast(right)); + } + inline syntax_option_type operator^(const syntax_option_type left, const syntax_option_type right) + { + return static_cast(static_cast(left) ^ static_cast(right)); + } + inline syntax_option_type operator~(const syntax_option_type b) + { + return static_cast(~static_cast(b)); + } + inline syntax_option_type &operator&=(syntax_option_type &left, const syntax_option_type right) + { + left = left & right; + return left; + } + inline syntax_option_type &operator|=(syntax_option_type &left, const syntax_option_type right) + { + left = left | right; + return left; + } + inline syntax_option_type &operator^=(syntax_option_type &left, const syntax_option_type right) + { + left = left ^ right; + return left; + } + } + // namespace regex_constants + + namespace regex_constants + { + enum match_flag_type + { + match_default = 0, + match_not_bol = 1 << 0, + match_not_eol = 1 << 1, + match_not_bow = 1 << 2, + match_not_eow = 1 << 3, + match_any = 1 << 4, + match_not_null = 1 << 5, + match_continuous = 1 << 6, + match_prev_avail = 1 << 7, + + format_default = 0, + format_sed = 1 << 8, + format_no_copy = 1 << 9, + format_first_only = 1 << 10, + + // For internal use. + match_match_ = 1 << 11 + }; + + inline match_flag_type operator&(const match_flag_type left, const match_flag_type right) + { + return static_cast(static_cast(left) & static_cast(right)); + } + inline match_flag_type operator|(const match_flag_type left, const match_flag_type right) + { + return static_cast(static_cast(left) | static_cast(right)); + } + inline match_flag_type operator^(const match_flag_type left, const match_flag_type right) + { + return static_cast(static_cast(left) ^ static_cast(right)); + } + inline match_flag_type operator~(const match_flag_type b) + { + return static_cast(~static_cast(b)); + } + inline match_flag_type &operator&=(match_flag_type &left, const match_flag_type right) + { + left = left & right; + return left; + } + inline match_flag_type &operator|=(match_flag_type &left, const match_flag_type right) + { + left = left | right; + return left; + } + inline match_flag_type &operator^=(match_flag_type &left, const match_flag_type right) + { + left = left ^ right; + return left; + } + } + // namespace regex_constants + + // 28.5, regex constants: + namespace regex_constants + { + typedef int error_type; + + static const error_type error_collate = 100; + static const error_type error_ctype = 101; + static const error_type error_escape = 102; + static const error_type error_backref = 103; + static const error_type error_brack = 104; + static const error_type error_paren = 105; + static const error_type error_brace = 106; + static const error_type error_badbrace = 107; + static const error_type error_range = 108; + static const error_type error_space = 109; + static const error_type error_badrepeat = 110; + static const error_type error_complexity = 111; + static const error_type error_stack = 112; + + // SRELL's extension. + static const error_type error_utf8 = 113; + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) + static const error_type error_lookbehind = 200; +#endif + static const error_type error_internal = 999; + } + // namespace regex_constants + +// ... "regex_constants.h"] +// ["regex_error.hpp" ... + +// 28.6, class regex_error: +class regex_error : public std::runtime_error +{ +public: + + explicit regex_error(const regex_constants::error_type ecode) + : std::runtime_error("regex_error") // added for error C2512. + , ecode_(ecode) + { + } + + regex_constants::error_type code() const + { + return ecode_; + } + +private: + + regex_constants::error_type ecode_; +}; + +// ... "regex_error.hpp"] +// ["rei_type.h" ... + + namespace regex_internal + { + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + + typedef char32_t uchar32; + +#elif defined(UINT_MAX) && UINT_MAX >= 0xFFFFFFFF + + typedef unsigned int uchar32; + +#elif defined(ULONG_MAX) && ULONG_MAX >= 0xFFFFFFFF + + typedef unsigned long uchar32; + +#else +#error could not find a suitable type for 32-bit Unicode integer values. +#endif // defined(SRELL_CPP11_CHAR1632_ENABLED) + + typedef uchar32 uint_l32; // uint_least32. + + } // regex_internal + +// ... "rei_type.h"] +// ["rei_constants.h" ... + + namespace regex_internal + { + enum re_state_type + { + st_character, // 0x00 + st_character_class, // 0x01 + + st_epsilon, // 0x02 + + st_check_counter, // 0x03 +// st_increment_counter, // 0x04 + st_decrement_counter, // 0x04 + st_save_and_reset_counter, // 0x05 + st_restore_counter, // 0x06 + + st_roundbracket_open, // 0x07 + st_roundbracket_pop, // 0x08 + st_roundbracket_close, // 0x09 + + st_repeat_in_push, // 0x0a + st_repeat_in_pop, // 0x0b + st_check_0_width_repeat, // 0x0c + + st_backreference, // 0x0d + + st_lookaround_open, // 0x0e + +// st_lookaround_pop, // 0x10 + + st_bol, // 0x0f + st_eol, // 0x10 + st_boundary, // 0x11 + + st_success, // 0x12 + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) + st_move_nextpos, // 0x13 +#endif + + st_lookaround_close = st_success, + st_zero_width_boundary = st_lookaround_open, + }; + // re_state_type + + namespace constants + { + static const uchar32 unicode_max_codepoint = 0x10ffff; + static const uchar32 invalid_u32value = static_cast(-1); + static const uchar32 max_u32value = static_cast(-2); + static const uchar32 asc_icase = 0x20; + static const uchar32 ccstr_empty = static_cast(-3); + } + // constants + + namespace meta_char + { + static const uchar32 mc_exclam = 0x21; // '!' + static const uchar32 mc_dollar = 0x24; // '$' + static const uchar32 mc_rbraop = 0x28; // '(' + static const uchar32 mc_rbracl = 0x29; // ')' + static const uchar32 mc_astrsk = 0x2a; // '*' + static const uchar32 mc_plus = 0x2b; // '+' + static const uchar32 mc_comma = 0x2c; // ',' + static const uchar32 mc_minus = 0x2d; // '-' + static const uchar32 mc_period = 0x2e; // '.' + static const uchar32 mc_colon = 0x3a; // ':' + static const uchar32 mc_lt = 0x3c; // '<' + static const uchar32 mc_eq = 0x3d; // '=' + static const uchar32 mc_gt = 0x3e; // '>' + static const uchar32 mc_query = 0x3f; // '?' + static const uchar32 mc_sbraop = 0x5b; // '[' + static const uchar32 mc_escape = 0x5c; // '\\' + static const uchar32 mc_sbracl = 0x5d; // ']' + static const uchar32 mc_caret = 0x5e; // '^' + static const uchar32 mc_cbraop = 0x7b; // '{' + static const uchar32 mc_bar = 0x7c; // '|' + static const uchar32 mc_cbracl = 0x7d; // '}' + } + // meta_char + + namespace char_ctrl + { + static const uchar32 cc_nul = 0x00; // '\0' //0x00:NUL + static const uchar32 cc_bs = 0x08; // '\b' //0x08:BS + static const uchar32 cc_htab = 0x09; // '\t' //0x09:HT + static const uchar32 cc_nl = 0x0a; // '\n' //0x0a:LF + static const uchar32 cc_vtab = 0x0b; // '\v' //0x0b:VT + static const uchar32 cc_ff = 0x0c; // '\f' //0x0c:FF + static const uchar32 cc_cr = 0x0d; // '\r' //0x0d:CR + } + // char_ctrl + + namespace char_alnum + { + static const uchar32 ch_0 = 0x30; // '0' + static const uchar32 ch_1 = 0x31; // '1' + static const uchar32 ch_7 = 0x37; // '7' + static const uchar32 ch_8 = 0x38; // '8' + static const uchar32 ch_9 = 0x39; // '9' + static const uchar32 ch_A = 0x41; // 'A' + static const uchar32 ch_B = 0x42; // 'B' + static const uchar32 ch_D = 0x44; // 'D' + static const uchar32 ch_F = 0x46; // 'F' + static const uchar32 ch_P = 0x50; // 'P' + static const uchar32 ch_S = 0x53; // 'S' + static const uchar32 ch_W = 0x57; // 'W' + static const uchar32 ch_Z = 0x5a; // 'Z' + static const uchar32 ch_a = 0x61; // 'a' + static const uchar32 ch_b = 0x62; // 'b' + static const uchar32 ch_c = 0x63; // 'c' + static const uchar32 ch_d = 0x64; // 'd' + static const uchar32 ch_f = 0x66; // 'f' + static const uchar32 ch_k = 0x6b; // 'k' + static const uchar32 ch_n = 0x6e; // 'n' + static const uchar32 ch_p = 0x70; // 'p' + static const uchar32 ch_r = 0x72; // 'r' + static const uchar32 ch_s = 0x73; // 's' + static const uchar32 ch_t = 0x74; // 't' + static const uchar32 ch_u = 0x75; // 'u' + static const uchar32 ch_v = 0x76; // 'v' + static const uchar32 ch_w = 0x77; // 'w' + static const uchar32 ch_x = 0x78; // 'x' + static const uchar32 ch_z = 0x7a; // 'z' + } + // char_alnum + + namespace char_other + { + static const uchar32 co_sp = 0x20; // ' ' + static const uchar32 co_amp = 0x26; // '&' + static const uchar32 co_apos = 0x27; // '\'' + static const uchar32 co_slash = 0x2f; // '/' + static const uchar32 co_ll = 0x5f; // '_' + static const uchar32 co_grav = 0x60; // '`' + } + // char_other + } + // namespace regex_internal + +// ... "rei_constants.h"] +// ["rei_utf_traits.hpp" ... + + namespace regex_internal + { + +template +struct utf_traits_core +{ +public: + + static const std::size_t maxseqlen = 1; + static const int utftype = 0; + + static const std::size_t bitsetsize = 0x100; + static const uchar32 bitsetmask = 0xff; + static const uchar32 cumask = 0xff; + + // *iter + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator /* end */) + { + return static_cast(*begin); + // Caller is responsible for begin != end. + } + + // *iter++ + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator /* end */) + { + return static_cast(*begin++); + // Caller is responsible for begin != end. + } + + // iter2 = iter; return *--iter2; + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator /* begin */) + { + return static_cast(*--cur); + } + + // *--iter + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator /* begin */) + { + return static_cast(*--cur); + // Caller is responsible for cur != begin. + } + +#if !defined(SRELLDBG_NO_BMH) + + template + static bool is_trailing(const charT2 /* cu */) + { + return false; + } + +#endif // !defined(SRELLDBG_NO_BMH) + + static uchar32 to_codeunits(charT out[maxseqlen], uchar32 cp) + { + out[0] = static_cast(cp); + return 1; + } + + static uchar32 firstcodeunit(const uchar32 cp) + { + return cp; + } + + template + static bool seek_charboundary(ForwardIterator &begin, const ForwardIterator end) + { + return begin != end; + } +}; // utf_traits_core + +// common and utf-32. +template +struct utf_traits : public utf_traits_core +{ + static const int utftype = 32; + + static const std::size_t bitsetsize = 0x10000; + static const uchar32 bitsetmask = 0xffff; + static const uchar32 cumask = 0x1fffff; +}; // utf_traits + +// utf-8 specific. +template +struct utf8_traits : public utf_traits_core +{ +public: + + // utf-8 specific. + static const std::size_t maxseqlen = 4; + static const int utftype = 8; + + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator end) + { +// return codepoint_inc(begin, end); + + uchar32 codepoint = static_cast(*begin & 0xff); + + if ((codepoint & 0x80) == 0) // 1 octet. + return codepoint; + + if (++begin != end && (codepoint >= 0xc0 && codepoint <= 0xf7) && (*begin & 0xc0) == 0x80) + { + codepoint = static_cast((codepoint << 6) | (*begin & 0x3f)); + + if ((codepoint & 0x800) == 0) // 2 octets. + return static_cast(codepoint & 0x7ff); + + if (++begin != end && (*begin & 0xc0) == 0x80) + { + codepoint = static_cast((codepoint << 6) | (*begin & 0x3f)); + + if ((codepoint & 0x10000) == 0) // 3 octets. + return static_cast(codepoint & 0xffff); + + if (++begin != end && (*begin & 0xc0) == 0x80) // 4 octets. + { + codepoint = static_cast((codepoint << 6) | (*begin & 0x3f)); + + return static_cast(codepoint & 0x1fffff); + } + } + } +// else // 80-bf, f8-ff: invalid. + + return regex_internal::constants::invalid_u32value; + } + + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator end) + { + uchar32 codepoint = static_cast(*begin++ & 0xff); + + if ((codepoint & 0x80) == 0) // 1 octet. + return codepoint; + + // Expects transformation to (codepoint - 0xc0) <= 0x37 by optimisation. + // 0xF7 instead of 0xF4 is for consistency with reverse iterators. + if (begin != end && (codepoint >= 0xc0 && codepoint <= 0xf7) && (*begin & 0xc0) == 0x80) +// if (begin != end && (0x7f00 & (1 << ((codepoint >> 3) & 0xf))) && (*begin & 0xc0) == 0x80) // c0, c8, d0, d8, e0, e8, f0. + { + codepoint = static_cast((codepoint << 6) | (*begin++ & 0x3f)); + + // 11 ?aaa aabb bbbb + if ((codepoint & 0x800) == 0) // 2 octets. + return static_cast(codepoint & 0x7ff); + // c080-c1bf: invalid. 00-7F. + // c280-dfbf: valid. 080-7FF. + + // 11 1aaa aabb bbbb + if (begin != end && (*begin & 0xc0) == 0x80) + { + codepoint = static_cast((codepoint << 6) | (*begin++ & 0x3f)); + + // 111? aaaa bbbb bbcc cccc + if ((codepoint & 0x10000) == 0) // 3 octets. + return static_cast(codepoint & 0xffff); + // e08080-e09fbf: invalid. 000-7FF. + // e0a080-efbfbf: valid. 0800-FFFF. + + // 1111 0aaa bbbb bbcc cccc + if (begin != end && (*begin & 0xc0) == 0x80) // 4 octets. + { + codepoint = static_cast((codepoint << 6) | (*begin++ & 0x3f)); + // f0808080-f08fbfbf: invalid. 0000-FFFF. + // f0908080-f3bfbfbf: valid. 10000-FFFFF. + // f4808080-f48fbfbf: valid. 100000-10FFFF. + // f4908080-f4bfbfbf: invalid. 110000-13FFFF. + // f5808080-f7bfbfbf: invalid. 140000-1FFFFF. + + // 11 110a aabb bbbb cccc ccdd dddd + return static_cast(codepoint & 0x1fffff); + } + } + } +// else // 80-bf, f8-ff: invalid. + + return regex_internal::constants::invalid_u32value; + } + + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator begin) + { + uchar32 codepoint = static_cast(*--cur); + + if ((codepoint & 0x80) == 0) + return static_cast(codepoint & 0xff); + + if ((codepoint & 0x40) == 0 && cur != begin) + { + codepoint = static_cast((codepoint & 0x3f) | (*--cur << 6)); + + if ((codepoint & 0x3800) == 0x3000) // 2 octets. + return static_cast(codepoint & 0x7ff); + + if ((codepoint & 0x3000) == 0x2000 && cur != begin) + { + codepoint = static_cast((codepoint & 0xfff) | (*--cur << 12)); + + if ((codepoint & 0xf0000) == 0xe0000) // 3 octets. + return static_cast(codepoint & 0xffff); + + if ((codepoint & 0xc0000) == 0x80000 && cur != begin) + { + if ((*--cur & 0xf8) == 0xf0) // 4 octets. + return static_cast((codepoint & 0x3ffff) | ((*cur & 7) << 18)); + } + } + } + return regex_internal::constants::invalid_u32value; + } + + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator begin) + { + uchar32 codepoint = static_cast(*--cur); + + if ((codepoint & 0x80) == 0) + return static_cast(codepoint & 0xff); + + if ((codepoint & 0x40) == 0 && cur != begin) + { + codepoint = static_cast((codepoint & 0x3f) | (*--cur << 6)); + + // 11 0bbb bbaa aaaa? + if ((codepoint & 0x3800) == 0x3000) // 2 octets. +// if ((*cur & 0xe0) == 0xc0) + return static_cast(codepoint & 0x7ff); + + // 10 bbbb bbaa aaaa? + if ((codepoint & 0x3000) == 0x2000 && cur != begin) // [\x80-\xbf]{2}. +// if ((*cur & 0xc0) == 0x80 && cur != begin) + { + codepoint = static_cast((codepoint & 0xfff) | (*--cur << 12)); + + // 1110 cccc bbbb bbaa aaaa? + if ((codepoint & 0xf0000) == 0xe0000) // 3 octets. +// if ((*cur & 0xf0) == 0xe0) + return static_cast(codepoint & 0xffff); + + // 10cc cccc bbbb bbaa aaaa? + if ((codepoint & 0xc0000) == 0x80000 && cur != begin) // [\x80-\xbf]{3}. +// if ((*cur & 0xc0) == 0x80 && cur != begin) + { + if ((*--cur & 0xf8) == 0xf0) // 4 octets. + return static_cast((codepoint & 0x3ffff) | ((*cur & 7) << 18)); + // d ddcc cccc bbbb bbaa aaaa + //else // [\0-\xef\xf8-\xff][\x80-\xbf]{3}. + + // Sequences [\xc0-\xdf][\x80-\xbf] and [\xe0-\xef][\x80-\xbf]{2} are valid. + // To give a chance to them, rewinds cur. + ++cur; + } + //else // [\0-\x7f\xc0-\xdf\xf0-\xff][\x80-\xbf]{2}. + ++cur; // Sequence [\xc0-\xdf][\x80-\xbf] is valid. Rewinds to give a chance to it. + } + //else // [\0-\x7f\xe0-\xff][\x80-\xbf]. + ++cur; // Rewinds to give a chance to [\0-\x7f]. + } + //else // [\xc0-\xff]. + + return regex_internal::constants::invalid_u32value; + } + +#if !defined(SRELLDBG_NO_BMH) + + template + static bool is_trailing(const charT2 cu) + { + return (cu & 0xc0) == 0x80; + } + +#endif // !defined(SRELLDBG_NO_BMH) + + static uchar32 to_codeunits(charT out[maxseqlen], uchar32 cp) + { + if (cp < 0x80) + { + out[0] = static_cast(cp); + return 1; + } + else if (cp < 0x800) + { + out[0] = static_cast(((cp >> 6) & 0x1f) | 0xc0); + out[1] = static_cast((cp & 0x3f) | 0x80); + return 2; + } + else if (cp < 0x10000) + { + out[0] = static_cast(((cp >> 12) & 0x0f) | 0xe0); + out[1] = static_cast(((cp >> 6) & 0x3f) | 0x80); + out[2] = static_cast((cp & 0x3f) | 0x80); + return 3; + } +// else // if (cp < 0x110000) + { + out[0] = static_cast(((cp >> 18) & 0x07) | 0xf0); + out[1] = static_cast(((cp >> 12) & 0x3f) | 0x80); + out[2] = static_cast(((cp >> 6) & 0x3f) | 0x80); + out[3] = static_cast((cp & 0x3f) | 0x80); + return 4; + } + } + + static uchar32 firstcodeunit(const uchar32 cp) + { + if (cp < 0x80) + return cp; + + if (cp < 0x800) + return static_cast(((cp >> 6) & 0x1f) | 0xc0); + + if (cp < 0x10000) + return static_cast(((cp >> 12) & 0x0f) | 0xe0); + + return static_cast(((cp >> 18) & 0x07) | 0xf0); + } + + template + static bool seek_charboundary(ForwardIterator &begin, const ForwardIterator end) + { + for (; begin != end; ++begin) + { +// if ((*begin & 0xc0) != 0x80 && (*begin & 0xf8) != 0xf8) // 00-7f, c0-f7. + if ((*begin & 0xc0) != 0x80) // 00-7f, c0-ff. + return true; + } + return false; + } +}; // utf8_traits + +// utf-16 specific. +template +struct utf16_traits : public utf_traits_core +{ +public: + + // utf-16 specific. + static const std::size_t maxseqlen = 2; + static const int utftype = 16; + + static const std::size_t bitsetsize = 0x10000; + static const uchar32 bitsetmask = 0xffff; + static const uchar32 cumask = 0xffff; + + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator end) + { + const uchar32 codeunit = *begin; + + if ((codeunit & 0xdc00) != 0xd800) + return static_cast(codeunit & 0xffff); + + if (++begin != end && (*begin & 0xdc00) == 0xdc00) + return static_cast((((codeunit & 0x3ff) << 10) | (*begin & 0x3ff)) + 0x10000); + + return static_cast(codeunit & 0xffff); + } + + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator end) + { + const uchar32 codeunit = *begin++; + + if ((codeunit & 0xdc00) != 0xd800) + return static_cast(codeunit & 0xffff); + + if (begin != end && (*begin & 0xdc00) == 0xdc00) + return static_cast((((codeunit & 0x3ff) << 10) | (*begin++ & 0x3ff)) + 0x10000); + + return static_cast(codeunit & 0xffff); + } + + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator begin) + { + const uchar32 codeunit = *--cur; + + if ((codeunit & 0xdc00) != 0xdc00 || cur == begin) + return static_cast(codeunit & 0xffff); + + if ((*--cur & 0xdc00) == 0xd800) + return static_cast((((*cur & 0x3ff) << 10) | (codeunit & 0x3ff)) + 0x10000); + + return static_cast(codeunit & 0xffff); + } + + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator begin) + { + const uchar32 codeunit = *--cur; + + if ((codeunit & 0xdc00) != 0xdc00 || cur == begin) + return static_cast(codeunit & 0xffff); + + if ((*--cur & 0xdc00) == 0xd800) + return static_cast((((*cur & 0x3ff) << 10) | (codeunit & 0x3ff)) + 0x10000); + //else // (codeunit & 0xdc00) == 0xdc00 && (*cur & 0xdc00) != 0xd800 + + ++cur; + + return static_cast(codeunit & 0xffff); + } + +#if !defined(SRELLDBG_NO_BMH) + + template + static bool is_trailing(const charT2 cu) + { + return (cu & 0xdc00) == 0xdc00; + } + +#endif // !defined(SRELLDBG_NO_BMH) + + static uchar32 to_codeunits(charT out[maxseqlen], uchar32 cp) + { + if (cp < 0x10000) + { + out[0] = static_cast(cp); + return 1; + } +// else // if (cp < 0x110000) + { + cp -= 0x10000; + out[0] = static_cast(((cp >> 10) & 0x3ff) | 0xd800); + out[1] = static_cast((cp & 0x3ff) | 0xdc00); + return 2; + } + } + + static uchar32 firstcodeunit(const uchar32 cp) + { + if (cp < 0x10000) + return cp; + + return static_cast((cp >> 10) + 0xd7c0); + // aaaaa bbbbcccc ddddeeee -> AA AAbb bbcc/cc dddd eeee where AAAA = aaaaa - 1. + } + + template + static bool seek_charboundary(ForwardIterator &begin, const ForwardIterator end) + { + for (; begin != end; ++begin) + { + if ((*begin & 0xdc00) != 0xdc00) + return true; + } + return false; + } +}; // utf16_traits + +// specialisation for char. +template <> +struct utf_traits : public utf_traits_core +{ +public: + + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator /* end */) + { + return static_cast(static_cast(*begin)); + } + + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator /* end */) + { + return static_cast(static_cast(*begin++)); + } + + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator /* begin */) + { + return static_cast(static_cast(*--cur)); + } + + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator /* begin */) + { + return static_cast(static_cast(*--cur)); + } + +#if !defined(SRELLDBG_NO_BMH) +#endif // !defined(SRELLDBG_NO_BMH) +}; // utf_traits + +// specialisation for signed char. +template <> +struct utf_traits : public utf_traits +{ +}; + +// (signed) short, (signed) int, (signed) long, (signed) long long, ... + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) +template <> +struct utf_traits : public utf16_traits +{ +}; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) +template <> +struct utf_traits : public utf8_traits +{ +}; +#endif + + } // regex_internal + +// ... "rei_utf_traits.hpp"] +// ["regex_traits.hpp" ... + +// 28.7, class template regex_traits: +template +struct regex_traits +{ +public: + + typedef charT char_type; + typedef std::basic_string string_type; + typedef std::locale locale_type; +// typedef bitmask_type char_class_type; + typedef int char_class_type; + + typedef regex_internal::utf_traits utf_traits; + +public: + +// regex_traits(); + + static std::size_t length(const char_type *p) + { + return std::char_traits::length(p); + } + + charT translate(const charT c) const + { + return c; + } + + charT translate_nocase(const charT c) const + { + return c; + } + + template + string_type transform(ForwardIterator first, ForwardIterator last) const + { + return string_type(first, last); + } + + template + string_type transform_primary(ForwardIterator first, ForwardIterator last) const + { + return string_type(first, last); + } + + template + string_type lookup_collatename(ForwardIterator first, ForwardIterator last) const + { + return string_type(first, last); + } + + template + char_class_type lookup_classname(ForwardIterator /* first */, ForwardIterator /* last */, bool /* icase */ = false) const + { + return static_cast(0); + } + + bool isctype(const charT /* c */, const char_class_type /* f */) const + { + return false; + } + + int value(const charT /* ch */, const int /* radix */) const + { + return -1; + } + + locale_type imbue(const locale_type /* l */) + { + return locale_type(); + } + + locale_type getloc() const + { + return locale_type(); + } +}; // regex_traits + +template +struct u8regex_traits : public regex_traits +{ + typedef regex_internal::utf8_traits utf_traits; +}; + +template +struct u16regex_traits : public regex_traits +{ + typedef regex_internal::utf16_traits utf_traits; +}; + +// ... "regex_traits.hpp"] +// ["rei_memory.hpp" ... + + namespace regex_internal + { +/* + * Similar to std::basic_string, except for: + * a. only allocates memory, does not initialise it. + * b. uses realloc() to avoid moving data as much as possible when + * resizing an allocated buffer. + */ +template +class simple_array +{ +public: + + typedef ElemT value_type; + typedef std::size_t size_type; + typedef ElemT &reference; + typedef const ElemT &const_reference; + typedef ElemT *pointer; + typedef const ElemT *const_pointer; + + static const size_type npos = static_cast(-1); + +public: + + simple_array() + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + } + + simple_array(const size_type initsize) + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + if (initsize) + { + buffer_ = static_cast(std::malloc(initsize * sizeof (ElemT))); + + if (buffer_ != NULL) + size_ = capacity_ = initsize; + else + throw std::bad_alloc(); + } + } + + simple_array(const simple_array &right, size_type pos, size_type len = npos) + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + if (pos > right.size_) + pos = right.size_; + + { + const size_type len2 = right.size_ - pos; + if (len > len2) + len = len2; + } + + if (len) + { + buffer_ = static_cast(std::malloc(len * sizeof (ElemT))); + + if (buffer_ != NULL) + { + for (capacity_ = len; size_ < capacity_;) + buffer_[size_++] = right[pos++]; + } + else + { + throw std::bad_alloc(); + } + } + } + + simple_array(const simple_array &right) + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + operator=(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + simple_array(simple_array &&right) SRELL_NOEXCEPT + : buffer_(right.buffer_) + , size_(right.size_) + , capacity_(right.capacity_) + { + right.size_ = 0; + right.capacity_ = 0; + right.buffer_ = NULL; + } +#endif + + simple_array &operator=(const simple_array &right) + { + if (this != &right) + { + resize(right.size_); + for (size_type i = 0; i < right.size_; ++i) + buffer_[i] = right.buffer_[i]; + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + simple_array &operator=(simple_array &&right) SRELL_NOEXCEPT + { + if (this != &right) + { + if (this->buffer_ != NULL) + std::free(this->buffer_); + + this->size_ = right.size_; + this->capacity_ = right.capacity_; + this->buffer_ = right.buffer_; + + right.size_ = 0; + right.capacity_ = 0; + right.buffer_ = NULL; + } + return *this; + } +#endif + + ~simple_array() + { + if (buffer_ != NULL) + std::free(buffer_); + } + + size_type size() const + { + return size_; + } + + void clear() + { + size_ = 0; + } + + void resize(const size_type newsize) + { + if (newsize > capacity_) + reserve(newsize); + + size_ = newsize; + } + + void resize(const size_type newsize, const ElemT &type) + { + size_type oldsize = size_; + + resize(newsize); + for (; oldsize < size_; ++oldsize) + buffer_[oldsize] = type; + } + + reference operator[](const size_type pos) + { + return buffer_[pos]; + } + + const_reference operator[](const size_type pos) const + { + return buffer_[pos]; + } + + void push_back(const_reference n) + { + const size_type oldsize = size_; + + if (++size_ > capacity_) + reserve(size_); + + buffer_[oldsize] = n; + } + + const_reference back() const + { + return buffer_[size_ - 1]; + } + + reference back() + { + return buffer_[size_ - 1]; + } + + void pop_back() + { + --size_; + } + + simple_array &operator+=(const simple_array &right) + { + return append(right); + } + + simple_array &append(const size_type size, const ElemT &type) + { + resize(size_ + size, type); + return *this; + } + + simple_array &append(const simple_array &right) + { + size_type oldsize = size_; + + resize(size_ + right.size_); + for (size_type i = 0; i < right.size_; ++i, ++oldsize) + buffer_[oldsize] = right.buffer_[i]; + + return *this; + } + + simple_array &append(const simple_array &right, size_type pos, size_type len /* = npos */) + { + { + const size_type len2 = right.size_ - pos; + if (len > len2) + len = len2; + } + + size_type oldsize = size_; + + resize(size_ + len); + len += pos; // end. + for (; pos < len; ++oldsize, ++pos) + buffer_[oldsize] = right.buffer_[pos]; + + return *this; + } + + // For rei_char_class class. + void erase(const size_type pos) + { + if (pos < size_) + { + std::memmove(buffer_ + pos, buffer_ + pos + 1, (size_ - pos - 1) * sizeof (ElemT)); + --size_; + } + } + + // For rei_compiler class. + void insert(const size_type pos, const ElemT &type) + { + move_forward(pos, 1); + buffer_[pos] = type; + } + + void insert(size_type pos, const simple_array &right) + { + move_forward(pos, right.size_); + for (size_type i = 0; i < right.size_; ++i, ++pos) + buffer_[pos] = right.buffer_[i]; + } + + void insert(size_type destpos, const simple_array &right, size_type srcpos, size_type srclen = npos) + { + { + const size_type len2 = right.size_ - srcpos; + if (srclen > len2) + srclen = len2; + } + + move_forward(destpos, srclen); + srclen += srcpos; // srcend. + for (; srcpos < srclen; ++destpos, ++srcpos) + buffer_[destpos] = right.buffer_[srcpos]; + } + + simple_array &replace(size_type pos, size_type count, const simple_array &right) + { + if (count < right.size_) + move_forward(pos + count, right.size_ - count); + else if (count > right.size_) + { + const pointer base = buffer_ + pos; + + std::memmove(base + right.size_, base + count, (size_ - pos - count) * sizeof (ElemT)); + size_ -= count - right.size_; + } + + for (size_type i = 0; i < right.size_; ++pos, ++i) + buffer_[pos] = right[i]; + + return *this; + } + + size_type find(const value_type c, size_type pos = 0) const + { + for (; pos <= size_; ++pos) + if (buffer_[pos] == c) + return pos; + + return npos; + } + + const_pointer data() const + { + return buffer_; + } + + int compare(size_type pos, const size_type count1, const_pointer p, const size_type count2) const + { + size_type count = count1 <= count2 ? count1 : count2; + + for (; count; ++pos, ++p, --count) + { + const value_type &v = buffer_[pos]; + if (v != *p) + return v < *p ? -1 : 1; + } + return count1 == count2 ? 0 : (count1 < count2 ? -1 : 1); + } + + size_type max_size() const + { + return maxsize_; + } + + void swap(simple_array &right) + { + if (this != &right) + { + const pointer tmpbuffer = this->buffer_; + const size_type tmpsize = this->size_; + const size_type tmpcapacity = this->capacity_; + + this->buffer_ = right.buffer_; + this->size_ = right.size_; + this->capacity_ = right.capacity_; + + right.buffer_ = tmpbuffer; + right.size_ = tmpsize; + right.capacity_ = tmpcapacity; + } + } + +private: + + void reserve(const size_type newsize) + { +// if (newsize > capacity_) + { + if (newsize <= maxsize_) + { +// capacity_ = newsize + (newsize >> 1); // newsize * 1.5. + capacity_ = ((newsize >> 8) + 1) << 8; // Round up to a multiple of 256. + + if (capacity_ > maxsize_) + capacity_ = maxsize_; + + const size_type newsize_in_byte = capacity_ * sizeof (ElemT); + const pointer oldbuffer = buffer_; + + buffer_ = static_cast(std::realloc(buffer_, newsize_in_byte)); + if (buffer_ != NULL) + return; + + // Even if realloc() failed, already-existing buffer remains valid. + std::free(oldbuffer); +// buffer_ = NULL; + size_ = capacity_ = 0; + } + throw std::bad_alloc(); + } + } + + void move_forward(const size_type pos, const size_type count) + { + const size_type oldsize = size_; + + resize(size_ + count); + + if (pos < oldsize) + { + const pointer base = buffer_ + pos; + + std::memmove(base + count, base, (oldsize - pos) * sizeof (ElemT)); + } + } + +private: + + pointer buffer_; + size_type size_; + size_type capacity_; + +// static const size_type maxsize_ = (npos - sizeof (simple_array)) / sizeof (ElemT); + static const size_type maxsize_ = (npos - sizeof (pointer) - sizeof (size_type) * 2) / sizeof (ElemT) / 2; +}; +// simple_array + + } // namespace regex_internal + +// ... "rei_memory.hpp"] +// ["rei_bitset.hpp" ... + + namespace regex_internal + { + +// Always uses a heap instead of the stack. +template +class bitset +{ +private: + + typedef unsigned long array_type; + +public: + + bitset() + : buffer_(static_cast(std::malloc(size_in_byte_))) + { + if (buffer_ != NULL) + { + reset(); + return; + } + throw std::bad_alloc(); + } + + bitset(const bitset &right) + : buffer_(static_cast(std::malloc(size_in_byte_))) + { + if (buffer_ != NULL) + { + operator=(right); + return; + } + throw std::bad_alloc(); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + bitset(bitset &&right) SRELL_NOEXCEPT + : buffer_(right.buffer_) + { + right.buffer_ = NULL; + } +#endif + + bitset &operator=(const bitset &right) + { + if (this != &right) + { +// for (std::size_t i = 0; i < arraylength_; ++i) +// buffer_[i] = right.buffer_[i]; + std::memcpy(buffer_, right.buffer_, size_in_byte_); + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + bitset &operator=(bitset &&right) SRELL_NOEXCEPT + { + if (this != &right) + { + if (this->buffer_ != NULL) + std::free(this->buffer_); + + this->buffer_ = right.buffer_; + right.buffer_ = NULL; + } + return *this; + } +#endif + + ~bitset() + { + if (buffer_ != NULL) + std::free(buffer_); + } + + bitset &reset() + { + std::memset(buffer_, 0, size_in_byte_); + return *this; + } + + bitset &reset(const std::size_t bit) + { + buffer_[bit / bits_per_elem_] &= ~(1 << (bit & bitmask_)); + return *this; + } + + bitset &set(const std::size_t bit) + { + buffer_[bit / bits_per_elem_] |= (1 << (bit & bitmask_)); + return *this; + } + +#if 0 + void set_range(const std::size_t firstbit, const std::size_t lastbit) + { + const std::size_t lastelemidx = lastbit / bits_per_elem_; + std::size_t firstelemidx = firstbit / bits_per_elem_; + const array_type lastelemmask = ~(allbits1_ << ((lastbit & bitmask_) + 1)); + array_type ormask = allbits1_ << (firstbit & bitmask_); + + if (firstelemidx < lastelemidx) + { + buffer_[firstelemidx] |= ormask; + ormask = allbits1_; + + for (++firstelemidx; firstelemidx < lastelemidx; ++firstelemidx) + buffer_[firstelemidx] |= ormask; + } + ormask &= lastelemmask; + buffer_[lastelemidx] |= ormask; + + } +#endif + + bool test(const std::size_t bit) const + { + return (buffer_[bit / bits_per_elem_] & (1 << (bit & bitmask_))) != 0; + } + + bool operator[](const std::size_t bit) const + { + return (buffer_[bit / bits_per_elem_] & (1 << (bit & bitmask_))) != 0; + } + + bitset &flip() + { + for (std::size_t i = 0; i < arraylength_; ++i) + buffer_[i] = ~buffer_[i]; + return *this; + } + + void swap(bitset &right) + { + if (this != &right) + { + array_type *const tmpbuffer = this->buffer_; + this->buffer_ = right.buffer_; + right.buffer_ = tmpbuffer; + } + } + +private: + +#if defined(__cpp_constexpr) + static constexpr std::size_t pow2leN(const std::size_t n, const std::size_t p2) + { + return ((p2 << 1) == 0 || (p2 << 1) > n) ? p2 : pow2leN(n, p2 << 1); + } + static const std::size_t bits_per_elem_ = pow2leN(CHAR_BIT * sizeof (array_type), 8); +#else + static const std::size_t bpe_tmp_ = CHAR_BIT * sizeof (array_type); + static const std::size_t bits_per_elem_ = bpe_tmp_ >= 64 ? 64 : (bpe_tmp_ >= 32 ? 32 : (bpe_tmp_ >= 16 ? 16 : 8)); +#endif + static const std::size_t bitmask_ = bits_per_elem_ - 1; + static const std::size_t arraylength_ = (Bits + bitmask_) / bits_per_elem_; + static const std::size_t size_in_byte_ = arraylength_ * sizeof (array_type); + static const array_type allbits1_ = ~static_cast(0); + + array_type *buffer_; +}; + + } // namespace regex_internal + +// ... "rei_bitset.hpp"] +// ["rei_ucf.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELL_NO_UNICODE_ICASE) +// ["srell_ucfdata2.hpp" ... +// CaseFolding-14.0.0.txt +// Date: 2021-03-08, 19:35:41 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html + +template +struct unicode_casefolding +{ + static const T2 ucf_maxcodepoint = 0x1E921; + static const T3 ucf_deltatablesize = 0x1900; + static const T2 rev_maxcodepoint = 0x1E943; + static const T3 rev_indextablesize = 0x1B00; + static const T3 rev_charsettablesize = 4303; // 1 + 1424 * 2 + 1454 + static const T3 rev_maxset = 4; + static const T2 eos = 0; + + static const T2 ucf_deltatable[]; + static const T3 ucf_segmenttable[]; + static const T3 rev_indextable[]; + static const T3 rev_segmenttable[]; + static const T2 rev_charsettable[]; + + static const T2 *ucf_deltatable_ptr() + { + return ucf_deltatable; + } + static const T3 *ucf_segmenttable_ptr() + { + return ucf_segmenttable; + } + static const T3 *rev_indextable_ptr() + { + return rev_indextable; + } + static const T3 *rev_segmenttable_ptr() + { + return rev_segmenttable; + } + static const T2 *rev_charsettable_ptr() + { + return rev_charsettable; + } +}; + +template +const T2 unicode_casefolding::ucf_deltatable[] = +{ + // For common (0) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+00xx (256) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+01xx (512) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, static_cast(-121), 1, 0, 1, 0, 1, 0, static_cast(-268), + 0, 210, 1, 0, 1, 0, 206, 1, 0, 205, 205, 1, 0, 0, 79, 202, + 203, 1, 0, 205, 207, 0, 211, 209, 1, 0, 0, 0, 211, 213, 0, 214, + 1, 0, 1, 0, 1, 0, 218, 1, 0, 218, 0, 0, 1, 0, 218, 1, + 0, 217, 217, 1, 0, 1, 0, 219, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 2, 1, 0, 1, 0, static_cast(-97), static_cast(-56), 1, 0, 1, 0, 1, 0, 1, 0, + + // For u+02xx (768) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + static_cast(-130), 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10795, 1, 0, static_cast(-163), 10792, 0, + 0, 1, 0, static_cast(-195), 69, 71, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+03xx (1024) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 116, + 0, 0, 0, 0, 0, 0, 38, 0, 37, 37, 37, 0, 64, 0, 63, 63, + 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, + static_cast(-30), static_cast(-25), 0, 0, 0, static_cast(-15), static_cast(-22), 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + static_cast(-54), static_cast(-48), 0, 0, static_cast(-60), static_cast(-64), 0, 1, 0, static_cast(-7), 1, 0, 0, static_cast(-130), static_cast(-130), static_cast(-130), + + // For u+04xx (1280) + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 15, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + + // For u+05xx (1536) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10xx (1792) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, + 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, + 7264, 7264, 7264, 7264, 7264, 7264, 0, 7264, 0, 0, 0, 0, 0, 7264, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+13xx (2048) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), 0, 0, + + // For u+1Cxx (2304) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + static_cast(-6222), static_cast(-6221), static_cast(-6212), static_cast(-6210), static_cast(-6210), static_cast(-6211), static_cast(-6204), static_cast(-6180), 35267, 0, 0, 0, 0, 0, 0, 0, + static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), + static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), + static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), 0, 0, static_cast(-3008), static_cast(-3008), static_cast(-3008), + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Exx (2560) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, static_cast(-58), 0, 0, static_cast(-7615), 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + + // For u+1Fxx (2816) + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), 0, static_cast(-8), 0, static_cast(-8), 0, static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-74), static_cast(-74), static_cast(-9), 0, static_cast(-7173), 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-86), static_cast(-86), static_cast(-86), static_cast(-86), static_cast(-9), 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-100), static_cast(-100), 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-112), static_cast(-112), static_cast(-7), 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-128), static_cast(-128), static_cast(-126), static_cast(-126), static_cast(-9), 0, 0, 0, + + // For u+21xx (3072) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, static_cast(-7517), 0, 0, 0, static_cast(-8383), static_cast(-8262), 0, 0, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+24xx (3328) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+2Cxx (3584) + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, static_cast(-10743), static_cast(-3814), static_cast(-10727), 0, 0, 1, 0, 1, 0, 1, 0, static_cast(-10780), static_cast(-10749), static_cast(-10783), + static_cast(-10782), 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-10815), static_cast(-10815), + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+A6xx (3840) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+A7xx (4096) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, static_cast(-35332), 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, static_cast(-42280), 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, static_cast(-42308), static_cast(-42319), static_cast(-42315), static_cast(-42305), static_cast(-42308), 0, + static_cast(-42258), static_cast(-42282), static_cast(-42261), 928, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, static_cast(-48), static_cast(-42307), static_cast(-35384), 1, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+ABxx (4352) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+FFxx (4608) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+104xx (4864) + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+105xx (5120) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, 39, 39, 39, + 39, 39, 39, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10Cxx (5376) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+118xx (5632) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+16Exx (5888) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1E9xx (6144) + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +template +const T3 unicode_casefolding::ucf_segmenttable[] = +{ + 256, 512, 768, 1024, 1280, 1536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1792, 0, 0, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 2304, 0, 2560, 2816, + 0, 3072, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 3584, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3840, 4096, 0, 0, 0, 4352, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4608, + 0, 0, 0, 0, 4864, 5120, 0, 0, 0, 0, 0, 0, 5376, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5632, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5888, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6144 +}; + +template +const T3 unicode_casefolding::rev_indextable[] = +{ + // For common (0) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+00xx (256) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 35, 38, 41, 44, + 47, 50, 53, 56, 60, 63, 66, 69, 72, 75, 78, 0, 0, 0, 0, 0, + 0, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 35, 38, 41, 44, + 47, 50, 53, 56, 60, 63, 66, 69, 72, 75, 78, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 88, 91, 94, 97, 100, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, + 134, 137, 140, 143, 146, 149, 152, 0, 155, 158, 161, 164, 167, 170, 173, 1924, + 85, 88, 91, 94, 97, 100, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, + 134, 137, 140, 143, 146, 149, 152, 0, 155, 158, 161, 164, 167, 170, 173, 350, + + // For u+21xx (512) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 785, 0, 0, 0, 31, 100, 0, 0, 0, 0, + 0, 0, 2359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2359, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2362, 2365, 2368, 2371, 2374, 2377, 2380, 2383, 2386, 2389, 2392, 2395, 2398, 2401, 2404, 2407, + 2362, 2365, 2368, 2371, 2374, 2377, 2380, 2383, 2386, 2389, 2392, 2395, 2398, 2401, 2404, 2407, + 0, 0, 0, 2410, 2410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+01xx (768) + 176, 176, 179, 179, 182, 182, 185, 185, 188, 188, 191, 191, 194, 194, 197, 197, + 200, 200, 203, 203, 206, 206, 209, 209, 212, 212, 215, 215, 218, 218, 221, 221, + 224, 224, 227, 227, 230, 230, 233, 233, 236, 236, 239, 239, 242, 242, 245, 245, + 0, 0, 248, 248, 251, 251, 254, 254, 0, 257, 257, 260, 260, 263, 263, 266, + 266, 269, 269, 272, 272, 275, 275, 278, 278, 0, 281, 281, 284, 284, 287, 287, + 290, 290, 293, 293, 296, 296, 299, 299, 302, 302, 305, 305, 308, 308, 311, 311, + 314, 314, 317, 317, 320, 320, 323, 323, 326, 326, 329, 329, 332, 332, 335, 335, + 338, 338, 341, 341, 344, 344, 347, 347, 350, 353, 353, 356, 356, 359, 359, 56, + 651, 362, 365, 365, 368, 368, 371, 374, 374, 377, 380, 383, 383, 0, 386, 389, + 392, 395, 395, 398, 401, 540, 404, 407, 410, 410, 642, 0, 413, 416, 606, 419, + 422, 422, 425, 425, 428, 428, 431, 434, 434, 437, 0, 0, 440, 440, 443, 446, + 446, 449, 452, 455, 455, 458, 458, 461, 464, 464, 0, 0, 467, 467, 0, 543, + 0, 0, 0, 0, 470, 470, 470, 474, 474, 474, 478, 478, 478, 482, 482, 485, + 485, 488, 488, 491, 491, 494, 494, 497, 497, 500, 500, 503, 503, 386, 506, 506, + 509, 509, 512, 512, 515, 515, 518, 518, 521, 521, 524, 524, 527, 527, 530, 530, + 0, 533, 533, 533, 537, 537, 540, 543, 546, 546, 549, 549, 552, 552, 555, 555, + + // For u+03xx (1024) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 680, 680, 683, 683, 0, 0, 686, 686, 0, 0, 0, 843, 846, 849, 0, 689, + 0, 0, 0, 0, 0, 0, 692, 0, 695, 698, 701, 0, 704, 0, 707, 710, + 0, 713, 716, 720, 723, 726, 730, 733, 736, 675, 741, 745, 81, 748, 751, 754, + 757, 761, 0, 765, 769, 772, 775, 779, 782, 785, 789, 792, 692, 695, 698, 701, + 0, 713, 716, 720, 723, 726, 730, 733, 736, 675, 741, 745, 81, 748, 751, 754, + 757, 761, 765, 765, 769, 772, 775, 779, 782, 785, 789, 792, 704, 707, 710, 795, + 716, 736, 0, 0, 0, 775, 757, 795, 798, 798, 801, 801, 804, 804, 807, 807, + 810, 810, 813, 813, 816, 816, 819, 819, 822, 822, 825, 825, 828, 828, 831, 831, + 741, 761, 837, 689, 736, 726, 0, 834, 834, 837, 840, 840, 0, 843, 846, 849, + + // For u+02xx (1280) + 558, 558, 561, 561, 564, 564, 567, 567, 570, 570, 573, 573, 576, 576, 579, 579, + 582, 582, 585, 585, 588, 588, 591, 591, 594, 594, 597, 597, 600, 600, 603, 603, + 606, 0, 609, 609, 612, 612, 615, 615, 618, 618, 621, 621, 624, 624, 627, 627, + 630, 630, 633, 633, 0, 0, 0, 0, 0, 0, 636, 639, 639, 642, 645, 2674, + 2677, 648, 648, 651, 654, 657, 660, 660, 663, 663, 666, 666, 669, 669, 672, 672, + 2662, 2656, 2665, 362, 371, 0, 377, 380, 0, 389, 0, 392, 3130, 0, 0, 0, + 398, 3133, 0, 401, 0, 3088, 3127, 0, 407, 404, 3139, 2638, 3136, 0, 0, 413, + 0, 2659, 416, 0, 0, 419, 0, 0, 0, 0, 0, 0, 0, 2644, 0, 0, + 431, 0, 3181, 437, 0, 0, 0, 3145, 443, 654, 449, 452, 657, 0, 0, 0, + 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3148, 3142, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+2Cxx (1536) + 2491, 2494, 2497, 2500, 2503, 2506, 2509, 2512, 2515, 2518, 2521, 2524, 2527, 2530, 2533, 2536, + 2539, 2542, 2545, 2548, 2551, 2554, 2557, 2560, 2563, 2566, 2569, 2572, 2575, 2578, 2581, 2584, + 2587, 2590, 2593, 2596, 2599, 2602, 2605, 2608, 2611, 2614, 2617, 2620, 2623, 2626, 2629, 2632, + 2491, 2494, 2497, 2500, 2503, 2506, 2509, 2512, 2515, 2518, 2521, 2524, 2527, 2530, 2533, 2536, + 2539, 2542, 2545, 2548, 2551, 2554, 2557, 2560, 2563, 2566, 2569, 2572, 2575, 2578, 2581, 2584, + 2587, 2590, 2593, 2596, 2599, 2602, 2605, 2608, 2611, 2614, 2617, 2620, 2623, 2626, 2629, 2632, + 2635, 2635, 2638, 2641, 2644, 636, 645, 2647, 2647, 2650, 2650, 2653, 2653, 2656, 2659, 2662, + 2665, 0, 2668, 2668, 0, 2671, 2671, 0, 0, 0, 0, 0, 0, 0, 2674, 2677, + 2680, 2680, 2683, 2683, 2686, 2686, 2689, 2689, 2692, 2692, 2695, 2695, 2698, 2698, 2701, 2701, + 2704, 2704, 2707, 2707, 2710, 2710, 2713, 2713, 2716, 2716, 2719, 2719, 2722, 2722, 2725, 2725, + 2728, 2728, 2731, 2731, 2734, 2734, 2737, 2737, 2740, 2740, 2743, 2743, 2746, 2746, 2749, 2749, + 2752, 2752, 2755, 2755, 2758, 2758, 2761, 2761, 2764, 2764, 2767, 2767, 2770, 2770, 2773, 2773, + 2776, 2776, 2779, 2779, 2782, 2782, 2785, 2785, 2788, 2788, 2791, 2791, 2794, 2794, 2797, 2797, + 2800, 2800, 2803, 2803, 2806, 2806, 2809, 2809, 2812, 2812, 2815, 2815, 2818, 2818, 2821, 2821, + 2824, 2824, 2827, 2827, 0, 0, 0, 0, 0, 0, 0, 2830, 2830, 2833, 2833, 0, + 0, 0, 2836, 2836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Fxx (1792) + 2071, 2074, 2077, 2080, 2083, 2086, 2089, 2092, 2071, 2074, 2077, 2080, 2083, 2086, 2089, 2092, + 2095, 2098, 2101, 2104, 2107, 2110, 0, 0, 2095, 2098, 2101, 2104, 2107, 2110, 0, 0, + 2113, 2116, 2119, 2122, 2125, 2128, 2131, 2134, 2113, 2116, 2119, 2122, 2125, 2128, 2131, 2134, + 2137, 2140, 2143, 2146, 2149, 2152, 2155, 2158, 2137, 2140, 2143, 2146, 2149, 2152, 2155, 2158, + 2161, 2164, 2167, 2170, 2173, 2176, 0, 0, 2161, 2164, 2167, 2170, 2173, 2176, 0, 0, + 0, 2179, 0, 2182, 0, 2185, 0, 2188, 0, 2179, 0, 2182, 0, 2185, 0, 2188, + 2191, 2194, 2197, 2200, 2203, 2206, 2209, 2212, 2191, 2194, 2197, 2200, 2203, 2206, 2209, 2212, + 2293, 2296, 2302, 2305, 2308, 2311, 2323, 2326, 2344, 2347, 2335, 2338, 2350, 2353, 0, 0, + 2215, 2218, 2221, 2224, 2227, 2230, 2233, 2236, 2215, 2218, 2221, 2224, 2227, 2230, 2233, 2236, + 2239, 2242, 2245, 2248, 2251, 2254, 2257, 2260, 2239, 2242, 2245, 2248, 2251, 2254, 2257, 2260, + 2263, 2266, 2269, 2272, 2275, 2278, 2281, 2284, 2263, 2266, 2269, 2272, 2275, 2278, 2281, 2284, + 2287, 2290, 0, 2299, 0, 0, 0, 0, 2287, 2290, 2293, 2296, 2299, 0, 675, 0, + 0, 0, 0, 2314, 0, 0, 0, 0, 2302, 2305, 2308, 2311, 2314, 0, 0, 0, + 2317, 2320, 0, 0, 0, 0, 0, 0, 2317, 2320, 2323, 2326, 0, 0, 0, 0, + 2329, 2332, 0, 0, 0, 2341, 0, 0, 2329, 2332, 2335, 2338, 2341, 0, 0, 0, + 0, 0, 0, 2356, 0, 0, 0, 0, 2344, 2347, 2350, 2353, 2356, 0, 0, 0, + + // For u+04xx (2048) + 852, 855, 858, 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, 897, + 900, 903, 906, 910, 913, 917, 920, 923, 926, 929, 932, 935, 938, 941, 944, 948, + 951, 954, 958, 963, 966, 969, 972, 975, 978, 981, 984, 988, 991, 994, 997, 1000, + 900, 903, 906, 910, 913, 917, 920, 923, 926, 929, 932, 935, 938, 941, 944, 948, + 951, 954, 958, 963, 966, 969, 972, 975, 978, 981, 984, 988, 991, 994, 997, 1000, + 852, 855, 858, 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, 897, + 1003, 1003, 1006, 1006, 1010, 1010, 1013, 1013, 1016, 1016, 1019, 1019, 1022, 1022, 1025, 1025, + 1028, 1028, 1031, 1031, 1034, 1034, 1037, 1037, 1040, 1040, 1043, 1043, 1046, 1046, 1049, 1049, + 1052, 1052, 0, 0, 0, 0, 0, 0, 0, 0, 1055, 1055, 1058, 1058, 1061, 1061, + 1064, 1064, 1067, 1067, 1070, 1070, 1073, 1073, 1076, 1076, 1079, 1079, 1082, 1082, 1085, 1085, + 1088, 1088, 1091, 1091, 1094, 1094, 1097, 1097, 1100, 1100, 1103, 1103, 1106, 1106, 1109, 1109, + 1112, 1112, 1115, 1115, 1118, 1118, 1121, 1121, 1124, 1124, 1127, 1127, 1130, 1130, 1133, 1133, + 1136, 1139, 1139, 1142, 1142, 1145, 1145, 1148, 1148, 1151, 1151, 1154, 1154, 1157, 1157, 1136, + 1160, 1160, 1163, 1163, 1166, 1166, 1169, 1169, 1172, 1172, 1175, 1175, 1178, 1178, 1181, 1181, + 1184, 1184, 1187, 1187, 1190, 1190, 1193, 1193, 1196, 1196, 1199, 1199, 1202, 1202, 1205, 1205, + 1208, 1208, 1211, 1211, 1214, 1214, 1217, 1217, 1220, 1220, 1223, 1223, 1226, 1226, 1229, 1229, + + // For u+1Cxx (2304) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 906, 913, 944, 954, 958, 958, 984, 1006, 1556, 0, 0, 0, 0, 0, 0, 0, + 1560, 1563, 1566, 1569, 1572, 1575, 1578, 1581, 1584, 1587, 1590, 1593, 1596, 1599, 1602, 1605, + 1608, 1611, 1614, 1617, 1620, 1623, 1626, 1629, 1632, 1635, 1638, 1641, 1644, 1647, 1650, 1653, + 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, 1683, 1686, 0, 0, 1689, 1692, 1695, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+05xx (2560) + 1232, 1232, 1235, 1235, 1238, 1238, 1241, 1241, 1244, 1244, 1247, 1247, 1250, 1250, 1253, 1253, + 1256, 1256, 1259, 1259, 1262, 1262, 1265, 1265, 1268, 1268, 1271, 1271, 1274, 1274, 1277, 1277, + 1280, 1280, 1283, 1283, 1286, 1286, 1289, 1289, 1292, 1292, 1295, 1295, 1298, 1298, 1301, 1301, + 0, 1304, 1307, 1310, 1313, 1316, 1319, 1322, 1325, 1328, 1331, 1334, 1337, 1340, 1343, 1346, + 1349, 1352, 1355, 1358, 1361, 1364, 1367, 1370, 1373, 1376, 1379, 1382, 1385, 1388, 1391, 1394, + 1397, 1400, 1403, 1406, 1409, 1412, 1415, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1304, 1307, 1310, 1313, 1316, 1319, 1322, 1325, 1328, 1331, 1334, 1337, 1340, 1343, 1346, + 1349, 1352, 1355, 1358, 1361, 1364, 1367, 1370, 1373, 1376, 1379, 1382, 1385, 1388, 1391, 1394, + 1397, 1400, 1403, 1406, 1409, 1412, 1415, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+2Dxx (2816) + 1418, 1421, 1424, 1427, 1430, 1433, 1436, 1439, 1442, 1445, 1448, 1451, 1454, 1457, 1460, 1463, + 1466, 1469, 1472, 1475, 1478, 1481, 1484, 1487, 1490, 1493, 1496, 1499, 1502, 1505, 1508, 1511, + 1514, 1517, 1520, 1523, 1526, 1529, 0, 1532, 0, 0, 0, 0, 0, 1535, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10xx (3072) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1418, 1421, 1424, 1427, 1430, 1433, 1436, 1439, 1442, 1445, 1448, 1451, 1454, 1457, 1460, 1463, + 1466, 1469, 1472, 1475, 1478, 1481, 1484, 1487, 1490, 1493, 1496, 1499, 1502, 1505, 1508, 1511, + 1514, 1517, 1520, 1523, 1526, 1529, 0, 1532, 0, 0, 0, 0, 0, 1535, 0, 0, + 1560, 1563, 1566, 1569, 1572, 1575, 1578, 1581, 1584, 1587, 1590, 1593, 1596, 1599, 1602, 1605, + 1608, 1611, 1614, 1617, 1620, 1623, 1626, 1629, 1632, 1635, 1638, 1641, 1644, 1647, 1650, 1653, + 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, 1683, 1686, 0, 0, 1689, 1692, 1695, + + // For u+13xx (3328) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3205, 3208, 3211, 3214, 3217, 3220, 3223, 3226, 3229, 3232, 3235, 3238, 3241, 3244, 3247, 3250, + 3253, 3256, 3259, 3262, 3265, 3268, 3271, 3274, 3277, 3280, 3283, 3286, 3289, 3292, 3295, 3298, + 3301, 3304, 3307, 3310, 3313, 3316, 3319, 3322, 3325, 3328, 3331, 3334, 3337, 3340, 3343, 3346, + 3349, 3352, 3355, 3358, 3361, 3364, 3367, 3370, 3373, 3376, 3379, 3382, 3385, 3388, 3391, 3394, + 3397, 3400, 3403, 3406, 3409, 3412, 3415, 3418, 3421, 3424, 3427, 3430, 3433, 3436, 3439, 3442, + 1538, 1541, 1544, 1547, 1550, 1553, 0, 0, 1538, 1541, 1544, 1547, 1550, 1553, 0, 0, + + // For u+A6xx (3584) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2839, 2839, 2842, 2842, 2845, 2845, 2848, 2848, 2851, 2851, 1556, 1556, 2854, 2854, 2857, 2857, + 2860, 2860, 2863, 2863, 2866, 2866, 2869, 2869, 2872, 2872, 2875, 2875, 2878, 2878, 2881, 2881, + 2884, 2884, 2887, 2887, 2890, 2890, 2893, 2893, 2896, 2896, 2899, 2899, 2902, 2902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2905, 2905, 2908, 2908, 2911, 2911, 2914, 2914, 2917, 2917, 2920, 2920, 2923, 2923, 2926, 2926, + 2929, 2929, 2932, 2932, 2935, 2935, 2938, 2938, 2941, 2941, 2944, 2944, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Exx (3840) + 1698, 1698, 1701, 1701, 1704, 1704, 1707, 1707, 1710, 1710, 1713, 1713, 1716, 1716, 1719, 1719, + 1722, 1722, 1725, 1725, 1728, 1728, 1731, 1731, 1734, 1734, 1737, 1737, 1740, 1740, 1743, 1743, + 1746, 1746, 1749, 1749, 1752, 1752, 1755, 1755, 1758, 1758, 1761, 1761, 1764, 1764, 1767, 1767, + 1770, 1770, 1773, 1773, 1776, 1776, 1779, 1779, 1782, 1782, 1785, 1785, 1788, 1788, 1791, 1791, + 1794, 1794, 1797, 1797, 1800, 1800, 1803, 1803, 1806, 1806, 1809, 1809, 1812, 1812, 1815, 1815, + 1818, 1818, 1821, 1821, 1824, 1824, 1827, 1827, 1830, 1830, 1833, 1833, 1836, 1836, 1839, 1839, + 1842, 1842, 1846, 1846, 1849, 1849, 1852, 1852, 1855, 1855, 1858, 1858, 1861, 1861, 1864, 1864, + 1867, 1867, 1870, 1870, 1873, 1873, 1876, 1876, 1879, 1879, 1882, 1882, 1885, 1885, 1888, 1888, + 1891, 1891, 1894, 1894, 1897, 1897, 1900, 1900, 1903, 1903, 1906, 1906, 1909, 1909, 1912, 1912, + 1915, 1915, 1918, 1918, 1921, 1921, 0, 0, 0, 0, 0, 1842, 0, 0, 1924, 0, + 1927, 1927, 1930, 1930, 1933, 1933, 1936, 1936, 1939, 1939, 1942, 1942, 1945, 1945, 1948, 1948, + 1951, 1951, 1954, 1954, 1957, 1957, 1960, 1960, 1963, 1963, 1966, 1966, 1969, 1969, 1972, 1972, + 1975, 1975, 1978, 1978, 1981, 1981, 1984, 1984, 1987, 1987, 1990, 1990, 1993, 1993, 1996, 1996, + 1999, 1999, 2002, 2002, 2005, 2005, 2008, 2008, 2011, 2011, 2014, 2014, 2017, 2017, 2020, 2020, + 2023, 2023, 2026, 2026, 2029, 2029, 2032, 2032, 2035, 2035, 2038, 2038, 2041, 2041, 2044, 2044, + 2047, 2047, 2050, 2050, 2053, 2053, 2056, 2056, 2059, 2059, 2062, 2062, 2065, 2065, 2068, 2068, + + // For u+24xx (4096) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2413, 2416, 2419, 2422, 2425, 2428, 2431, 2434, 2437, 2440, + 2443, 2446, 2449, 2452, 2455, 2458, 2461, 2464, 2467, 2470, 2473, 2476, 2479, 2482, 2485, 2488, + 2413, 2416, 2419, 2422, 2425, 2428, 2431, 2434, 2437, 2440, 2443, 2446, 2449, 2452, 2455, 2458, + 2461, 2464, 2467, 2470, 2473, 2476, 2479, 2482, 2485, 2488, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Dxx (4352) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3067, 0, 0, 0, 2641, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+A7xx (4608) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2947, 2947, 2950, 2950, 2953, 2953, 2956, 2956, 2959, 2959, 2962, 2962, 2965, 2965, + 0, 0, 2968, 2968, 2971, 2971, 2974, 2974, 2977, 2977, 2980, 2980, 2983, 2983, 2986, 2986, + 2989, 2989, 2992, 2992, 2995, 2995, 2998, 2998, 3001, 3001, 3004, 3004, 3007, 3007, 3010, 3010, + 3013, 3013, 3016, 3016, 3019, 3019, 3022, 3022, 3025, 3025, 3028, 3028, 3031, 3031, 3034, 3034, + 3037, 3037, 3040, 3040, 3043, 3043, 3046, 3046, 3049, 3049, 3052, 3052, 3055, 3055, 3058, 3058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3061, 3061, 3064, 3064, 3067, 3070, 3070, + 3073, 3073, 3076, 3076, 3079, 3079, 3082, 3082, 0, 0, 0, 3085, 3085, 3088, 0, 0, + 3091, 3091, 3094, 3094, 3178, 0, 3097, 3097, 3100, 3100, 3103, 3103, 3106, 3106, 3109, 3109, + 3112, 3112, 3115, 3115, 3118, 3118, 3121, 3121, 3124, 3124, 3127, 3130, 3133, 3136, 3139, 0, + 3142, 3145, 3148, 3151, 3154, 3154, 3157, 3157, 3160, 3160, 3163, 3163, 3166, 3166, 3169, 3169, + 3172, 3172, 3175, 3175, 3178, 3181, 3184, 3187, 3187, 3190, 3190, 0, 0, 0, 0, 0, + 3193, 3193, 0, 0, 0, 0, 3196, 3196, 3199, 3199, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3202, 3202, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+ABxx (4864) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3205, 3208, 3211, 3214, 3217, 3220, 3223, 3226, 3229, 3232, 3235, 3238, 3241, 3244, 3247, 3250, + 3253, 3256, 3259, 3262, 3265, 3268, 3271, 3274, 3277, 3280, 3283, 3286, 3289, 3292, 3295, 3298, + 3301, 3304, 3307, 3310, 3313, 3316, 3319, 3322, 3325, 3328, 3331, 3334, 3337, 3340, 3343, 3346, + 3349, 3352, 3355, 3358, 3361, 3364, 3367, 3370, 3373, 3376, 3379, 3382, 3385, 3388, 3391, 3394, + 3397, 3400, 3403, 3406, 3409, 3412, 3415, 3418, 3421, 3424, 3427, 3430, 3433, 3436, 3439, 3442, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+FFxx (5120) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3445, 3448, 3451, 3454, 3457, 3460, 3463, 3466, 3469, 3472, 3475, 3478, 3481, 3484, 3487, + 3490, 3493, 3496, 3499, 3502, 3505, 3508, 3511, 3514, 3517, 3520, 0, 0, 0, 0, 0, + 0, 3445, 3448, 3451, 3454, 3457, 3460, 3463, 3466, 3469, 3472, 3475, 3478, 3481, 3484, 3487, + 3490, 3493, 3496, 3499, 3502, 3505, 3508, 3511, 3514, 3517, 3520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+104xx (5376) + 3523, 3526, 3529, 3532, 3535, 3538, 3541, 3544, 3547, 3550, 3553, 3556, 3559, 3562, 3565, 3568, + 3571, 3574, 3577, 3580, 3583, 3586, 3589, 3592, 3595, 3598, 3601, 3604, 3607, 3610, 3613, 3616, + 3619, 3622, 3625, 3628, 3631, 3634, 3637, 3640, 3523, 3526, 3529, 3532, 3535, 3538, 3541, 3544, + 3547, 3550, 3553, 3556, 3559, 3562, 3565, 3568, 3571, 3574, 3577, 3580, 3583, 3586, 3589, 3592, + 3595, 3598, 3601, 3604, 3607, 3610, 3613, 3616, 3619, 3622, 3625, 3628, 3631, 3634, 3637, 3640, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3643, 3646, 3649, 3652, 3655, 3658, 3661, 3664, 3667, 3670, 3673, 3676, 3679, 3682, 3685, 3688, + 3691, 3694, 3697, 3700, 3703, 3706, 3709, 3712, 3715, 3718, 3721, 3724, 3727, 3730, 3733, 3736, + 3739, 3742, 3745, 3748, 0, 0, 0, 0, 3643, 3646, 3649, 3652, 3655, 3658, 3661, 3664, + 3667, 3670, 3673, 3676, 3679, 3682, 3685, 3688, 3691, 3694, 3697, 3700, 3703, 3706, 3709, 3712, + 3715, 3718, 3721, 3724, 3727, 3730, 3733, 3736, 3739, 3742, 3745, 3748, 0, 0, 0, 0, + + // For u+105xx (5632) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3751, 3754, 3757, 3760, 3763, 3766, 3769, 3772, 3775, 3778, 3781, 0, 3784, 3787, 3790, 3793, + 3796, 3799, 3802, 3805, 3808, 3811, 3814, 3817, 3820, 3823, 3826, 0, 3829, 3832, 3835, 3838, + 3841, 3844, 3847, 0, 3850, 3853, 0, 3751, 3754, 3757, 3760, 3763, 3766, 3769, 3772, 3775, + 3778, 3781, 0, 3784, 3787, 3790, 3793, 3796, 3799, 3802, 3805, 3808, 3811, 3814, 3817, 3820, + 3823, 3826, 0, 3829, 3832, 3835, 3838, 3841, 3844, 3847, 0, 3850, 3853, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10Cxx (5888) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3856, 3859, 3862, 3865, 3868, 3871, 3874, 3877, 3880, 3883, 3886, 3889, 3892, 3895, 3898, 3901, + 3904, 3907, 3910, 3913, 3916, 3919, 3922, 3925, 3928, 3931, 3934, 3937, 3940, 3943, 3946, 3949, + 3952, 3955, 3958, 3961, 3964, 3967, 3970, 3973, 3976, 3979, 3982, 3985, 3988, 3991, 3994, 3997, + 4000, 4003, 4006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3856, 3859, 3862, 3865, 3868, 3871, 3874, 3877, 3880, 3883, 3886, 3889, 3892, 3895, 3898, 3901, + 3904, 3907, 3910, 3913, 3916, 3919, 3922, 3925, 3928, 3931, 3934, 3937, 3940, 3943, 3946, 3949, + 3952, 3955, 3958, 3961, 3964, 3967, 3970, 3973, 3976, 3979, 3982, 3985, 3988, 3991, 3994, 3997, + 4000, 4003, 4006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+118xx (6144) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4009, 4012, 4015, 4018, 4021, 4024, 4027, 4030, 4033, 4036, 4039, 4042, 4045, 4048, 4051, 4054, + 4057, 4060, 4063, 4066, 4069, 4072, 4075, 4078, 4081, 4084, 4087, 4090, 4093, 4096, 4099, 4102, + 4009, 4012, 4015, 4018, 4021, 4024, 4027, 4030, 4033, 4036, 4039, 4042, 4045, 4048, 4051, 4054, + 4057, 4060, 4063, 4066, 4069, 4072, 4075, 4078, 4081, 4084, 4087, 4090, 4093, 4096, 4099, 4102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+16Exx (6400) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4105, 4108, 4111, 4114, 4117, 4120, 4123, 4126, 4129, 4132, 4135, 4138, 4141, 4144, 4147, 4150, + 4153, 4156, 4159, 4162, 4165, 4168, 4171, 4174, 4177, 4180, 4183, 4186, 4189, 4192, 4195, 4198, + 4105, 4108, 4111, 4114, 4117, 4120, 4123, 4126, 4129, 4132, 4135, 4138, 4141, 4144, 4147, 4150, + 4153, 4156, 4159, 4162, 4165, 4168, 4171, 4174, 4177, 4180, 4183, 4186, 4189, 4192, 4195, 4198, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1E9xx (6656) + 4201, 4204, 4207, 4210, 4213, 4216, 4219, 4222, 4225, 4228, 4231, 4234, 4237, 4240, 4243, 4246, + 4249, 4252, 4255, 4258, 4261, 4264, 4267, 4270, 4273, 4276, 4279, 4282, 4285, 4288, 4291, 4294, + 4297, 4300, 4201, 4204, 4207, 4210, 4213, 4216, 4219, 4222, 4225, 4228, 4231, 4234, 4237, 4240, + 4243, 4246, 4249, 4252, 4255, 4258, 4261, 4264, 4267, 4270, 4273, 4276, 4279, 4282, 4285, 4288, + 4291, 4294, 4297, 4300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +template +const T3 unicode_casefolding::rev_segmenttable[] = +{ + 256, 768, 1280, 1024, 2048, 2560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3072, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 0, 2304, 4352, 3840, 1792, + 0, 512, 0, 0, 4096, 0, 0, 0, 0, 0, 0, 0, 1536, 2816, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3584, 4608, 0, 0, 0, 4864, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5120, + 0, 0, 0, 0, 5376, 5632, 0, 0, 0, 0, 0, 0, 5888, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6144, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6400, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6656 +}; + +template +const T2 unicode_casefolding::rev_charsettable[] = +{ + eos, // 0 + 0x0061, 0x0041, eos, + 0x0062, 0x0042, eos, + 0x0063, 0x0043, eos, + 0x0064, 0x0044, eos, // 10 + 0x0065, 0x0045, eos, + 0x0066, 0x0046, eos, + 0x0067, 0x0047, eos, + 0x0068, 0x0048, eos, // 22 + 0x0069, 0x0049, eos, + 0x006A, 0x004A, eos, + 0x006B, 0x004B, 0x212A, eos, // 31 + 0x006C, 0x004C, eos, + 0x006D, 0x004D, eos, + 0x006E, 0x004E, eos, // 41 + 0x006F, 0x004F, eos, + 0x0070, 0x0050, eos, + 0x0071, 0x0051, eos, // 50 + 0x0072, 0x0052, eos, + 0x0073, 0x0053, 0x017F, eos, + 0x0074, 0x0054, eos, // 60 + 0x0075, 0x0055, eos, + 0x0076, 0x0056, eos, + 0x0077, 0x0057, eos, + 0x0078, 0x0058, eos, // 72 + 0x0079, 0x0059, eos, + 0x007A, 0x005A, eos, + 0x03BC, 0x00B5, 0x039C, eos, // 81 + 0x00E0, 0x00C0, eos, + 0x00E1, 0x00C1, eos, + 0x00E2, 0x00C2, eos, // 91 + 0x00E3, 0x00C3, eos, + 0x00E4, 0x00C4, eos, + 0x00E5, 0x00C5, 0x212B, eos, // 100 + 0x00E6, 0x00C6, eos, + 0x00E7, 0x00C7, eos, + 0x00E8, 0x00C8, eos, // 110 + 0x00E9, 0x00C9, eos, + 0x00EA, 0x00CA, eos, + 0x00EB, 0x00CB, eos, + 0x00EC, 0x00CC, eos, // 122 + 0x00ED, 0x00CD, eos, + 0x00EE, 0x00CE, eos, + 0x00EF, 0x00CF, eos, // 131 + 0x00F0, 0x00D0, eos, + 0x00F1, 0x00D1, eos, + 0x00F2, 0x00D2, eos, // 140 + 0x00F3, 0x00D3, eos, + 0x00F4, 0x00D4, eos, + 0x00F5, 0x00D5, eos, + 0x00F6, 0x00D6, eos, // 152 + 0x00F8, 0x00D8, eos, + 0x00F9, 0x00D9, eos, + 0x00FA, 0x00DA, eos, // 161 + 0x00FB, 0x00DB, eos, + 0x00FC, 0x00DC, eos, + 0x00FD, 0x00DD, eos, // 170 + 0x00FE, 0x00DE, eos, + 0x0101, 0x0100, eos, + 0x0103, 0x0102, eos, + 0x0105, 0x0104, eos, // 182 + 0x0107, 0x0106, eos, + 0x0109, 0x0108, eos, + 0x010B, 0x010A, eos, // 191 + 0x010D, 0x010C, eos, + 0x010F, 0x010E, eos, + 0x0111, 0x0110, eos, // 200 + 0x0113, 0x0112, eos, + 0x0115, 0x0114, eos, + 0x0117, 0x0116, eos, + 0x0119, 0x0118, eos, // 212 + 0x011B, 0x011A, eos, + 0x011D, 0x011C, eos, + 0x011F, 0x011E, eos, // 221 + 0x0121, 0x0120, eos, + 0x0123, 0x0122, eos, + 0x0125, 0x0124, eos, // 230 + 0x0127, 0x0126, eos, + 0x0129, 0x0128, eos, + 0x012B, 0x012A, eos, + 0x012D, 0x012C, eos, // 242 + 0x012F, 0x012E, eos, + 0x0133, 0x0132, eos, + 0x0135, 0x0134, eos, // 251 + 0x0137, 0x0136, eos, + 0x013A, 0x0139, eos, + 0x013C, 0x013B, eos, // 260 + 0x013E, 0x013D, eos, + 0x0140, 0x013F, eos, + 0x0142, 0x0141, eos, + 0x0144, 0x0143, eos, // 272 + 0x0146, 0x0145, eos, + 0x0148, 0x0147, eos, + 0x014B, 0x014A, eos, // 281 + 0x014D, 0x014C, eos, + 0x014F, 0x014E, eos, + 0x0151, 0x0150, eos, // 290 + 0x0153, 0x0152, eos, + 0x0155, 0x0154, eos, + 0x0157, 0x0156, eos, + 0x0159, 0x0158, eos, // 302 + 0x015B, 0x015A, eos, + 0x015D, 0x015C, eos, + 0x015F, 0x015E, eos, // 311 + 0x0161, 0x0160, eos, + 0x0163, 0x0162, eos, + 0x0165, 0x0164, eos, // 320 + 0x0167, 0x0166, eos, + 0x0169, 0x0168, eos, + 0x016B, 0x016A, eos, + 0x016D, 0x016C, eos, // 332 + 0x016F, 0x016E, eos, + 0x0171, 0x0170, eos, + 0x0173, 0x0172, eos, // 341 + 0x0175, 0x0174, eos, + 0x0177, 0x0176, eos, + 0x00FF, 0x0178, eos, // 350 + 0x017A, 0x0179, eos, + 0x017C, 0x017B, eos, + 0x017E, 0x017D, eos, + 0x0253, 0x0181, eos, // 362 + 0x0183, 0x0182, eos, + 0x0185, 0x0184, eos, + 0x0254, 0x0186, eos, // 371 + 0x0188, 0x0187, eos, + 0x0256, 0x0189, eos, + 0x0257, 0x018A, eos, // 380 + 0x018C, 0x018B, eos, + 0x01DD, 0x018E, eos, + 0x0259, 0x018F, eos, + 0x025B, 0x0190, eos, // 392 + 0x0192, 0x0191, eos, + 0x0260, 0x0193, eos, + 0x0263, 0x0194, eos, // 401 + 0x0269, 0x0196, eos, + 0x0268, 0x0197, eos, + 0x0199, 0x0198, eos, // 410 + 0x026F, 0x019C, eos, + 0x0272, 0x019D, eos, + 0x0275, 0x019F, eos, + 0x01A1, 0x01A0, eos, // 422 + 0x01A3, 0x01A2, eos, + 0x01A5, 0x01A4, eos, + 0x0280, 0x01A6, eos, // 431 + 0x01A8, 0x01A7, eos, + 0x0283, 0x01A9, eos, + 0x01AD, 0x01AC, eos, // 440 + 0x0288, 0x01AE, eos, + 0x01B0, 0x01AF, eos, + 0x028A, 0x01B1, eos, + 0x028B, 0x01B2, eos, // 452 + 0x01B4, 0x01B3, eos, + 0x01B6, 0x01B5, eos, + 0x0292, 0x01B7, eos, // 461 + 0x01B9, 0x01B8, eos, + 0x01BD, 0x01BC, eos, + 0x01C6, 0x01C4, 0x01C5, eos, // 470 + 0x01C9, 0x01C7, 0x01C8, eos, + 0x01CC, 0x01CA, 0x01CB, eos, + 0x01CE, 0x01CD, eos, // 482 + 0x01D0, 0x01CF, eos, + 0x01D2, 0x01D1, eos, + 0x01D4, 0x01D3, eos, // 491 + 0x01D6, 0x01D5, eos, + 0x01D8, 0x01D7, eos, + 0x01DA, 0x01D9, eos, // 500 + 0x01DC, 0x01DB, eos, + 0x01DF, 0x01DE, eos, + 0x01E1, 0x01E0, eos, + 0x01E3, 0x01E2, eos, // 512 + 0x01E5, 0x01E4, eos, + 0x01E7, 0x01E6, eos, + 0x01E9, 0x01E8, eos, // 521 + 0x01EB, 0x01EA, eos, + 0x01ED, 0x01EC, eos, + 0x01EF, 0x01EE, eos, // 530 + 0x01F3, 0x01F1, 0x01F2, eos, + 0x01F5, 0x01F4, eos, + 0x0195, 0x01F6, eos, // 540 + 0x01BF, 0x01F7, eos, + 0x01F9, 0x01F8, eos, + 0x01FB, 0x01FA, eos, + 0x01FD, 0x01FC, eos, // 552 + 0x01FF, 0x01FE, eos, + 0x0201, 0x0200, eos, + 0x0203, 0x0202, eos, // 561 + 0x0205, 0x0204, eos, + 0x0207, 0x0206, eos, + 0x0209, 0x0208, eos, // 570 + 0x020B, 0x020A, eos, + 0x020D, 0x020C, eos, + 0x020F, 0x020E, eos, + 0x0211, 0x0210, eos, // 582 + 0x0213, 0x0212, eos, + 0x0215, 0x0214, eos, + 0x0217, 0x0216, eos, // 591 + 0x0219, 0x0218, eos, + 0x021B, 0x021A, eos, + 0x021D, 0x021C, eos, // 600 + 0x021F, 0x021E, eos, + 0x019E, 0x0220, eos, + 0x0223, 0x0222, eos, + 0x0225, 0x0224, eos, // 612 + 0x0227, 0x0226, eos, + 0x0229, 0x0228, eos, + 0x022B, 0x022A, eos, // 621 + 0x022D, 0x022C, eos, + 0x022F, 0x022E, eos, + 0x0231, 0x0230, eos, // 630 + 0x0233, 0x0232, eos, + 0x2C65, 0x023A, eos, + 0x023C, 0x023B, eos, + 0x019A, 0x023D, eos, // 642 + 0x2C66, 0x023E, eos, + 0x0242, 0x0241, eos, + 0x0180, 0x0243, eos, // 651 + 0x0289, 0x0244, eos, + 0x028C, 0x0245, eos, + 0x0247, 0x0246, eos, // 660 + 0x0249, 0x0248, eos, + 0x024B, 0x024A, eos, + 0x024D, 0x024C, eos, + 0x024F, 0x024E, eos, // 672 + 0x03B9, 0x0345, 0x0399, 0x1FBE, eos, + 0x0371, 0x0370, eos, // 680 + 0x0373, 0x0372, eos, + 0x0377, 0x0376, eos, + 0x03F3, 0x037F, eos, + 0x03AC, 0x0386, eos, // 692 + 0x03AD, 0x0388, eos, + 0x03AE, 0x0389, eos, + 0x03AF, 0x038A, eos, // 701 + 0x03CC, 0x038C, eos, + 0x03CD, 0x038E, eos, + 0x03CE, 0x038F, eos, // 710 + 0x03B1, 0x0391, eos, + 0x03B2, 0x0392, 0x03D0, eos, + 0x03B3, 0x0393, eos, // 720 + 0x03B4, 0x0394, eos, + 0x03B5, 0x0395, 0x03F5, eos, + 0x03B6, 0x0396, eos, // 730 + 0x03B7, 0x0397, eos, + 0x03B8, 0x0398, 0x03D1, 0x03F4, eos, + 0x03BA, 0x039A, 0x03F0, eos, // 741 + 0x03BB, 0x039B, eos, + 0x03BD, 0x039D, eos, + 0x03BE, 0x039E, eos, // 751 + 0x03BF, 0x039F, eos, + 0x03C0, 0x03A0, 0x03D6, eos, + 0x03C1, 0x03A1, 0x03F1, eos, // 761 + 0x03C3, 0x03A3, 0x03C2, eos, + 0x03C4, 0x03A4, eos, + 0x03C5, 0x03A5, eos, // 772 + 0x03C6, 0x03A6, 0x03D5, eos, + 0x03C7, 0x03A7, eos, + 0x03C8, 0x03A8, eos, // 782 + 0x03C9, 0x03A9, 0x2126, eos, + 0x03CA, 0x03AA, eos, + 0x03CB, 0x03AB, eos, // 792 + 0x03D7, 0x03CF, eos, + 0x03D9, 0x03D8, eos, + 0x03DB, 0x03DA, eos, // 801 + 0x03DD, 0x03DC, eos, + 0x03DF, 0x03DE, eos, + 0x03E1, 0x03E0, eos, // 810 + 0x03E3, 0x03E2, eos, + 0x03E5, 0x03E4, eos, + 0x03E7, 0x03E6, eos, + 0x03E9, 0x03E8, eos, // 822 + 0x03EB, 0x03EA, eos, + 0x03ED, 0x03EC, eos, + 0x03EF, 0x03EE, eos, // 831 + 0x03F8, 0x03F7, eos, + 0x03F2, 0x03F9, eos, + 0x03FB, 0x03FA, eos, // 840 + 0x037B, 0x03FD, eos, + 0x037C, 0x03FE, eos, + 0x037D, 0x03FF, eos, + 0x0450, 0x0400, eos, // 852 + 0x0451, 0x0401, eos, + 0x0452, 0x0402, eos, + 0x0453, 0x0403, eos, // 861 + 0x0454, 0x0404, eos, + 0x0455, 0x0405, eos, + 0x0456, 0x0406, eos, // 870 + 0x0457, 0x0407, eos, + 0x0458, 0x0408, eos, + 0x0459, 0x0409, eos, + 0x045A, 0x040A, eos, // 882 + 0x045B, 0x040B, eos, + 0x045C, 0x040C, eos, + 0x045D, 0x040D, eos, // 891 + 0x045E, 0x040E, eos, + 0x045F, 0x040F, eos, + 0x0430, 0x0410, eos, // 900 + 0x0431, 0x0411, eos, + 0x0432, 0x0412, 0x1C80, eos, + 0x0433, 0x0413, eos, // 910 + 0x0434, 0x0414, 0x1C81, eos, + 0x0435, 0x0415, eos, + 0x0436, 0x0416, eos, // 920 + 0x0437, 0x0417, eos, + 0x0438, 0x0418, eos, + 0x0439, 0x0419, eos, + 0x043A, 0x041A, eos, // 932 + 0x043B, 0x041B, eos, + 0x043C, 0x041C, eos, + 0x043D, 0x041D, eos, // 941 + 0x043E, 0x041E, 0x1C82, eos, + 0x043F, 0x041F, eos, + 0x0440, 0x0420, eos, // 951 + 0x0441, 0x0421, 0x1C83, eos, + 0x0442, 0x0422, 0x1C84, 0x1C85, eos, + 0x0443, 0x0423, eos, // 963 + 0x0444, 0x0424, eos, + 0x0445, 0x0425, eos, + 0x0446, 0x0426, eos, // 972 + 0x0447, 0x0427, eos, + 0x0448, 0x0428, eos, + 0x0449, 0x0429, eos, // 981 + 0x044A, 0x042A, 0x1C86, eos, + 0x044B, 0x042B, eos, + 0x044C, 0x042C, eos, // 991 + 0x044D, 0x042D, eos, + 0x044E, 0x042E, eos, + 0x044F, 0x042F, eos, // 1000 + 0x0461, 0x0460, eos, + 0x0463, 0x0462, 0x1C87, eos, + 0x0465, 0x0464, eos, // 1010 + 0x0467, 0x0466, eos, + 0x0469, 0x0468, eos, + 0x046B, 0x046A, eos, + 0x046D, 0x046C, eos, // 1022 + 0x046F, 0x046E, eos, + 0x0471, 0x0470, eos, + 0x0473, 0x0472, eos, // 1031 + 0x0475, 0x0474, eos, + 0x0477, 0x0476, eos, + 0x0479, 0x0478, eos, // 1040 + 0x047B, 0x047A, eos, + 0x047D, 0x047C, eos, + 0x047F, 0x047E, eos, + 0x0481, 0x0480, eos, // 1052 + 0x048B, 0x048A, eos, + 0x048D, 0x048C, eos, + 0x048F, 0x048E, eos, // 1061 + 0x0491, 0x0490, eos, + 0x0493, 0x0492, eos, + 0x0495, 0x0494, eos, // 1070 + 0x0497, 0x0496, eos, + 0x0499, 0x0498, eos, + 0x049B, 0x049A, eos, + 0x049D, 0x049C, eos, // 1082 + 0x049F, 0x049E, eos, + 0x04A1, 0x04A0, eos, + 0x04A3, 0x04A2, eos, // 1091 + 0x04A5, 0x04A4, eos, + 0x04A7, 0x04A6, eos, + 0x04A9, 0x04A8, eos, // 1100 + 0x04AB, 0x04AA, eos, + 0x04AD, 0x04AC, eos, + 0x04AF, 0x04AE, eos, + 0x04B1, 0x04B0, eos, // 1112 + 0x04B3, 0x04B2, eos, + 0x04B5, 0x04B4, eos, + 0x04B7, 0x04B6, eos, // 1121 + 0x04B9, 0x04B8, eos, + 0x04BB, 0x04BA, eos, + 0x04BD, 0x04BC, eos, // 1130 + 0x04BF, 0x04BE, eos, + 0x04CF, 0x04C0, eos, + 0x04C2, 0x04C1, eos, + 0x04C4, 0x04C3, eos, // 1142 + 0x04C6, 0x04C5, eos, + 0x04C8, 0x04C7, eos, + 0x04CA, 0x04C9, eos, // 1151 + 0x04CC, 0x04CB, eos, + 0x04CE, 0x04CD, eos, + 0x04D1, 0x04D0, eos, // 1160 + 0x04D3, 0x04D2, eos, + 0x04D5, 0x04D4, eos, + 0x04D7, 0x04D6, eos, + 0x04D9, 0x04D8, eos, // 1172 + 0x04DB, 0x04DA, eos, + 0x04DD, 0x04DC, eos, + 0x04DF, 0x04DE, eos, // 1181 + 0x04E1, 0x04E0, eos, + 0x04E3, 0x04E2, eos, + 0x04E5, 0x04E4, eos, // 1190 + 0x04E7, 0x04E6, eos, + 0x04E9, 0x04E8, eos, + 0x04EB, 0x04EA, eos, + 0x04ED, 0x04EC, eos, // 1202 + 0x04EF, 0x04EE, eos, + 0x04F1, 0x04F0, eos, + 0x04F3, 0x04F2, eos, // 1211 + 0x04F5, 0x04F4, eos, + 0x04F7, 0x04F6, eos, + 0x04F9, 0x04F8, eos, // 1220 + 0x04FB, 0x04FA, eos, + 0x04FD, 0x04FC, eos, + 0x04FF, 0x04FE, eos, + 0x0501, 0x0500, eos, // 1232 + 0x0503, 0x0502, eos, + 0x0505, 0x0504, eos, + 0x0507, 0x0506, eos, // 1241 + 0x0509, 0x0508, eos, + 0x050B, 0x050A, eos, + 0x050D, 0x050C, eos, // 1250 + 0x050F, 0x050E, eos, + 0x0511, 0x0510, eos, + 0x0513, 0x0512, eos, + 0x0515, 0x0514, eos, // 1262 + 0x0517, 0x0516, eos, + 0x0519, 0x0518, eos, + 0x051B, 0x051A, eos, // 1271 + 0x051D, 0x051C, eos, + 0x051F, 0x051E, eos, + 0x0521, 0x0520, eos, // 1280 + 0x0523, 0x0522, eos, + 0x0525, 0x0524, eos, + 0x0527, 0x0526, eos, + 0x0529, 0x0528, eos, // 1292 + 0x052B, 0x052A, eos, + 0x052D, 0x052C, eos, + 0x052F, 0x052E, eos, // 1301 + 0x0561, 0x0531, eos, + 0x0562, 0x0532, eos, + 0x0563, 0x0533, eos, // 1310 + 0x0564, 0x0534, eos, + 0x0565, 0x0535, eos, + 0x0566, 0x0536, eos, + 0x0567, 0x0537, eos, // 1322 + 0x0568, 0x0538, eos, + 0x0569, 0x0539, eos, + 0x056A, 0x053A, eos, // 1331 + 0x056B, 0x053B, eos, + 0x056C, 0x053C, eos, + 0x056D, 0x053D, eos, // 1340 + 0x056E, 0x053E, eos, + 0x056F, 0x053F, eos, + 0x0570, 0x0540, eos, + 0x0571, 0x0541, eos, // 1352 + 0x0572, 0x0542, eos, + 0x0573, 0x0543, eos, + 0x0574, 0x0544, eos, // 1361 + 0x0575, 0x0545, eos, + 0x0576, 0x0546, eos, + 0x0577, 0x0547, eos, // 1370 + 0x0578, 0x0548, eos, + 0x0579, 0x0549, eos, + 0x057A, 0x054A, eos, + 0x057B, 0x054B, eos, // 1382 + 0x057C, 0x054C, eos, + 0x057D, 0x054D, eos, + 0x057E, 0x054E, eos, // 1391 + 0x057F, 0x054F, eos, + 0x0580, 0x0550, eos, + 0x0581, 0x0551, eos, // 1400 + 0x0582, 0x0552, eos, + 0x0583, 0x0553, eos, + 0x0584, 0x0554, eos, + 0x0585, 0x0555, eos, // 1412 + 0x0586, 0x0556, eos, + 0x2D00, 0x10A0, eos, + 0x2D01, 0x10A1, eos, // 1421 + 0x2D02, 0x10A2, eos, + 0x2D03, 0x10A3, eos, + 0x2D04, 0x10A4, eos, // 1430 + 0x2D05, 0x10A5, eos, + 0x2D06, 0x10A6, eos, + 0x2D07, 0x10A7, eos, + 0x2D08, 0x10A8, eos, // 1442 + 0x2D09, 0x10A9, eos, + 0x2D0A, 0x10AA, eos, + 0x2D0B, 0x10AB, eos, // 1451 + 0x2D0C, 0x10AC, eos, + 0x2D0D, 0x10AD, eos, + 0x2D0E, 0x10AE, eos, // 1460 + 0x2D0F, 0x10AF, eos, + 0x2D10, 0x10B0, eos, + 0x2D11, 0x10B1, eos, + 0x2D12, 0x10B2, eos, // 1472 + 0x2D13, 0x10B3, eos, + 0x2D14, 0x10B4, eos, + 0x2D15, 0x10B5, eos, // 1481 + 0x2D16, 0x10B6, eos, + 0x2D17, 0x10B7, eos, + 0x2D18, 0x10B8, eos, // 1490 + 0x2D19, 0x10B9, eos, + 0x2D1A, 0x10BA, eos, + 0x2D1B, 0x10BB, eos, + 0x2D1C, 0x10BC, eos, // 1502 + 0x2D1D, 0x10BD, eos, + 0x2D1E, 0x10BE, eos, + 0x2D1F, 0x10BF, eos, // 1511 + 0x2D20, 0x10C0, eos, + 0x2D21, 0x10C1, eos, + 0x2D22, 0x10C2, eos, // 1520 + 0x2D23, 0x10C3, eos, + 0x2D24, 0x10C4, eos, + 0x2D25, 0x10C5, eos, + 0x2D27, 0x10C7, eos, // 1532 + 0x2D2D, 0x10CD, eos, + 0x13F0, 0x13F8, eos, + 0x13F1, 0x13F9, eos, // 1541 + 0x13F2, 0x13FA, eos, + 0x13F3, 0x13FB, eos, + 0x13F4, 0x13FC, eos, // 1550 + 0x13F5, 0x13FD, eos, + 0xA64B, 0x1C88, 0xA64A, eos, + 0x10D0, 0x1C90, eos, // 1560 + 0x10D1, 0x1C91, eos, + 0x10D2, 0x1C92, eos, + 0x10D3, 0x1C93, eos, + 0x10D4, 0x1C94, eos, // 1572 + 0x10D5, 0x1C95, eos, + 0x10D6, 0x1C96, eos, + 0x10D7, 0x1C97, eos, // 1581 + 0x10D8, 0x1C98, eos, + 0x10D9, 0x1C99, eos, + 0x10DA, 0x1C9A, eos, // 1590 + 0x10DB, 0x1C9B, eos, + 0x10DC, 0x1C9C, eos, + 0x10DD, 0x1C9D, eos, + 0x10DE, 0x1C9E, eos, // 1602 + 0x10DF, 0x1C9F, eos, + 0x10E0, 0x1CA0, eos, + 0x10E1, 0x1CA1, eos, // 1611 + 0x10E2, 0x1CA2, eos, + 0x10E3, 0x1CA3, eos, + 0x10E4, 0x1CA4, eos, // 1620 + 0x10E5, 0x1CA5, eos, + 0x10E6, 0x1CA6, eos, + 0x10E7, 0x1CA7, eos, + 0x10E8, 0x1CA8, eos, // 1632 + 0x10E9, 0x1CA9, eos, + 0x10EA, 0x1CAA, eos, + 0x10EB, 0x1CAB, eos, // 1641 + 0x10EC, 0x1CAC, eos, + 0x10ED, 0x1CAD, eos, + 0x10EE, 0x1CAE, eos, // 1650 + 0x10EF, 0x1CAF, eos, + 0x10F0, 0x1CB0, eos, + 0x10F1, 0x1CB1, eos, + 0x10F2, 0x1CB2, eos, // 1662 + 0x10F3, 0x1CB3, eos, + 0x10F4, 0x1CB4, eos, + 0x10F5, 0x1CB5, eos, // 1671 + 0x10F6, 0x1CB6, eos, + 0x10F7, 0x1CB7, eos, + 0x10F8, 0x1CB8, eos, // 1680 + 0x10F9, 0x1CB9, eos, + 0x10FA, 0x1CBA, eos, + 0x10FD, 0x1CBD, eos, + 0x10FE, 0x1CBE, eos, // 1692 + 0x10FF, 0x1CBF, eos, + 0x1E01, 0x1E00, eos, + 0x1E03, 0x1E02, eos, // 1701 + 0x1E05, 0x1E04, eos, + 0x1E07, 0x1E06, eos, + 0x1E09, 0x1E08, eos, // 1710 + 0x1E0B, 0x1E0A, eos, + 0x1E0D, 0x1E0C, eos, + 0x1E0F, 0x1E0E, eos, + 0x1E11, 0x1E10, eos, // 1722 + 0x1E13, 0x1E12, eos, + 0x1E15, 0x1E14, eos, + 0x1E17, 0x1E16, eos, // 1731 + 0x1E19, 0x1E18, eos, + 0x1E1B, 0x1E1A, eos, + 0x1E1D, 0x1E1C, eos, // 1740 + 0x1E1F, 0x1E1E, eos, + 0x1E21, 0x1E20, eos, + 0x1E23, 0x1E22, eos, + 0x1E25, 0x1E24, eos, // 1752 + 0x1E27, 0x1E26, eos, + 0x1E29, 0x1E28, eos, + 0x1E2B, 0x1E2A, eos, // 1761 + 0x1E2D, 0x1E2C, eos, + 0x1E2F, 0x1E2E, eos, + 0x1E31, 0x1E30, eos, // 1770 + 0x1E33, 0x1E32, eos, + 0x1E35, 0x1E34, eos, + 0x1E37, 0x1E36, eos, + 0x1E39, 0x1E38, eos, // 1782 + 0x1E3B, 0x1E3A, eos, + 0x1E3D, 0x1E3C, eos, + 0x1E3F, 0x1E3E, eos, // 1791 + 0x1E41, 0x1E40, eos, + 0x1E43, 0x1E42, eos, + 0x1E45, 0x1E44, eos, // 1800 + 0x1E47, 0x1E46, eos, + 0x1E49, 0x1E48, eos, + 0x1E4B, 0x1E4A, eos, + 0x1E4D, 0x1E4C, eos, // 1812 + 0x1E4F, 0x1E4E, eos, + 0x1E51, 0x1E50, eos, + 0x1E53, 0x1E52, eos, // 1821 + 0x1E55, 0x1E54, eos, + 0x1E57, 0x1E56, eos, + 0x1E59, 0x1E58, eos, // 1830 + 0x1E5B, 0x1E5A, eos, + 0x1E5D, 0x1E5C, eos, + 0x1E5F, 0x1E5E, eos, + 0x1E61, 0x1E60, 0x1E9B, eos, // 1842 + 0x1E63, 0x1E62, eos, + 0x1E65, 0x1E64, eos, + 0x1E67, 0x1E66, eos, // 1852 + 0x1E69, 0x1E68, eos, + 0x1E6B, 0x1E6A, eos, + 0x1E6D, 0x1E6C, eos, // 1861 + 0x1E6F, 0x1E6E, eos, + 0x1E71, 0x1E70, eos, + 0x1E73, 0x1E72, eos, // 1870 + 0x1E75, 0x1E74, eos, + 0x1E77, 0x1E76, eos, + 0x1E79, 0x1E78, eos, + 0x1E7B, 0x1E7A, eos, // 1882 + 0x1E7D, 0x1E7C, eos, + 0x1E7F, 0x1E7E, eos, + 0x1E81, 0x1E80, eos, // 1891 + 0x1E83, 0x1E82, eos, + 0x1E85, 0x1E84, eos, + 0x1E87, 0x1E86, eos, // 1900 + 0x1E89, 0x1E88, eos, + 0x1E8B, 0x1E8A, eos, + 0x1E8D, 0x1E8C, eos, + 0x1E8F, 0x1E8E, eos, // 1912 + 0x1E91, 0x1E90, eos, + 0x1E93, 0x1E92, eos, + 0x1E95, 0x1E94, eos, // 1921 + 0x00DF, 0x1E9E, eos, + 0x1EA1, 0x1EA0, eos, + 0x1EA3, 0x1EA2, eos, // 1930 + 0x1EA5, 0x1EA4, eos, + 0x1EA7, 0x1EA6, eos, + 0x1EA9, 0x1EA8, eos, + 0x1EAB, 0x1EAA, eos, // 1942 + 0x1EAD, 0x1EAC, eos, + 0x1EAF, 0x1EAE, eos, + 0x1EB1, 0x1EB0, eos, // 1951 + 0x1EB3, 0x1EB2, eos, + 0x1EB5, 0x1EB4, eos, + 0x1EB7, 0x1EB6, eos, // 1960 + 0x1EB9, 0x1EB8, eos, + 0x1EBB, 0x1EBA, eos, + 0x1EBD, 0x1EBC, eos, + 0x1EBF, 0x1EBE, eos, // 1972 + 0x1EC1, 0x1EC0, eos, + 0x1EC3, 0x1EC2, eos, + 0x1EC5, 0x1EC4, eos, // 1981 + 0x1EC7, 0x1EC6, eos, + 0x1EC9, 0x1EC8, eos, + 0x1ECB, 0x1ECA, eos, // 1990 + 0x1ECD, 0x1ECC, eos, + 0x1ECF, 0x1ECE, eos, + 0x1ED1, 0x1ED0, eos, + 0x1ED3, 0x1ED2, eos, // 2002 + 0x1ED5, 0x1ED4, eos, + 0x1ED7, 0x1ED6, eos, + 0x1ED9, 0x1ED8, eos, // 2011 + 0x1EDB, 0x1EDA, eos, + 0x1EDD, 0x1EDC, eos, + 0x1EDF, 0x1EDE, eos, // 2020 + 0x1EE1, 0x1EE0, eos, + 0x1EE3, 0x1EE2, eos, + 0x1EE5, 0x1EE4, eos, + 0x1EE7, 0x1EE6, eos, // 2032 + 0x1EE9, 0x1EE8, eos, + 0x1EEB, 0x1EEA, eos, + 0x1EED, 0x1EEC, eos, // 2041 + 0x1EEF, 0x1EEE, eos, + 0x1EF1, 0x1EF0, eos, + 0x1EF3, 0x1EF2, eos, // 2050 + 0x1EF5, 0x1EF4, eos, + 0x1EF7, 0x1EF6, eos, + 0x1EF9, 0x1EF8, eos, + 0x1EFB, 0x1EFA, eos, // 2062 + 0x1EFD, 0x1EFC, eos, + 0x1EFF, 0x1EFE, eos, + 0x1F00, 0x1F08, eos, // 2071 + 0x1F01, 0x1F09, eos, + 0x1F02, 0x1F0A, eos, + 0x1F03, 0x1F0B, eos, // 2080 + 0x1F04, 0x1F0C, eos, + 0x1F05, 0x1F0D, eos, + 0x1F06, 0x1F0E, eos, + 0x1F07, 0x1F0F, eos, // 2092 + 0x1F10, 0x1F18, eos, + 0x1F11, 0x1F19, eos, + 0x1F12, 0x1F1A, eos, // 2101 + 0x1F13, 0x1F1B, eos, + 0x1F14, 0x1F1C, eos, + 0x1F15, 0x1F1D, eos, // 2110 + 0x1F20, 0x1F28, eos, + 0x1F21, 0x1F29, eos, + 0x1F22, 0x1F2A, eos, + 0x1F23, 0x1F2B, eos, // 2122 + 0x1F24, 0x1F2C, eos, + 0x1F25, 0x1F2D, eos, + 0x1F26, 0x1F2E, eos, // 2131 + 0x1F27, 0x1F2F, eos, + 0x1F30, 0x1F38, eos, + 0x1F31, 0x1F39, eos, // 2140 + 0x1F32, 0x1F3A, eos, + 0x1F33, 0x1F3B, eos, + 0x1F34, 0x1F3C, eos, + 0x1F35, 0x1F3D, eos, // 2152 + 0x1F36, 0x1F3E, eos, + 0x1F37, 0x1F3F, eos, + 0x1F40, 0x1F48, eos, // 2161 + 0x1F41, 0x1F49, eos, + 0x1F42, 0x1F4A, eos, + 0x1F43, 0x1F4B, eos, // 2170 + 0x1F44, 0x1F4C, eos, + 0x1F45, 0x1F4D, eos, + 0x1F51, 0x1F59, eos, + 0x1F53, 0x1F5B, eos, // 2182 + 0x1F55, 0x1F5D, eos, + 0x1F57, 0x1F5F, eos, + 0x1F60, 0x1F68, eos, // 2191 + 0x1F61, 0x1F69, eos, + 0x1F62, 0x1F6A, eos, + 0x1F63, 0x1F6B, eos, // 2200 + 0x1F64, 0x1F6C, eos, + 0x1F65, 0x1F6D, eos, + 0x1F66, 0x1F6E, eos, + 0x1F67, 0x1F6F, eos, // 2212 + 0x1F80, 0x1F88, eos, + 0x1F81, 0x1F89, eos, + 0x1F82, 0x1F8A, eos, // 2221 + 0x1F83, 0x1F8B, eos, + 0x1F84, 0x1F8C, eos, + 0x1F85, 0x1F8D, eos, // 2230 + 0x1F86, 0x1F8E, eos, + 0x1F87, 0x1F8F, eos, + 0x1F90, 0x1F98, eos, + 0x1F91, 0x1F99, eos, // 2242 + 0x1F92, 0x1F9A, eos, + 0x1F93, 0x1F9B, eos, + 0x1F94, 0x1F9C, eos, // 2251 + 0x1F95, 0x1F9D, eos, + 0x1F96, 0x1F9E, eos, + 0x1F97, 0x1F9F, eos, // 2260 + 0x1FA0, 0x1FA8, eos, + 0x1FA1, 0x1FA9, eos, + 0x1FA2, 0x1FAA, eos, + 0x1FA3, 0x1FAB, eos, // 2272 + 0x1FA4, 0x1FAC, eos, + 0x1FA5, 0x1FAD, eos, + 0x1FA6, 0x1FAE, eos, // 2281 + 0x1FA7, 0x1FAF, eos, + 0x1FB0, 0x1FB8, eos, + 0x1FB1, 0x1FB9, eos, // 2290 + 0x1F70, 0x1FBA, eos, + 0x1F71, 0x1FBB, eos, + 0x1FB3, 0x1FBC, eos, + 0x1F72, 0x1FC8, eos, // 2302 + 0x1F73, 0x1FC9, eos, + 0x1F74, 0x1FCA, eos, + 0x1F75, 0x1FCB, eos, // 2311 + 0x1FC3, 0x1FCC, eos, + 0x1FD0, 0x1FD8, eos, + 0x1FD1, 0x1FD9, eos, // 2320 + 0x1F76, 0x1FDA, eos, + 0x1F77, 0x1FDB, eos, + 0x1FE0, 0x1FE8, eos, + 0x1FE1, 0x1FE9, eos, // 2332 + 0x1F7A, 0x1FEA, eos, + 0x1F7B, 0x1FEB, eos, + 0x1FE5, 0x1FEC, eos, // 2341 + 0x1F78, 0x1FF8, eos, + 0x1F79, 0x1FF9, eos, + 0x1F7C, 0x1FFA, eos, // 2350 + 0x1F7D, 0x1FFB, eos, + 0x1FF3, 0x1FFC, eos, + 0x214E, 0x2132, eos, + 0x2170, 0x2160, eos, // 2362 + 0x2171, 0x2161, eos, + 0x2172, 0x2162, eos, + 0x2173, 0x2163, eos, // 2371 + 0x2174, 0x2164, eos, + 0x2175, 0x2165, eos, + 0x2176, 0x2166, eos, // 2380 + 0x2177, 0x2167, eos, + 0x2178, 0x2168, eos, + 0x2179, 0x2169, eos, + 0x217A, 0x216A, eos, // 2392 + 0x217B, 0x216B, eos, + 0x217C, 0x216C, eos, + 0x217D, 0x216D, eos, // 2401 + 0x217E, 0x216E, eos, + 0x217F, 0x216F, eos, + 0x2184, 0x2183, eos, // 2410 + 0x24D0, 0x24B6, eos, + 0x24D1, 0x24B7, eos, + 0x24D2, 0x24B8, eos, + 0x24D3, 0x24B9, eos, // 2422 + 0x24D4, 0x24BA, eos, + 0x24D5, 0x24BB, eos, + 0x24D6, 0x24BC, eos, // 2431 + 0x24D7, 0x24BD, eos, + 0x24D8, 0x24BE, eos, + 0x24D9, 0x24BF, eos, // 2440 + 0x24DA, 0x24C0, eos, + 0x24DB, 0x24C1, eos, + 0x24DC, 0x24C2, eos, + 0x24DD, 0x24C3, eos, // 2452 + 0x24DE, 0x24C4, eos, + 0x24DF, 0x24C5, eos, + 0x24E0, 0x24C6, eos, // 2461 + 0x24E1, 0x24C7, eos, + 0x24E2, 0x24C8, eos, + 0x24E3, 0x24C9, eos, // 2470 + 0x24E4, 0x24CA, eos, + 0x24E5, 0x24CB, eos, + 0x24E6, 0x24CC, eos, + 0x24E7, 0x24CD, eos, // 2482 + 0x24E8, 0x24CE, eos, + 0x24E9, 0x24CF, eos, + 0x2C30, 0x2C00, eos, // 2491 + 0x2C31, 0x2C01, eos, + 0x2C32, 0x2C02, eos, + 0x2C33, 0x2C03, eos, // 2500 + 0x2C34, 0x2C04, eos, + 0x2C35, 0x2C05, eos, + 0x2C36, 0x2C06, eos, + 0x2C37, 0x2C07, eos, // 2512 + 0x2C38, 0x2C08, eos, + 0x2C39, 0x2C09, eos, + 0x2C3A, 0x2C0A, eos, // 2521 + 0x2C3B, 0x2C0B, eos, + 0x2C3C, 0x2C0C, eos, + 0x2C3D, 0x2C0D, eos, // 2530 + 0x2C3E, 0x2C0E, eos, + 0x2C3F, 0x2C0F, eos, + 0x2C40, 0x2C10, eos, + 0x2C41, 0x2C11, eos, // 2542 + 0x2C42, 0x2C12, eos, + 0x2C43, 0x2C13, eos, + 0x2C44, 0x2C14, eos, // 2551 + 0x2C45, 0x2C15, eos, + 0x2C46, 0x2C16, eos, + 0x2C47, 0x2C17, eos, // 2560 + 0x2C48, 0x2C18, eos, + 0x2C49, 0x2C19, eos, + 0x2C4A, 0x2C1A, eos, + 0x2C4B, 0x2C1B, eos, // 2572 + 0x2C4C, 0x2C1C, eos, + 0x2C4D, 0x2C1D, eos, + 0x2C4E, 0x2C1E, eos, // 2581 + 0x2C4F, 0x2C1F, eos, + 0x2C50, 0x2C20, eos, + 0x2C51, 0x2C21, eos, // 2590 + 0x2C52, 0x2C22, eos, + 0x2C53, 0x2C23, eos, + 0x2C54, 0x2C24, eos, + 0x2C55, 0x2C25, eos, // 2602 + 0x2C56, 0x2C26, eos, + 0x2C57, 0x2C27, eos, + 0x2C58, 0x2C28, eos, // 2611 + 0x2C59, 0x2C29, eos, + 0x2C5A, 0x2C2A, eos, + 0x2C5B, 0x2C2B, eos, // 2620 + 0x2C5C, 0x2C2C, eos, + 0x2C5D, 0x2C2D, eos, + 0x2C5E, 0x2C2E, eos, + 0x2C5F, 0x2C2F, eos, // 2632 + 0x2C61, 0x2C60, eos, + 0x026B, 0x2C62, eos, + 0x1D7D, 0x2C63, eos, // 2641 + 0x027D, 0x2C64, eos, + 0x2C68, 0x2C67, eos, + 0x2C6A, 0x2C69, eos, // 2650 + 0x2C6C, 0x2C6B, eos, + 0x0251, 0x2C6D, eos, + 0x0271, 0x2C6E, eos, + 0x0250, 0x2C6F, eos, // 2662 + 0x0252, 0x2C70, eos, + 0x2C73, 0x2C72, eos, + 0x2C76, 0x2C75, eos, // 2671 + 0x023F, 0x2C7E, eos, + 0x0240, 0x2C7F, eos, + 0x2C81, 0x2C80, eos, // 2680 + 0x2C83, 0x2C82, eos, + 0x2C85, 0x2C84, eos, + 0x2C87, 0x2C86, eos, + 0x2C89, 0x2C88, eos, // 2692 + 0x2C8B, 0x2C8A, eos, + 0x2C8D, 0x2C8C, eos, + 0x2C8F, 0x2C8E, eos, // 2701 + 0x2C91, 0x2C90, eos, + 0x2C93, 0x2C92, eos, + 0x2C95, 0x2C94, eos, // 2710 + 0x2C97, 0x2C96, eos, + 0x2C99, 0x2C98, eos, + 0x2C9B, 0x2C9A, eos, + 0x2C9D, 0x2C9C, eos, // 2722 + 0x2C9F, 0x2C9E, eos, + 0x2CA1, 0x2CA0, eos, + 0x2CA3, 0x2CA2, eos, // 2731 + 0x2CA5, 0x2CA4, eos, + 0x2CA7, 0x2CA6, eos, + 0x2CA9, 0x2CA8, eos, // 2740 + 0x2CAB, 0x2CAA, eos, + 0x2CAD, 0x2CAC, eos, + 0x2CAF, 0x2CAE, eos, + 0x2CB1, 0x2CB0, eos, // 2752 + 0x2CB3, 0x2CB2, eos, + 0x2CB5, 0x2CB4, eos, + 0x2CB7, 0x2CB6, eos, // 2761 + 0x2CB9, 0x2CB8, eos, + 0x2CBB, 0x2CBA, eos, + 0x2CBD, 0x2CBC, eos, // 2770 + 0x2CBF, 0x2CBE, eos, + 0x2CC1, 0x2CC0, eos, + 0x2CC3, 0x2CC2, eos, + 0x2CC5, 0x2CC4, eos, // 2782 + 0x2CC7, 0x2CC6, eos, + 0x2CC9, 0x2CC8, eos, + 0x2CCB, 0x2CCA, eos, // 2791 + 0x2CCD, 0x2CCC, eos, + 0x2CCF, 0x2CCE, eos, + 0x2CD1, 0x2CD0, eos, // 2800 + 0x2CD3, 0x2CD2, eos, + 0x2CD5, 0x2CD4, eos, + 0x2CD7, 0x2CD6, eos, + 0x2CD9, 0x2CD8, eos, // 2812 + 0x2CDB, 0x2CDA, eos, + 0x2CDD, 0x2CDC, eos, + 0x2CDF, 0x2CDE, eos, // 2821 + 0x2CE1, 0x2CE0, eos, + 0x2CE3, 0x2CE2, eos, + 0x2CEC, 0x2CEB, eos, // 2830 + 0x2CEE, 0x2CED, eos, + 0x2CF3, 0x2CF2, eos, + 0xA641, 0xA640, eos, + 0xA643, 0xA642, eos, // 2842 + 0xA645, 0xA644, eos, + 0xA647, 0xA646, eos, + 0xA649, 0xA648, eos, // 2851 + 0xA64D, 0xA64C, eos, + 0xA64F, 0xA64E, eos, + 0xA651, 0xA650, eos, // 2860 + 0xA653, 0xA652, eos, + 0xA655, 0xA654, eos, + 0xA657, 0xA656, eos, + 0xA659, 0xA658, eos, // 2872 + 0xA65B, 0xA65A, eos, + 0xA65D, 0xA65C, eos, + 0xA65F, 0xA65E, eos, // 2881 + 0xA661, 0xA660, eos, + 0xA663, 0xA662, eos, + 0xA665, 0xA664, eos, // 2890 + 0xA667, 0xA666, eos, + 0xA669, 0xA668, eos, + 0xA66B, 0xA66A, eos, + 0xA66D, 0xA66C, eos, // 2902 + 0xA681, 0xA680, eos, + 0xA683, 0xA682, eos, + 0xA685, 0xA684, eos, // 2911 + 0xA687, 0xA686, eos, + 0xA689, 0xA688, eos, + 0xA68B, 0xA68A, eos, // 2920 + 0xA68D, 0xA68C, eos, + 0xA68F, 0xA68E, eos, + 0xA691, 0xA690, eos, + 0xA693, 0xA692, eos, // 2932 + 0xA695, 0xA694, eos, + 0xA697, 0xA696, eos, + 0xA699, 0xA698, eos, // 2941 + 0xA69B, 0xA69A, eos, + 0xA723, 0xA722, eos, + 0xA725, 0xA724, eos, // 2950 + 0xA727, 0xA726, eos, + 0xA729, 0xA728, eos, + 0xA72B, 0xA72A, eos, + 0xA72D, 0xA72C, eos, // 2962 + 0xA72F, 0xA72E, eos, + 0xA733, 0xA732, eos, + 0xA735, 0xA734, eos, // 2971 + 0xA737, 0xA736, eos, + 0xA739, 0xA738, eos, + 0xA73B, 0xA73A, eos, // 2980 + 0xA73D, 0xA73C, eos, + 0xA73F, 0xA73E, eos, + 0xA741, 0xA740, eos, + 0xA743, 0xA742, eos, // 2992 + 0xA745, 0xA744, eos, + 0xA747, 0xA746, eos, + 0xA749, 0xA748, eos, // 3001 + 0xA74B, 0xA74A, eos, + 0xA74D, 0xA74C, eos, + 0xA74F, 0xA74E, eos, // 3010 + 0xA751, 0xA750, eos, + 0xA753, 0xA752, eos, + 0xA755, 0xA754, eos, + 0xA757, 0xA756, eos, // 3022 + 0xA759, 0xA758, eos, + 0xA75B, 0xA75A, eos, + 0xA75D, 0xA75C, eos, // 3031 + 0xA75F, 0xA75E, eos, + 0xA761, 0xA760, eos, + 0xA763, 0xA762, eos, // 3040 + 0xA765, 0xA764, eos, + 0xA767, 0xA766, eos, + 0xA769, 0xA768, eos, + 0xA76B, 0xA76A, eos, // 3052 + 0xA76D, 0xA76C, eos, + 0xA76F, 0xA76E, eos, + 0xA77A, 0xA779, eos, // 3061 + 0xA77C, 0xA77B, eos, + 0x1D79, 0xA77D, eos, + 0xA77F, 0xA77E, eos, // 3070 + 0xA781, 0xA780, eos, + 0xA783, 0xA782, eos, + 0xA785, 0xA784, eos, + 0xA787, 0xA786, eos, // 3082 + 0xA78C, 0xA78B, eos, + 0x0265, 0xA78D, eos, + 0xA791, 0xA790, eos, // 3091 + 0xA793, 0xA792, eos, + 0xA797, 0xA796, eos, + 0xA799, 0xA798, eos, // 3100 + 0xA79B, 0xA79A, eos, + 0xA79D, 0xA79C, eos, + 0xA79F, 0xA79E, eos, + 0xA7A1, 0xA7A0, eos, // 3112 + 0xA7A3, 0xA7A2, eos, + 0xA7A5, 0xA7A4, eos, + 0xA7A7, 0xA7A6, eos, // 3121 + 0xA7A9, 0xA7A8, eos, + 0x0266, 0xA7AA, eos, + 0x025C, 0xA7AB, eos, // 3130 + 0x0261, 0xA7AC, eos, + 0x026C, 0xA7AD, eos, + 0x026A, 0xA7AE, eos, + 0x029E, 0xA7B0, eos, // 3142 + 0x0287, 0xA7B1, eos, + 0x029D, 0xA7B2, eos, + 0xAB53, 0xA7B3, eos, // 3151 + 0xA7B5, 0xA7B4, eos, + 0xA7B7, 0xA7B6, eos, + 0xA7B9, 0xA7B8, eos, // 3160 + 0xA7BB, 0xA7BA, eos, + 0xA7BD, 0xA7BC, eos, + 0xA7BF, 0xA7BE, eos, + 0xA7C1, 0xA7C0, eos, // 3172 + 0xA7C3, 0xA7C2, eos, + 0xA794, 0xA7C4, eos, + 0x0282, 0xA7C5, eos, // 3181 + 0x1D8E, 0xA7C6, eos, + 0xA7C8, 0xA7C7, eos, + 0xA7CA, 0xA7C9, eos, // 3190 + 0xA7D1, 0xA7D0, eos, + 0xA7D7, 0xA7D6, eos, + 0xA7D9, 0xA7D8, eos, + 0xA7F6, 0xA7F5, eos, // 3202 + 0x13A0, 0xAB70, eos, + 0x13A1, 0xAB71, eos, + 0x13A2, 0xAB72, eos, // 3211 + 0x13A3, 0xAB73, eos, + 0x13A4, 0xAB74, eos, + 0x13A5, 0xAB75, eos, // 3220 + 0x13A6, 0xAB76, eos, + 0x13A7, 0xAB77, eos, + 0x13A8, 0xAB78, eos, + 0x13A9, 0xAB79, eos, // 3232 + 0x13AA, 0xAB7A, eos, + 0x13AB, 0xAB7B, eos, + 0x13AC, 0xAB7C, eos, // 3241 + 0x13AD, 0xAB7D, eos, + 0x13AE, 0xAB7E, eos, + 0x13AF, 0xAB7F, eos, // 3250 + 0x13B0, 0xAB80, eos, + 0x13B1, 0xAB81, eos, + 0x13B2, 0xAB82, eos, + 0x13B3, 0xAB83, eos, // 3262 + 0x13B4, 0xAB84, eos, + 0x13B5, 0xAB85, eos, + 0x13B6, 0xAB86, eos, // 3271 + 0x13B7, 0xAB87, eos, + 0x13B8, 0xAB88, eos, + 0x13B9, 0xAB89, eos, // 3280 + 0x13BA, 0xAB8A, eos, + 0x13BB, 0xAB8B, eos, + 0x13BC, 0xAB8C, eos, + 0x13BD, 0xAB8D, eos, // 3292 + 0x13BE, 0xAB8E, eos, + 0x13BF, 0xAB8F, eos, + 0x13C0, 0xAB90, eos, // 3301 + 0x13C1, 0xAB91, eos, + 0x13C2, 0xAB92, eos, + 0x13C3, 0xAB93, eos, // 3310 + 0x13C4, 0xAB94, eos, + 0x13C5, 0xAB95, eos, + 0x13C6, 0xAB96, eos, + 0x13C7, 0xAB97, eos, // 3322 + 0x13C8, 0xAB98, eos, + 0x13C9, 0xAB99, eos, + 0x13CA, 0xAB9A, eos, // 3331 + 0x13CB, 0xAB9B, eos, + 0x13CC, 0xAB9C, eos, + 0x13CD, 0xAB9D, eos, // 3340 + 0x13CE, 0xAB9E, eos, + 0x13CF, 0xAB9F, eos, + 0x13D0, 0xABA0, eos, + 0x13D1, 0xABA1, eos, // 3352 + 0x13D2, 0xABA2, eos, + 0x13D3, 0xABA3, eos, + 0x13D4, 0xABA4, eos, // 3361 + 0x13D5, 0xABA5, eos, + 0x13D6, 0xABA6, eos, + 0x13D7, 0xABA7, eos, // 3370 + 0x13D8, 0xABA8, eos, + 0x13D9, 0xABA9, eos, + 0x13DA, 0xABAA, eos, + 0x13DB, 0xABAB, eos, // 3382 + 0x13DC, 0xABAC, eos, + 0x13DD, 0xABAD, eos, + 0x13DE, 0xABAE, eos, // 3391 + 0x13DF, 0xABAF, eos, + 0x13E0, 0xABB0, eos, + 0x13E1, 0xABB1, eos, // 3400 + 0x13E2, 0xABB2, eos, + 0x13E3, 0xABB3, eos, + 0x13E4, 0xABB4, eos, + 0x13E5, 0xABB5, eos, // 3412 + 0x13E6, 0xABB6, eos, + 0x13E7, 0xABB7, eos, + 0x13E8, 0xABB8, eos, // 3421 + 0x13E9, 0xABB9, eos, + 0x13EA, 0xABBA, eos, + 0x13EB, 0xABBB, eos, // 3430 + 0x13EC, 0xABBC, eos, + 0x13ED, 0xABBD, eos, + 0x13EE, 0xABBE, eos, + 0x13EF, 0xABBF, eos, // 3442 + 0xFF41, 0xFF21, eos, + 0xFF42, 0xFF22, eos, + 0xFF43, 0xFF23, eos, // 3451 + 0xFF44, 0xFF24, eos, + 0xFF45, 0xFF25, eos, + 0xFF46, 0xFF26, eos, // 3460 + 0xFF47, 0xFF27, eos, + 0xFF48, 0xFF28, eos, + 0xFF49, 0xFF29, eos, + 0xFF4A, 0xFF2A, eos, // 3472 + 0xFF4B, 0xFF2B, eos, + 0xFF4C, 0xFF2C, eos, + 0xFF4D, 0xFF2D, eos, // 3481 + 0xFF4E, 0xFF2E, eos, + 0xFF4F, 0xFF2F, eos, + 0xFF50, 0xFF30, eos, // 3490 + 0xFF51, 0xFF31, eos, + 0xFF52, 0xFF32, eos, + 0xFF53, 0xFF33, eos, + 0xFF54, 0xFF34, eos, // 3502 + 0xFF55, 0xFF35, eos, + 0xFF56, 0xFF36, eos, + 0xFF57, 0xFF37, eos, // 3511 + 0xFF58, 0xFF38, eos, + 0xFF59, 0xFF39, eos, + 0xFF5A, 0xFF3A, eos, // 3520 + 0x10428, 0x10400, eos, + 0x10429, 0x10401, eos, + 0x1042A, 0x10402, eos, + 0x1042B, 0x10403, eos, // 3532 + 0x1042C, 0x10404, eos, + 0x1042D, 0x10405, eos, + 0x1042E, 0x10406, eos, // 3541 + 0x1042F, 0x10407, eos, + 0x10430, 0x10408, eos, + 0x10431, 0x10409, eos, // 3550 + 0x10432, 0x1040A, eos, + 0x10433, 0x1040B, eos, + 0x10434, 0x1040C, eos, + 0x10435, 0x1040D, eos, // 3562 + 0x10436, 0x1040E, eos, + 0x10437, 0x1040F, eos, + 0x10438, 0x10410, eos, // 3571 + 0x10439, 0x10411, eos, + 0x1043A, 0x10412, eos, + 0x1043B, 0x10413, eos, // 3580 + 0x1043C, 0x10414, eos, + 0x1043D, 0x10415, eos, + 0x1043E, 0x10416, eos, + 0x1043F, 0x10417, eos, // 3592 + 0x10440, 0x10418, eos, + 0x10441, 0x10419, eos, + 0x10442, 0x1041A, eos, // 3601 + 0x10443, 0x1041B, eos, + 0x10444, 0x1041C, eos, + 0x10445, 0x1041D, eos, // 3610 + 0x10446, 0x1041E, eos, + 0x10447, 0x1041F, eos, + 0x10448, 0x10420, eos, + 0x10449, 0x10421, eos, // 3622 + 0x1044A, 0x10422, eos, + 0x1044B, 0x10423, eos, + 0x1044C, 0x10424, eos, // 3631 + 0x1044D, 0x10425, eos, + 0x1044E, 0x10426, eos, + 0x1044F, 0x10427, eos, // 3640 + 0x104D8, 0x104B0, eos, + 0x104D9, 0x104B1, eos, + 0x104DA, 0x104B2, eos, + 0x104DB, 0x104B3, eos, // 3652 + 0x104DC, 0x104B4, eos, + 0x104DD, 0x104B5, eos, + 0x104DE, 0x104B6, eos, // 3661 + 0x104DF, 0x104B7, eos, + 0x104E0, 0x104B8, eos, + 0x104E1, 0x104B9, eos, // 3670 + 0x104E2, 0x104BA, eos, + 0x104E3, 0x104BB, eos, + 0x104E4, 0x104BC, eos, + 0x104E5, 0x104BD, eos, // 3682 + 0x104E6, 0x104BE, eos, + 0x104E7, 0x104BF, eos, + 0x104E8, 0x104C0, eos, // 3691 + 0x104E9, 0x104C1, eos, + 0x104EA, 0x104C2, eos, + 0x104EB, 0x104C3, eos, // 3700 + 0x104EC, 0x104C4, eos, + 0x104ED, 0x104C5, eos, + 0x104EE, 0x104C6, eos, + 0x104EF, 0x104C7, eos, // 3712 + 0x104F0, 0x104C8, eos, + 0x104F1, 0x104C9, eos, + 0x104F2, 0x104CA, eos, // 3721 + 0x104F3, 0x104CB, eos, + 0x104F4, 0x104CC, eos, + 0x104F5, 0x104CD, eos, // 3730 + 0x104F6, 0x104CE, eos, + 0x104F7, 0x104CF, eos, + 0x104F8, 0x104D0, eos, + 0x104F9, 0x104D1, eos, // 3742 + 0x104FA, 0x104D2, eos, + 0x104FB, 0x104D3, eos, + 0x10597, 0x10570, eos, // 3751 + 0x10598, 0x10571, eos, + 0x10599, 0x10572, eos, + 0x1059A, 0x10573, eos, // 3760 + 0x1059B, 0x10574, eos, + 0x1059C, 0x10575, eos, + 0x1059D, 0x10576, eos, + 0x1059E, 0x10577, eos, // 3772 + 0x1059F, 0x10578, eos, + 0x105A0, 0x10579, eos, + 0x105A1, 0x1057A, eos, // 3781 + 0x105A3, 0x1057C, eos, + 0x105A4, 0x1057D, eos, + 0x105A5, 0x1057E, eos, // 3790 + 0x105A6, 0x1057F, eos, + 0x105A7, 0x10580, eos, + 0x105A8, 0x10581, eos, + 0x105A9, 0x10582, eos, // 3802 + 0x105AA, 0x10583, eos, + 0x105AB, 0x10584, eos, + 0x105AC, 0x10585, eos, // 3811 + 0x105AD, 0x10586, eos, + 0x105AE, 0x10587, eos, + 0x105AF, 0x10588, eos, // 3820 + 0x105B0, 0x10589, eos, + 0x105B1, 0x1058A, eos, + 0x105B3, 0x1058C, eos, + 0x105B4, 0x1058D, eos, // 3832 + 0x105B5, 0x1058E, eos, + 0x105B6, 0x1058F, eos, + 0x105B7, 0x10590, eos, // 3841 + 0x105B8, 0x10591, eos, + 0x105B9, 0x10592, eos, + 0x105BB, 0x10594, eos, // 3850 + 0x105BC, 0x10595, eos, + 0x10CC0, 0x10C80, eos, + 0x10CC1, 0x10C81, eos, + 0x10CC2, 0x10C82, eos, // 3862 + 0x10CC3, 0x10C83, eos, + 0x10CC4, 0x10C84, eos, + 0x10CC5, 0x10C85, eos, // 3871 + 0x10CC6, 0x10C86, eos, + 0x10CC7, 0x10C87, eos, + 0x10CC8, 0x10C88, eos, // 3880 + 0x10CC9, 0x10C89, eos, + 0x10CCA, 0x10C8A, eos, + 0x10CCB, 0x10C8B, eos, + 0x10CCC, 0x10C8C, eos, // 3892 + 0x10CCD, 0x10C8D, eos, + 0x10CCE, 0x10C8E, eos, + 0x10CCF, 0x10C8F, eos, // 3901 + 0x10CD0, 0x10C90, eos, + 0x10CD1, 0x10C91, eos, + 0x10CD2, 0x10C92, eos, // 3910 + 0x10CD3, 0x10C93, eos, + 0x10CD4, 0x10C94, eos, + 0x10CD5, 0x10C95, eos, + 0x10CD6, 0x10C96, eos, // 3922 + 0x10CD7, 0x10C97, eos, + 0x10CD8, 0x10C98, eos, + 0x10CD9, 0x10C99, eos, // 3931 + 0x10CDA, 0x10C9A, eos, + 0x10CDB, 0x10C9B, eos, + 0x10CDC, 0x10C9C, eos, // 3940 + 0x10CDD, 0x10C9D, eos, + 0x10CDE, 0x10C9E, eos, + 0x10CDF, 0x10C9F, eos, + 0x10CE0, 0x10CA0, eos, // 3952 + 0x10CE1, 0x10CA1, eos, + 0x10CE2, 0x10CA2, eos, + 0x10CE3, 0x10CA3, eos, // 3961 + 0x10CE4, 0x10CA4, eos, + 0x10CE5, 0x10CA5, eos, + 0x10CE6, 0x10CA6, eos, // 3970 + 0x10CE7, 0x10CA7, eos, + 0x10CE8, 0x10CA8, eos, + 0x10CE9, 0x10CA9, eos, + 0x10CEA, 0x10CAA, eos, // 3982 + 0x10CEB, 0x10CAB, eos, + 0x10CEC, 0x10CAC, eos, + 0x10CED, 0x10CAD, eos, // 3991 + 0x10CEE, 0x10CAE, eos, + 0x10CEF, 0x10CAF, eos, + 0x10CF0, 0x10CB0, eos, // 4000 + 0x10CF1, 0x10CB1, eos, + 0x10CF2, 0x10CB2, eos, + 0x118C0, 0x118A0, eos, + 0x118C1, 0x118A1, eos, // 4012 + 0x118C2, 0x118A2, eos, + 0x118C3, 0x118A3, eos, + 0x118C4, 0x118A4, eos, // 4021 + 0x118C5, 0x118A5, eos, + 0x118C6, 0x118A6, eos, + 0x118C7, 0x118A7, eos, // 4030 + 0x118C8, 0x118A8, eos, + 0x118C9, 0x118A9, eos, + 0x118CA, 0x118AA, eos, + 0x118CB, 0x118AB, eos, // 4042 + 0x118CC, 0x118AC, eos, + 0x118CD, 0x118AD, eos, + 0x118CE, 0x118AE, eos, // 4051 + 0x118CF, 0x118AF, eos, + 0x118D0, 0x118B0, eos, + 0x118D1, 0x118B1, eos, // 4060 + 0x118D2, 0x118B2, eos, + 0x118D3, 0x118B3, eos, + 0x118D4, 0x118B4, eos, + 0x118D5, 0x118B5, eos, // 4072 + 0x118D6, 0x118B6, eos, + 0x118D7, 0x118B7, eos, + 0x118D8, 0x118B8, eos, // 4081 + 0x118D9, 0x118B9, eos, + 0x118DA, 0x118BA, eos, + 0x118DB, 0x118BB, eos, // 4090 + 0x118DC, 0x118BC, eos, + 0x118DD, 0x118BD, eos, + 0x118DE, 0x118BE, eos, + 0x118DF, 0x118BF, eos, // 4102 + 0x16E60, 0x16E40, eos, + 0x16E61, 0x16E41, eos, + 0x16E62, 0x16E42, eos, // 4111 + 0x16E63, 0x16E43, eos, + 0x16E64, 0x16E44, eos, + 0x16E65, 0x16E45, eos, // 4120 + 0x16E66, 0x16E46, eos, + 0x16E67, 0x16E47, eos, + 0x16E68, 0x16E48, eos, + 0x16E69, 0x16E49, eos, // 4132 + 0x16E6A, 0x16E4A, eos, + 0x16E6B, 0x16E4B, eos, + 0x16E6C, 0x16E4C, eos, // 4141 + 0x16E6D, 0x16E4D, eos, + 0x16E6E, 0x16E4E, eos, + 0x16E6F, 0x16E4F, eos, // 4150 + 0x16E70, 0x16E50, eos, + 0x16E71, 0x16E51, eos, + 0x16E72, 0x16E52, eos, + 0x16E73, 0x16E53, eos, // 4162 + 0x16E74, 0x16E54, eos, + 0x16E75, 0x16E55, eos, + 0x16E76, 0x16E56, eos, // 4171 + 0x16E77, 0x16E57, eos, + 0x16E78, 0x16E58, eos, + 0x16E79, 0x16E59, eos, // 4180 + 0x16E7A, 0x16E5A, eos, + 0x16E7B, 0x16E5B, eos, + 0x16E7C, 0x16E5C, eos, + 0x16E7D, 0x16E5D, eos, // 4192 + 0x16E7E, 0x16E5E, eos, + 0x16E7F, 0x16E5F, eos, + 0x1E922, 0x1E900, eos, // 4201 + 0x1E923, 0x1E901, eos, + 0x1E924, 0x1E902, eos, + 0x1E925, 0x1E903, eos, // 4210 + 0x1E926, 0x1E904, eos, + 0x1E927, 0x1E905, eos, + 0x1E928, 0x1E906, eos, + 0x1E929, 0x1E907, eos, // 4222 + 0x1E92A, 0x1E908, eos, + 0x1E92B, 0x1E909, eos, + 0x1E92C, 0x1E90A, eos, // 4231 + 0x1E92D, 0x1E90B, eos, + 0x1E92E, 0x1E90C, eos, + 0x1E92F, 0x1E90D, eos, // 4240 + 0x1E930, 0x1E90E, eos, + 0x1E931, 0x1E90F, eos, + 0x1E932, 0x1E910, eos, + 0x1E933, 0x1E911, eos, // 4252 + 0x1E934, 0x1E912, eos, + 0x1E935, 0x1E913, eos, + 0x1E936, 0x1E914, eos, // 4261 + 0x1E937, 0x1E915, eos, + 0x1E938, 0x1E916, eos, + 0x1E939, 0x1E917, eos, // 4270 + 0x1E93A, 0x1E918, eos, + 0x1E93B, 0x1E919, eos, + 0x1E93C, 0x1E91A, eos, + 0x1E93D, 0x1E91B, eos, // 4282 + 0x1E93E, 0x1E91C, eos, + 0x1E93F, 0x1E91D, eos, + 0x1E940, 0x1E91E, eos, // 4291 + 0x1E941, 0x1E91F, eos, + 0x1E942, 0x1E920, eos, + 0x1E943, 0x1E921, eos // 4300 +}; +#define SRELL_UCFDATA_VERSION 200 +// ... "srell_ucfdata2.hpp"] + + namespace ucf_internal + { + +typedef unicode_casefolding ucf_data; + + } // namespace ucf_internal +#endif // !defined(SRELL_NO_UNICODE_ICASE) + +class unicode_case_folding +{ +public: + +#if !defined(SRELL_NO_UNICODE_ICASE) + static const uchar32 rev_maxset = ucf_internal::ucf_data::rev_maxset; +#else + static const uchar32 rev_maxset = 2; +#endif + + static uchar32 do_casefolding(const uchar32 cp) + { +#if !defined(SRELL_NO_UNICODE_ICASE) + if (cp <= ucf_internal::ucf_data::ucf_maxcodepoint) + return cp + ucf_internal::ucf_data::ucf_deltatable[ucf_internal::ucf_data::ucf_segmenttable[cp >> 8] + (cp & 0xff)]; +#else + if (cp >= char_alnum::ch_A && cp <= char_alnum::ch_Z) // 'A' && 'Z' + return static_cast(cp - char_alnum::ch_A + char_alnum::ch_a); // - 'A' + 'a' +#endif + return cp; + } + + static uchar32 casefoldedcharset(uchar32 out[rev_maxset], const uchar32 cp) + { +#if !defined(SRELL_NO_UNICODE_ICASE) + uchar32 count = 0; + + if (cp <= ucf_internal::ucf_data::rev_maxcodepoint) + { + const uchar32 offset_of_charset = ucf_internal::ucf_data::rev_indextable[ucf_internal::ucf_data::rev_segmenttable[cp >> 8] + (cp & 0xff)]; + const uchar32 *ptr = &ucf_internal::ucf_data::rev_charsettable[offset_of_charset]; + + for (; *ptr != cfcharset_eos_ && count < rev_maxset; ++ptr, ++count) + out[count] = *ptr; + } + if (count == 0) + out[count++] = cp; + + return count; +#else +// const uchar32 nocase = static_cast(cp & ~0x20); + const uchar32 nocase = static_cast(cp | constants::asc_icase); + + out[0] = cp; +// if (nocase >= char_alnum::ch_A && nocase <= char_alnum::ch_Z) + if (nocase >= char_alnum::ch_a && nocase <= char_alnum::ch_z) + { + out[1] = static_cast(cp ^ constants::asc_icase); + return 2; + } + return 1; +#endif + } + + unicode_case_folding &operator=(const unicode_case_folding &) + { + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + unicode_case_folding &operator=(unicode_case_folding &&) SRELL_NOEXCEPT + { + return *this; + } +#endif + + void swap(unicode_case_folding & /* right */) + { + } + +private: + +#if !defined(SRELL_NO_UNICODE_ICASE) + static const uchar32 cfcharset_eos_ = ucf_internal::ucf_data::eos; +#endif + +public: // For debug. + + void print_tables() const; +}; +// unicode_case_folding + + } // namespace regex_internal + +// ... "rei_ucf.hpp"] +// ["rei_up.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELL_NO_UNICODE_PROPERTY) +// ["srell_updata.hpp" ... +// UnicodeData.txt +// +// PropList-14.0.0.txt +// Date: 2021-08-12, 23:13:05 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// DerivedCoreProperties-14.0.0.txt +// Date: 2021-08-12, 23:12:53 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// emoji-data-14.0.0.txt +// Date: 2021-08-26, 17:22:22 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// DerivedNormalizationProps-14.0.0.txt +// Date: 2021-06-04, 02:19:20 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// Scripts-14.0.0.txt +// Date: 2021-07-10, 00:35:31 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// ScriptExtensions-14.0.0.txt +// Date: 2021-06-04, 02:19:38 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// + +template +struct unicode_property_data +{ + static const T1 unknown = 0; + static const T1 gc_Other = 1; // #1 + static const T1 gc_Control = 2; // #2 + static const T1 gc_Format = 3; // #3 + static const T1 gc_Unassigned = 4; // #4 + static const T1 gc_Private_Use = 5; // #5 + static const T1 gc_Surrogate = 6; // #6 + static const T1 gc_Letter = 7; // #7 + static const T1 gc_Cased_Letter = 8; // #8 + static const T1 gc_Lowercase_Letter = 9; // #9 + static const T1 gc_Titlecase_Letter = 10; // #10 + static const T1 gc_Uppercase_Letter = 11; // #11 + static const T1 gc_Modifier_Letter = 12; // #12 + static const T1 gc_Other_Letter = 13; // #13 + static const T1 gc_Mark = 14; // #14 + static const T1 gc_Spacing_Mark = 15; // #15 + static const T1 gc_Enclosing_Mark = 16; // #16 + static const T1 gc_Nonspacing_Mark = 17; // #17 + static const T1 gc_Number = 18; // #18 + static const T1 gc_Decimal_Number = 19; // #19 + static const T1 gc_Letter_Number = 20; // #20 + static const T1 gc_Other_Number = 21; // #21 + static const T1 gc_Punctuation = 22; // #22 + static const T1 gc_Connector_Punctuation = 23; // #23 + static const T1 gc_Dash_Punctuation = 24; // #24 + static const T1 gc_Close_Punctuation = 25; // #25 + static const T1 gc_Final_Punctuation = 26; // #26 + static const T1 gc_Initial_Punctuation = 27; // #27 + static const T1 gc_Other_Punctuation = 28; // #28 + static const T1 gc_Open_Punctuation = 29; // #29 + static const T1 gc_Symbol = 30; // #30 + static const T1 gc_Currency_Symbol = 31; // #31 + static const T1 gc_Modifier_Symbol = 32; // #32 + static const T1 gc_Math_Symbol = 33; // #33 + static const T1 gc_Other_Symbol = 34; // #34 + static const T1 gc_Separator = 35; // #35 + static const T1 gc_Line_Separator = 36; // #36 + static const T1 gc_Paragraph_Separator = 37; // #37 + static const T1 gc_Space_Separator = 38; // #38 + static const T1 bp_ASCII = 39; // #39 + static const T1 bp_ASCII_Hex_Digit = 40; // #40 + static const T1 bp_Alphabetic = 41; // #41 + static const T1 bp_Any = 42; // #42 + static const T1 bp_Assigned = 43; // #43 + static const T1 bp_Bidi_Control = 44; // #44 + static const T1 bp_Bidi_Mirrored = 45; // #45 + static const T1 bp_Case_Ignorable = 46; // #46 + static const T1 bp_Cased = 47; // #47 + static const T1 bp_Changes_When_Casefolded = 48; // #48 + static const T1 bp_Changes_When_Casemapped = 49; // #49 + static const T1 bp_Changes_When_Lowercased = 50; // #50 + static const T1 bp_Changes_When_NFKC_Casefolded = 51; // #51 + static const T1 bp_Changes_When_Titlecased = 52; // #52 + static const T1 bp_Changes_When_Uppercased = 53; // #53 + static const T1 bp_Dash = 54; // #54 + static const T1 bp_Default_Ignorable_Code_Point = 55; // #55 + static const T1 bp_Deprecated = 56; // #56 + static const T1 bp_Diacritic = 57; // #57 + static const T1 bp_Emoji = 58; // #58 + static const T1 bp_Emoji_Component = 59; // #59 + static const T1 bp_Emoji_Modifier = 60; // #60 + static const T1 bp_Emoji_Modifier_Base = 61; // #61 + static const T1 bp_Emoji_Presentation = 62; // #62 + static const T1 bp_Extended_Pictographic = 63; // #63 + static const T1 bp_Extender = 64; // #64 + static const T1 bp_Grapheme_Base = 65; // #65 + static const T1 bp_Grapheme_Extend = 66; // #66 + static const T1 bp_Hex_Digit = 67; // #67 + static const T1 bp_IDS_Binary_Operator = 68; // #68 + static const T1 bp_IDS_Trinary_Operator = 69; // #69 + static const T1 bp_ID_Continue = 70; // #70 + static const T1 bp_ID_Start = 71; // #71 + static const T1 bp_Ideographic = 72; // #72 + static const T1 bp_Join_Control = 73; // #73 + static const T1 bp_Logical_Order_Exception = 74; // #74 + static const T1 bp_Lowercase = 75; // #75 + static const T1 bp_Math = 76; // #76 + static const T1 bp_Noncharacter_Code_Point = 77; // #77 + static const T1 bp_Pattern_Syntax = 78; // #78 + static const T1 bp_Pattern_White_Space = 79; // #79 + static const T1 bp_Quotation_Mark = 80; // #80 + static const T1 bp_Radical = 81; // #81 + static const T1 bp_Regional_Indicator = 82; // #82 + static const T1 bp_Sentence_Terminal = 83; // #83 + static const T1 bp_Soft_Dotted = 84; // #84 + static const T1 bp_Terminal_Punctuation = 85; // #85 + static const T1 bp_Unified_Ideograph = 86; // #86 + static const T1 bp_Uppercase = 87; // #87 + static const T1 bp_Variation_Selector = 88; // #88 + static const T1 bp_White_Space = 89; // #89 + static const T1 bp_XID_Continue = 90; // #90 + static const T1 bp_XID_Start = 91; // #91 + static const T1 sc_Adlam = 92; // #92 + static const T1 sc_Ahom = 93; // #93 + static const T1 sc_Anatolian_Hieroglyphs = 94; // #94 + static const T1 sc_Arabic = 95; // #95 + static const T1 sc_Armenian = 96; // #96 + static const T1 sc_Avestan = 97; // #97 + static const T1 sc_Balinese = 98; // #98 + static const T1 sc_Bamum = 99; // #99 + static const T1 sc_Bassa_Vah = 100; // #100 + static const T1 sc_Batak = 101; // #101 + static const T1 sc_Bengali = 102; // #102 + static const T1 sc_Bhaiksuki = 103; // #103 + static const T1 sc_Bopomofo = 104; // #104 + static const T1 sc_Brahmi = 105; // #105 + static const T1 sc_Braille = 106; // #106 + static const T1 sc_Buginese = 107; // #107 + static const T1 sc_Buhid = 108; // #108 + static const T1 sc_Canadian_Aboriginal = 109; // #109 + static const T1 sc_Carian = 110; // #110 + static const T1 sc_Caucasian_Albanian = 111; // #111 + static const T1 sc_Chakma = 112; // #112 + static const T1 sc_Cham = 113; // #113 + static const T1 sc_Cherokee = 114; // #114 + static const T1 sc_Chorasmian = 115; // #115 + static const T1 sc_Common = 116; // #116 + static const T1 sc_Coptic = 117; // #117 + static const T1 sc_Cypro_Minoan = 118; // #118 + static const T1 sc_Cuneiform = 119; // #119 + static const T1 sc_Cypriot = 120; // #120 + static const T1 sc_Cyrillic = 121; // #121 + static const T1 sc_Deseret = 122; // #122 + static const T1 sc_Devanagari = 123; // #123 + static const T1 sc_Dives_Akuru = 124; // #124 + static const T1 sc_Dogra = 125; // #125 + static const T1 sc_Duployan = 126; // #126 + static const T1 sc_Egyptian_Hieroglyphs = 127; // #127 + static const T1 sc_Elbasan = 128; // #128 + static const T1 sc_Elymaic = 129; // #129 + static const T1 sc_Ethiopic = 130; // #130 + static const T1 sc_Georgian = 131; // #131 + static const T1 sc_Glagolitic = 132; // #132 + static const T1 sc_Gothic = 133; // #133 + static const T1 sc_Grantha = 134; // #134 + static const T1 sc_Greek = 135; // #135 + static const T1 sc_Gujarati = 136; // #136 + static const T1 sc_Gunjala_Gondi = 137; // #137 + static const T1 sc_Gurmukhi = 138; // #138 + static const T1 sc_Han = 139; // #139 + static const T1 sc_Hangul = 140; // #140 + static const T1 sc_Hanifi_Rohingya = 141; // #141 + static const T1 sc_Hanunoo = 142; // #142 + static const T1 sc_Hatran = 143; // #143 + static const T1 sc_Hebrew = 144; // #144 + static const T1 sc_Hiragana = 145; // #145 + static const T1 sc_Imperial_Aramaic = 146; // #146 + static const T1 sc_Inherited = 147; // #147 + static const T1 sc_Inscriptional_Pahlavi = 148; // #148 + static const T1 sc_Inscriptional_Parthian = 149; // #149 + static const T1 sc_Javanese = 150; // #150 + static const T1 sc_Kaithi = 151; // #151 + static const T1 sc_Kannada = 152; // #152 + static const T1 sc_Katakana = 153; // #153 + static const T1 sc_Kayah_Li = 154; // #154 + static const T1 sc_Kharoshthi = 155; // #155 + static const T1 sc_Khitan_Small_Script = 156; // #156 + static const T1 sc_Khmer = 157; // #157 + static const T1 sc_Khojki = 158; // #158 + static const T1 sc_Khudawadi = 159; // #159 + static const T1 sc_Lao = 160; // #160 + static const T1 sc_Latin = 161; // #161 + static const T1 sc_Lepcha = 162; // #162 + static const T1 sc_Limbu = 163; // #163 + static const T1 sc_Linear_A = 164; // #164 + static const T1 sc_Linear_B = 165; // #165 + static const T1 sc_Lisu = 166; // #166 + static const T1 sc_Lycian = 167; // #167 + static const T1 sc_Lydian = 168; // #168 + static const T1 sc_Mahajani = 169; // #169 + static const T1 sc_Makasar = 170; // #170 + static const T1 sc_Malayalam = 171; // #171 + static const T1 sc_Mandaic = 172; // #172 + static const T1 sc_Manichaean = 173; // #173 + static const T1 sc_Marchen = 174; // #174 + static const T1 sc_Masaram_Gondi = 175; // #175 + static const T1 sc_Medefaidrin = 176; // #176 + static const T1 sc_Meetei_Mayek = 177; // #177 + static const T1 sc_Mende_Kikakui = 178; // #178 + static const T1 sc_Meroitic_Cursive = 179; // #179 + static const T1 sc_Meroitic_Hieroglyphs = 180; // #180 + static const T1 sc_Miao = 181; // #181 + static const T1 sc_Modi = 182; // #182 + static const T1 sc_Mongolian = 183; // #183 + static const T1 sc_Mro = 184; // #184 + static const T1 sc_Multani = 185; // #185 + static const T1 sc_Myanmar = 186; // #186 + static const T1 sc_Nabataean = 187; // #187 + static const T1 sc_Nandinagari = 188; // #188 + static const T1 sc_New_Tai_Lue = 189; // #189 + static const T1 sc_Newa = 190; // #190 + static const T1 sc_Nko = 191; // #191 + static const T1 sc_Nushu = 192; // #192 + static const T1 sc_Nyiakeng_Puachue_Hmong = 193; // #193 + static const T1 sc_Ogham = 194; // #194 + static const T1 sc_Ol_Chiki = 195; // #195 + static const T1 sc_Old_Hungarian = 196; // #196 + static const T1 sc_Old_Italic = 197; // #197 + static const T1 sc_Old_North_Arabian = 198; // #198 + static const T1 sc_Old_Permic = 199; // #199 + static const T1 sc_Old_Persian = 200; // #200 + static const T1 sc_Old_Sogdian = 201; // #201 + static const T1 sc_Old_South_Arabian = 202; // #202 + static const T1 sc_Old_Turkic = 203; // #203 + static const T1 sc_Old_Uyghur = 204; // #204 + static const T1 sc_Oriya = 205; // #205 + static const T1 sc_Osage = 206; // #206 + static const T1 sc_Osmanya = 207; // #207 + static const T1 sc_Pahawh_Hmong = 208; // #208 + static const T1 sc_Palmyrene = 209; // #209 + static const T1 sc_Pau_Cin_Hau = 210; // #210 + static const T1 sc_Phags_Pa = 211; // #211 + static const T1 sc_Phoenician = 212; // #212 + static const T1 sc_Psalter_Pahlavi = 213; // #213 + static const T1 sc_Rejang = 214; // #214 + static const T1 sc_Runic = 215; // #215 + static const T1 sc_Samaritan = 216; // #216 + static const T1 sc_Saurashtra = 217; // #217 + static const T1 sc_Sharada = 218; // #218 + static const T1 sc_Shavian = 219; // #219 + static const T1 sc_Siddham = 220; // #220 + static const T1 sc_SignWriting = 221; // #221 + static const T1 sc_Sinhala = 222; // #222 + static const T1 sc_Sogdian = 223; // #223 + static const T1 sc_Sora_Sompeng = 224; // #224 + static const T1 sc_Soyombo = 225; // #225 + static const T1 sc_Sundanese = 226; // #226 + static const T1 sc_Syloti_Nagri = 227; // #227 + static const T1 sc_Syriac = 228; // #228 + static const T1 sc_Tagalog = 229; // #229 + static const T1 sc_Tagbanwa = 230; // #230 + static const T1 sc_Tai_Le = 231; // #231 + static const T1 sc_Tai_Tham = 232; // #232 + static const T1 sc_Tai_Viet = 233; // #233 + static const T1 sc_Takri = 234; // #234 + static const T1 sc_Tamil = 235; // #235 + static const T1 sc_Tangsa = 236; // #236 + static const T1 sc_Tangut = 237; // #237 + static const T1 sc_Telugu = 238; // #238 + static const T1 sc_Thaana = 239; // #239 + static const T1 sc_Thai = 240; // #240 + static const T1 sc_Tibetan = 241; // #241 + static const T1 sc_Tifinagh = 242; // #242 + static const T1 sc_Tirhuta = 243; // #243 + static const T1 sc_Toto = 244; // #244 + static const T1 sc_Ugaritic = 245; // #245 + static const T1 sc_Vai = 246; // #246 + static const T1 sc_Vithkuqi = 247; // #247 + static const T1 sc_Wancho = 248; // #248 + static const T1 sc_Warang_Citi = 249; // #249 + static const T1 sc_Yezidi = 250; // #250 + static const T1 sc_Yi = 251; // #251 + static const T1 sc_Zanabazar_Square = 252; // #252 + static const T1 scx_Adlam = 253; // #253 + static const T1 scx_Ahom = 254; // #93 + static const T1 scx_Anatolian_Hieroglyphs = 255; // #94 + static const T1 scx_Arabic = 256; // #254 + static const T1 scx_Armenian = 257; // #96 + static const T1 scx_Avestan = 258; // #97 + static const T1 scx_Balinese = 259; // #98 + static const T1 scx_Bamum = 260; // #99 + static const T1 scx_Bassa_Vah = 261; // #100 + static const T1 scx_Batak = 262; // #101 + static const T1 scx_Bengali = 263; // #255 + static const T1 scx_Bhaiksuki = 264; // #103 + static const T1 scx_Bopomofo = 265; // #256 + static const T1 scx_Brahmi = 266; // #105 + static const T1 scx_Braille = 267; // #106 + static const T1 scx_Buginese = 268; // #257 + static const T1 scx_Buhid = 269; // #258 + static const T1 scx_Canadian_Aboriginal = 270; // #109 + static const T1 scx_Carian = 271; // #110 + static const T1 scx_Caucasian_Albanian = 272; // #111 + static const T1 scx_Chakma = 273; // #259 + static const T1 scx_Cham = 274; // #113 + static const T1 scx_Cherokee = 275; // #114 + static const T1 scx_Chorasmian = 276; // #115 + static const T1 scx_Common = 277; // #260 + static const T1 scx_Coptic = 278; // #261 + static const T1 scx_Cypro_Minoan = 279; // #262 + static const T1 scx_Cuneiform = 280; // #119 + static const T1 scx_Cypriot = 281; // #263 + static const T1 scx_Cyrillic = 282; // #264 + static const T1 scx_Deseret = 283; // #122 + static const T1 scx_Devanagari = 284; // #265 + static const T1 scx_Dives_Akuru = 285; // #124 + static const T1 scx_Dogra = 286; // #266 + static const T1 scx_Duployan = 287; // #267 + static const T1 scx_Egyptian_Hieroglyphs = 288; // #127 + static const T1 scx_Elbasan = 289; // #128 + static const T1 scx_Elymaic = 290; // #129 + static const T1 scx_Ethiopic = 291; // #130 + static const T1 scx_Georgian = 292; // #268 + static const T1 scx_Glagolitic = 293; // #269 + static const T1 scx_Gothic = 294; // #133 + static const T1 scx_Grantha = 295; // #270 + static const T1 scx_Greek = 296; // #271 + static const T1 scx_Gujarati = 297; // #272 + static const T1 scx_Gunjala_Gondi = 298; // #273 + static const T1 scx_Gurmukhi = 299; // #274 + static const T1 scx_Han = 300; // #275 + static const T1 scx_Hangul = 301; // #276 + static const T1 scx_Hanifi_Rohingya = 302; // #277 + static const T1 scx_Hanunoo = 303; // #278 + static const T1 scx_Hatran = 304; // #143 + static const T1 scx_Hebrew = 305; // #144 + static const T1 scx_Hiragana = 306; // #279 + static const T1 scx_Imperial_Aramaic = 307; // #146 + static const T1 scx_Inherited = 308; // #280 + static const T1 scx_Inscriptional_Pahlavi = 309; // #148 + static const T1 scx_Inscriptional_Parthian = 310; // #149 + static const T1 scx_Javanese = 311; // #281 + static const T1 scx_Kaithi = 312; // #282 + static const T1 scx_Kannada = 313; // #283 + static const T1 scx_Katakana = 314; // #284 + static const T1 scx_Kayah_Li = 315; // #285 + static const T1 scx_Kharoshthi = 316; // #155 + static const T1 scx_Khitan_Small_Script = 317; // #156 + static const T1 scx_Khmer = 318; // #157 + static const T1 scx_Khojki = 319; // #286 + static const T1 scx_Khudawadi = 320; // #287 + static const T1 scx_Lao = 321; // #160 + static const T1 scx_Latin = 322; // #288 + static const T1 scx_Lepcha = 323; // #162 + static const T1 scx_Limbu = 324; // #289 + static const T1 scx_Linear_A = 325; // #290 + static const T1 scx_Linear_B = 326; // #291 + static const T1 scx_Lisu = 327; // #166 + static const T1 scx_Lycian = 328; // #167 + static const T1 scx_Lydian = 329; // #168 + static const T1 scx_Mahajani = 330; // #292 + static const T1 scx_Makasar = 331; // #170 + static const T1 scx_Malayalam = 332; // #293 + static const T1 scx_Mandaic = 333; // #294 + static const T1 scx_Manichaean = 334; // #295 + static const T1 scx_Marchen = 335; // #174 + static const T1 scx_Masaram_Gondi = 336; // #296 + static const T1 scx_Medefaidrin = 337; // #176 + static const T1 scx_Meetei_Mayek = 338; // #177 + static const T1 scx_Mende_Kikakui = 339; // #178 + static const T1 scx_Meroitic_Cursive = 340; // #179 + static const T1 scx_Meroitic_Hieroglyphs = 341; // #180 + static const T1 scx_Miao = 342; // #181 + static const T1 scx_Modi = 343; // #297 + static const T1 scx_Mongolian = 344; // #298 + static const T1 scx_Mro = 345; // #184 + static const T1 scx_Multani = 346; // #299 + static const T1 scx_Myanmar = 347; // #300 + static const T1 scx_Nabataean = 348; // #187 + static const T1 scx_Nandinagari = 349; // #301 + static const T1 scx_New_Tai_Lue = 350; // #189 + static const T1 scx_Newa = 351; // #190 + static const T1 scx_Nko = 352; // #302 + static const T1 scx_Nushu = 353; // #192 + static const T1 scx_Nyiakeng_Puachue_Hmong = 354; // #193 + static const T1 scx_Ogham = 355; // #194 + static const T1 scx_Ol_Chiki = 356; // #195 + static const T1 scx_Old_Hungarian = 357; // #196 + static const T1 scx_Old_Italic = 358; // #197 + static const T1 scx_Old_North_Arabian = 359; // #198 + static const T1 scx_Old_Permic = 360; // #303 + static const T1 scx_Old_Persian = 361; // #200 + static const T1 scx_Old_Sogdian = 362; // #201 + static const T1 scx_Old_South_Arabian = 363; // #202 + static const T1 scx_Old_Turkic = 364; // #203 + static const T1 scx_Old_Uyghur = 365; // #304 + static const T1 scx_Oriya = 366; // #305 + static const T1 scx_Osage = 367; // #206 + static const T1 scx_Osmanya = 368; // #207 + static const T1 scx_Pahawh_Hmong = 369; // #208 + static const T1 scx_Palmyrene = 370; // #209 + static const T1 scx_Pau_Cin_Hau = 371; // #210 + static const T1 scx_Phags_Pa = 372; // #306 + static const T1 scx_Phoenician = 373; // #212 + static const T1 scx_Psalter_Pahlavi = 374; // #307 + static const T1 scx_Rejang = 375; // #214 + static const T1 scx_Runic = 376; // #215 + static const T1 scx_Samaritan = 377; // #216 + static const T1 scx_Saurashtra = 378; // #217 + static const T1 scx_Sharada = 379; // #308 + static const T1 scx_Shavian = 380; // #219 + static const T1 scx_Siddham = 381; // #220 + static const T1 scx_SignWriting = 382; // #221 + static const T1 scx_Sinhala = 383; // #309 + static const T1 scx_Sogdian = 384; // #310 + static const T1 scx_Sora_Sompeng = 385; // #224 + static const T1 scx_Soyombo = 386; // #225 + static const T1 scx_Sundanese = 387; // #226 + static const T1 scx_Syloti_Nagri = 388; // #311 + static const T1 scx_Syriac = 389; // #312 + static const T1 scx_Tagalog = 390; // #313 + static const T1 scx_Tagbanwa = 391; // #314 + static const T1 scx_Tai_Le = 392; // #315 + static const T1 scx_Tai_Tham = 393; // #232 + static const T1 scx_Tai_Viet = 394; // #233 + static const T1 scx_Takri = 395; // #316 + static const T1 scx_Tamil = 396; // #317 + static const T1 scx_Tangsa = 397; // #236 + static const T1 scx_Tangut = 398; // #237 + static const T1 scx_Telugu = 399; // #318 + static const T1 scx_Thaana = 400; // #319 + static const T1 scx_Thai = 401; // #240 + static const T1 scx_Tibetan = 402; // #241 + static const T1 scx_Tifinagh = 403; // #242 + static const T1 scx_Tirhuta = 404; // #320 + static const T1 scx_Toto = 405; // #244 + static const T1 scx_Ugaritic = 406; // #245 + static const T1 scx_Vai = 407; // #246 + static const T1 scx_Vithkuqi = 408; // #247 + static const T1 scx_Wancho = 409; // #248 + static const T1 scx_Warang_Citi = 410; // #249 + static const T1 scx_Yezidi = 411; // #321 + static const T1 scx_Yi = 412; // #322 + static const T1 scx_Zanabazar_Square = 413; // #252 + static const T1 last_property_number = 322; + struct ptype + { + static const T2 unknown = 0; + static const T2 binary = 1; + static const T2 general_category = 2; + static const T2 script = 3; + static const T2 script_extensions = 4; + }; + static const T3 propertynametable[]; + static const T4 rangetable[]; + static const T5 rangenumbertable[]; + static const T6 positiontable[]; + + static const T3 *propertyname_table() + { + return propertynametable; + } + static const T4 *ranges() + { + return rangetable; + } + static const T5 *rangenumber_table() + { + return rangenumbertable; + } + static const T6 *position_table() + { + return positiontable; + } +}; + +template +const T3 unicode_property_data::propertynametable[] = +{ + "*", // #0:unknown + "*", // #1:binary + "General_Category:gc", // #2 + "Script:sc", // #3 + "Script_Extensions:scx", // #4 + "" +}; + +template +const T4 unicode_property_data::rangetable[] = +{ + // #1 (0+725): gc=Other:C + // Cc:2 + Cf:21 + Cn:698 + Co:3 + Cs:1 + // #2 (0+2): gc=Control:Cc:cntrl + 0x0000, 0x001F, 0x007F, 0x009F, + // #3 (2+21): gc=Format:Cf + 0x00AD, 0x00AD, 0x0600, 0x0605, 0x061C, 0x061C, 0x06DD, 0x06DD, + 0x070F, 0x070F, 0x0890, 0x0891, 0x08E2, 0x08E2, 0x180E, 0x180E, + 0x200B, 0x200F, 0x202A, 0x202E, 0x2060, 0x2064, 0x2066, 0x206F, + 0xFEFF, 0xFEFF, 0xFFF9, 0xFFFB, 0x110BD, 0x110BD, 0x110CD, 0x110CD, + 0x13430, 0x13438, 0x1BCA0, 0x1BCA3, 0x1D173, 0x1D17A, 0xE0001, 0xE0001, + 0xE0020, 0xE007F, + // #4 (23+698): gc=Unassigned:Cn + 0x0378, 0x0379, 0x0380, 0x0383, 0x038B, 0x038B, 0x038D, 0x038D, + 0x03A2, 0x03A2, 0x0530, 0x0530, 0x0557, 0x0558, 0x058B, 0x058C, + 0x0590, 0x0590, 0x05C8, 0x05CF, 0x05EB, 0x05EE, 0x05F5, 0x05FF, + 0x070E, 0x070E, 0x074B, 0x074C, 0x07B2, 0x07BF, 0x07FB, 0x07FC, + 0x082E, 0x082F, 0x083F, 0x083F, 0x085C, 0x085D, 0x085F, 0x085F, + 0x086B, 0x086F, 0x088F, 0x088F, 0x0892, 0x0897, 0x0984, 0x0984, + 0x098D, 0x098E, 0x0991, 0x0992, 0x09A9, 0x09A9, 0x09B1, 0x09B1, + 0x09B3, 0x09B5, 0x09BA, 0x09BB, 0x09C5, 0x09C6, 0x09C9, 0x09CA, + 0x09CF, 0x09D6, 0x09D8, 0x09DB, 0x09DE, 0x09DE, 0x09E4, 0x09E5, + 0x09FF, 0x0A00, 0x0A04, 0x0A04, 0x0A0B, 0x0A0E, 0x0A11, 0x0A12, + 0x0A29, 0x0A29, 0x0A31, 0x0A31, 0x0A34, 0x0A34, 0x0A37, 0x0A37, + 0x0A3A, 0x0A3B, 0x0A3D, 0x0A3D, 0x0A43, 0x0A46, 0x0A49, 0x0A4A, + 0x0A4E, 0x0A50, 0x0A52, 0x0A58, 0x0A5D, 0x0A5D, 0x0A5F, 0x0A65, + 0x0A77, 0x0A80, 0x0A84, 0x0A84, 0x0A8E, 0x0A8E, 0x0A92, 0x0A92, + 0x0AA9, 0x0AA9, 0x0AB1, 0x0AB1, 0x0AB4, 0x0AB4, 0x0ABA, 0x0ABB, + 0x0AC6, 0x0AC6, 0x0ACA, 0x0ACA, 0x0ACE, 0x0ACF, 0x0AD1, 0x0ADF, + 0x0AE4, 0x0AE5, 0x0AF2, 0x0AF8, 0x0B00, 0x0B00, 0x0B04, 0x0B04, + 0x0B0D, 0x0B0E, 0x0B11, 0x0B12, 0x0B29, 0x0B29, 0x0B31, 0x0B31, + 0x0B34, 0x0B34, 0x0B3A, 0x0B3B, 0x0B45, 0x0B46, 0x0B49, 0x0B4A, + 0x0B4E, 0x0B54, 0x0B58, 0x0B5B, 0x0B5E, 0x0B5E, 0x0B64, 0x0B65, + 0x0B78, 0x0B81, 0x0B84, 0x0B84, 0x0B8B, 0x0B8D, 0x0B91, 0x0B91, + 0x0B96, 0x0B98, 0x0B9B, 0x0B9B, 0x0B9D, 0x0B9D, 0x0BA0, 0x0BA2, + 0x0BA5, 0x0BA7, 0x0BAB, 0x0BAD, 0x0BBA, 0x0BBD, 0x0BC3, 0x0BC5, + 0x0BC9, 0x0BC9, 0x0BCE, 0x0BCF, 0x0BD1, 0x0BD6, 0x0BD8, 0x0BE5, + 0x0BFB, 0x0BFF, 0x0C0D, 0x0C0D, 0x0C11, 0x0C11, 0x0C29, 0x0C29, + 0x0C3A, 0x0C3B, 0x0C45, 0x0C45, 0x0C49, 0x0C49, 0x0C4E, 0x0C54, + 0x0C57, 0x0C57, 0x0C5B, 0x0C5C, 0x0C5E, 0x0C5F, 0x0C64, 0x0C65, + 0x0C70, 0x0C76, 0x0C8D, 0x0C8D, 0x0C91, 0x0C91, 0x0CA9, 0x0CA9, + 0x0CB4, 0x0CB4, 0x0CBA, 0x0CBB, 0x0CC5, 0x0CC5, 0x0CC9, 0x0CC9, + 0x0CCE, 0x0CD4, 0x0CD7, 0x0CDC, 0x0CDF, 0x0CDF, 0x0CE4, 0x0CE5, + 0x0CF0, 0x0CF0, 0x0CF3, 0x0CFF, 0x0D0D, 0x0D0D, 0x0D11, 0x0D11, + 0x0D45, 0x0D45, 0x0D49, 0x0D49, 0x0D50, 0x0D53, 0x0D64, 0x0D65, + 0x0D80, 0x0D80, 0x0D84, 0x0D84, 0x0D97, 0x0D99, 0x0DB2, 0x0DB2, + 0x0DBC, 0x0DBC, 0x0DBE, 0x0DBF, 0x0DC7, 0x0DC9, 0x0DCB, 0x0DCE, + 0x0DD5, 0x0DD5, 0x0DD7, 0x0DD7, 0x0DE0, 0x0DE5, 0x0DF0, 0x0DF1, + 0x0DF5, 0x0E00, 0x0E3B, 0x0E3E, 0x0E5C, 0x0E80, 0x0E83, 0x0E83, + 0x0E85, 0x0E85, 0x0E8B, 0x0E8B, 0x0EA4, 0x0EA4, 0x0EA6, 0x0EA6, + 0x0EBE, 0x0EBF, 0x0EC5, 0x0EC5, 0x0EC7, 0x0EC7, 0x0ECE, 0x0ECF, + 0x0EDA, 0x0EDB, 0x0EE0, 0x0EFF, 0x0F48, 0x0F48, 0x0F6D, 0x0F70, + 0x0F98, 0x0F98, 0x0FBD, 0x0FBD, 0x0FCD, 0x0FCD, 0x0FDB, 0x0FFF, + 0x10C6, 0x10C6, 0x10C8, 0x10CC, 0x10CE, 0x10CF, 0x1249, 0x1249, + 0x124E, 0x124F, 0x1257, 0x1257, 0x1259, 0x1259, 0x125E, 0x125F, + 0x1289, 0x1289, 0x128E, 0x128F, 0x12B1, 0x12B1, 0x12B6, 0x12B7, + 0x12BF, 0x12BF, 0x12C1, 0x12C1, 0x12C6, 0x12C7, 0x12D7, 0x12D7, + 0x1311, 0x1311, 0x1316, 0x1317, 0x135B, 0x135C, 0x137D, 0x137F, + 0x139A, 0x139F, 0x13F6, 0x13F7, 0x13FE, 0x13FF, 0x169D, 0x169F, + 0x16F9, 0x16FF, 0x1716, 0x171E, 0x1737, 0x173F, 0x1754, 0x175F, + 0x176D, 0x176D, 0x1771, 0x1771, 0x1774, 0x177F, 0x17DE, 0x17DF, + 0x17EA, 0x17EF, 0x17FA, 0x17FF, 0x181A, 0x181F, 0x1879, 0x187F, + 0x18AB, 0x18AF, 0x18F6, 0x18FF, 0x191F, 0x191F, 0x192C, 0x192F, + 0x193C, 0x193F, 0x1941, 0x1943, 0x196E, 0x196F, 0x1975, 0x197F, + 0x19AC, 0x19AF, 0x19CA, 0x19CF, 0x19DB, 0x19DD, 0x1A1C, 0x1A1D, + 0x1A5F, 0x1A5F, 0x1A7D, 0x1A7E, 0x1A8A, 0x1A8F, 0x1A9A, 0x1A9F, + 0x1AAE, 0x1AAF, 0x1ACF, 0x1AFF, 0x1B4D, 0x1B4F, 0x1B7F, 0x1B7F, + 0x1BF4, 0x1BFB, 0x1C38, 0x1C3A, 0x1C4A, 0x1C4C, 0x1C89, 0x1C8F, + 0x1CBB, 0x1CBC, 0x1CC8, 0x1CCF, 0x1CFB, 0x1CFF, 0x1F16, 0x1F17, + 0x1F1E, 0x1F1F, 0x1F46, 0x1F47, 0x1F4E, 0x1F4F, 0x1F58, 0x1F58, + 0x1F5A, 0x1F5A, 0x1F5C, 0x1F5C, 0x1F5E, 0x1F5E, 0x1F7E, 0x1F7F, + 0x1FB5, 0x1FB5, 0x1FC5, 0x1FC5, 0x1FD4, 0x1FD5, 0x1FDC, 0x1FDC, + 0x1FF0, 0x1FF1, 0x1FF5, 0x1FF5, 0x1FFF, 0x1FFF, 0x2065, 0x2065, + 0x2072, 0x2073, 0x208F, 0x208F, 0x209D, 0x209F, 0x20C1, 0x20CF, + 0x20F1, 0x20FF, 0x218C, 0x218F, 0x2427, 0x243F, 0x244B, 0x245F, + 0x2B74, 0x2B75, 0x2B96, 0x2B96, 0x2CF4, 0x2CF8, 0x2D26, 0x2D26, + 0x2D28, 0x2D2C, 0x2D2E, 0x2D2F, 0x2D68, 0x2D6E, 0x2D71, 0x2D7E, + 0x2D97, 0x2D9F, 0x2DA7, 0x2DA7, 0x2DAF, 0x2DAF, 0x2DB7, 0x2DB7, + 0x2DBF, 0x2DBF, 0x2DC7, 0x2DC7, 0x2DCF, 0x2DCF, 0x2DD7, 0x2DD7, + 0x2DDF, 0x2DDF, 0x2E5E, 0x2E7F, 0x2E9A, 0x2E9A, 0x2EF4, 0x2EFF, + 0x2FD6, 0x2FEF, 0x2FFC, 0x2FFF, 0x3040, 0x3040, 0x3097, 0x3098, + 0x3100, 0x3104, 0x3130, 0x3130, 0x318F, 0x318F, 0x31E4, 0x31EF, + 0x321F, 0x321F, 0xA48D, 0xA48F, 0xA4C7, 0xA4CF, 0xA62C, 0xA63F, + 0xA6F8, 0xA6FF, 0xA7CB, 0xA7CF, 0xA7D2, 0xA7D2, 0xA7D4, 0xA7D4, + 0xA7DA, 0xA7F1, 0xA82D, 0xA82F, 0xA83A, 0xA83F, 0xA878, 0xA87F, + 0xA8C6, 0xA8CD, 0xA8DA, 0xA8DF, 0xA954, 0xA95E, 0xA97D, 0xA97F, + 0xA9CE, 0xA9CE, 0xA9DA, 0xA9DD, 0xA9FF, 0xA9FF, 0xAA37, 0xAA3F, + 0xAA4E, 0xAA4F, 0xAA5A, 0xAA5B, 0xAAC3, 0xAADA, 0xAAF7, 0xAB00, + 0xAB07, 0xAB08, 0xAB0F, 0xAB10, 0xAB17, 0xAB1F, 0xAB27, 0xAB27, + 0xAB2F, 0xAB2F, 0xAB6C, 0xAB6F, 0xABEE, 0xABEF, 0xABFA, 0xABFF, + 0xD7A4, 0xD7AF, 0xD7C7, 0xD7CA, 0xD7FC, 0xD7FF, 0xFA6E, 0xFA6F, + 0xFADA, 0xFAFF, 0xFB07, 0xFB12, 0xFB18, 0xFB1C, 0xFB37, 0xFB37, + 0xFB3D, 0xFB3D, 0xFB3F, 0xFB3F, 0xFB42, 0xFB42, 0xFB45, 0xFB45, + 0xFBC3, 0xFBD2, 0xFD90, 0xFD91, 0xFDC8, 0xFDCE, 0xFDD0, 0xFDEF, + 0xFE1A, 0xFE1F, 0xFE53, 0xFE53, 0xFE67, 0xFE67, 0xFE6C, 0xFE6F, + 0xFE75, 0xFE75, 0xFEFD, 0xFEFE, 0xFF00, 0xFF00, 0xFFBF, 0xFFC1, + 0xFFC8, 0xFFC9, 0xFFD0, 0xFFD1, 0xFFD8, 0xFFD9, 0xFFDD, 0xFFDF, + 0xFFE7, 0xFFE7, 0xFFEF, 0xFFF8, 0xFFFE, 0xFFFF, 0x1000C, 0x1000C, + 0x10027, 0x10027, 0x1003B, 0x1003B, 0x1003E, 0x1003E, 0x1004E, 0x1004F, + 0x1005E, 0x1007F, 0x100FB, 0x100FF, 0x10103, 0x10106, 0x10134, 0x10136, + 0x1018F, 0x1018F, 0x1019D, 0x1019F, 0x101A1, 0x101CF, 0x101FE, 0x1027F, + 0x1029D, 0x1029F, 0x102D1, 0x102DF, 0x102FC, 0x102FF, 0x10324, 0x1032C, + 0x1034B, 0x1034F, 0x1037B, 0x1037F, 0x1039E, 0x1039E, 0x103C4, 0x103C7, + 0x103D6, 0x103FF, 0x1049E, 0x1049F, 0x104AA, 0x104AF, 0x104D4, 0x104D7, + 0x104FC, 0x104FF, 0x10528, 0x1052F, 0x10564, 0x1056E, 0x1057B, 0x1057B, + 0x1058B, 0x1058B, 0x10593, 0x10593, 0x10596, 0x10596, 0x105A2, 0x105A2, + 0x105B2, 0x105B2, 0x105BA, 0x105BA, 0x105BD, 0x105FF, 0x10737, 0x1073F, + 0x10756, 0x1075F, 0x10768, 0x1077F, 0x10786, 0x10786, 0x107B1, 0x107B1, + 0x107BB, 0x107FF, 0x10806, 0x10807, 0x10809, 0x10809, 0x10836, 0x10836, + 0x10839, 0x1083B, 0x1083D, 0x1083E, 0x10856, 0x10856, 0x1089F, 0x108A6, + 0x108B0, 0x108DF, 0x108F3, 0x108F3, 0x108F6, 0x108FA, 0x1091C, 0x1091E, + 0x1093A, 0x1093E, 0x10940, 0x1097F, 0x109B8, 0x109BB, 0x109D0, 0x109D1, + 0x10A04, 0x10A04, 0x10A07, 0x10A0B, 0x10A14, 0x10A14, 0x10A18, 0x10A18, + 0x10A36, 0x10A37, 0x10A3B, 0x10A3E, 0x10A49, 0x10A4F, 0x10A59, 0x10A5F, + 0x10AA0, 0x10ABF, 0x10AE7, 0x10AEA, 0x10AF7, 0x10AFF, 0x10B36, 0x10B38, + 0x10B56, 0x10B57, 0x10B73, 0x10B77, 0x10B92, 0x10B98, 0x10B9D, 0x10BA8, + 0x10BB0, 0x10BFF, 0x10C49, 0x10C7F, 0x10CB3, 0x10CBF, 0x10CF3, 0x10CF9, + 0x10D28, 0x10D2F, 0x10D3A, 0x10E5F, 0x10E7F, 0x10E7F, 0x10EAA, 0x10EAA, + 0x10EAE, 0x10EAF, 0x10EB2, 0x10EFF, 0x10F28, 0x10F2F, 0x10F5A, 0x10F6F, + 0x10F8A, 0x10FAF, 0x10FCC, 0x10FDF, 0x10FF7, 0x10FFF, 0x1104E, 0x11051, + 0x11076, 0x1107E, 0x110C3, 0x110CC, 0x110CE, 0x110CF, 0x110E9, 0x110EF, + 0x110FA, 0x110FF, 0x11135, 0x11135, 0x11148, 0x1114F, 0x11177, 0x1117F, + 0x111E0, 0x111E0, 0x111F5, 0x111FF, 0x11212, 0x11212, 0x1123F, 0x1127F, + 0x11287, 0x11287, 0x11289, 0x11289, 0x1128E, 0x1128E, 0x1129E, 0x1129E, + 0x112AA, 0x112AF, 0x112EB, 0x112EF, 0x112FA, 0x112FF, 0x11304, 0x11304, + 0x1130D, 0x1130E, 0x11311, 0x11312, 0x11329, 0x11329, 0x11331, 0x11331, + 0x11334, 0x11334, 0x1133A, 0x1133A, 0x11345, 0x11346, 0x11349, 0x1134A, + 0x1134E, 0x1134F, 0x11351, 0x11356, 0x11358, 0x1135C, 0x11364, 0x11365, + 0x1136D, 0x1136F, 0x11375, 0x113FF, 0x1145C, 0x1145C, 0x11462, 0x1147F, + 0x114C8, 0x114CF, 0x114DA, 0x1157F, 0x115B6, 0x115B7, 0x115DE, 0x115FF, + 0x11645, 0x1164F, 0x1165A, 0x1165F, 0x1166D, 0x1167F, 0x116BA, 0x116BF, + 0x116CA, 0x116FF, 0x1171B, 0x1171C, 0x1172C, 0x1172F, 0x11747, 0x117FF, + 0x1183C, 0x1189F, 0x118F3, 0x118FE, 0x11907, 0x11908, 0x1190A, 0x1190B, + 0x11914, 0x11914, 0x11917, 0x11917, 0x11936, 0x11936, 0x11939, 0x1193A, + 0x11947, 0x1194F, 0x1195A, 0x1199F, 0x119A8, 0x119A9, 0x119D8, 0x119D9, + 0x119E5, 0x119FF, 0x11A48, 0x11A4F, 0x11AA3, 0x11AAF, 0x11AF9, 0x11BFF, + 0x11C09, 0x11C09, 0x11C37, 0x11C37, 0x11C46, 0x11C4F, 0x11C6D, 0x11C6F, + 0x11C90, 0x11C91, 0x11CA8, 0x11CA8, 0x11CB7, 0x11CFF, 0x11D07, 0x11D07, + 0x11D0A, 0x11D0A, 0x11D37, 0x11D39, 0x11D3B, 0x11D3B, 0x11D3E, 0x11D3E, + 0x11D48, 0x11D4F, 0x11D5A, 0x11D5F, 0x11D66, 0x11D66, 0x11D69, 0x11D69, + 0x11D8F, 0x11D8F, 0x11D92, 0x11D92, 0x11D99, 0x11D9F, 0x11DAA, 0x11EDF, + 0x11EF9, 0x11FAF, 0x11FB1, 0x11FBF, 0x11FF2, 0x11FFE, 0x1239A, 0x123FF, + 0x1246F, 0x1246F, 0x12475, 0x1247F, 0x12544, 0x12F8F, 0x12FF3, 0x12FFF, + 0x1342F, 0x1342F, 0x13439, 0x143FF, 0x14647, 0x167FF, 0x16A39, 0x16A3F, + 0x16A5F, 0x16A5F, 0x16A6A, 0x16A6D, 0x16ABF, 0x16ABF, 0x16ACA, 0x16ACF, + 0x16AEE, 0x16AEF, 0x16AF6, 0x16AFF, 0x16B46, 0x16B4F, 0x16B5A, 0x16B5A, + 0x16B62, 0x16B62, 0x16B78, 0x16B7C, 0x16B90, 0x16E3F, 0x16E9B, 0x16EFF, + 0x16F4B, 0x16F4E, 0x16F88, 0x16F8E, 0x16FA0, 0x16FDF, 0x16FE5, 0x16FEF, + 0x16FF2, 0x16FFF, 0x187F8, 0x187FF, 0x18CD6, 0x18CFF, 0x18D09, 0x1AFEF, + 0x1AFF4, 0x1AFF4, 0x1AFFC, 0x1AFFC, 0x1AFFF, 0x1AFFF, 0x1B123, 0x1B14F, + 0x1B153, 0x1B163, 0x1B168, 0x1B16F, 0x1B2FC, 0x1BBFF, 0x1BC6B, 0x1BC6F, + 0x1BC7D, 0x1BC7F, 0x1BC89, 0x1BC8F, 0x1BC9A, 0x1BC9B, 0x1BCA4, 0x1CEFF, + 0x1CF2E, 0x1CF2F, 0x1CF47, 0x1CF4F, 0x1CFC4, 0x1CFFF, 0x1D0F6, 0x1D0FF, + 0x1D127, 0x1D128, 0x1D1EB, 0x1D1FF, 0x1D246, 0x1D2DF, 0x1D2F4, 0x1D2FF, + 0x1D357, 0x1D35F, 0x1D379, 0x1D3FF, 0x1D455, 0x1D455, 0x1D49D, 0x1D49D, + 0x1D4A0, 0x1D4A1, 0x1D4A3, 0x1D4A4, 0x1D4A7, 0x1D4A8, 0x1D4AD, 0x1D4AD, + 0x1D4BA, 0x1D4BA, 0x1D4BC, 0x1D4BC, 0x1D4C4, 0x1D4C4, 0x1D506, 0x1D506, + 0x1D50B, 0x1D50C, 0x1D515, 0x1D515, 0x1D51D, 0x1D51D, 0x1D53A, 0x1D53A, + 0x1D53F, 0x1D53F, 0x1D545, 0x1D545, 0x1D547, 0x1D549, 0x1D551, 0x1D551, + 0x1D6A6, 0x1D6A7, 0x1D7CC, 0x1D7CD, 0x1DA8C, 0x1DA9A, 0x1DAA0, 0x1DAA0, + 0x1DAB0, 0x1DEFF, 0x1DF1F, 0x1DFFF, 0x1E007, 0x1E007, 0x1E019, 0x1E01A, + 0x1E022, 0x1E022, 0x1E025, 0x1E025, 0x1E02B, 0x1E0FF, 0x1E12D, 0x1E12F, + 0x1E13E, 0x1E13F, 0x1E14A, 0x1E14D, 0x1E150, 0x1E28F, 0x1E2AF, 0x1E2BF, + 0x1E2FA, 0x1E2FE, 0x1E300, 0x1E7DF, 0x1E7E7, 0x1E7E7, 0x1E7EC, 0x1E7EC, + 0x1E7EF, 0x1E7EF, 0x1E7FF, 0x1E7FF, 0x1E8C5, 0x1E8C6, 0x1E8D7, 0x1E8FF, + 0x1E94C, 0x1E94F, 0x1E95A, 0x1E95D, 0x1E960, 0x1EC70, 0x1ECB5, 0x1ED00, + 0x1ED3E, 0x1EDFF, 0x1EE04, 0x1EE04, 0x1EE20, 0x1EE20, 0x1EE23, 0x1EE23, + 0x1EE25, 0x1EE26, 0x1EE28, 0x1EE28, 0x1EE33, 0x1EE33, 0x1EE38, 0x1EE38, + 0x1EE3A, 0x1EE3A, 0x1EE3C, 0x1EE41, 0x1EE43, 0x1EE46, 0x1EE48, 0x1EE48, + 0x1EE4A, 0x1EE4A, 0x1EE4C, 0x1EE4C, 0x1EE50, 0x1EE50, 0x1EE53, 0x1EE53, + 0x1EE55, 0x1EE56, 0x1EE58, 0x1EE58, 0x1EE5A, 0x1EE5A, 0x1EE5C, 0x1EE5C, + 0x1EE5E, 0x1EE5E, 0x1EE60, 0x1EE60, 0x1EE63, 0x1EE63, 0x1EE65, 0x1EE66, + 0x1EE6B, 0x1EE6B, 0x1EE73, 0x1EE73, 0x1EE78, 0x1EE78, 0x1EE7D, 0x1EE7D, + 0x1EE7F, 0x1EE7F, 0x1EE8A, 0x1EE8A, 0x1EE9C, 0x1EEA0, 0x1EEA4, 0x1EEA4, + 0x1EEAA, 0x1EEAA, 0x1EEBC, 0x1EEEF, 0x1EEF2, 0x1EFFF, 0x1F02C, 0x1F02F, + 0x1F094, 0x1F09F, 0x1F0AF, 0x1F0B0, 0x1F0C0, 0x1F0C0, 0x1F0D0, 0x1F0D0, + 0x1F0F6, 0x1F0FF, 0x1F1AE, 0x1F1E5, 0x1F203, 0x1F20F, 0x1F23C, 0x1F23F, + 0x1F249, 0x1F24F, 0x1F252, 0x1F25F, 0x1F266, 0x1F2FF, 0x1F6D8, 0x1F6DC, + 0x1F6ED, 0x1F6EF, 0x1F6FD, 0x1F6FF, 0x1F774, 0x1F77F, 0x1F7D9, 0x1F7DF, + 0x1F7EC, 0x1F7EF, 0x1F7F1, 0x1F7FF, 0x1F80C, 0x1F80F, 0x1F848, 0x1F84F, + 0x1F85A, 0x1F85F, 0x1F888, 0x1F88F, 0x1F8AE, 0x1F8AF, 0x1F8B2, 0x1F8FF, + 0x1FA54, 0x1FA5F, 0x1FA6E, 0x1FA6F, 0x1FA75, 0x1FA77, 0x1FA7D, 0x1FA7F, + 0x1FA87, 0x1FA8F, 0x1FAAD, 0x1FAAF, 0x1FABB, 0x1FABF, 0x1FAC6, 0x1FACF, + 0x1FADA, 0x1FADF, 0x1FAE8, 0x1FAEF, 0x1FAF7, 0x1FAFF, 0x1FB93, 0x1FB93, + 0x1FBCB, 0x1FBEF, 0x1FBFA, 0x1FFFF, 0x2A6E0, 0x2A6FF, 0x2B739, 0x2B73F, + 0x2B81E, 0x2B81F, 0x2CEA2, 0x2CEAF, 0x2EBE1, 0x2F7FF, 0x2FA1E, 0x2FFFF, + 0x3134B, 0xE0000, 0xE0002, 0xE001F, 0xE0080, 0xE00FF, 0xE01F0, 0xEFFFF, + 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF, + // #5 (721+3): gc=Private_Use:Co + 0xE000, 0xF8FF, 0xF0000, 0xFFFFD, 0x100000, 0x10FFFD, + // #6 (724+1): gc=Surrogate:Cs + 0xD800, 0xDFFF, + // #7 (725+1883): gc=Letter:L + // Ll:657 + Lt:10 + Lu:646 + Lm:69 + Lo:501 + // #8 (725+1313): gc=Cased_Letter:LC + // Ll:657 + Lt:10 + Lu:646 + // #9 (725+657): gc=Lowercase_Letter:Ll + 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00DF, 0x00F6, 0x00F8, 0x00FF, + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010B, 0x010B, 0x010D, 0x010D, 0x010F, 0x010F, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011B, 0x011B, 0x011D, 0x011D, 0x011F, 0x011F, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012B, 0x012B, 0x012D, 0x012D, 0x012F, 0x012F, + 0x0131, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0138, + 0x013A, 0x013A, 0x013C, 0x013C, 0x013E, 0x013E, 0x0140, 0x0140, + 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, 0x0149, + 0x014B, 0x014B, 0x014D, 0x014D, 0x014F, 0x014F, 0x0151, 0x0151, + 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, 0x0159, 0x0159, + 0x015B, 0x015B, 0x015D, 0x015D, 0x015F, 0x015F, 0x0161, 0x0161, + 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, 0x0169, 0x0169, + 0x016B, 0x016B, 0x016D, 0x016D, 0x016F, 0x016F, 0x0171, 0x0171, + 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, 0x017A, 0x017A, + 0x017C, 0x017C, 0x017E, 0x0180, 0x0183, 0x0183, 0x0185, 0x0185, + 0x0188, 0x0188, 0x018C, 0x018D, 0x0192, 0x0192, 0x0195, 0x0195, + 0x0199, 0x019B, 0x019E, 0x019E, 0x01A1, 0x01A1, 0x01A3, 0x01A3, + 0x01A5, 0x01A5, 0x01A8, 0x01A8, 0x01AA, 0x01AB, 0x01AD, 0x01AD, + 0x01B0, 0x01B0, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x01B9, 0x01BA, + 0x01BD, 0x01BF, 0x01C6, 0x01C6, 0x01C9, 0x01C9, 0x01CC, 0x01CC, + 0x01CE, 0x01CE, 0x01D0, 0x01D0, 0x01D2, 0x01D2, 0x01D4, 0x01D4, + 0x01D6, 0x01D6, 0x01D8, 0x01D8, 0x01DA, 0x01DA, 0x01DC, 0x01DD, + 0x01DF, 0x01DF, 0x01E1, 0x01E1, 0x01E3, 0x01E3, 0x01E5, 0x01E5, + 0x01E7, 0x01E7, 0x01E9, 0x01E9, 0x01EB, 0x01EB, 0x01ED, 0x01ED, + 0x01EF, 0x01F0, 0x01F3, 0x01F3, 0x01F5, 0x01F5, 0x01F9, 0x01F9, + 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF, 0x0201, 0x0201, + 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, 0x0209, 0x0209, + 0x020B, 0x020B, 0x020D, 0x020D, 0x020F, 0x020F, 0x0211, 0x0211, + 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, 0x0219, 0x0219, + 0x021B, 0x021B, 0x021D, 0x021D, 0x021F, 0x021F, 0x0221, 0x0221, + 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, + 0x022B, 0x022B, 0x022D, 0x022D, 0x022F, 0x022F, 0x0231, 0x0231, + 0x0233, 0x0239, 0x023C, 0x023C, 0x023F, 0x0240, 0x0242, 0x0242, + 0x0247, 0x0247, 0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, + 0x024F, 0x0293, 0x0295, 0x02AF, 0x0371, 0x0371, 0x0373, 0x0373, + 0x0377, 0x0377, 0x037B, 0x037D, 0x0390, 0x0390, 0x03AC, 0x03CE, + 0x03D0, 0x03D1, 0x03D5, 0x03D7, 0x03D9, 0x03D9, 0x03DB, 0x03DB, + 0x03DD, 0x03DD, 0x03DF, 0x03DF, 0x03E1, 0x03E1, 0x03E3, 0x03E3, + 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, + 0x03ED, 0x03ED, 0x03EF, 0x03F3, 0x03F5, 0x03F5, 0x03F8, 0x03F8, + 0x03FB, 0x03FC, 0x0430, 0x045F, 0x0461, 0x0461, 0x0463, 0x0463, + 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, + 0x046D, 0x046D, 0x046F, 0x046F, 0x0471, 0x0471, 0x0473, 0x0473, + 0x0475, 0x0475, 0x0477, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, + 0x047D, 0x047D, 0x047F, 0x047F, 0x0481, 0x0481, 0x048B, 0x048B, + 0x048D, 0x048D, 0x048F, 0x048F, 0x0491, 0x0491, 0x0493, 0x0493, + 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, + 0x049D, 0x049D, 0x049F, 0x049F, 0x04A1, 0x04A1, 0x04A3, 0x04A3, + 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, + 0x04AD, 0x04AD, 0x04AF, 0x04AF, 0x04B1, 0x04B1, 0x04B3, 0x04B3, + 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, + 0x04BD, 0x04BD, 0x04BF, 0x04BF, 0x04C2, 0x04C2, 0x04C4, 0x04C4, + 0x04C6, 0x04C6, 0x04C8, 0x04C8, 0x04CA, 0x04CA, 0x04CC, 0x04CC, + 0x04CE, 0x04CF, 0x04D1, 0x04D1, 0x04D3, 0x04D3, 0x04D5, 0x04D5, + 0x04D7, 0x04D7, 0x04D9, 0x04D9, 0x04DB, 0x04DB, 0x04DD, 0x04DD, + 0x04DF, 0x04DF, 0x04E1, 0x04E1, 0x04E3, 0x04E3, 0x04E5, 0x04E5, + 0x04E7, 0x04E7, 0x04E9, 0x04E9, 0x04EB, 0x04EB, 0x04ED, 0x04ED, + 0x04EF, 0x04EF, 0x04F1, 0x04F1, 0x04F3, 0x04F3, 0x04F5, 0x04F5, + 0x04F7, 0x04F7, 0x04F9, 0x04F9, 0x04FB, 0x04FB, 0x04FD, 0x04FD, + 0x04FF, 0x04FF, 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, + 0x0507, 0x0507, 0x0509, 0x0509, 0x050B, 0x050B, 0x050D, 0x050D, + 0x050F, 0x050F, 0x0511, 0x0511, 0x0513, 0x0513, 0x0515, 0x0515, + 0x0517, 0x0517, 0x0519, 0x0519, 0x051B, 0x051B, 0x051D, 0x051D, + 0x051F, 0x051F, 0x0521, 0x0521, 0x0523, 0x0523, 0x0525, 0x0525, + 0x0527, 0x0527, 0x0529, 0x0529, 0x052B, 0x052B, 0x052D, 0x052D, + 0x052F, 0x052F, 0x0560, 0x0588, 0x10D0, 0x10FA, 0x10FD, 0x10FF, + 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1D00, 0x1D2B, 0x1D6B, 0x1D77, + 0x1D79, 0x1D9A, 0x1E01, 0x1E01, 0x1E03, 0x1E03, 0x1E05, 0x1E05, + 0x1E07, 0x1E07, 0x1E09, 0x1E09, 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, + 0x1E0F, 0x1E0F, 0x1E11, 0x1E11, 0x1E13, 0x1E13, 0x1E15, 0x1E15, + 0x1E17, 0x1E17, 0x1E19, 0x1E19, 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, + 0x1E1F, 0x1E1F, 0x1E21, 0x1E21, 0x1E23, 0x1E23, 0x1E25, 0x1E25, + 0x1E27, 0x1E27, 0x1E29, 0x1E29, 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, + 0x1E2F, 0x1E2F, 0x1E31, 0x1E31, 0x1E33, 0x1E33, 0x1E35, 0x1E35, + 0x1E37, 0x1E37, 0x1E39, 0x1E39, 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, + 0x1E3F, 0x1E3F, 0x1E41, 0x1E41, 0x1E43, 0x1E43, 0x1E45, 0x1E45, + 0x1E47, 0x1E47, 0x1E49, 0x1E49, 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, + 0x1E4F, 0x1E4F, 0x1E51, 0x1E51, 0x1E53, 0x1E53, 0x1E55, 0x1E55, + 0x1E57, 0x1E57, 0x1E59, 0x1E59, 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, + 0x1E5F, 0x1E5F, 0x1E61, 0x1E61, 0x1E63, 0x1E63, 0x1E65, 0x1E65, + 0x1E67, 0x1E67, 0x1E69, 0x1E69, 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, + 0x1E6F, 0x1E6F, 0x1E71, 0x1E71, 0x1E73, 0x1E73, 0x1E75, 0x1E75, + 0x1E77, 0x1E77, 0x1E79, 0x1E79, 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, + 0x1E7F, 0x1E7F, 0x1E81, 0x1E81, 0x1E83, 0x1E83, 0x1E85, 0x1E85, + 0x1E87, 0x1E87, 0x1E89, 0x1E89, 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, + 0x1E8F, 0x1E8F, 0x1E91, 0x1E91, 0x1E93, 0x1E93, 0x1E95, 0x1E9D, + 0x1E9F, 0x1E9F, 0x1EA1, 0x1EA1, 0x1EA3, 0x1EA3, 0x1EA5, 0x1EA5, + 0x1EA7, 0x1EA7, 0x1EA9, 0x1EA9, 0x1EAB, 0x1EAB, 0x1EAD, 0x1EAD, + 0x1EAF, 0x1EAF, 0x1EB1, 0x1EB1, 0x1EB3, 0x1EB3, 0x1EB5, 0x1EB5, + 0x1EB7, 0x1EB7, 0x1EB9, 0x1EB9, 0x1EBB, 0x1EBB, 0x1EBD, 0x1EBD, + 0x1EBF, 0x1EBF, 0x1EC1, 0x1EC1, 0x1EC3, 0x1EC3, 0x1EC5, 0x1EC5, + 0x1EC7, 0x1EC7, 0x1EC9, 0x1EC9, 0x1ECB, 0x1ECB, 0x1ECD, 0x1ECD, + 0x1ECF, 0x1ECF, 0x1ED1, 0x1ED1, 0x1ED3, 0x1ED3, 0x1ED5, 0x1ED5, + 0x1ED7, 0x1ED7, 0x1ED9, 0x1ED9, 0x1EDB, 0x1EDB, 0x1EDD, 0x1EDD, + 0x1EDF, 0x1EDF, 0x1EE1, 0x1EE1, 0x1EE3, 0x1EE3, 0x1EE5, 0x1EE5, + 0x1EE7, 0x1EE7, 0x1EE9, 0x1EE9, 0x1EEB, 0x1EEB, 0x1EED, 0x1EED, + 0x1EEF, 0x1EEF, 0x1EF1, 0x1EF1, 0x1EF3, 0x1EF3, 0x1EF5, 0x1EF5, + 0x1EF7, 0x1EF7, 0x1EF9, 0x1EF9, 0x1EFB, 0x1EFB, 0x1EFD, 0x1EFD, + 0x1EFF, 0x1F07, 0x1F10, 0x1F15, 0x1F20, 0x1F27, 0x1F30, 0x1F37, + 0x1F40, 0x1F45, 0x1F50, 0x1F57, 0x1F60, 0x1F67, 0x1F70, 0x1F7D, + 0x1F80, 0x1F87, 0x1F90, 0x1F97, 0x1FA0, 0x1FA7, 0x1FB0, 0x1FB4, + 0x1FB6, 0x1FB7, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FC7, + 0x1FD0, 0x1FD3, 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FF7, 0x210A, 0x210A, 0x210E, 0x210F, 0x2113, 0x2113, + 0x212F, 0x212F, 0x2134, 0x2134, 0x2139, 0x2139, 0x213C, 0x213D, + 0x2146, 0x2149, 0x214E, 0x214E, 0x2184, 0x2184, 0x2C30, 0x2C5F, + 0x2C61, 0x2C61, 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, + 0x2C6C, 0x2C6C, 0x2C71, 0x2C71, 0x2C73, 0x2C74, 0x2C76, 0x2C7B, + 0x2C81, 0x2C81, 0x2C83, 0x2C83, 0x2C85, 0x2C85, 0x2C87, 0x2C87, + 0x2C89, 0x2C89, 0x2C8B, 0x2C8B, 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, + 0x2C91, 0x2C91, 0x2C93, 0x2C93, 0x2C95, 0x2C95, 0x2C97, 0x2C97, + 0x2C99, 0x2C99, 0x2C9B, 0x2C9B, 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, + 0x2CA1, 0x2CA1, 0x2CA3, 0x2CA3, 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, + 0x2CA9, 0x2CA9, 0x2CAB, 0x2CAB, 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, + 0x2CB1, 0x2CB1, 0x2CB3, 0x2CB3, 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, + 0x2CB9, 0x2CB9, 0x2CBB, 0x2CBB, 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, + 0x2CC1, 0x2CC1, 0x2CC3, 0x2CC3, 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, + 0x2CC9, 0x2CC9, 0x2CCB, 0x2CCB, 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, + 0x2CD1, 0x2CD1, 0x2CD3, 0x2CD3, 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, + 0x2CD9, 0x2CD9, 0x2CDB, 0x2CDB, 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, + 0x2CE1, 0x2CE1, 0x2CE3, 0x2CE4, 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, + 0x2CF3, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + 0xA641, 0xA641, 0xA643, 0xA643, 0xA645, 0xA645, 0xA647, 0xA647, + 0xA649, 0xA649, 0xA64B, 0xA64B, 0xA64D, 0xA64D, 0xA64F, 0xA64F, + 0xA651, 0xA651, 0xA653, 0xA653, 0xA655, 0xA655, 0xA657, 0xA657, + 0xA659, 0xA659, 0xA65B, 0xA65B, 0xA65D, 0xA65D, 0xA65F, 0xA65F, + 0xA661, 0xA661, 0xA663, 0xA663, 0xA665, 0xA665, 0xA667, 0xA667, + 0xA669, 0xA669, 0xA66B, 0xA66B, 0xA66D, 0xA66D, 0xA681, 0xA681, + 0xA683, 0xA683, 0xA685, 0xA685, 0xA687, 0xA687, 0xA689, 0xA689, + 0xA68B, 0xA68B, 0xA68D, 0xA68D, 0xA68F, 0xA68F, 0xA691, 0xA691, + 0xA693, 0xA693, 0xA695, 0xA695, 0xA697, 0xA697, 0xA699, 0xA699, + 0xA69B, 0xA69B, 0xA723, 0xA723, 0xA725, 0xA725, 0xA727, 0xA727, + 0xA729, 0xA729, 0xA72B, 0xA72B, 0xA72D, 0xA72D, 0xA72F, 0xA731, + 0xA733, 0xA733, 0xA735, 0xA735, 0xA737, 0xA737, 0xA739, 0xA739, + 0xA73B, 0xA73B, 0xA73D, 0xA73D, 0xA73F, 0xA73F, 0xA741, 0xA741, + 0xA743, 0xA743, 0xA745, 0xA745, 0xA747, 0xA747, 0xA749, 0xA749, + 0xA74B, 0xA74B, 0xA74D, 0xA74D, 0xA74F, 0xA74F, 0xA751, 0xA751, + 0xA753, 0xA753, 0xA755, 0xA755, 0xA757, 0xA757, 0xA759, 0xA759, + 0xA75B, 0xA75B, 0xA75D, 0xA75D, 0xA75F, 0xA75F, 0xA761, 0xA761, + 0xA763, 0xA763, 0xA765, 0xA765, 0xA767, 0xA767, 0xA769, 0xA769, + 0xA76B, 0xA76B, 0xA76D, 0xA76D, 0xA76F, 0xA76F, 0xA771, 0xA778, + 0xA77A, 0xA77A, 0xA77C, 0xA77C, 0xA77F, 0xA77F, 0xA781, 0xA781, + 0xA783, 0xA783, 0xA785, 0xA785, 0xA787, 0xA787, 0xA78C, 0xA78C, + 0xA78E, 0xA78E, 0xA791, 0xA791, 0xA793, 0xA795, 0xA797, 0xA797, + 0xA799, 0xA799, 0xA79B, 0xA79B, 0xA79D, 0xA79D, 0xA79F, 0xA79F, + 0xA7A1, 0xA7A1, 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, 0xA7A7, 0xA7A7, + 0xA7A9, 0xA7A9, 0xA7AF, 0xA7AF, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, + 0xA7B9, 0xA7B9, 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, + 0xA7C1, 0xA7C1, 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, + 0xA7D1, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D5, 0xA7D7, 0xA7D7, + 0xA7D9, 0xA7D9, 0xA7F6, 0xA7F6, 0xA7FA, 0xA7FA, 0xAB30, 0xAB5A, + 0xAB60, 0xAB68, 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, + 0xFF41, 0xFF5A, 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10CC0, 0x10CF2, + 0x118C0, 0x118DF, 0x16E60, 0x16E7F, 0x1D41A, 0x1D433, 0x1D44E, 0x1D454, + 0x1D456, 0x1D467, 0x1D482, 0x1D49B, 0x1D4B6, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D4CF, 0x1D4EA, 0x1D503, 0x1D51E, 0x1D537, + 0x1D552, 0x1D56B, 0x1D586, 0x1D59F, 0x1D5BA, 0x1D5D3, 0x1D5EE, 0x1D607, + 0x1D622, 0x1D63B, 0x1D656, 0x1D66F, 0x1D68A, 0x1D6A5, 0x1D6C2, 0x1D6DA, + 0x1D6DC, 0x1D6E1, 0x1D6FC, 0x1D714, 0x1D716, 0x1D71B, 0x1D736, 0x1D74E, + 0x1D750, 0x1D755, 0x1D770, 0x1D788, 0x1D78A, 0x1D78F, 0x1D7AA, 0x1D7C2, + 0x1D7C4, 0x1D7C9, 0x1D7CB, 0x1D7CB, 0x1DF00, 0x1DF09, 0x1DF0B, 0x1DF1E, + 0x1E922, 0x1E943, + // #10 (1382+10): gc=Titlecase_Letter:Lt + 0x01C5, 0x01C5, 0x01C8, 0x01C8, 0x01CB, 0x01CB, 0x01F2, 0x01F2, + 0x1F88, 0x1F8F, 0x1F98, 0x1F9F, 0x1FA8, 0x1FAF, 0x1FBC, 0x1FBC, + 0x1FCC, 0x1FCC, 0x1FFC, 0x1FFC, + // #11 (1392+646): gc=Uppercase_Letter:Lu + 0x0041, 0x005A, 0x00C0, 0x00D6, 0x00D8, 0x00DE, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, + 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, 0x0141, 0x0141, + 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, 0x014A, 0x014A, + 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, 0x0152, 0x0152, + 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, 0x015A, 0x015A, + 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, 0x0162, 0x0162, + 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, 0x016A, 0x016A, + 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, 0x0172, 0x0172, + 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, 0x017B, 0x017B, + 0x017D, 0x017D, 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, + 0x0189, 0x018B, 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, + 0x019C, 0x019D, 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, + 0x01A6, 0x01A7, 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, + 0x01B1, 0x01B3, 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, + 0x01C4, 0x01C4, 0x01C7, 0x01C7, 0x01CA, 0x01CA, 0x01CD, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F1, 0x01F4, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, + 0x01FC, 0x01FC, 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, + 0x0204, 0x0204, 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, + 0x020C, 0x020C, 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, + 0x0214, 0x0214, 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, + 0x021C, 0x021C, 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, + 0x0224, 0x0224, 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, + 0x022C, 0x022C, 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, + 0x023A, 0x023B, 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, + 0x0248, 0x0248, 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, + 0x0370, 0x0370, 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, + 0x0391, 0x03A1, 0x03A3, 0x03AB, 0x03CF, 0x03CF, 0x03D2, 0x03D4, + 0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, + 0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, + 0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, + 0x03F4, 0x03F4, 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, + 0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, + 0x0468, 0x0468, 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, + 0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, + 0x0478, 0x0478, 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, + 0x0480, 0x0480, 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, + 0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, + 0x0498, 0x0498, 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, + 0x04A0, 0x04A0, 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, + 0x04A8, 0x04A8, 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, + 0x04B0, 0x04B0, 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, + 0x04B8, 0x04B8, 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, + 0x04C0, 0x04C1, 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, + 0x04C9, 0x04C9, 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, + 0x04D2, 0x04D2, 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, + 0x04DA, 0x04DA, 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, + 0x04E2, 0x04E2, 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, + 0x04EA, 0x04EA, 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, + 0x04F2, 0x04F2, 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, + 0x04FA, 0x04FA, 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, + 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, + 0x050A, 0x050A, 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, + 0x0512, 0x0512, 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, + 0x051A, 0x051A, 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, + 0x0522, 0x0522, 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, + 0x052A, 0x052A, 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x13A0, 0x13F5, + 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, + 0x1E04, 0x1E04, 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, + 0x1E0C, 0x1E0C, 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, + 0x1E14, 0x1E14, 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, + 0x1E1C, 0x1E1C, 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, + 0x1E24, 0x1E24, 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, + 0x1E2C, 0x1E2C, 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, + 0x1E34, 0x1E34, 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, + 0x1E3C, 0x1E3C, 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, + 0x1E44, 0x1E44, 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, + 0x1E4C, 0x1E4C, 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, + 0x1E54, 0x1E54, 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, + 0x1E5C, 0x1E5C, 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, + 0x1E64, 0x1E64, 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, + 0x1E6C, 0x1E6C, 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, + 0x1E74, 0x1E74, 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, + 0x1E7C, 0x1E7C, 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, + 0x1E84, 0x1E84, 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, + 0x1E8C, 0x1E8C, 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, + 0x1E94, 0x1E94, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, + 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, + 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, + 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, + 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, + 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, + 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, + 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, + 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, + 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, + 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, + 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, + 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, + 0x1FB8, 0x1FBB, 0x1FC8, 0x1FCB, 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, + 0x1FF8, 0x1FFB, 0x2102, 0x2102, 0x2107, 0x2107, 0x210B, 0x210D, + 0x2110, 0x2112, 0x2115, 0x2115, 0x2119, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, 0x2130, 0x2133, + 0x213E, 0x213F, 0x2145, 0x2145, 0x2183, 0x2183, 0x2C00, 0x2C2F, + 0x2C60, 0x2C60, 0x2C62, 0x2C64, 0x2C67, 0x2C67, 0x2C69, 0x2C69, + 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, 0x2C72, 0x2C72, 0x2C75, 0x2C75, + 0x2C7E, 0x2C80, 0x2C82, 0x2C82, 0x2C84, 0x2C84, 0x2C86, 0x2C86, + 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, + 0x2C90, 0x2C90, 0x2C92, 0x2C92, 0x2C94, 0x2C94, 0x2C96, 0x2C96, + 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, + 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, + 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, + 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, + 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, + 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, + 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, + 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, + 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, + 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, + 0x2CF2, 0x2CF2, 0xA640, 0xA640, 0xA642, 0xA642, 0xA644, 0xA644, + 0xA646, 0xA646, 0xA648, 0xA648, 0xA64A, 0xA64A, 0xA64C, 0xA64C, + 0xA64E, 0xA64E, 0xA650, 0xA650, 0xA652, 0xA652, 0xA654, 0xA654, + 0xA656, 0xA656, 0xA658, 0xA658, 0xA65A, 0xA65A, 0xA65C, 0xA65C, + 0xA65E, 0xA65E, 0xA660, 0xA660, 0xA662, 0xA662, 0xA664, 0xA664, + 0xA666, 0xA666, 0xA668, 0xA668, 0xA66A, 0xA66A, 0xA66C, 0xA66C, + 0xA680, 0xA680, 0xA682, 0xA682, 0xA684, 0xA684, 0xA686, 0xA686, + 0xA688, 0xA688, 0xA68A, 0xA68A, 0xA68C, 0xA68C, 0xA68E, 0xA68E, + 0xA690, 0xA690, 0xA692, 0xA692, 0xA694, 0xA694, 0xA696, 0xA696, + 0xA698, 0xA698, 0xA69A, 0xA69A, 0xA722, 0xA722, 0xA724, 0xA724, + 0xA726, 0xA726, 0xA728, 0xA728, 0xA72A, 0xA72A, 0xA72C, 0xA72C, + 0xA72E, 0xA72E, 0xA732, 0xA732, 0xA734, 0xA734, 0xA736, 0xA736, + 0xA738, 0xA738, 0xA73A, 0xA73A, 0xA73C, 0xA73C, 0xA73E, 0xA73E, + 0xA740, 0xA740, 0xA742, 0xA742, 0xA744, 0xA744, 0xA746, 0xA746, + 0xA748, 0xA748, 0xA74A, 0xA74A, 0xA74C, 0xA74C, 0xA74E, 0xA74E, + 0xA750, 0xA750, 0xA752, 0xA752, 0xA754, 0xA754, 0xA756, 0xA756, + 0xA758, 0xA758, 0xA75A, 0xA75A, 0xA75C, 0xA75C, 0xA75E, 0xA75E, + 0xA760, 0xA760, 0xA762, 0xA762, 0xA764, 0xA764, 0xA766, 0xA766, + 0xA768, 0xA768, 0xA76A, 0xA76A, 0xA76C, 0xA76C, 0xA76E, 0xA76E, + 0xA779, 0xA779, 0xA77B, 0xA77B, 0xA77D, 0xA77E, 0xA780, 0xA780, + 0xA782, 0xA782, 0xA784, 0xA784, 0xA786, 0xA786, 0xA78B, 0xA78B, + 0xA78D, 0xA78D, 0xA790, 0xA790, 0xA792, 0xA792, 0xA796, 0xA796, + 0xA798, 0xA798, 0xA79A, 0xA79A, 0xA79C, 0xA79C, 0xA79E, 0xA79E, + 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, + 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, + 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, + 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, + 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, + 0xFF21, 0xFF3A, 0x10400, 0x10427, 0x104B0, 0x104D3, 0x10570, 0x1057A, + 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, 0x10C80, 0x10CB2, + 0x118A0, 0x118BF, 0x16E40, 0x16E5F, 0x1D400, 0x1D419, 0x1D434, 0x1D44D, + 0x1D468, 0x1D481, 0x1D49C, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B5, 0x1D4D0, 0x1D4E9, + 0x1D504, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D538, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D56C, 0x1D585, 0x1D5A0, 0x1D5B9, 0x1D5D4, 0x1D5ED, + 0x1D608, 0x1D621, 0x1D63C, 0x1D655, 0x1D670, 0x1D689, 0x1D6A8, 0x1D6C0, + 0x1D6E2, 0x1D6FA, 0x1D71C, 0x1D734, 0x1D756, 0x1D76E, 0x1D790, 0x1D7A8, + 0x1D7CA, 0x1D7CA, 0x1E900, 0x1E921, + // #12 (2038+69): gc=Modifier_Letter:Lm + 0x02B0, 0x02C1, 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, + 0x02EE, 0x02EE, 0x0374, 0x0374, 0x037A, 0x037A, 0x0559, 0x0559, + 0x0640, 0x0640, 0x06E5, 0x06E6, 0x07F4, 0x07F5, 0x07FA, 0x07FA, + 0x081A, 0x081A, 0x0824, 0x0824, 0x0828, 0x0828, 0x08C9, 0x08C9, + 0x0971, 0x0971, 0x0E46, 0x0E46, 0x0EC6, 0x0EC6, 0x10FC, 0x10FC, + 0x17D7, 0x17D7, 0x1843, 0x1843, 0x1AA7, 0x1AA7, 0x1C78, 0x1C7D, + 0x1D2C, 0x1D6A, 0x1D78, 0x1D78, 0x1D9B, 0x1DBF, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x2C7C, 0x2C7D, 0x2D6F, 0x2D6F, + 0x2E2F, 0x2E2F, 0x3005, 0x3005, 0x3031, 0x3035, 0x303B, 0x303B, + 0x309D, 0x309E, 0x30FC, 0x30FE, 0xA015, 0xA015, 0xA4F8, 0xA4FD, + 0xA60C, 0xA60C, 0xA67F, 0xA67F, 0xA69C, 0xA69D, 0xA717, 0xA71F, + 0xA770, 0xA770, 0xA788, 0xA788, 0xA7F2, 0xA7F4, 0xA7F8, 0xA7F9, + 0xA9CF, 0xA9CF, 0xA9E6, 0xA9E6, 0xAA70, 0xAA70, 0xAADD, 0xAADD, + 0xAAF3, 0xAAF4, 0xAB5C, 0xAB5F, 0xAB69, 0xAB69, 0xFF70, 0xFF70, + 0xFF9E, 0xFF9F, 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, + 0x16B40, 0x16B43, 0x16F93, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1E137, 0x1E13D, + 0x1E94B, 0x1E94B, + // #13 (2107+501): gc=Other_Letter:Lo + 0x00AA, 0x00AA, 0x00BA, 0x00BA, 0x01BB, 0x01BB, 0x01C0, 0x01C3, + 0x0294, 0x0294, 0x05D0, 0x05EA, 0x05EF, 0x05F2, 0x0620, 0x063F, + 0x0641, 0x064A, 0x066E, 0x066F, 0x0671, 0x06D3, 0x06D5, 0x06D5, + 0x06EE, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x0710, + 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, 0x07CA, 0x07EA, + 0x0800, 0x0815, 0x0840, 0x0858, 0x0860, 0x086A, 0x0870, 0x0887, + 0x0889, 0x088E, 0x08A0, 0x08C8, 0x0904, 0x0939, 0x093D, 0x093D, + 0x0950, 0x0950, 0x0958, 0x0961, 0x0972, 0x0980, 0x0985, 0x098C, + 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, + 0x09B6, 0x09B9, 0x09BD, 0x09BD, 0x09CE, 0x09CE, 0x09DC, 0x09DD, + 0x09DF, 0x09E1, 0x09F0, 0x09F1, 0x09FC, 0x09FC, 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, + 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, + 0x0A72, 0x0A74, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABD, 0x0ABD, + 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, 0x0AF9, 0x0AF9, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, + 0x0B71, 0x0B71, 0x0B83, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BD0, 0x0BD0, + 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C39, + 0x0C3D, 0x0C3D, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, + 0x0C80, 0x0C80, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, + 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBD, 0x0CBD, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE1, 0x0CF1, 0x0CF2, 0x0D04, 0x0D0C, 0x0D0E, 0x0D10, + 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, 0x0D4E, 0x0D4E, 0x0D54, 0x0D56, + 0x0D5F, 0x0D61, 0x0D7A, 0x0D7F, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0E01, 0x0E30, + 0x0E32, 0x0E33, 0x0E40, 0x0E45, 0x0E81, 0x0E82, 0x0E84, 0x0E84, + 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB0, + 0x0EB2, 0x0EB3, 0x0EBD, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EDC, 0x0EDF, + 0x0F00, 0x0F00, 0x0F40, 0x0F47, 0x0F49, 0x0F6C, 0x0F88, 0x0F8C, + 0x1000, 0x102A, 0x103F, 0x103F, 0x1050, 0x1055, 0x105A, 0x105D, + 0x1061, 0x1061, 0x1065, 0x1066, 0x106E, 0x1070, 0x1075, 0x1081, + 0x108E, 0x108E, 0x1100, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, + 0x1258, 0x1258, 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, + 0x1290, 0x12B0, 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, + 0x12C2, 0x12C5, 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, + 0x1318, 0x135A, 0x1380, 0x138F, 0x1401, 0x166C, 0x166F, 0x167F, + 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16F1, 0x16F8, 0x1700, 0x1711, + 0x171F, 0x1731, 0x1740, 0x1751, 0x1760, 0x176C, 0x176E, 0x1770, + 0x1780, 0x17B3, 0x17DC, 0x17DC, 0x1820, 0x1842, 0x1844, 0x1878, + 0x1880, 0x1884, 0x1887, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, + 0x19B0, 0x19C9, 0x1A00, 0x1A16, 0x1A20, 0x1A54, 0x1B05, 0x1B33, + 0x1B45, 0x1B4C, 0x1B83, 0x1BA0, 0x1BAE, 0x1BAF, 0x1BBA, 0x1BE5, + 0x1C00, 0x1C23, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C77, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x2135, 0x2138, + 0x2D30, 0x2D67, 0x2D80, 0x2D96, 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, + 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, + 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, 0x3006, 0x3006, 0x303C, 0x303C, + 0x3041, 0x3096, 0x309F, 0x309F, 0x30A1, 0x30FA, 0x30FF, 0x30FF, + 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, + 0x3400, 0x4DBF, 0x4E00, 0xA014, 0xA016, 0xA48C, 0xA4D0, 0xA4F7, + 0xA500, 0xA60B, 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA66E, 0xA66E, + 0xA6A0, 0xA6E5, 0xA78F, 0xA78F, 0xA7F7, 0xA7F7, 0xA7FB, 0xA801, + 0xA803, 0xA805, 0xA807, 0xA80A, 0xA80C, 0xA822, 0xA840, 0xA873, + 0xA882, 0xA8B3, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, 0xA930, 0xA946, 0xA960, 0xA97C, 0xA984, 0xA9B2, + 0xA9E0, 0xA9E4, 0xA9E7, 0xA9EF, 0xA9FA, 0xA9FE, 0xAA00, 0xAA28, + 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA60, 0xAA6F, 0xAA71, 0xAA76, + 0xAA7A, 0xAA7A, 0xAA7E, 0xAAAF, 0xAAB1, 0xAAB1, 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADC, + 0xAAE0, 0xAAEA, 0xAAF2, 0xAAF2, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xABC0, 0xABE2, + 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB1D, 0xFB1D, 0xFB1F, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0xFF66, 0xFF6F, + 0xFF71, 0xFF9D, 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0x10000, 0x1000B, 0x1000D, 0x10026, + 0x10028, 0x1003A, 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, + 0x10080, 0x100FA, 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x10300, 0x1031F, + 0x1032D, 0x10340, 0x10342, 0x10349, 0x10350, 0x10375, 0x10380, 0x1039D, + 0x103A0, 0x103C3, 0x103C8, 0x103CF, 0x10450, 0x1049D, 0x10500, 0x10527, + 0x10530, 0x10563, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, + 0x1083C, 0x1083C, 0x1083F, 0x10855, 0x10860, 0x10876, 0x10880, 0x1089E, + 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x10900, 0x10915, 0x10920, 0x10939, + 0x10980, 0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A00, 0x10A10, 0x10A13, + 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A60, 0x10A7C, 0x10A80, 0x10A9C, + 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, 0x10B00, 0x10B35, 0x10B40, 0x10B55, + 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, 0x10D00, 0x10D23, + 0x10E80, 0x10EA9, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, + 0x10F30, 0x10F45, 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, + 0x11003, 0x11037, 0x11071, 0x11072, 0x11075, 0x11075, 0x11083, 0x110AF, + 0x110D0, 0x110E8, 0x11103, 0x11126, 0x11144, 0x11144, 0x11147, 0x11147, + 0x11150, 0x11172, 0x11176, 0x11176, 0x11183, 0x111B2, 0x111C1, 0x111C4, + 0x111DA, 0x111DA, 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x1122B, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A8, 0x112B0, 0x112DE, 0x11305, 0x1130C, 0x1130F, 0x11310, + 0x11313, 0x11328, 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, + 0x1133D, 0x1133D, 0x11350, 0x11350, 0x1135D, 0x11361, 0x11400, 0x11434, + 0x11447, 0x1144A, 0x1145F, 0x11461, 0x11480, 0x114AF, 0x114C4, 0x114C5, + 0x114C7, 0x114C7, 0x11580, 0x115AE, 0x115D8, 0x115DB, 0x11600, 0x1162F, + 0x11644, 0x11644, 0x11680, 0x116AA, 0x116B8, 0x116B8, 0x11700, 0x1171A, + 0x11740, 0x11746, 0x11800, 0x1182B, 0x118FF, 0x11906, 0x11909, 0x11909, + 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x1192F, 0x1193F, 0x1193F, + 0x11941, 0x11941, 0x119A0, 0x119A7, 0x119AA, 0x119D0, 0x119E1, 0x119E1, + 0x119E3, 0x119E3, 0x11A00, 0x11A00, 0x11A0B, 0x11A32, 0x11A3A, 0x11A3A, + 0x11A50, 0x11A50, 0x11A5C, 0x11A89, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, + 0x11C00, 0x11C08, 0x11C0A, 0x11C2E, 0x11C40, 0x11C40, 0x11C72, 0x11C8F, + 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D30, 0x11D46, 0x11D46, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D89, 0x11D98, 0x11D98, + 0x11EE0, 0x11EF2, 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12480, 0x12543, + 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, + 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, 0x16AD0, 0x16AED, 0x16B00, 0x16B2F, + 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16F00, 0x16F4A, 0x16F50, 0x16F50, + 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1B000, 0x1B122, + 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, 0x1DF0A, 0x1DF0A, + 0x1E100, 0x1E12C, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, + 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, + 0x1E800, 0x1E8C4, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, + 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + // #14 (2608+518): gc=Mark:M:Combining_Mark + // Mc:177 + Me:5 + Mn:336 + // #15 (2608+177): gc=Spacing_Mark:Mc + 0x0903, 0x0903, 0x093B, 0x093B, 0x093E, 0x0940, 0x0949, 0x094C, + 0x094E, 0x094F, 0x0982, 0x0983, 0x09BE, 0x09C0, 0x09C7, 0x09C8, + 0x09CB, 0x09CC, 0x09D7, 0x09D7, 0x0A03, 0x0A03, 0x0A3E, 0x0A40, + 0x0A83, 0x0A83, 0x0ABE, 0x0AC0, 0x0AC9, 0x0AC9, 0x0ACB, 0x0ACC, + 0x0B02, 0x0B03, 0x0B3E, 0x0B3E, 0x0B40, 0x0B40, 0x0B47, 0x0B48, + 0x0B4B, 0x0B4C, 0x0B57, 0x0B57, 0x0BBE, 0x0BBF, 0x0BC1, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCC, 0x0BD7, 0x0BD7, 0x0C01, 0x0C03, + 0x0C41, 0x0C44, 0x0C82, 0x0C83, 0x0CBE, 0x0CBE, 0x0CC0, 0x0CC4, + 0x0CC7, 0x0CC8, 0x0CCA, 0x0CCB, 0x0CD5, 0x0CD6, 0x0D02, 0x0D03, + 0x0D3E, 0x0D40, 0x0D46, 0x0D48, 0x0D4A, 0x0D4C, 0x0D57, 0x0D57, + 0x0D82, 0x0D83, 0x0DCF, 0x0DD1, 0x0DD8, 0x0DDF, 0x0DF2, 0x0DF3, + 0x0F3E, 0x0F3F, 0x0F7F, 0x0F7F, 0x102B, 0x102C, 0x1031, 0x1031, + 0x1038, 0x1038, 0x103B, 0x103C, 0x1056, 0x1057, 0x1062, 0x1064, + 0x1067, 0x106D, 0x1083, 0x1084, 0x1087, 0x108C, 0x108F, 0x108F, + 0x109A, 0x109C, 0x1715, 0x1715, 0x1734, 0x1734, 0x17B6, 0x17B6, + 0x17BE, 0x17C5, 0x17C7, 0x17C8, 0x1923, 0x1926, 0x1929, 0x192B, + 0x1930, 0x1931, 0x1933, 0x1938, 0x1A19, 0x1A1A, 0x1A55, 0x1A55, + 0x1A57, 0x1A57, 0x1A61, 0x1A61, 0x1A63, 0x1A64, 0x1A6D, 0x1A72, + 0x1B04, 0x1B04, 0x1B35, 0x1B35, 0x1B3B, 0x1B3B, 0x1B3D, 0x1B41, + 0x1B43, 0x1B44, 0x1B82, 0x1B82, 0x1BA1, 0x1BA1, 0x1BA6, 0x1BA7, + 0x1BAA, 0x1BAA, 0x1BE7, 0x1BE7, 0x1BEA, 0x1BEC, 0x1BEE, 0x1BEE, + 0x1BF2, 0x1BF3, 0x1C24, 0x1C2B, 0x1C34, 0x1C35, 0x1CE1, 0x1CE1, + 0x1CF7, 0x1CF7, 0x302E, 0x302F, 0xA823, 0xA824, 0xA827, 0xA827, + 0xA880, 0xA881, 0xA8B4, 0xA8C3, 0xA952, 0xA953, 0xA983, 0xA983, + 0xA9B4, 0xA9B5, 0xA9BA, 0xA9BB, 0xA9BE, 0xA9C0, 0xAA2F, 0xAA30, + 0xAA33, 0xAA34, 0xAA4D, 0xAA4D, 0xAA7B, 0xAA7B, 0xAA7D, 0xAA7D, + 0xAAEB, 0xAAEB, 0xAAEE, 0xAAEF, 0xAAF5, 0xAAF5, 0xABE3, 0xABE4, + 0xABE6, 0xABE7, 0xABE9, 0xABEA, 0xABEC, 0xABEC, 0x11000, 0x11000, + 0x11002, 0x11002, 0x11082, 0x11082, 0x110B0, 0x110B2, 0x110B7, 0x110B8, + 0x1112C, 0x1112C, 0x11145, 0x11146, 0x11182, 0x11182, 0x111B3, 0x111B5, + 0x111BF, 0x111C0, 0x111CE, 0x111CE, 0x1122C, 0x1122E, 0x11232, 0x11233, + 0x11235, 0x11235, 0x112E0, 0x112E2, 0x11302, 0x11303, 0x1133E, 0x1133F, + 0x11341, 0x11344, 0x11347, 0x11348, 0x1134B, 0x1134D, 0x11357, 0x11357, + 0x11362, 0x11363, 0x11435, 0x11437, 0x11440, 0x11441, 0x11445, 0x11445, + 0x114B0, 0x114B2, 0x114B9, 0x114B9, 0x114BB, 0x114BE, 0x114C1, 0x114C1, + 0x115AF, 0x115B1, 0x115B8, 0x115BB, 0x115BE, 0x115BE, 0x11630, 0x11632, + 0x1163B, 0x1163C, 0x1163E, 0x1163E, 0x116AC, 0x116AC, 0x116AE, 0x116AF, + 0x116B6, 0x116B6, 0x11720, 0x11721, 0x11726, 0x11726, 0x1182C, 0x1182E, + 0x11838, 0x11838, 0x11930, 0x11935, 0x11937, 0x11938, 0x1193D, 0x1193D, + 0x11940, 0x11940, 0x11942, 0x11942, 0x119D1, 0x119D3, 0x119DC, 0x119DF, + 0x119E4, 0x119E4, 0x11A39, 0x11A39, 0x11A57, 0x11A58, 0x11A97, 0x11A97, + 0x11C2F, 0x11C2F, 0x11C3E, 0x11C3E, 0x11CA9, 0x11CA9, 0x11CB1, 0x11CB1, + 0x11CB4, 0x11CB4, 0x11D8A, 0x11D8E, 0x11D93, 0x11D94, 0x11D96, 0x11D96, + 0x11EF5, 0x11EF6, 0x16F51, 0x16F87, 0x16FF0, 0x16FF1, 0x1D165, 0x1D166, + 0x1D16D, 0x1D172, + // #16 (2785+5): gc=Enclosing_Mark:Me + 0x0488, 0x0489, 0x1ABE, 0x1ABE, 0x20DD, 0x20E0, 0x20E2, 0x20E4, + 0xA670, 0xA672, + // #17 (2790+336): gc=Nonspacing_Mark:Mn + 0x0300, 0x036F, 0x0483, 0x0487, 0x0591, 0x05BD, 0x05BF, 0x05BF, + 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x0610, 0x061A, + 0x064B, 0x065F, 0x0670, 0x0670, 0x06D6, 0x06DC, 0x06DF, 0x06E4, + 0x06E7, 0x06E8, 0x06EA, 0x06ED, 0x0711, 0x0711, 0x0730, 0x074A, + 0x07A6, 0x07B0, 0x07EB, 0x07F3, 0x07FD, 0x07FD, 0x0816, 0x0819, + 0x081B, 0x0823, 0x0825, 0x0827, 0x0829, 0x082D, 0x0859, 0x085B, + 0x0898, 0x089F, 0x08CA, 0x08E1, 0x08E3, 0x0902, 0x093A, 0x093A, + 0x093C, 0x093C, 0x0941, 0x0948, 0x094D, 0x094D, 0x0951, 0x0957, + 0x0962, 0x0963, 0x0981, 0x0981, 0x09BC, 0x09BC, 0x09C1, 0x09C4, + 0x09CD, 0x09CD, 0x09E2, 0x09E3, 0x09FE, 0x09FE, 0x0A01, 0x0A02, + 0x0A3C, 0x0A3C, 0x0A41, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A70, 0x0A71, 0x0A75, 0x0A75, 0x0A81, 0x0A82, + 0x0ABC, 0x0ABC, 0x0AC1, 0x0AC5, 0x0AC7, 0x0AC8, 0x0ACD, 0x0ACD, + 0x0AE2, 0x0AE3, 0x0AFA, 0x0AFF, 0x0B01, 0x0B01, 0x0B3C, 0x0B3C, + 0x0B3F, 0x0B3F, 0x0B41, 0x0B44, 0x0B4D, 0x0B4D, 0x0B55, 0x0B56, + 0x0B62, 0x0B63, 0x0B82, 0x0B82, 0x0BC0, 0x0BC0, 0x0BCD, 0x0BCD, + 0x0C00, 0x0C00, 0x0C04, 0x0C04, 0x0C3C, 0x0C3C, 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, + 0x0C81, 0x0C81, 0x0CBC, 0x0CBC, 0x0CBF, 0x0CBF, 0x0CC6, 0x0CC6, + 0x0CCC, 0x0CCD, 0x0CE2, 0x0CE3, 0x0D00, 0x0D01, 0x0D3B, 0x0D3C, + 0x0D41, 0x0D44, 0x0D4D, 0x0D4D, 0x0D62, 0x0D63, 0x0D81, 0x0D81, + 0x0DCA, 0x0DCA, 0x0DD2, 0x0DD4, 0x0DD6, 0x0DD6, 0x0E31, 0x0E31, + 0x0E34, 0x0E3A, 0x0E47, 0x0E4E, 0x0EB1, 0x0EB1, 0x0EB4, 0x0EBC, + 0x0EC8, 0x0ECD, 0x0F18, 0x0F19, 0x0F35, 0x0F35, 0x0F37, 0x0F37, + 0x0F39, 0x0F39, 0x0F71, 0x0F7E, 0x0F80, 0x0F84, 0x0F86, 0x0F87, + 0x0F8D, 0x0F97, 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, 0x102D, 0x1030, + 0x1032, 0x1037, 0x1039, 0x103A, 0x103D, 0x103E, 0x1058, 0x1059, + 0x105E, 0x1060, 0x1071, 0x1074, 0x1082, 0x1082, 0x1085, 0x1086, + 0x108D, 0x108D, 0x109D, 0x109D, 0x135D, 0x135F, 0x1712, 0x1714, + 0x1732, 0x1733, 0x1752, 0x1753, 0x1772, 0x1773, 0x17B4, 0x17B5, + 0x17B7, 0x17BD, 0x17C6, 0x17C6, 0x17C9, 0x17D3, 0x17DD, 0x17DD, + 0x180B, 0x180D, 0x180F, 0x180F, 0x1885, 0x1886, 0x18A9, 0x18A9, + 0x1920, 0x1922, 0x1927, 0x1928, 0x1932, 0x1932, 0x1939, 0x193B, + 0x1A17, 0x1A18, 0x1A1B, 0x1A1B, 0x1A56, 0x1A56, 0x1A58, 0x1A5E, + 0x1A60, 0x1A60, 0x1A62, 0x1A62, 0x1A65, 0x1A6C, 0x1A73, 0x1A7C, + 0x1A7F, 0x1A7F, 0x1AB0, 0x1ABD, 0x1ABF, 0x1ACE, 0x1B00, 0x1B03, + 0x1B34, 0x1B34, 0x1B36, 0x1B3A, 0x1B3C, 0x1B3C, 0x1B42, 0x1B42, + 0x1B6B, 0x1B73, 0x1B80, 0x1B81, 0x1BA2, 0x1BA5, 0x1BA8, 0x1BA9, + 0x1BAB, 0x1BAD, 0x1BE6, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BED, + 0x1BEF, 0x1BF1, 0x1C2C, 0x1C33, 0x1C36, 0x1C37, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, + 0x1CF8, 0x1CF9, 0x1DC0, 0x1DFF, 0x20D0, 0x20DC, 0x20E1, 0x20E1, + 0x20E5, 0x20F0, 0x2CEF, 0x2CF1, 0x2D7F, 0x2D7F, 0x2DE0, 0x2DFF, + 0x302A, 0x302D, 0x3099, 0x309A, 0xA66F, 0xA66F, 0xA674, 0xA67D, + 0xA69E, 0xA69F, 0xA6F0, 0xA6F1, 0xA802, 0xA802, 0xA806, 0xA806, + 0xA80B, 0xA80B, 0xA825, 0xA826, 0xA82C, 0xA82C, 0xA8C4, 0xA8C5, + 0xA8E0, 0xA8F1, 0xA8FF, 0xA8FF, 0xA926, 0xA92D, 0xA947, 0xA951, + 0xA980, 0xA982, 0xA9B3, 0xA9B3, 0xA9B6, 0xA9B9, 0xA9BC, 0xA9BD, + 0xA9E5, 0xA9E5, 0xAA29, 0xAA2E, 0xAA31, 0xAA32, 0xAA35, 0xAA36, + 0xAA43, 0xAA43, 0xAA4C, 0xAA4C, 0xAA7C, 0xAA7C, 0xAAB0, 0xAAB0, + 0xAAB2, 0xAAB4, 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xAAC1, + 0xAAEC, 0xAAED, 0xAAF6, 0xAAF6, 0xABE5, 0xABE5, 0xABE8, 0xABE8, + 0xABED, 0xABED, 0xFB1E, 0xFB1E, 0xFE00, 0xFE0F, 0xFE20, 0xFE2F, + 0x101FD, 0x101FD, 0x102E0, 0x102E0, 0x10376, 0x1037A, 0x10A01, 0x10A03, + 0x10A05, 0x10A06, 0x10A0C, 0x10A0F, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, + 0x10AE5, 0x10AE6, 0x10D24, 0x10D27, 0x10EAB, 0x10EAC, 0x10F46, 0x10F50, + 0x10F82, 0x10F85, 0x11001, 0x11001, 0x11038, 0x11046, 0x11070, 0x11070, + 0x11073, 0x11074, 0x1107F, 0x11081, 0x110B3, 0x110B6, 0x110B9, 0x110BA, + 0x110C2, 0x110C2, 0x11100, 0x11102, 0x11127, 0x1112B, 0x1112D, 0x11134, + 0x11173, 0x11173, 0x11180, 0x11181, 0x111B6, 0x111BE, 0x111C9, 0x111CC, + 0x111CF, 0x111CF, 0x1122F, 0x11231, 0x11234, 0x11234, 0x11236, 0x11237, + 0x1123E, 0x1123E, 0x112DF, 0x112DF, 0x112E3, 0x112EA, 0x11300, 0x11301, + 0x1133B, 0x1133C, 0x11340, 0x11340, 0x11366, 0x1136C, 0x11370, 0x11374, + 0x11438, 0x1143F, 0x11442, 0x11444, 0x11446, 0x11446, 0x1145E, 0x1145E, + 0x114B3, 0x114B8, 0x114BA, 0x114BA, 0x114BF, 0x114C0, 0x114C2, 0x114C3, + 0x115B2, 0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, 0x115DC, 0x115DD, + 0x11633, 0x1163A, 0x1163D, 0x1163D, 0x1163F, 0x11640, 0x116AB, 0x116AB, + 0x116AD, 0x116AD, 0x116B0, 0x116B5, 0x116B7, 0x116B7, 0x1171D, 0x1171F, + 0x11722, 0x11725, 0x11727, 0x1172B, 0x1182F, 0x11837, 0x11839, 0x1183A, + 0x1193B, 0x1193C, 0x1193E, 0x1193E, 0x11943, 0x11943, 0x119D4, 0x119D7, + 0x119DA, 0x119DB, 0x119E0, 0x119E0, 0x11A01, 0x11A0A, 0x11A33, 0x11A38, + 0x11A3B, 0x11A3E, 0x11A47, 0x11A47, 0x11A51, 0x11A56, 0x11A59, 0x11A5B, + 0x11A8A, 0x11A96, 0x11A98, 0x11A99, 0x11C30, 0x11C36, 0x11C38, 0x11C3D, + 0x11C3F, 0x11C3F, 0x11C92, 0x11CA7, 0x11CAA, 0x11CB0, 0x11CB2, 0x11CB3, + 0x11CB5, 0x11CB6, 0x11D31, 0x11D36, 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, + 0x11D3F, 0x11D45, 0x11D47, 0x11D47, 0x11D90, 0x11D91, 0x11D95, 0x11D95, + 0x11D97, 0x11D97, 0x11EF3, 0x11EF4, 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, + 0x16F4F, 0x16F4F, 0x16F8F, 0x16F92, 0x16FE4, 0x16FE4, 0x1BC9D, 0x1BC9E, + 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E130, 0x1E136, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E94A, 0xE0100, 0xE01EF, + // #18 (3126+145): gc=Number:N + // Nd:62 + Nl:12 + No:71 + // #19 (3126+62): gc=Decimal_Number:Nd:digit + 0x0030, 0x0039, 0x0660, 0x0669, 0x06F0, 0x06F9, 0x07C0, 0x07C9, + 0x0966, 0x096F, 0x09E6, 0x09EF, 0x0A66, 0x0A6F, 0x0AE6, 0x0AEF, + 0x0B66, 0x0B6F, 0x0BE6, 0x0BEF, 0x0C66, 0x0C6F, 0x0CE6, 0x0CEF, + 0x0D66, 0x0D6F, 0x0DE6, 0x0DEF, 0x0E50, 0x0E59, 0x0ED0, 0x0ED9, + 0x0F20, 0x0F29, 0x1040, 0x1049, 0x1090, 0x1099, 0x17E0, 0x17E9, + 0x1810, 0x1819, 0x1946, 0x194F, 0x19D0, 0x19D9, 0x1A80, 0x1A89, + 0x1A90, 0x1A99, 0x1B50, 0x1B59, 0x1BB0, 0x1BB9, 0x1C40, 0x1C49, + 0x1C50, 0x1C59, 0xA620, 0xA629, 0xA8D0, 0xA8D9, 0xA900, 0xA909, + 0xA9D0, 0xA9D9, 0xA9F0, 0xA9F9, 0xAA50, 0xAA59, 0xABF0, 0xABF9, + 0xFF10, 0xFF19, 0x104A0, 0x104A9, 0x10D30, 0x10D39, 0x11066, 0x1106F, + 0x110F0, 0x110F9, 0x11136, 0x1113F, 0x111D0, 0x111D9, 0x112F0, 0x112F9, + 0x11450, 0x11459, 0x114D0, 0x114D9, 0x11650, 0x11659, 0x116C0, 0x116C9, + 0x11730, 0x11739, 0x118E0, 0x118E9, 0x11950, 0x11959, 0x11C50, 0x11C59, + 0x11D50, 0x11D59, 0x11DA0, 0x11DA9, 0x16A60, 0x16A69, 0x16AC0, 0x16AC9, + 0x16B50, 0x16B59, 0x1D7CE, 0x1D7FF, 0x1E140, 0x1E149, 0x1E2F0, 0x1E2F9, + 0x1E950, 0x1E959, 0x1FBF0, 0x1FBF9, + // #20 (3188+12): gc=Letter_Number:Nl + 0x16EE, 0x16F0, 0x2160, 0x2182, 0x2185, 0x2188, 0x3007, 0x3007, + 0x3021, 0x3029, 0x3038, 0x303A, 0xA6E6, 0xA6EF, 0x10140, 0x10174, + 0x10341, 0x10341, 0x1034A, 0x1034A, 0x103D1, 0x103D5, 0x12400, 0x1246E, + // #21 (3200+71): gc=Other_Number:No + 0x00B2, 0x00B3, 0x00B9, 0x00B9, 0x00BC, 0x00BE, 0x09F4, 0x09F9, + 0x0B72, 0x0B77, 0x0BF0, 0x0BF2, 0x0C78, 0x0C7E, 0x0D58, 0x0D5E, + 0x0D70, 0x0D78, 0x0F2A, 0x0F33, 0x1369, 0x137C, 0x17F0, 0x17F9, + 0x19DA, 0x19DA, 0x2070, 0x2070, 0x2074, 0x2079, 0x2080, 0x2089, + 0x2150, 0x215F, 0x2189, 0x2189, 0x2460, 0x249B, 0x24EA, 0x24FF, + 0x2776, 0x2793, 0x2CFD, 0x2CFD, 0x3192, 0x3195, 0x3220, 0x3229, + 0x3248, 0x324F, 0x3251, 0x325F, 0x3280, 0x3289, 0x32B1, 0x32BF, + 0xA830, 0xA835, 0x10107, 0x10133, 0x10175, 0x10178, 0x1018A, 0x1018B, + 0x102E1, 0x102FB, 0x10320, 0x10323, 0x10858, 0x1085F, 0x10879, 0x1087F, + 0x108A7, 0x108AF, 0x108FB, 0x108FF, 0x10916, 0x1091B, 0x109BC, 0x109BD, + 0x109C0, 0x109CF, 0x109D2, 0x109FF, 0x10A40, 0x10A48, 0x10A7D, 0x10A7E, + 0x10A9D, 0x10A9F, 0x10AEB, 0x10AEF, 0x10B58, 0x10B5F, 0x10B78, 0x10B7F, + 0x10BA9, 0x10BAF, 0x10CFA, 0x10CFF, 0x10E60, 0x10E7E, 0x10F1D, 0x10F26, + 0x10F51, 0x10F54, 0x10FC5, 0x10FCB, 0x11052, 0x11065, 0x111E1, 0x111F4, + 0x1173A, 0x1173B, 0x118EA, 0x118F2, 0x11C5A, 0x11C6C, 0x11FC0, 0x11FD4, + 0x16B5B, 0x16B61, 0x16E80, 0x16E96, 0x1D2E0, 0x1D2F3, 0x1D360, 0x1D378, + 0x1E8C7, 0x1E8CF, 0x1EC71, 0x1ECAB, 0x1ECAD, 0x1ECAF, 0x1ECB1, 0x1ECB4, + 0x1ED01, 0x1ED2D, 0x1ED2F, 0x1ED3D, 0x1F100, 0x1F10C, + // #22 (3271+386): gc=Punctuation:P:punct + // Pc:6 + Pd:19 + Pe:76 + Pf:10 + Pi:11 + Po:185 + Ps:79 + // #23 (3271+6): gc=Connector_Punctuation:Pc + 0x005F, 0x005F, 0x203F, 0x2040, 0x2054, 0x2054, 0xFE33, 0xFE34, + 0xFE4D, 0xFE4F, 0xFF3F, 0xFF3F, + // #24 (3277+19): gc=Dash_Punctuation:Pd + 0x002D, 0x002D, 0x058A, 0x058A, 0x05BE, 0x05BE, 0x1400, 0x1400, + 0x1806, 0x1806, 0x2010, 0x2015, 0x2E17, 0x2E17, 0x2E1A, 0x2E1A, + 0x2E3A, 0x2E3B, 0x2E40, 0x2E40, 0x2E5D, 0x2E5D, 0x301C, 0x301C, + 0x3030, 0x3030, 0x30A0, 0x30A0, 0xFE31, 0xFE32, 0xFE58, 0xFE58, + 0xFE63, 0xFE63, 0xFF0D, 0xFF0D, 0x10EAD, 0x10EAD, + // #25 (3296+76): gc=Close_Punctuation:Pe + 0x0029, 0x0029, 0x005D, 0x005D, 0x007D, 0x007D, 0x0F3B, 0x0F3B, + 0x0F3D, 0x0F3D, 0x169C, 0x169C, 0x2046, 0x2046, 0x207E, 0x207E, + 0x208E, 0x208E, 0x2309, 0x2309, 0x230B, 0x230B, 0x232A, 0x232A, + 0x2769, 0x2769, 0x276B, 0x276B, 0x276D, 0x276D, 0x276F, 0x276F, + 0x2771, 0x2771, 0x2773, 0x2773, 0x2775, 0x2775, 0x27C6, 0x27C6, + 0x27E7, 0x27E7, 0x27E9, 0x27E9, 0x27EB, 0x27EB, 0x27ED, 0x27ED, + 0x27EF, 0x27EF, 0x2984, 0x2984, 0x2986, 0x2986, 0x2988, 0x2988, + 0x298A, 0x298A, 0x298C, 0x298C, 0x298E, 0x298E, 0x2990, 0x2990, + 0x2992, 0x2992, 0x2994, 0x2994, 0x2996, 0x2996, 0x2998, 0x2998, + 0x29D9, 0x29D9, 0x29DB, 0x29DB, 0x29FD, 0x29FD, 0x2E23, 0x2E23, + 0x2E25, 0x2E25, 0x2E27, 0x2E27, 0x2E29, 0x2E29, 0x2E56, 0x2E56, + 0x2E58, 0x2E58, 0x2E5A, 0x2E5A, 0x2E5C, 0x2E5C, 0x3009, 0x3009, + 0x300B, 0x300B, 0x300D, 0x300D, 0x300F, 0x300F, 0x3011, 0x3011, + 0x3015, 0x3015, 0x3017, 0x3017, 0x3019, 0x3019, 0x301B, 0x301B, + 0x301E, 0x301F, 0xFD3E, 0xFD3E, 0xFE18, 0xFE18, 0xFE36, 0xFE36, + 0xFE38, 0xFE38, 0xFE3A, 0xFE3A, 0xFE3C, 0xFE3C, 0xFE3E, 0xFE3E, + 0xFE40, 0xFE40, 0xFE42, 0xFE42, 0xFE44, 0xFE44, 0xFE48, 0xFE48, + 0xFE5A, 0xFE5A, 0xFE5C, 0xFE5C, 0xFE5E, 0xFE5E, 0xFF09, 0xFF09, + 0xFF3D, 0xFF3D, 0xFF5D, 0xFF5D, 0xFF60, 0xFF60, 0xFF63, 0xFF63, + // #26 (3372+10): gc=Final_Punctuation:Pf + 0x00BB, 0x00BB, 0x2019, 0x2019, 0x201D, 0x201D, 0x203A, 0x203A, + 0x2E03, 0x2E03, 0x2E05, 0x2E05, 0x2E0A, 0x2E0A, 0x2E0D, 0x2E0D, + 0x2E1D, 0x2E1D, 0x2E21, 0x2E21, + // #27 (3382+11): gc=Initial_Punctuation:Pi + 0x00AB, 0x00AB, 0x2018, 0x2018, 0x201B, 0x201C, 0x201F, 0x201F, + 0x2039, 0x2039, 0x2E02, 0x2E02, 0x2E04, 0x2E04, 0x2E09, 0x2E09, + 0x2E0C, 0x2E0C, 0x2E1C, 0x2E1C, 0x2E20, 0x2E20, + // #28 (3393+185): gc=Other_Punctuation:Po + 0x0021, 0x0023, 0x0025, 0x0027, 0x002A, 0x002A, 0x002C, 0x002C, + 0x002E, 0x002F, 0x003A, 0x003B, 0x003F, 0x0040, 0x005C, 0x005C, + 0x00A1, 0x00A1, 0x00A7, 0x00A7, 0x00B6, 0x00B7, 0x00BF, 0x00BF, + 0x037E, 0x037E, 0x0387, 0x0387, 0x055A, 0x055F, 0x0589, 0x0589, + 0x05C0, 0x05C0, 0x05C3, 0x05C3, 0x05C6, 0x05C6, 0x05F3, 0x05F4, + 0x0609, 0x060A, 0x060C, 0x060D, 0x061B, 0x061B, 0x061D, 0x061F, + 0x066A, 0x066D, 0x06D4, 0x06D4, 0x0700, 0x070D, 0x07F7, 0x07F9, + 0x0830, 0x083E, 0x085E, 0x085E, 0x0964, 0x0965, 0x0970, 0x0970, + 0x09FD, 0x09FD, 0x0A76, 0x0A76, 0x0AF0, 0x0AF0, 0x0C77, 0x0C77, + 0x0C84, 0x0C84, 0x0DF4, 0x0DF4, 0x0E4F, 0x0E4F, 0x0E5A, 0x0E5B, + 0x0F04, 0x0F12, 0x0F14, 0x0F14, 0x0F85, 0x0F85, 0x0FD0, 0x0FD4, + 0x0FD9, 0x0FDA, 0x104A, 0x104F, 0x10FB, 0x10FB, 0x1360, 0x1368, + 0x166E, 0x166E, 0x16EB, 0x16ED, 0x1735, 0x1736, 0x17D4, 0x17D6, + 0x17D8, 0x17DA, 0x1800, 0x1805, 0x1807, 0x180A, 0x1944, 0x1945, + 0x1A1E, 0x1A1F, 0x1AA0, 0x1AA6, 0x1AA8, 0x1AAD, 0x1B5A, 0x1B60, + 0x1B7D, 0x1B7E, 0x1BFC, 0x1BFF, 0x1C3B, 0x1C3F, 0x1C7E, 0x1C7F, + 0x1CC0, 0x1CC7, 0x1CD3, 0x1CD3, 0x2016, 0x2017, 0x2020, 0x2027, + 0x2030, 0x2038, 0x203B, 0x203E, 0x2041, 0x2043, 0x2047, 0x2051, + 0x2053, 0x2053, 0x2055, 0x205E, 0x2CF9, 0x2CFC, 0x2CFE, 0x2CFF, + 0x2D70, 0x2D70, 0x2E00, 0x2E01, 0x2E06, 0x2E08, 0x2E0B, 0x2E0B, + 0x2E0E, 0x2E16, 0x2E18, 0x2E19, 0x2E1B, 0x2E1B, 0x2E1E, 0x2E1F, + 0x2E2A, 0x2E2E, 0x2E30, 0x2E39, 0x2E3C, 0x2E3F, 0x2E41, 0x2E41, + 0x2E43, 0x2E4F, 0x2E52, 0x2E54, 0x3001, 0x3003, 0x303D, 0x303D, + 0x30FB, 0x30FB, 0xA4FE, 0xA4FF, 0xA60D, 0xA60F, 0xA673, 0xA673, + 0xA67E, 0xA67E, 0xA6F2, 0xA6F7, 0xA874, 0xA877, 0xA8CE, 0xA8CF, + 0xA8F8, 0xA8FA, 0xA8FC, 0xA8FC, 0xA92E, 0xA92F, 0xA95F, 0xA95F, + 0xA9C1, 0xA9CD, 0xA9DE, 0xA9DF, 0xAA5C, 0xAA5F, 0xAADE, 0xAADF, + 0xAAF0, 0xAAF1, 0xABEB, 0xABEB, 0xFE10, 0xFE16, 0xFE19, 0xFE19, + 0xFE30, 0xFE30, 0xFE45, 0xFE46, 0xFE49, 0xFE4C, 0xFE50, 0xFE52, + 0xFE54, 0xFE57, 0xFE5F, 0xFE61, 0xFE68, 0xFE68, 0xFE6A, 0xFE6B, + 0xFF01, 0xFF03, 0xFF05, 0xFF07, 0xFF0A, 0xFF0A, 0xFF0C, 0xFF0C, + 0xFF0E, 0xFF0F, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF20, 0xFF3C, 0xFF3C, + 0xFF61, 0xFF61, 0xFF64, 0xFF65, 0x10100, 0x10102, 0x1039F, 0x1039F, + 0x103D0, 0x103D0, 0x1056F, 0x1056F, 0x10857, 0x10857, 0x1091F, 0x1091F, + 0x1093F, 0x1093F, 0x10A50, 0x10A58, 0x10A7F, 0x10A7F, 0x10AF0, 0x10AF6, + 0x10B39, 0x10B3F, 0x10B99, 0x10B9C, 0x10F55, 0x10F59, 0x10F86, 0x10F89, + 0x11047, 0x1104D, 0x110BB, 0x110BC, 0x110BE, 0x110C1, 0x11140, 0x11143, + 0x11174, 0x11175, 0x111C5, 0x111C8, 0x111CD, 0x111CD, 0x111DB, 0x111DB, + 0x111DD, 0x111DF, 0x11238, 0x1123D, 0x112A9, 0x112A9, 0x1144B, 0x1144F, + 0x1145A, 0x1145B, 0x1145D, 0x1145D, 0x114C6, 0x114C6, 0x115C1, 0x115D7, + 0x11641, 0x11643, 0x11660, 0x1166C, 0x116B9, 0x116B9, 0x1173C, 0x1173E, + 0x1183B, 0x1183B, 0x11944, 0x11946, 0x119E2, 0x119E2, 0x11A3F, 0x11A46, + 0x11A9A, 0x11A9C, 0x11A9E, 0x11AA2, 0x11C41, 0x11C45, 0x11C70, 0x11C71, + 0x11EF7, 0x11EF8, 0x11FFF, 0x11FFF, 0x12470, 0x12474, 0x12FF1, 0x12FF2, + 0x16A6E, 0x16A6F, 0x16AF5, 0x16AF5, 0x16B37, 0x16B3B, 0x16B44, 0x16B44, + 0x16E97, 0x16E9A, 0x16FE2, 0x16FE2, 0x1BC9F, 0x1BC9F, 0x1DA87, 0x1DA8B, + 0x1E95E, 0x1E95F, + // #29 (3578+79): gc=Open_Punctuation:Ps + 0x0028, 0x0028, 0x005B, 0x005B, 0x007B, 0x007B, 0x0F3A, 0x0F3A, + 0x0F3C, 0x0F3C, 0x169B, 0x169B, 0x201A, 0x201A, 0x201E, 0x201E, + 0x2045, 0x2045, 0x207D, 0x207D, 0x208D, 0x208D, 0x2308, 0x2308, + 0x230A, 0x230A, 0x2329, 0x2329, 0x2768, 0x2768, 0x276A, 0x276A, + 0x276C, 0x276C, 0x276E, 0x276E, 0x2770, 0x2770, 0x2772, 0x2772, + 0x2774, 0x2774, 0x27C5, 0x27C5, 0x27E6, 0x27E6, 0x27E8, 0x27E8, + 0x27EA, 0x27EA, 0x27EC, 0x27EC, 0x27EE, 0x27EE, 0x2983, 0x2983, + 0x2985, 0x2985, 0x2987, 0x2987, 0x2989, 0x2989, 0x298B, 0x298B, + 0x298D, 0x298D, 0x298F, 0x298F, 0x2991, 0x2991, 0x2993, 0x2993, + 0x2995, 0x2995, 0x2997, 0x2997, 0x29D8, 0x29D8, 0x29DA, 0x29DA, + 0x29FC, 0x29FC, 0x2E22, 0x2E22, 0x2E24, 0x2E24, 0x2E26, 0x2E26, + 0x2E28, 0x2E28, 0x2E42, 0x2E42, 0x2E55, 0x2E55, 0x2E57, 0x2E57, + 0x2E59, 0x2E59, 0x2E5B, 0x2E5B, 0x3008, 0x3008, 0x300A, 0x300A, + 0x300C, 0x300C, 0x300E, 0x300E, 0x3010, 0x3010, 0x3014, 0x3014, + 0x3016, 0x3016, 0x3018, 0x3018, 0x301A, 0x301A, 0x301D, 0x301D, + 0xFD3F, 0xFD3F, 0xFE17, 0xFE17, 0xFE35, 0xFE35, 0xFE37, 0xFE37, + 0xFE39, 0xFE39, 0xFE3B, 0xFE3B, 0xFE3D, 0xFE3D, 0xFE3F, 0xFE3F, + 0xFE41, 0xFE41, 0xFE43, 0xFE43, 0xFE47, 0xFE47, 0xFE59, 0xFE59, + 0xFE5B, 0xFE5B, 0xFE5D, 0xFE5D, 0xFF08, 0xFF08, 0xFF3B, 0xFF3B, + 0xFF5B, 0xFF5B, 0xFF5F, 0xFF5F, 0xFF62, 0xFF62, + // #30 (3657+302): gc=Symbol:S + // Sc:21 + Sk:31 + Sm:64 + So:186 + // #31 (3657+21): gc=Currency_Symbol:Sc + 0x0024, 0x0024, 0x00A2, 0x00A5, 0x058F, 0x058F, 0x060B, 0x060B, + 0x07FE, 0x07FF, 0x09F2, 0x09F3, 0x09FB, 0x09FB, 0x0AF1, 0x0AF1, + 0x0BF9, 0x0BF9, 0x0E3F, 0x0E3F, 0x17DB, 0x17DB, 0x20A0, 0x20C0, + 0xA838, 0xA838, 0xFDFC, 0xFDFC, 0xFE69, 0xFE69, 0xFF04, 0xFF04, + 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE6, 0x11FDD, 0x11FE0, 0x1E2FF, 0x1E2FF, + 0x1ECB0, 0x1ECB0, + // #32 (3678+31): gc=Modifier_Symbol:Sk + 0x005E, 0x005E, 0x0060, 0x0060, 0x00A8, 0x00A8, 0x00AF, 0x00AF, + 0x00B4, 0x00B4, 0x00B8, 0x00B8, 0x02C2, 0x02C5, 0x02D2, 0x02DF, + 0x02E5, 0x02EB, 0x02ED, 0x02ED, 0x02EF, 0x02FF, 0x0375, 0x0375, + 0x0384, 0x0385, 0x0888, 0x0888, 0x1FBD, 0x1FBD, 0x1FBF, 0x1FC1, + 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF, 0x1FED, 0x1FEF, 0x1FFD, 0x1FFE, + 0x309B, 0x309C, 0xA700, 0xA716, 0xA720, 0xA721, 0xA789, 0xA78A, + 0xAB5B, 0xAB5B, 0xAB6A, 0xAB6B, 0xFBB2, 0xFBC2, 0xFF3E, 0xFF3E, + 0xFF40, 0xFF40, 0xFFE3, 0xFFE3, 0x1F3FB, 0x1F3FF, + // #33 (3709+64): gc=Math_Symbol:Sm + 0x002B, 0x002B, 0x003C, 0x003E, 0x007C, 0x007C, 0x007E, 0x007E, + 0x00AC, 0x00AC, 0x00B1, 0x00B1, 0x00D7, 0x00D7, 0x00F7, 0x00F7, + 0x03F6, 0x03F6, 0x0606, 0x0608, 0x2044, 0x2044, 0x2052, 0x2052, + 0x207A, 0x207C, 0x208A, 0x208C, 0x2118, 0x2118, 0x2140, 0x2144, + 0x214B, 0x214B, 0x2190, 0x2194, 0x219A, 0x219B, 0x21A0, 0x21A0, + 0x21A3, 0x21A3, 0x21A6, 0x21A6, 0x21AE, 0x21AE, 0x21CE, 0x21CF, + 0x21D2, 0x21D2, 0x21D4, 0x21D4, 0x21F4, 0x22FF, 0x2320, 0x2321, + 0x237C, 0x237C, 0x239B, 0x23B3, 0x23DC, 0x23E1, 0x25B7, 0x25B7, + 0x25C1, 0x25C1, 0x25F8, 0x25FF, 0x266F, 0x266F, 0x27C0, 0x27C4, + 0x27C7, 0x27E5, 0x27F0, 0x27FF, 0x2900, 0x2982, 0x2999, 0x29D7, + 0x29DC, 0x29FB, 0x29FE, 0x2AFF, 0x2B30, 0x2B44, 0x2B47, 0x2B4C, + 0xFB29, 0xFB29, 0xFE62, 0xFE62, 0xFE64, 0xFE66, 0xFF0B, 0xFF0B, + 0xFF1C, 0xFF1E, 0xFF5C, 0xFF5C, 0xFF5E, 0xFF5E, 0xFFE2, 0xFFE2, + 0xFFE9, 0xFFEC, 0x1D6C1, 0x1D6C1, 0x1D6DB, 0x1D6DB, 0x1D6FB, 0x1D6FB, + 0x1D715, 0x1D715, 0x1D735, 0x1D735, 0x1D74F, 0x1D74F, 0x1D76F, 0x1D76F, + 0x1D789, 0x1D789, 0x1D7A9, 0x1D7A9, 0x1D7C3, 0x1D7C3, 0x1EEF0, 0x1EEF1, + // #34 (3773+186): gc=Other_Symbol:So + 0x00A6, 0x00A6, 0x00A9, 0x00A9, 0x00AE, 0x00AE, 0x00B0, 0x00B0, + 0x0482, 0x0482, 0x058D, 0x058E, 0x060E, 0x060F, 0x06DE, 0x06DE, + 0x06E9, 0x06E9, 0x06FD, 0x06FE, 0x07F6, 0x07F6, 0x09FA, 0x09FA, + 0x0B70, 0x0B70, 0x0BF3, 0x0BF8, 0x0BFA, 0x0BFA, 0x0C7F, 0x0C7F, + 0x0D4F, 0x0D4F, 0x0D79, 0x0D79, 0x0F01, 0x0F03, 0x0F13, 0x0F13, + 0x0F15, 0x0F17, 0x0F1A, 0x0F1F, 0x0F34, 0x0F34, 0x0F36, 0x0F36, + 0x0F38, 0x0F38, 0x0FBE, 0x0FC5, 0x0FC7, 0x0FCC, 0x0FCE, 0x0FCF, + 0x0FD5, 0x0FD8, 0x109E, 0x109F, 0x1390, 0x1399, 0x166D, 0x166D, + 0x1940, 0x1940, 0x19DE, 0x19FF, 0x1B61, 0x1B6A, 0x1B74, 0x1B7C, + 0x2100, 0x2101, 0x2103, 0x2106, 0x2108, 0x2109, 0x2114, 0x2114, + 0x2116, 0x2117, 0x211E, 0x2123, 0x2125, 0x2125, 0x2127, 0x2127, + 0x2129, 0x2129, 0x212E, 0x212E, 0x213A, 0x213B, 0x214A, 0x214A, + 0x214C, 0x214D, 0x214F, 0x214F, 0x218A, 0x218B, 0x2195, 0x2199, + 0x219C, 0x219F, 0x21A1, 0x21A2, 0x21A4, 0x21A5, 0x21A7, 0x21AD, + 0x21AF, 0x21CD, 0x21D0, 0x21D1, 0x21D3, 0x21D3, 0x21D5, 0x21F3, + 0x2300, 0x2307, 0x230C, 0x231F, 0x2322, 0x2328, 0x232B, 0x237B, + 0x237D, 0x239A, 0x23B4, 0x23DB, 0x23E2, 0x2426, 0x2440, 0x244A, + 0x249C, 0x24E9, 0x2500, 0x25B6, 0x25B8, 0x25C0, 0x25C2, 0x25F7, + 0x2600, 0x266E, 0x2670, 0x2767, 0x2794, 0x27BF, 0x2800, 0x28FF, + 0x2B00, 0x2B2F, 0x2B45, 0x2B46, 0x2B4D, 0x2B73, 0x2B76, 0x2B95, + 0x2B97, 0x2BFF, 0x2CE5, 0x2CEA, 0x2E50, 0x2E51, 0x2E80, 0x2E99, + 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, 0x2FF0, 0x2FFB, 0x3004, 0x3004, + 0x3012, 0x3013, 0x3020, 0x3020, 0x3036, 0x3037, 0x303E, 0x303F, + 0x3190, 0x3191, 0x3196, 0x319F, 0x31C0, 0x31E3, 0x3200, 0x321E, + 0x322A, 0x3247, 0x3250, 0x3250, 0x3260, 0x327F, 0x328A, 0x32B0, + 0x32C0, 0x33FF, 0x4DC0, 0x4DFF, 0xA490, 0xA4C6, 0xA828, 0xA82B, + 0xA836, 0xA837, 0xA839, 0xA839, 0xAA77, 0xAA79, 0xFD40, 0xFD4F, + 0xFDCF, 0xFDCF, 0xFDFD, 0xFDFF, 0xFFE4, 0xFFE4, 0xFFE8, 0xFFE8, + 0xFFED, 0xFFEE, 0xFFFC, 0xFFFD, 0x10137, 0x1013F, 0x10179, 0x10189, + 0x1018C, 0x1018E, 0x10190, 0x1019C, 0x101A0, 0x101A0, 0x101D0, 0x101FC, + 0x10877, 0x10878, 0x10AC8, 0x10AC8, 0x1173F, 0x1173F, 0x11FD5, 0x11FDC, + 0x11FE1, 0x11FF1, 0x16B3C, 0x16B3F, 0x16B45, 0x16B45, 0x1BC9C, 0x1BC9C, + 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, 0x1D100, 0x1D126, 0x1D129, 0x1D164, + 0x1D16A, 0x1D16C, 0x1D183, 0x1D184, 0x1D18C, 0x1D1A9, 0x1D1AE, 0x1D1EA, + 0x1D200, 0x1D241, 0x1D245, 0x1D245, 0x1D300, 0x1D356, 0x1D800, 0x1D9FF, + 0x1DA37, 0x1DA3A, 0x1DA6D, 0x1DA74, 0x1DA76, 0x1DA83, 0x1DA85, 0x1DA86, + 0x1E14F, 0x1E14F, 0x1ECAC, 0x1ECAC, 0x1ED2E, 0x1ED2E, 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, 0x1F10D, 0x1F1AD, 0x1F1E6, 0x1F202, 0x1F210, 0x1F23B, + 0x1F240, 0x1F248, 0x1F250, 0x1F251, 0x1F260, 0x1F265, 0x1F300, 0x1F3FA, + 0x1F400, 0x1F6D7, 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, 0x1F700, 0x1F773, + 0x1F780, 0x1F7D8, 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F800, 0x1F80B, + 0x1F810, 0x1F847, 0x1F850, 0x1F859, 0x1F860, 0x1F887, 0x1F890, 0x1F8AD, + 0x1F8B0, 0x1F8B1, 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, 0x1FA70, 0x1FA74, + 0x1FA78, 0x1FA7C, 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, + 0x1FAC0, 0x1FAC5, 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, + 0x1FB00, 0x1FB92, 0x1FB94, 0x1FBCA, + // #35 (3959+9): gc=Separator:Z + // Zl:1 + Zp:1 + Zs:7 + // #36 (3959+1): gc=Line_Separator:Zl + 0x2028, 0x2028, + // #37 (3960+1): gc=Paragraph_Separator:Zp + 0x2029, 0x2029, + // #38 (3961+7): gc=Space_Separator:Zs + 0x0020, 0x0020, 0x00A0, 0x00A0, 0x1680, 0x1680, 0x2000, 0x200A, + 0x202F, 0x202F, 0x205F, 0x205F, 0x3000, 0x3000, + // #39 (3968+1): bp=ASCII + 0x0000, 0x007F, + // #40 (3969+3): bp=ASCII_Hex_Digit:AHex + 0x0030, 0x0039, 0x0041, 0x0046, 0x0061, 0x0066, + // #41 (3972+722): bp=Alphabetic:Alpha + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, + 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, + 0x0345, 0x0345, 0x0370, 0x0374, 0x0376, 0x0377, 0x037A, 0x037D, + 0x037F, 0x037F, 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, + 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, 0x048A, 0x052F, + 0x0531, 0x0556, 0x0559, 0x0559, 0x0560, 0x0588, 0x05B0, 0x05BD, + 0x05BF, 0x05BF, 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, + 0x05D0, 0x05EA, 0x05EF, 0x05F2, 0x0610, 0x061A, 0x0620, 0x0657, + 0x0659, 0x065F, 0x066E, 0x06D3, 0x06D5, 0x06DC, 0x06E1, 0x06E8, + 0x06ED, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x073F, + 0x074D, 0x07B1, 0x07CA, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x07FA, + 0x0800, 0x0817, 0x081A, 0x082C, 0x0840, 0x0858, 0x0860, 0x086A, + 0x0870, 0x0887, 0x0889, 0x088E, 0x08A0, 0x08C9, 0x08D4, 0x08DF, + 0x08E3, 0x08E9, 0x08F0, 0x093B, 0x093D, 0x094C, 0x094E, 0x0950, + 0x0955, 0x0963, 0x0971, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, + 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, + 0x09BD, 0x09C4, 0x09C7, 0x09C8, 0x09CB, 0x09CC, 0x09CE, 0x09CE, + 0x09D7, 0x09D7, 0x09DC, 0x09DD, 0x09DF, 0x09E3, 0x09F0, 0x09F1, + 0x09FC, 0x09FC, 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, + 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, + 0x0A38, 0x0A39, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4C, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A70, 0x0A75, + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABD, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACC, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AF9, 0x0AFC, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, + 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, + 0x0B3D, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4C, 0x0B56, 0x0B57, + 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B71, 0x0B71, 0x0B82, 0x0B83, + 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, + 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCC, + 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, 0x0C00, 0x0C03, 0x0C05, 0x0C0C, + 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3D, 0x0C44, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4C, 0x0C55, 0x0C56, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, 0x0C80, 0x0C83, 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, + 0x0CBD, 0x0CC4, 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCC, 0x0CD5, 0x0CD6, + 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE3, 0x0CF1, 0x0CF2, 0x0D00, 0x0D0C, + 0x0D0E, 0x0D10, 0x0D12, 0x0D3A, 0x0D3D, 0x0D44, 0x0D46, 0x0D48, + 0x0D4A, 0x0D4C, 0x0D4E, 0x0D4E, 0x0D54, 0x0D57, 0x0D5F, 0x0D63, + 0x0D7A, 0x0D7F, 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DF2, 0x0DF3, 0x0E01, 0x0E3A, + 0x0E40, 0x0E46, 0x0E4D, 0x0E4D, 0x0E81, 0x0E82, 0x0E84, 0x0E84, + 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB9, + 0x0EBB, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0ECD, 0x0ECD, + 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, 0x0F40, 0x0F47, 0x0F49, 0x0F6C, + 0x0F71, 0x0F81, 0x0F88, 0x0F97, 0x0F99, 0x0FBC, 0x1000, 0x1036, + 0x1038, 0x1038, 0x103B, 0x103F, 0x1050, 0x108F, 0x109A, 0x109D, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x1380, 0x138F, 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1401, 0x166C, + 0x166F, 0x167F, 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16EE, 0x16F8, + 0x1700, 0x1713, 0x171F, 0x1733, 0x1740, 0x1753, 0x1760, 0x176C, + 0x176E, 0x1770, 0x1772, 0x1773, 0x1780, 0x17B3, 0x17B6, 0x17C8, + 0x17D7, 0x17D7, 0x17DC, 0x17DC, 0x1820, 0x1878, 0x1880, 0x18AA, + 0x18B0, 0x18F5, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x1938, + 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, 0x19B0, 0x19C9, + 0x1A00, 0x1A1B, 0x1A20, 0x1A5E, 0x1A61, 0x1A74, 0x1AA7, 0x1AA7, + 0x1ABF, 0x1AC0, 0x1ACC, 0x1ACE, 0x1B00, 0x1B33, 0x1B35, 0x1B43, + 0x1B45, 0x1B4C, 0x1B80, 0x1BA9, 0x1BAC, 0x1BAF, 0x1BBA, 0x1BE5, + 0x1BE7, 0x1BF1, 0x1C00, 0x1C36, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1DE7, 0x1DF4, 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, + 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, 0x2102, 0x2102, + 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, 0x2119, 0x211D, + 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, + 0x212F, 0x2139, 0x213C, 0x213F, 0x2145, 0x2149, 0x214E, 0x214E, + 0x2160, 0x2188, 0x24B6, 0x24E9, 0x2C00, 0x2CE4, 0x2CEB, 0x2CEE, + 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, 0x2D80, 0x2D96, 0x2DA0, 0x2DA6, + 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, + 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, 0x2DE0, 0x2DFF, + 0x2E2F, 0x2E2F, 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, + 0x3038, 0x303C, 0x3041, 0x3096, 0x309D, 0x309F, 0x30A1, 0x30FA, + 0x30FC, 0x30FF, 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, + 0x31F0, 0x31FF, 0x3400, 0x4DBF, 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, + 0xA500, 0xA60C, 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA640, 0xA66E, + 0xA674, 0xA67B, 0xA67F, 0xA6EF, 0xA717, 0xA71F, 0xA722, 0xA788, + 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, + 0xA7F2, 0xA805, 0xA807, 0xA827, 0xA840, 0xA873, 0xA880, 0xA8C3, + 0xA8C5, 0xA8C5, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FF, + 0xA90A, 0xA92A, 0xA930, 0xA952, 0xA960, 0xA97C, 0xA980, 0xA9B2, + 0xA9B4, 0xA9BF, 0xA9CF, 0xA9CF, 0xA9E0, 0xA9EF, 0xA9FA, 0xA9FE, + 0xAA00, 0xAA36, 0xAA40, 0xAA4D, 0xAA60, 0xAA76, 0xAA7A, 0xAABE, + 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADD, 0xAAE0, 0xAAEF, + 0xAAF2, 0xAAF5, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, 0xAB11, 0xAB16, + 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, 0xAB5C, 0xAB69, + 0xAB70, 0xABEA, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, + 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, + 0xFB1D, 0xFB28, 0xFB2A, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, + 0xFB40, 0xFB41, 0xFB43, 0xFB44, 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, + 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, 0xFDF0, 0xFDFB, 0xFE70, 0xFE74, + 0xFE76, 0xFEFC, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, + 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10140, 0x10174, + 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x10300, 0x1031F, 0x1032D, 0x1034A, + 0x10350, 0x1037A, 0x10380, 0x1039D, 0x103A0, 0x103C3, 0x103C8, 0x103CF, + 0x103D1, 0x103D5, 0x10400, 0x1049D, 0x104B0, 0x104D3, 0x104D8, 0x104FB, + 0x10500, 0x10527, 0x10530, 0x10563, 0x10570, 0x1057A, 0x1057C, 0x1058A, + 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10600, 0x10736, 0x10740, 0x10755, + 0x10760, 0x10767, 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, + 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, + 0x1083C, 0x1083C, 0x1083F, 0x10855, 0x10860, 0x10876, 0x10880, 0x1089E, + 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x10900, 0x10915, 0x10920, 0x10939, + 0x10980, 0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A03, 0x10A05, 0x10A06, + 0x10A0C, 0x10A13, 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, 0x10B00, 0x10B35, + 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D27, 0x10E80, 0x10EA9, + 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, + 0x10F30, 0x10F45, 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, + 0x11000, 0x11045, 0x11071, 0x11075, 0x11082, 0x110B8, 0x110C2, 0x110C2, + 0x110D0, 0x110E8, 0x11100, 0x11132, 0x11144, 0x11147, 0x11150, 0x11172, + 0x11176, 0x11176, 0x11180, 0x111BF, 0x111C1, 0x111C4, 0x111CE, 0x111CF, + 0x111DA, 0x111DA, 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x11234, + 0x11237, 0x11237, 0x1123E, 0x1123E, 0x11280, 0x11286, 0x11288, 0x11288, + 0x1128A, 0x1128D, 0x1128F, 0x1129D, 0x1129F, 0x112A8, 0x112B0, 0x112E8, + 0x11300, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133D, 0x11344, + 0x11347, 0x11348, 0x1134B, 0x1134C, 0x11350, 0x11350, 0x11357, 0x11357, + 0x1135D, 0x11363, 0x11400, 0x11441, 0x11443, 0x11445, 0x11447, 0x1144A, + 0x1145F, 0x11461, 0x11480, 0x114C1, 0x114C4, 0x114C5, 0x114C7, 0x114C7, + 0x11580, 0x115B5, 0x115B8, 0x115BE, 0x115D8, 0x115DD, 0x11600, 0x1163E, + 0x11640, 0x11640, 0x11644, 0x11644, 0x11680, 0x116B5, 0x116B8, 0x116B8, + 0x11700, 0x1171A, 0x1171D, 0x1172A, 0x11740, 0x11746, 0x11800, 0x11838, + 0x118A0, 0x118DF, 0x118FF, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, + 0x11915, 0x11916, 0x11918, 0x11935, 0x11937, 0x11938, 0x1193B, 0x1193C, + 0x1193F, 0x11942, 0x119A0, 0x119A7, 0x119AA, 0x119D7, 0x119DA, 0x119DF, + 0x119E1, 0x119E1, 0x119E3, 0x119E4, 0x11A00, 0x11A32, 0x11A35, 0x11A3E, + 0x11A50, 0x11A97, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, + 0x11C0A, 0x11C36, 0x11C38, 0x11C3E, 0x11C40, 0x11C40, 0x11C72, 0x11C8F, + 0x11C92, 0x11CA7, 0x11CA9, 0x11CB6, 0x11D00, 0x11D06, 0x11D08, 0x11D09, + 0x11D0B, 0x11D36, 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D41, + 0x11D43, 0x11D43, 0x11D46, 0x11D47, 0x11D60, 0x11D65, 0x11D67, 0x11D68, + 0x11D6A, 0x11D8E, 0x11D90, 0x11D91, 0x11D93, 0x11D96, 0x11D98, 0x11D98, + 0x11EE0, 0x11EF6, 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12400, 0x1246E, + 0x12480, 0x12543, 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, + 0x16800, 0x16A38, 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, 0x16AD0, 0x16AED, + 0x16B00, 0x16B2F, 0x16B40, 0x16B43, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, + 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, + 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x16FF0, 0x16FF1, 0x17000, 0x187F7, + 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, + 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, + 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, + 0x1BC90, 0x1BC99, 0x1BC9E, 0x1BC9E, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, + 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, + 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, + 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, + 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, + 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, + 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, + 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, + 0x1DF00, 0x1DF1E, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E100, 0x1E12C, 0x1E137, 0x1E13D, + 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, 0x1E7E0, 0x1E7E6, + 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, + 0x1E900, 0x1E943, 0x1E947, 0x1E947, 0x1E94B, 0x1E94B, 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, + 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, + 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, + 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, + 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, + 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, + 0x1F130, 0x1F149, 0x1F150, 0x1F169, 0x1F170, 0x1F189, 0x20000, 0x2A6DF, + 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, + 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #42 (4694+1): bp=Any + 0x0000, 0x10FFFF, + // #43 (4695+0): bp=Assigned + + // #44 (4695+4): bp=Bidi_Control:Bidi_C + 0x061C, 0x061C, 0x200E, 0x200F, 0x202A, 0x202E, 0x2066, 0x2069, + // #45 (4699+114): bp=Bidi_Mirrored:Bidi_M + 0x0028, 0x0029, 0x003C, 0x003C, 0x003E, 0x003E, 0x005B, 0x005B, + 0x005D, 0x005D, 0x007B, 0x007B, 0x007D, 0x007D, 0x00AB, 0x00AB, + 0x00BB, 0x00BB, 0x0F3A, 0x0F3D, 0x169B, 0x169C, 0x2039, 0x203A, + 0x2045, 0x2046, 0x207D, 0x207E, 0x208D, 0x208E, 0x2140, 0x2140, + 0x2201, 0x2204, 0x2208, 0x220D, 0x2211, 0x2211, 0x2215, 0x2216, + 0x221A, 0x221D, 0x221F, 0x2222, 0x2224, 0x2224, 0x2226, 0x2226, + 0x222B, 0x2233, 0x2239, 0x2239, 0x223B, 0x224C, 0x2252, 0x2255, + 0x225F, 0x2260, 0x2262, 0x2262, 0x2264, 0x226B, 0x226E, 0x228C, + 0x228F, 0x2292, 0x2298, 0x2298, 0x22A2, 0x22A3, 0x22A6, 0x22B8, + 0x22BE, 0x22BF, 0x22C9, 0x22CD, 0x22D0, 0x22D1, 0x22D6, 0x22ED, + 0x22F0, 0x22FF, 0x2308, 0x230B, 0x2320, 0x2321, 0x2329, 0x232A, + 0x2768, 0x2775, 0x27C0, 0x27C0, 0x27C3, 0x27C6, 0x27C8, 0x27C9, + 0x27CB, 0x27CD, 0x27D3, 0x27D6, 0x27DC, 0x27DE, 0x27E2, 0x27EF, + 0x2983, 0x2998, 0x299B, 0x29A0, 0x29A2, 0x29AF, 0x29B8, 0x29B8, + 0x29C0, 0x29C5, 0x29C9, 0x29C9, 0x29CE, 0x29D2, 0x29D4, 0x29D5, + 0x29D8, 0x29DC, 0x29E1, 0x29E1, 0x29E3, 0x29E5, 0x29E8, 0x29E9, + 0x29F4, 0x29F9, 0x29FC, 0x29FD, 0x2A0A, 0x2A1C, 0x2A1E, 0x2A21, + 0x2A24, 0x2A24, 0x2A26, 0x2A26, 0x2A29, 0x2A29, 0x2A2B, 0x2A2E, + 0x2A34, 0x2A35, 0x2A3C, 0x2A3E, 0x2A57, 0x2A58, 0x2A64, 0x2A65, + 0x2A6A, 0x2A6D, 0x2A6F, 0x2A70, 0x2A73, 0x2A74, 0x2A79, 0x2AA3, + 0x2AA6, 0x2AAD, 0x2AAF, 0x2AD6, 0x2ADC, 0x2ADC, 0x2ADE, 0x2ADE, + 0x2AE2, 0x2AE6, 0x2AEC, 0x2AEE, 0x2AF3, 0x2AF3, 0x2AF7, 0x2AFB, + 0x2AFD, 0x2AFD, 0x2BFE, 0x2BFE, 0x2E02, 0x2E05, 0x2E09, 0x2E0A, + 0x2E0C, 0x2E0D, 0x2E1C, 0x2E1D, 0x2E20, 0x2E29, 0x2E55, 0x2E5C, + 0x3008, 0x3011, 0x3014, 0x301B, 0xFE59, 0xFE5E, 0xFE64, 0xFE65, + 0xFF08, 0xFF09, 0xFF1C, 0xFF1C, 0xFF1E, 0xFF1E, 0xFF3B, 0xFF3B, + 0xFF3D, 0xFF3D, 0xFF5B, 0xFF5B, 0xFF5D, 0xFF5D, 0xFF5F, 0xFF60, + 0xFF62, 0xFF63, 0x1D6DB, 0x1D6DB, 0x1D715, 0x1D715, 0x1D74F, 0x1D74F, + 0x1D789, 0x1D789, 0x1D7C3, 0x1D7C3, + // #46 (4813+427): bp=Case_Ignorable:CI + 0x0027, 0x0027, 0x002E, 0x002E, 0x003A, 0x003A, 0x005E, 0x005E, + 0x0060, 0x0060, 0x00A8, 0x00A8, 0x00AD, 0x00AD, 0x00AF, 0x00AF, + 0x00B4, 0x00B4, 0x00B7, 0x00B8, 0x02B0, 0x036F, 0x0374, 0x0375, + 0x037A, 0x037A, 0x0384, 0x0385, 0x0387, 0x0387, 0x0483, 0x0489, + 0x0559, 0x0559, 0x055F, 0x055F, 0x0591, 0x05BD, 0x05BF, 0x05BF, + 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x05F4, 0x05F4, + 0x0600, 0x0605, 0x0610, 0x061A, 0x061C, 0x061C, 0x0640, 0x0640, + 0x064B, 0x065F, 0x0670, 0x0670, 0x06D6, 0x06DD, 0x06DF, 0x06E8, + 0x06EA, 0x06ED, 0x070F, 0x070F, 0x0711, 0x0711, 0x0730, 0x074A, + 0x07A6, 0x07B0, 0x07EB, 0x07F5, 0x07FA, 0x07FA, 0x07FD, 0x07FD, + 0x0816, 0x082D, 0x0859, 0x085B, 0x0888, 0x0888, 0x0890, 0x0891, + 0x0898, 0x089F, 0x08C9, 0x0902, 0x093A, 0x093A, 0x093C, 0x093C, + 0x0941, 0x0948, 0x094D, 0x094D, 0x0951, 0x0957, 0x0962, 0x0963, + 0x0971, 0x0971, 0x0981, 0x0981, 0x09BC, 0x09BC, 0x09C1, 0x09C4, + 0x09CD, 0x09CD, 0x09E2, 0x09E3, 0x09FE, 0x09FE, 0x0A01, 0x0A02, + 0x0A3C, 0x0A3C, 0x0A41, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A70, 0x0A71, 0x0A75, 0x0A75, 0x0A81, 0x0A82, + 0x0ABC, 0x0ABC, 0x0AC1, 0x0AC5, 0x0AC7, 0x0AC8, 0x0ACD, 0x0ACD, + 0x0AE2, 0x0AE3, 0x0AFA, 0x0AFF, 0x0B01, 0x0B01, 0x0B3C, 0x0B3C, + 0x0B3F, 0x0B3F, 0x0B41, 0x0B44, 0x0B4D, 0x0B4D, 0x0B55, 0x0B56, + 0x0B62, 0x0B63, 0x0B82, 0x0B82, 0x0BC0, 0x0BC0, 0x0BCD, 0x0BCD, + 0x0C00, 0x0C00, 0x0C04, 0x0C04, 0x0C3C, 0x0C3C, 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, + 0x0C81, 0x0C81, 0x0CBC, 0x0CBC, 0x0CBF, 0x0CBF, 0x0CC6, 0x0CC6, + 0x0CCC, 0x0CCD, 0x0CE2, 0x0CE3, 0x0D00, 0x0D01, 0x0D3B, 0x0D3C, + 0x0D41, 0x0D44, 0x0D4D, 0x0D4D, 0x0D62, 0x0D63, 0x0D81, 0x0D81, + 0x0DCA, 0x0DCA, 0x0DD2, 0x0DD4, 0x0DD6, 0x0DD6, 0x0E31, 0x0E31, + 0x0E34, 0x0E3A, 0x0E46, 0x0E4E, 0x0EB1, 0x0EB1, 0x0EB4, 0x0EBC, + 0x0EC6, 0x0EC6, 0x0EC8, 0x0ECD, 0x0F18, 0x0F19, 0x0F35, 0x0F35, + 0x0F37, 0x0F37, 0x0F39, 0x0F39, 0x0F71, 0x0F7E, 0x0F80, 0x0F84, + 0x0F86, 0x0F87, 0x0F8D, 0x0F97, 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, + 0x102D, 0x1030, 0x1032, 0x1037, 0x1039, 0x103A, 0x103D, 0x103E, + 0x1058, 0x1059, 0x105E, 0x1060, 0x1071, 0x1074, 0x1082, 0x1082, + 0x1085, 0x1086, 0x108D, 0x108D, 0x109D, 0x109D, 0x10FC, 0x10FC, + 0x135D, 0x135F, 0x1712, 0x1714, 0x1732, 0x1733, 0x1752, 0x1753, + 0x1772, 0x1773, 0x17B4, 0x17B5, 0x17B7, 0x17BD, 0x17C6, 0x17C6, + 0x17C9, 0x17D3, 0x17D7, 0x17D7, 0x17DD, 0x17DD, 0x180B, 0x180F, + 0x1843, 0x1843, 0x1885, 0x1886, 0x18A9, 0x18A9, 0x1920, 0x1922, + 0x1927, 0x1928, 0x1932, 0x1932, 0x1939, 0x193B, 0x1A17, 0x1A18, + 0x1A1B, 0x1A1B, 0x1A56, 0x1A56, 0x1A58, 0x1A5E, 0x1A60, 0x1A60, + 0x1A62, 0x1A62, 0x1A65, 0x1A6C, 0x1A73, 0x1A7C, 0x1A7F, 0x1A7F, + 0x1AA7, 0x1AA7, 0x1AB0, 0x1ACE, 0x1B00, 0x1B03, 0x1B34, 0x1B34, + 0x1B36, 0x1B3A, 0x1B3C, 0x1B3C, 0x1B42, 0x1B42, 0x1B6B, 0x1B73, + 0x1B80, 0x1B81, 0x1BA2, 0x1BA5, 0x1BA8, 0x1BA9, 0x1BAB, 0x1BAD, + 0x1BE6, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BED, 0x1BEF, 0x1BF1, + 0x1C2C, 0x1C33, 0x1C36, 0x1C37, 0x1C78, 0x1C7D, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, + 0x1CF8, 0x1CF9, 0x1D2C, 0x1D6A, 0x1D78, 0x1D78, 0x1D9B, 0x1DFF, + 0x1FBD, 0x1FBD, 0x1FBF, 0x1FC1, 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF, + 0x1FED, 0x1FEF, 0x1FFD, 0x1FFE, 0x200B, 0x200F, 0x2018, 0x2019, + 0x2024, 0x2024, 0x2027, 0x2027, 0x202A, 0x202E, 0x2060, 0x2064, + 0x2066, 0x206F, 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, + 0x20D0, 0x20F0, 0x2C7C, 0x2C7D, 0x2CEF, 0x2CF1, 0x2D6F, 0x2D6F, + 0x2D7F, 0x2D7F, 0x2DE0, 0x2DFF, 0x2E2F, 0x2E2F, 0x3005, 0x3005, + 0x302A, 0x302D, 0x3031, 0x3035, 0x303B, 0x303B, 0x3099, 0x309E, + 0x30FC, 0x30FE, 0xA015, 0xA015, 0xA4F8, 0xA4FD, 0xA60C, 0xA60C, + 0xA66F, 0xA672, 0xA674, 0xA67D, 0xA67F, 0xA67F, 0xA69C, 0xA69F, + 0xA6F0, 0xA6F1, 0xA700, 0xA721, 0xA770, 0xA770, 0xA788, 0xA78A, + 0xA7F2, 0xA7F4, 0xA7F8, 0xA7F9, 0xA802, 0xA802, 0xA806, 0xA806, + 0xA80B, 0xA80B, 0xA825, 0xA826, 0xA82C, 0xA82C, 0xA8C4, 0xA8C5, + 0xA8E0, 0xA8F1, 0xA8FF, 0xA8FF, 0xA926, 0xA92D, 0xA947, 0xA951, + 0xA980, 0xA982, 0xA9B3, 0xA9B3, 0xA9B6, 0xA9B9, 0xA9BC, 0xA9BD, + 0xA9CF, 0xA9CF, 0xA9E5, 0xA9E6, 0xAA29, 0xAA2E, 0xAA31, 0xAA32, + 0xAA35, 0xAA36, 0xAA43, 0xAA43, 0xAA4C, 0xAA4C, 0xAA70, 0xAA70, + 0xAA7C, 0xAA7C, 0xAAB0, 0xAAB0, 0xAAB2, 0xAAB4, 0xAAB7, 0xAAB8, + 0xAABE, 0xAABF, 0xAAC1, 0xAAC1, 0xAADD, 0xAADD, 0xAAEC, 0xAAED, + 0xAAF3, 0xAAF4, 0xAAF6, 0xAAF6, 0xAB5B, 0xAB5F, 0xAB69, 0xAB6B, + 0xABE5, 0xABE5, 0xABE8, 0xABE8, 0xABED, 0xABED, 0xFB1E, 0xFB1E, + 0xFBB2, 0xFBC2, 0xFE00, 0xFE0F, 0xFE13, 0xFE13, 0xFE20, 0xFE2F, + 0xFE52, 0xFE52, 0xFE55, 0xFE55, 0xFEFF, 0xFEFF, 0xFF07, 0xFF07, + 0xFF0E, 0xFF0E, 0xFF1A, 0xFF1A, 0xFF3E, 0xFF3E, 0xFF40, 0xFF40, + 0xFF70, 0xFF70, 0xFF9E, 0xFF9F, 0xFFE3, 0xFFE3, 0xFFF9, 0xFFFB, + 0x101FD, 0x101FD, 0x102E0, 0x102E0, 0x10376, 0x1037A, 0x10780, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10A01, 0x10A03, 0x10A05, 0x10A06, + 0x10A0C, 0x10A0F, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, 0x10AE5, 0x10AE6, + 0x10D24, 0x10D27, 0x10EAB, 0x10EAC, 0x10F46, 0x10F50, 0x10F82, 0x10F85, + 0x11001, 0x11001, 0x11038, 0x11046, 0x11070, 0x11070, 0x11073, 0x11074, + 0x1107F, 0x11081, 0x110B3, 0x110B6, 0x110B9, 0x110BA, 0x110BD, 0x110BD, + 0x110C2, 0x110C2, 0x110CD, 0x110CD, 0x11100, 0x11102, 0x11127, 0x1112B, + 0x1112D, 0x11134, 0x11173, 0x11173, 0x11180, 0x11181, 0x111B6, 0x111BE, + 0x111C9, 0x111CC, 0x111CF, 0x111CF, 0x1122F, 0x11231, 0x11234, 0x11234, + 0x11236, 0x11237, 0x1123E, 0x1123E, 0x112DF, 0x112DF, 0x112E3, 0x112EA, + 0x11300, 0x11301, 0x1133B, 0x1133C, 0x11340, 0x11340, 0x11366, 0x1136C, + 0x11370, 0x11374, 0x11438, 0x1143F, 0x11442, 0x11444, 0x11446, 0x11446, + 0x1145E, 0x1145E, 0x114B3, 0x114B8, 0x114BA, 0x114BA, 0x114BF, 0x114C0, + 0x114C2, 0x114C3, 0x115B2, 0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, + 0x115DC, 0x115DD, 0x11633, 0x1163A, 0x1163D, 0x1163D, 0x1163F, 0x11640, + 0x116AB, 0x116AB, 0x116AD, 0x116AD, 0x116B0, 0x116B5, 0x116B7, 0x116B7, + 0x1171D, 0x1171F, 0x11722, 0x11725, 0x11727, 0x1172B, 0x1182F, 0x11837, + 0x11839, 0x1183A, 0x1193B, 0x1193C, 0x1193E, 0x1193E, 0x11943, 0x11943, + 0x119D4, 0x119D7, 0x119DA, 0x119DB, 0x119E0, 0x119E0, 0x11A01, 0x11A0A, + 0x11A33, 0x11A38, 0x11A3B, 0x11A3E, 0x11A47, 0x11A47, 0x11A51, 0x11A56, + 0x11A59, 0x11A5B, 0x11A8A, 0x11A96, 0x11A98, 0x11A99, 0x11C30, 0x11C36, + 0x11C38, 0x11C3D, 0x11C3F, 0x11C3F, 0x11C92, 0x11CA7, 0x11CAA, 0x11CB0, + 0x11CB2, 0x11CB3, 0x11CB5, 0x11CB6, 0x11D31, 0x11D36, 0x11D3A, 0x11D3A, + 0x11D3C, 0x11D3D, 0x11D3F, 0x11D45, 0x11D47, 0x11D47, 0x11D90, 0x11D91, + 0x11D95, 0x11D95, 0x11D97, 0x11D97, 0x11EF3, 0x11EF4, 0x13430, 0x13438, + 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, 0x16B40, 0x16B43, 0x16F4F, 0x16F4F, + 0x16F8F, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE4, 0x1AFF0, 0x1AFF3, + 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1BC9D, 0x1BC9E, 0x1BCA0, 0x1BCA3, + 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, 0x1D173, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E130, 0x1E13D, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E94B, 0x1F3FB, 0x1F3FF, + 0xE0001, 0xE0001, 0xE0020, 0xE007F, 0xE0100, 0xE01EF, + // #47 (5240+155): bp=Cased + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x01BA, + 0x01BC, 0x01BF, 0x01C4, 0x0293, 0x0295, 0x02B8, 0x02C0, 0x02C1, + 0x02E0, 0x02E4, 0x0345, 0x0345, 0x0370, 0x0373, 0x0376, 0x0377, + 0x037A, 0x037D, 0x037F, 0x037F, 0x0386, 0x0386, 0x0388, 0x038A, + 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, + 0x048A, 0x052F, 0x0531, 0x0556, 0x0560, 0x0588, 0x10A0, 0x10C5, + 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, 0x10FD, 0x10FF, + 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1D00, 0x1DBF, 0x1E00, 0x1F15, 0x1F18, 0x1F1D, + 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, + 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, + 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FFC, 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, + 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, + 0x2119, 0x211D, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, + 0x212A, 0x212D, 0x212F, 0x2134, 0x2139, 0x2139, 0x213C, 0x213F, + 0x2145, 0x2149, 0x214E, 0x214E, 0x2160, 0x217F, 0x2183, 0x2184, + 0x24B6, 0x24E9, 0x2C00, 0x2CE4, 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, + 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0xA640, 0xA66D, + 0xA680, 0xA69D, 0xA722, 0xA787, 0xA78B, 0xA78E, 0xA790, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F5, 0xA7F6, + 0xA7F8, 0xA7FA, 0xAB30, 0xAB5A, 0xAB5C, 0xAB68, 0xAB70, 0xABBF, + 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, + 0x10400, 0x1044F, 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10570, 0x1057A, + 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10780, 0x10780, + 0x10783, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10C80, 0x10CB2, + 0x10CC0, 0x10CF2, 0x118A0, 0x118DF, 0x16E40, 0x16E7F, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, + 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, 0x1D736, 0x1D74E, + 0x1D750, 0x1D76E, 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, + 0x1D7C4, 0x1D7CB, 0x1DF00, 0x1DF09, 0x1DF0B, 0x1DF1E, 0x1E900, 0x1E943, + 0x1F130, 0x1F149, 0x1F150, 0x1F169, 0x1F170, 0x1F189, + // #48 (5395+622): bp=Changes_When_Casefolded:CWCF + 0x0041, 0x005A, 0x00B5, 0x00B5, 0x00C0, 0x00D6, 0x00D8, 0x00DF, + 0x0100, 0x0100, 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, + 0x0108, 0x0108, 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, + 0x0110, 0x0110, 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, + 0x0118, 0x0118, 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, + 0x0120, 0x0120, 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, + 0x0128, 0x0128, 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, + 0x0130, 0x0130, 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, + 0x0139, 0x0139, 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, + 0x0141, 0x0141, 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, + 0x0149, 0x014A, 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, + 0x0152, 0x0152, 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, + 0x015A, 0x015A, 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, + 0x0162, 0x0162, 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, + 0x016A, 0x016A, 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, + 0x0172, 0x0172, 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, + 0x017B, 0x017B, 0x017D, 0x017D, 0x017F, 0x017F, 0x0181, 0x0182, + 0x0184, 0x0184, 0x0186, 0x0187, 0x0189, 0x018B, 0x018E, 0x0191, + 0x0193, 0x0194, 0x0196, 0x0198, 0x019C, 0x019D, 0x019F, 0x01A0, + 0x01A2, 0x01A2, 0x01A4, 0x01A4, 0x01A6, 0x01A7, 0x01A9, 0x01A9, + 0x01AC, 0x01AC, 0x01AE, 0x01AF, 0x01B1, 0x01B3, 0x01B5, 0x01B5, + 0x01B7, 0x01B8, 0x01BC, 0x01BC, 0x01C4, 0x01C5, 0x01C7, 0x01C8, + 0x01CA, 0x01CB, 0x01CD, 0x01CD, 0x01CF, 0x01CF, 0x01D1, 0x01D1, + 0x01D3, 0x01D3, 0x01D5, 0x01D5, 0x01D7, 0x01D7, 0x01D9, 0x01D9, + 0x01DB, 0x01DB, 0x01DE, 0x01DE, 0x01E0, 0x01E0, 0x01E2, 0x01E2, + 0x01E4, 0x01E4, 0x01E6, 0x01E6, 0x01E8, 0x01E8, 0x01EA, 0x01EA, + 0x01EC, 0x01EC, 0x01EE, 0x01EE, 0x01F1, 0x01F2, 0x01F4, 0x01F4, + 0x01F6, 0x01F8, 0x01FA, 0x01FA, 0x01FC, 0x01FC, 0x01FE, 0x01FE, + 0x0200, 0x0200, 0x0202, 0x0202, 0x0204, 0x0204, 0x0206, 0x0206, + 0x0208, 0x0208, 0x020A, 0x020A, 0x020C, 0x020C, 0x020E, 0x020E, + 0x0210, 0x0210, 0x0212, 0x0212, 0x0214, 0x0214, 0x0216, 0x0216, + 0x0218, 0x0218, 0x021A, 0x021A, 0x021C, 0x021C, 0x021E, 0x021E, + 0x0220, 0x0220, 0x0222, 0x0222, 0x0224, 0x0224, 0x0226, 0x0226, + 0x0228, 0x0228, 0x022A, 0x022A, 0x022C, 0x022C, 0x022E, 0x022E, + 0x0230, 0x0230, 0x0232, 0x0232, 0x023A, 0x023B, 0x023D, 0x023E, + 0x0241, 0x0241, 0x0243, 0x0246, 0x0248, 0x0248, 0x024A, 0x024A, + 0x024C, 0x024C, 0x024E, 0x024E, 0x0345, 0x0345, 0x0370, 0x0370, + 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, 0x0386, 0x0386, + 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, 0x0391, 0x03A1, + 0x03A3, 0x03AB, 0x03C2, 0x03C2, 0x03CF, 0x03D1, 0x03D5, 0x03D6, + 0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, + 0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, + 0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, + 0x03F0, 0x03F1, 0x03F4, 0x03F5, 0x03F7, 0x03F7, 0x03F9, 0x03FA, + 0x03FD, 0x042F, 0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, + 0x0466, 0x0466, 0x0468, 0x0468, 0x046A, 0x046A, 0x046C, 0x046C, + 0x046E, 0x046E, 0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, + 0x0476, 0x0476, 0x0478, 0x0478, 0x047A, 0x047A, 0x047C, 0x047C, + 0x047E, 0x047E, 0x0480, 0x0480, 0x048A, 0x048A, 0x048C, 0x048C, + 0x048E, 0x048E, 0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, + 0x0496, 0x0496, 0x0498, 0x0498, 0x049A, 0x049A, 0x049C, 0x049C, + 0x049E, 0x049E, 0x04A0, 0x04A0, 0x04A2, 0x04A2, 0x04A4, 0x04A4, + 0x04A6, 0x04A6, 0x04A8, 0x04A8, 0x04AA, 0x04AA, 0x04AC, 0x04AC, + 0x04AE, 0x04AE, 0x04B0, 0x04B0, 0x04B2, 0x04B2, 0x04B4, 0x04B4, + 0x04B6, 0x04B6, 0x04B8, 0x04B8, 0x04BA, 0x04BA, 0x04BC, 0x04BC, + 0x04BE, 0x04BE, 0x04C0, 0x04C1, 0x04C3, 0x04C3, 0x04C5, 0x04C5, + 0x04C7, 0x04C7, 0x04C9, 0x04C9, 0x04CB, 0x04CB, 0x04CD, 0x04CD, + 0x04D0, 0x04D0, 0x04D2, 0x04D2, 0x04D4, 0x04D4, 0x04D6, 0x04D6, + 0x04D8, 0x04D8, 0x04DA, 0x04DA, 0x04DC, 0x04DC, 0x04DE, 0x04DE, + 0x04E0, 0x04E0, 0x04E2, 0x04E2, 0x04E4, 0x04E4, 0x04E6, 0x04E6, + 0x04E8, 0x04E8, 0x04EA, 0x04EA, 0x04EC, 0x04EC, 0x04EE, 0x04EE, + 0x04F0, 0x04F0, 0x04F2, 0x04F2, 0x04F4, 0x04F4, 0x04F6, 0x04F6, + 0x04F8, 0x04F8, 0x04FA, 0x04FA, 0x04FC, 0x04FC, 0x04FE, 0x04FE, + 0x0500, 0x0500, 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506, + 0x0508, 0x0508, 0x050A, 0x050A, 0x050C, 0x050C, 0x050E, 0x050E, + 0x0510, 0x0510, 0x0512, 0x0512, 0x0514, 0x0514, 0x0516, 0x0516, + 0x0518, 0x0518, 0x051A, 0x051A, 0x051C, 0x051C, 0x051E, 0x051E, + 0x0520, 0x0520, 0x0522, 0x0522, 0x0524, 0x0524, 0x0526, 0x0526, + 0x0528, 0x0528, 0x052A, 0x052A, 0x052C, 0x052C, 0x052E, 0x052E, + 0x0531, 0x0556, 0x0587, 0x0587, 0x10A0, 0x10C5, 0x10C7, 0x10C7, + 0x10CD, 0x10CD, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, 0x1E04, 0x1E04, + 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, 0x1E0C, 0x1E0C, + 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, 0x1E14, 0x1E14, + 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, 0x1E1C, 0x1E1C, + 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, 0x1E24, 0x1E24, + 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, 0x1E2C, 0x1E2C, + 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, 0x1E34, 0x1E34, + 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, 0x1E3C, 0x1E3C, + 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, 0x1E44, 0x1E44, + 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, 0x1E4C, 0x1E4C, + 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, 0x1E54, 0x1E54, + 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, 0x1E5C, 0x1E5C, + 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, 0x1E64, 0x1E64, + 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, 0x1E6C, 0x1E6C, + 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, 0x1E74, 0x1E74, + 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, 0x1E7C, 0x1E7C, + 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, 0x1E84, 0x1E84, + 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, 0x1E8C, 0x1E8C, + 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, 0x1E94, 0x1E94, + 0x1E9A, 0x1E9B, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, + 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, + 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, + 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, + 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, + 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, + 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, + 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, + 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, + 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, + 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, + 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, + 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, + 0x1F80, 0x1FAF, 0x1FB2, 0x1FB4, 0x1FB7, 0x1FBC, 0x1FC2, 0x1FC4, + 0x1FC7, 0x1FCC, 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, 0x1FF2, 0x1FF4, + 0x1FF7, 0x1FFC, 0x2126, 0x2126, 0x212A, 0x212B, 0x2132, 0x2132, + 0x2160, 0x216F, 0x2183, 0x2183, 0x24B6, 0x24CF, 0x2C00, 0x2C2F, + 0x2C60, 0x2C60, 0x2C62, 0x2C64, 0x2C67, 0x2C67, 0x2C69, 0x2C69, + 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, 0x2C72, 0x2C72, 0x2C75, 0x2C75, + 0x2C7E, 0x2C80, 0x2C82, 0x2C82, 0x2C84, 0x2C84, 0x2C86, 0x2C86, + 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, + 0x2C90, 0x2C90, 0x2C92, 0x2C92, 0x2C94, 0x2C94, 0x2C96, 0x2C96, + 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, + 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, + 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, + 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, + 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, + 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, + 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, + 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, + 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, + 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, + 0x2CF2, 0x2CF2, 0xA640, 0xA640, 0xA642, 0xA642, 0xA644, 0xA644, + 0xA646, 0xA646, 0xA648, 0xA648, 0xA64A, 0xA64A, 0xA64C, 0xA64C, + 0xA64E, 0xA64E, 0xA650, 0xA650, 0xA652, 0xA652, 0xA654, 0xA654, + 0xA656, 0xA656, 0xA658, 0xA658, 0xA65A, 0xA65A, 0xA65C, 0xA65C, + 0xA65E, 0xA65E, 0xA660, 0xA660, 0xA662, 0xA662, 0xA664, 0xA664, + 0xA666, 0xA666, 0xA668, 0xA668, 0xA66A, 0xA66A, 0xA66C, 0xA66C, + 0xA680, 0xA680, 0xA682, 0xA682, 0xA684, 0xA684, 0xA686, 0xA686, + 0xA688, 0xA688, 0xA68A, 0xA68A, 0xA68C, 0xA68C, 0xA68E, 0xA68E, + 0xA690, 0xA690, 0xA692, 0xA692, 0xA694, 0xA694, 0xA696, 0xA696, + 0xA698, 0xA698, 0xA69A, 0xA69A, 0xA722, 0xA722, 0xA724, 0xA724, + 0xA726, 0xA726, 0xA728, 0xA728, 0xA72A, 0xA72A, 0xA72C, 0xA72C, + 0xA72E, 0xA72E, 0xA732, 0xA732, 0xA734, 0xA734, 0xA736, 0xA736, + 0xA738, 0xA738, 0xA73A, 0xA73A, 0xA73C, 0xA73C, 0xA73E, 0xA73E, + 0xA740, 0xA740, 0xA742, 0xA742, 0xA744, 0xA744, 0xA746, 0xA746, + 0xA748, 0xA748, 0xA74A, 0xA74A, 0xA74C, 0xA74C, 0xA74E, 0xA74E, + 0xA750, 0xA750, 0xA752, 0xA752, 0xA754, 0xA754, 0xA756, 0xA756, + 0xA758, 0xA758, 0xA75A, 0xA75A, 0xA75C, 0xA75C, 0xA75E, 0xA75E, + 0xA760, 0xA760, 0xA762, 0xA762, 0xA764, 0xA764, 0xA766, 0xA766, + 0xA768, 0xA768, 0xA76A, 0xA76A, 0xA76C, 0xA76C, 0xA76E, 0xA76E, + 0xA779, 0xA779, 0xA77B, 0xA77B, 0xA77D, 0xA77E, 0xA780, 0xA780, + 0xA782, 0xA782, 0xA784, 0xA784, 0xA786, 0xA786, 0xA78B, 0xA78B, + 0xA78D, 0xA78D, 0xA790, 0xA790, 0xA792, 0xA792, 0xA796, 0xA796, + 0xA798, 0xA798, 0xA79A, 0xA79A, 0xA79C, 0xA79C, 0xA79E, 0xA79E, + 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, + 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, + 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, + 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, + 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, + 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF21, 0xFF3A, + 0x10400, 0x10427, 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, + 0x1058C, 0x10592, 0x10594, 0x10595, 0x10C80, 0x10CB2, 0x118A0, 0x118BF, + 0x16E40, 0x16E5F, 0x1E900, 0x1E921, + // #49 (6017+131): bp=Changes_When_Casemapped:CWCM + 0x0041, 0x005A, 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00C0, 0x00D6, + 0x00D8, 0x00F6, 0x00F8, 0x0137, 0x0139, 0x018C, 0x018E, 0x019A, + 0x019C, 0x01A9, 0x01AC, 0x01B9, 0x01BC, 0x01BD, 0x01BF, 0x01BF, + 0x01C4, 0x0220, 0x0222, 0x0233, 0x023A, 0x0254, 0x0256, 0x0257, + 0x0259, 0x0259, 0x025B, 0x025C, 0x0260, 0x0261, 0x0263, 0x0263, + 0x0265, 0x0266, 0x0268, 0x026C, 0x026F, 0x026F, 0x0271, 0x0272, + 0x0275, 0x0275, 0x027D, 0x027D, 0x0280, 0x0280, 0x0282, 0x0283, + 0x0287, 0x028C, 0x0292, 0x0292, 0x029D, 0x029E, 0x0345, 0x0345, + 0x0370, 0x0373, 0x0376, 0x0377, 0x037B, 0x037D, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x03D1, 0x03D5, 0x03F5, 0x03F7, 0x03FB, 0x03FD, 0x0481, + 0x048A, 0x052F, 0x0531, 0x0556, 0x0561, 0x0587, 0x10A0, 0x10C5, + 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, 0x10FD, 0x10FF, + 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1D79, 0x1D79, 0x1D7D, 0x1D7D, 0x1D8E, 0x1D8E, + 0x1E00, 0x1E9B, 0x1E9E, 0x1E9E, 0x1EA0, 0x1F15, 0x1F18, 0x1F1D, + 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, + 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, + 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FFC, 0x2126, 0x2126, 0x212A, 0x212B, 0x2132, 0x2132, + 0x214E, 0x214E, 0x2160, 0x217F, 0x2183, 0x2184, 0x24B6, 0x24E9, + 0x2C00, 0x2C70, 0x2C72, 0x2C73, 0x2C75, 0x2C76, 0x2C7E, 0x2CE3, + 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0xA640, 0xA66D, 0xA680, 0xA69B, 0xA722, 0xA72F, + 0xA732, 0xA76F, 0xA779, 0xA787, 0xA78B, 0xA78D, 0xA790, 0xA794, + 0xA796, 0xA7AE, 0xA7B0, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D6, 0xA7D9, + 0xA7F5, 0xA7F6, 0xAB53, 0xAB53, 0xAB70, 0xABBF, 0xFB00, 0xFB06, + 0xFB13, 0xFB17, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0x10400, 0x1044F, + 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10570, 0x1057A, 0x1057C, 0x1058A, + 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, + 0x118A0, 0x118DF, 0x16E40, 0x16E7F, 0x1E900, 0x1E943, + // #50 (6148+609): bp=Changes_When_Lowercased:CWL + 0x0041, 0x005A, 0x00C0, 0x00D6, 0x00D8, 0x00DE, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, + 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, 0x0141, 0x0141, + 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, 0x014A, 0x014A, + 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, 0x0152, 0x0152, + 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, 0x015A, 0x015A, + 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, 0x0162, 0x0162, + 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, 0x016A, 0x016A, + 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, 0x0172, 0x0172, + 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, 0x017B, 0x017B, + 0x017D, 0x017D, 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, + 0x0189, 0x018B, 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, + 0x019C, 0x019D, 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, + 0x01A6, 0x01A7, 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, + 0x01B1, 0x01B3, 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, + 0x01C4, 0x01C5, 0x01C7, 0x01C8, 0x01CA, 0x01CB, 0x01CD, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F2, 0x01F4, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, + 0x01FC, 0x01FC, 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, + 0x0204, 0x0204, 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, + 0x020C, 0x020C, 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, + 0x0214, 0x0214, 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, + 0x021C, 0x021C, 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, + 0x0224, 0x0224, 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, + 0x022C, 0x022C, 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, + 0x023A, 0x023B, 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, + 0x0248, 0x0248, 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, + 0x0370, 0x0370, 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, + 0x0391, 0x03A1, 0x03A3, 0x03AB, 0x03CF, 0x03CF, 0x03D8, 0x03D8, + 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, 0x03E0, 0x03E0, + 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, 0x03E8, 0x03E8, + 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, 0x03F4, 0x03F4, + 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, 0x0460, 0x0460, + 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, 0x0468, 0x0468, + 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, 0x0470, 0x0470, + 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, 0x0478, 0x0478, + 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, 0x0480, 0x0480, + 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, 0x0490, 0x0490, + 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, 0x0498, 0x0498, + 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, 0x04A0, 0x04A0, + 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, 0x04A8, 0x04A8, + 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, 0x04B0, 0x04B0, + 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, 0x04B8, 0x04B8, + 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, 0x04C0, 0x04C1, + 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, 0x04C9, 0x04C9, + 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, 0x04D2, 0x04D2, + 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, 0x04DA, 0x04DA, + 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, 0x04E2, 0x04E2, + 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, 0x04EA, 0x04EA, + 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, 0x04F2, 0x04F2, + 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, 0x04FA, 0x04FA, + 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, 0x0502, 0x0502, + 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, 0x050A, 0x050A, + 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, 0x0512, 0x0512, + 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, 0x051A, 0x051A, + 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, 0x0522, 0x0522, + 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, 0x052A, 0x052A, + 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, 0x10A0, 0x10C5, + 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x13A0, 0x13F5, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, 0x1E04, 0x1E04, + 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, 0x1E0C, 0x1E0C, + 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, 0x1E14, 0x1E14, + 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, 0x1E1C, 0x1E1C, + 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, 0x1E24, 0x1E24, + 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, 0x1E2C, 0x1E2C, + 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, 0x1E34, 0x1E34, + 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, 0x1E3C, 0x1E3C, + 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, 0x1E44, 0x1E44, + 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, 0x1E4C, 0x1E4C, + 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, 0x1E54, 0x1E54, + 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, 0x1E5C, 0x1E5C, + 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, 0x1E64, 0x1E64, + 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, 0x1E6C, 0x1E6C, + 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, 0x1E74, 0x1E74, + 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, 0x1E7C, 0x1E7C, + 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, 0x1E84, 0x1E84, + 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, 0x1E8C, 0x1E8C, + 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, 0x1E94, 0x1E94, + 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, 0x1EA4, 0x1EA4, + 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, 0x1EAC, 0x1EAC, + 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, 0x1EB4, 0x1EB4, + 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, 0x1EBC, 0x1EBC, + 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, 0x1EC4, 0x1EC4, + 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, 0x1ECC, 0x1ECC, + 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, 0x1ED4, 0x1ED4, + 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, 0x1EDC, 0x1EDC, + 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, 0x1EE4, 0x1EE4, + 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, 0x1EEC, 0x1EEC, + 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, 0x1EF4, 0x1EF4, + 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, 0x1EFC, 0x1EFC, + 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, 0x1F28, 0x1F2F, + 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, 0x1F88, 0x1F8F, + 0x1F98, 0x1F9F, 0x1FA8, 0x1FAF, 0x1FB8, 0x1FBC, 0x1FC8, 0x1FCC, + 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, 0x1FF8, 0x1FFC, 0x2126, 0x2126, + 0x212A, 0x212B, 0x2132, 0x2132, 0x2160, 0x216F, 0x2183, 0x2183, + 0x24B6, 0x24CF, 0x2C00, 0x2C2F, 0x2C60, 0x2C60, 0x2C62, 0x2C64, + 0x2C67, 0x2C67, 0x2C69, 0x2C69, 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, + 0x2C72, 0x2C72, 0x2C75, 0x2C75, 0x2C7E, 0x2C80, 0x2C82, 0x2C82, + 0x2C84, 0x2C84, 0x2C86, 0x2C86, 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, + 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, 0x2C90, 0x2C90, 0x2C92, 0x2C92, + 0x2C94, 0x2C94, 0x2C96, 0x2C96, 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, + 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, + 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, + 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, + 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, + 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, + 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, + 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, + 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, + 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, + 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, 0x2CF2, 0x2CF2, 0xA640, 0xA640, + 0xA642, 0xA642, 0xA644, 0xA644, 0xA646, 0xA646, 0xA648, 0xA648, + 0xA64A, 0xA64A, 0xA64C, 0xA64C, 0xA64E, 0xA64E, 0xA650, 0xA650, + 0xA652, 0xA652, 0xA654, 0xA654, 0xA656, 0xA656, 0xA658, 0xA658, + 0xA65A, 0xA65A, 0xA65C, 0xA65C, 0xA65E, 0xA65E, 0xA660, 0xA660, + 0xA662, 0xA662, 0xA664, 0xA664, 0xA666, 0xA666, 0xA668, 0xA668, + 0xA66A, 0xA66A, 0xA66C, 0xA66C, 0xA680, 0xA680, 0xA682, 0xA682, + 0xA684, 0xA684, 0xA686, 0xA686, 0xA688, 0xA688, 0xA68A, 0xA68A, + 0xA68C, 0xA68C, 0xA68E, 0xA68E, 0xA690, 0xA690, 0xA692, 0xA692, + 0xA694, 0xA694, 0xA696, 0xA696, 0xA698, 0xA698, 0xA69A, 0xA69A, + 0xA722, 0xA722, 0xA724, 0xA724, 0xA726, 0xA726, 0xA728, 0xA728, + 0xA72A, 0xA72A, 0xA72C, 0xA72C, 0xA72E, 0xA72E, 0xA732, 0xA732, + 0xA734, 0xA734, 0xA736, 0xA736, 0xA738, 0xA738, 0xA73A, 0xA73A, + 0xA73C, 0xA73C, 0xA73E, 0xA73E, 0xA740, 0xA740, 0xA742, 0xA742, + 0xA744, 0xA744, 0xA746, 0xA746, 0xA748, 0xA748, 0xA74A, 0xA74A, + 0xA74C, 0xA74C, 0xA74E, 0xA74E, 0xA750, 0xA750, 0xA752, 0xA752, + 0xA754, 0xA754, 0xA756, 0xA756, 0xA758, 0xA758, 0xA75A, 0xA75A, + 0xA75C, 0xA75C, 0xA75E, 0xA75E, 0xA760, 0xA760, 0xA762, 0xA762, + 0xA764, 0xA764, 0xA766, 0xA766, 0xA768, 0xA768, 0xA76A, 0xA76A, + 0xA76C, 0xA76C, 0xA76E, 0xA76E, 0xA779, 0xA779, 0xA77B, 0xA77B, + 0xA77D, 0xA77E, 0xA780, 0xA780, 0xA782, 0xA782, 0xA784, 0xA784, + 0xA786, 0xA786, 0xA78B, 0xA78B, 0xA78D, 0xA78D, 0xA790, 0xA790, + 0xA792, 0xA792, 0xA796, 0xA796, 0xA798, 0xA798, 0xA79A, 0xA79A, + 0xA79C, 0xA79C, 0xA79E, 0xA79E, 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, + 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, + 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, + 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, + 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, + 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, 0xFF21, 0xFF3A, 0x10400, 0x10427, + 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10C80, 0x10CB2, 0x118A0, 0x118BF, 0x16E40, 0x16E5F, + 0x1E900, 0x1E921, + // #51 (6757+838): bp=Changes_When_NFKC_Casefolded:CWKCF + 0x0041, 0x005A, 0x00A0, 0x00A0, 0x00A8, 0x00A8, 0x00AA, 0x00AA, + 0x00AD, 0x00AD, 0x00AF, 0x00AF, 0x00B2, 0x00B5, 0x00B8, 0x00BA, + 0x00BC, 0x00BE, 0x00C0, 0x00D6, 0x00D8, 0x00DF, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, 0x013B, 0x013B, + 0x013D, 0x013D, 0x013F, 0x0141, 0x0143, 0x0143, 0x0145, 0x0145, + 0x0147, 0x0147, 0x0149, 0x014A, 0x014C, 0x014C, 0x014E, 0x014E, + 0x0150, 0x0150, 0x0152, 0x0152, 0x0154, 0x0154, 0x0156, 0x0156, + 0x0158, 0x0158, 0x015A, 0x015A, 0x015C, 0x015C, 0x015E, 0x015E, + 0x0160, 0x0160, 0x0162, 0x0162, 0x0164, 0x0164, 0x0166, 0x0166, + 0x0168, 0x0168, 0x016A, 0x016A, 0x016C, 0x016C, 0x016E, 0x016E, + 0x0170, 0x0170, 0x0172, 0x0172, 0x0174, 0x0174, 0x0176, 0x0176, + 0x0178, 0x0179, 0x017B, 0x017B, 0x017D, 0x017D, 0x017F, 0x017F, + 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, 0x0189, 0x018B, + 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, 0x019C, 0x019D, + 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, 0x01A6, 0x01A7, + 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, 0x01B1, 0x01B3, + 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, 0x01C4, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, 0x01FC, 0x01FC, + 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, 0x0204, 0x0204, + 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, 0x020C, 0x020C, + 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, 0x0214, 0x0214, + 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, 0x021C, 0x021C, + 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, 0x0224, 0x0224, + 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, 0x022C, 0x022C, + 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, 0x023A, 0x023B, + 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, 0x0248, 0x0248, + 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, 0x02B0, 0x02B8, + 0x02D8, 0x02DD, 0x02E0, 0x02E4, 0x0340, 0x0341, 0x0343, 0x0345, + 0x034F, 0x034F, 0x0370, 0x0370, 0x0372, 0x0372, 0x0374, 0x0374, + 0x0376, 0x0376, 0x037A, 0x037A, 0x037E, 0x037F, 0x0384, 0x038A, + 0x038C, 0x038C, 0x038E, 0x038F, 0x0391, 0x03A1, 0x03A3, 0x03AB, + 0x03C2, 0x03C2, 0x03CF, 0x03D6, 0x03D8, 0x03D8, 0x03DA, 0x03DA, + 0x03DC, 0x03DC, 0x03DE, 0x03DE, 0x03E0, 0x03E0, 0x03E2, 0x03E2, + 0x03E4, 0x03E4, 0x03E6, 0x03E6, 0x03E8, 0x03E8, 0x03EA, 0x03EA, + 0x03EC, 0x03EC, 0x03EE, 0x03EE, 0x03F0, 0x03F2, 0x03F4, 0x03F5, + 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, 0x0460, 0x0460, + 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, 0x0468, 0x0468, + 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, 0x0470, 0x0470, + 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, 0x0478, 0x0478, + 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, 0x0480, 0x0480, + 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, 0x0490, 0x0490, + 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, 0x0498, 0x0498, + 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, 0x04A0, 0x04A0, + 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, 0x04A8, 0x04A8, + 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, 0x04B0, 0x04B0, + 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, 0x04B8, 0x04B8, + 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, 0x04C0, 0x04C1, + 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, 0x04C9, 0x04C9, + 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, 0x04D2, 0x04D2, + 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, 0x04DA, 0x04DA, + 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, 0x04E2, 0x04E2, + 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, 0x04EA, 0x04EA, + 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, 0x04F2, 0x04F2, + 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, 0x04FA, 0x04FA, + 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, 0x0502, 0x0502, + 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, 0x050A, 0x050A, + 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, 0x0512, 0x0512, + 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, 0x051A, 0x051A, + 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, 0x0522, 0x0522, + 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, 0x052A, 0x052A, + 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, 0x0587, 0x0587, + 0x061C, 0x061C, 0x0675, 0x0678, 0x0958, 0x095F, 0x09DC, 0x09DD, + 0x09DF, 0x09DF, 0x0A33, 0x0A33, 0x0A36, 0x0A36, 0x0A59, 0x0A5B, + 0x0A5E, 0x0A5E, 0x0B5C, 0x0B5D, 0x0E33, 0x0E33, 0x0EB3, 0x0EB3, + 0x0EDC, 0x0EDD, 0x0F0C, 0x0F0C, 0x0F43, 0x0F43, 0x0F4D, 0x0F4D, + 0x0F52, 0x0F52, 0x0F57, 0x0F57, 0x0F5C, 0x0F5C, 0x0F69, 0x0F69, + 0x0F73, 0x0F73, 0x0F75, 0x0F79, 0x0F81, 0x0F81, 0x0F93, 0x0F93, + 0x0F9D, 0x0F9D, 0x0FA2, 0x0FA2, 0x0FA7, 0x0FA7, 0x0FAC, 0x0FAC, + 0x0FB9, 0x0FB9, 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, + 0x10FC, 0x10FC, 0x115F, 0x1160, 0x13F8, 0x13FD, 0x17B4, 0x17B5, + 0x180B, 0x180F, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, + 0x1D2C, 0x1D2E, 0x1D30, 0x1D3A, 0x1D3C, 0x1D4D, 0x1D4F, 0x1D6A, + 0x1D78, 0x1D78, 0x1D9B, 0x1DBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, + 0x1E04, 0x1E04, 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, + 0x1E0C, 0x1E0C, 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, + 0x1E14, 0x1E14, 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, + 0x1E1C, 0x1E1C, 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, + 0x1E24, 0x1E24, 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, + 0x1E2C, 0x1E2C, 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, + 0x1E34, 0x1E34, 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, + 0x1E3C, 0x1E3C, 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, + 0x1E44, 0x1E44, 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, + 0x1E4C, 0x1E4C, 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, + 0x1E54, 0x1E54, 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, + 0x1E5C, 0x1E5C, 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, + 0x1E64, 0x1E64, 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, + 0x1E6C, 0x1E6C, 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, + 0x1E74, 0x1E74, 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, + 0x1E7C, 0x1E7C, 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, + 0x1E84, 0x1E84, 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, + 0x1E8C, 0x1E8C, 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, + 0x1E94, 0x1E94, 0x1E9A, 0x1E9B, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, + 0x1EA2, 0x1EA2, 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, + 0x1EAA, 0x1EAA, 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, + 0x1EB2, 0x1EB2, 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, + 0x1EBA, 0x1EBA, 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, + 0x1EC2, 0x1EC2, 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, + 0x1ECA, 0x1ECA, 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, + 0x1ED2, 0x1ED2, 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, + 0x1EDA, 0x1EDA, 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, + 0x1EE2, 0x1EE2, 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, + 0x1EEA, 0x1EEA, 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, + 0x1EF2, 0x1EF2, 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, + 0x1EFA, 0x1EFA, 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, + 0x1F18, 0x1F1D, 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, + 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, + 0x1F68, 0x1F6F, 0x1F71, 0x1F71, 0x1F73, 0x1F73, 0x1F75, 0x1F75, + 0x1F77, 0x1F77, 0x1F79, 0x1F79, 0x1F7B, 0x1F7B, 0x1F7D, 0x1F7D, + 0x1F80, 0x1FAF, 0x1FB2, 0x1FB4, 0x1FB7, 0x1FC4, 0x1FC7, 0x1FCF, + 0x1FD3, 0x1FD3, 0x1FD8, 0x1FDB, 0x1FDD, 0x1FDF, 0x1FE3, 0x1FE3, + 0x1FE8, 0x1FEF, 0x1FF2, 0x1FF4, 0x1FF7, 0x1FFE, 0x2000, 0x200F, + 0x2011, 0x2011, 0x2017, 0x2017, 0x2024, 0x2026, 0x202A, 0x202F, + 0x2033, 0x2034, 0x2036, 0x2037, 0x203C, 0x203C, 0x203E, 0x203E, + 0x2047, 0x2049, 0x2057, 0x2057, 0x205F, 0x2071, 0x2074, 0x208E, + 0x2090, 0x209C, 0x20A8, 0x20A8, 0x2100, 0x2103, 0x2105, 0x2107, + 0x2109, 0x2113, 0x2115, 0x2116, 0x2119, 0x211D, 0x2120, 0x2122, + 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, + 0x212F, 0x2139, 0x213B, 0x2140, 0x2145, 0x2149, 0x2150, 0x217F, + 0x2183, 0x2183, 0x2189, 0x2189, 0x222C, 0x222D, 0x222F, 0x2230, + 0x2329, 0x232A, 0x2460, 0x24EA, 0x2A0C, 0x2A0C, 0x2A74, 0x2A76, + 0x2ADC, 0x2ADC, 0x2C00, 0x2C2F, 0x2C60, 0x2C60, 0x2C62, 0x2C64, + 0x2C67, 0x2C67, 0x2C69, 0x2C69, 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, + 0x2C72, 0x2C72, 0x2C75, 0x2C75, 0x2C7C, 0x2C80, 0x2C82, 0x2C82, + 0x2C84, 0x2C84, 0x2C86, 0x2C86, 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, + 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, 0x2C90, 0x2C90, 0x2C92, 0x2C92, + 0x2C94, 0x2C94, 0x2C96, 0x2C96, 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, + 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, + 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, + 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, + 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, + 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, + 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, + 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, + 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, + 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, + 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, 0x2CF2, 0x2CF2, 0x2D6F, 0x2D6F, + 0x2E9F, 0x2E9F, 0x2EF3, 0x2EF3, 0x2F00, 0x2FD5, 0x3000, 0x3000, + 0x3036, 0x3036, 0x3038, 0x303A, 0x309B, 0x309C, 0x309F, 0x309F, + 0x30FF, 0x30FF, 0x3131, 0x318E, 0x3192, 0x319F, 0x3200, 0x321E, + 0x3220, 0x3247, 0x3250, 0x327E, 0x3280, 0x33FF, 0xA640, 0xA640, + 0xA642, 0xA642, 0xA644, 0xA644, 0xA646, 0xA646, 0xA648, 0xA648, + 0xA64A, 0xA64A, 0xA64C, 0xA64C, 0xA64E, 0xA64E, 0xA650, 0xA650, + 0xA652, 0xA652, 0xA654, 0xA654, 0xA656, 0xA656, 0xA658, 0xA658, + 0xA65A, 0xA65A, 0xA65C, 0xA65C, 0xA65E, 0xA65E, 0xA660, 0xA660, + 0xA662, 0xA662, 0xA664, 0xA664, 0xA666, 0xA666, 0xA668, 0xA668, + 0xA66A, 0xA66A, 0xA66C, 0xA66C, 0xA680, 0xA680, 0xA682, 0xA682, + 0xA684, 0xA684, 0xA686, 0xA686, 0xA688, 0xA688, 0xA68A, 0xA68A, + 0xA68C, 0xA68C, 0xA68E, 0xA68E, 0xA690, 0xA690, 0xA692, 0xA692, + 0xA694, 0xA694, 0xA696, 0xA696, 0xA698, 0xA698, 0xA69A, 0xA69A, + 0xA69C, 0xA69D, 0xA722, 0xA722, 0xA724, 0xA724, 0xA726, 0xA726, + 0xA728, 0xA728, 0xA72A, 0xA72A, 0xA72C, 0xA72C, 0xA72E, 0xA72E, + 0xA732, 0xA732, 0xA734, 0xA734, 0xA736, 0xA736, 0xA738, 0xA738, + 0xA73A, 0xA73A, 0xA73C, 0xA73C, 0xA73E, 0xA73E, 0xA740, 0xA740, + 0xA742, 0xA742, 0xA744, 0xA744, 0xA746, 0xA746, 0xA748, 0xA748, + 0xA74A, 0xA74A, 0xA74C, 0xA74C, 0xA74E, 0xA74E, 0xA750, 0xA750, + 0xA752, 0xA752, 0xA754, 0xA754, 0xA756, 0xA756, 0xA758, 0xA758, + 0xA75A, 0xA75A, 0xA75C, 0xA75C, 0xA75E, 0xA75E, 0xA760, 0xA760, + 0xA762, 0xA762, 0xA764, 0xA764, 0xA766, 0xA766, 0xA768, 0xA768, + 0xA76A, 0xA76A, 0xA76C, 0xA76C, 0xA76E, 0xA76E, 0xA770, 0xA770, + 0xA779, 0xA779, 0xA77B, 0xA77B, 0xA77D, 0xA77E, 0xA780, 0xA780, + 0xA782, 0xA782, 0xA784, 0xA784, 0xA786, 0xA786, 0xA78B, 0xA78B, + 0xA78D, 0xA78D, 0xA790, 0xA790, 0xA792, 0xA792, 0xA796, 0xA796, + 0xA798, 0xA798, 0xA79A, 0xA79A, 0xA79C, 0xA79C, 0xA79E, 0xA79E, + 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, + 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, + 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, + 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, + 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, 0xA7D8, 0xA7D8, 0xA7F2, 0xA7F5, + 0xA7F8, 0xA7F9, 0xAB5C, 0xAB5F, 0xAB69, 0xAB69, 0xAB70, 0xABBF, + 0xF900, 0xFA0D, 0xFA10, 0xFA10, 0xFA12, 0xFA12, 0xFA15, 0xFA1E, + 0xFA20, 0xFA20, 0xFA22, 0xFA22, 0xFA25, 0xFA26, 0xFA2A, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, + 0xFB1F, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, + 0xFB43, 0xFB44, 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, + 0xFD92, 0xFDC7, 0xFDF0, 0xFDFC, 0xFE00, 0xFE19, 0xFE30, 0xFE44, + 0xFE47, 0xFE52, 0xFE54, 0xFE66, 0xFE68, 0xFE6B, 0xFE70, 0xFE72, + 0xFE74, 0xFE74, 0xFE76, 0xFEFC, 0xFEFF, 0xFEFF, 0xFF01, 0xFFBE, + 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, 0xFFF0, 0xFFF8, 0x10400, 0x10427, + 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10781, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, + 0x10C80, 0x10CB2, 0x118A0, 0x118BF, 0x16E40, 0x16E5F, 0x1BCA0, 0x1BCA3, + 0x1D15E, 0x1D164, 0x1D173, 0x1D17A, 0x1D1BB, 0x1D1C0, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D7FF, + 0x1E900, 0x1E921, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1F100, 0x1F10A, 0x1F110, 0x1F12E, + 0x1F130, 0x1F14F, 0x1F16A, 0x1F16C, 0x1F190, 0x1F190, 0x1F200, 0x1F202, + 0x1F210, 0x1F23B, 0x1F240, 0x1F248, 0x1F250, 0x1F251, 0x1FBF0, 0x1FBF9, + 0x2F800, 0x2FA1D, 0xE0000, 0xE0FFF, + // #52 (7595+626): bp=Changes_When_Titlecased:CWT + 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00DF, 0x00F6, 0x00F8, 0x00FF, + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010B, 0x010B, 0x010D, 0x010D, 0x010F, 0x010F, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011B, 0x011B, 0x011D, 0x011D, 0x011F, 0x011F, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012B, 0x012B, 0x012D, 0x012D, 0x012F, 0x012F, + 0x0131, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, + 0x013A, 0x013A, 0x013C, 0x013C, 0x013E, 0x013E, 0x0140, 0x0140, + 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, 0x0149, + 0x014B, 0x014B, 0x014D, 0x014D, 0x014F, 0x014F, 0x0151, 0x0151, + 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, 0x0159, 0x0159, + 0x015B, 0x015B, 0x015D, 0x015D, 0x015F, 0x015F, 0x0161, 0x0161, + 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, 0x0169, 0x0169, + 0x016B, 0x016B, 0x016D, 0x016D, 0x016F, 0x016F, 0x0171, 0x0171, + 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, 0x017A, 0x017A, + 0x017C, 0x017C, 0x017E, 0x0180, 0x0183, 0x0183, 0x0185, 0x0185, + 0x0188, 0x0188, 0x018C, 0x018C, 0x0192, 0x0192, 0x0195, 0x0195, + 0x0199, 0x019A, 0x019E, 0x019E, 0x01A1, 0x01A1, 0x01A3, 0x01A3, + 0x01A5, 0x01A5, 0x01A8, 0x01A8, 0x01AD, 0x01AD, 0x01B0, 0x01B0, + 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x01B9, 0x01B9, 0x01BD, 0x01BD, + 0x01BF, 0x01BF, 0x01C4, 0x01C4, 0x01C6, 0x01C7, 0x01C9, 0x01CA, + 0x01CC, 0x01CC, 0x01CE, 0x01CE, 0x01D0, 0x01D0, 0x01D2, 0x01D2, + 0x01D4, 0x01D4, 0x01D6, 0x01D6, 0x01D8, 0x01D8, 0x01DA, 0x01DA, + 0x01DC, 0x01DD, 0x01DF, 0x01DF, 0x01E1, 0x01E1, 0x01E3, 0x01E3, + 0x01E5, 0x01E5, 0x01E7, 0x01E7, 0x01E9, 0x01E9, 0x01EB, 0x01EB, + 0x01ED, 0x01ED, 0x01EF, 0x01F1, 0x01F3, 0x01F3, 0x01F5, 0x01F5, + 0x01F9, 0x01F9, 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF, + 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, + 0x0209, 0x0209, 0x020B, 0x020B, 0x020D, 0x020D, 0x020F, 0x020F, + 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, + 0x0219, 0x0219, 0x021B, 0x021B, 0x021D, 0x021D, 0x021F, 0x021F, + 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, + 0x022B, 0x022B, 0x022D, 0x022D, 0x022F, 0x022F, 0x0231, 0x0231, + 0x0233, 0x0233, 0x023C, 0x023C, 0x023F, 0x0240, 0x0242, 0x0242, + 0x0247, 0x0247, 0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, + 0x024F, 0x0254, 0x0256, 0x0257, 0x0259, 0x0259, 0x025B, 0x025C, + 0x0260, 0x0261, 0x0263, 0x0263, 0x0265, 0x0266, 0x0268, 0x026C, + 0x026F, 0x026F, 0x0271, 0x0272, 0x0275, 0x0275, 0x027D, 0x027D, + 0x0280, 0x0280, 0x0282, 0x0283, 0x0287, 0x028C, 0x0292, 0x0292, + 0x029D, 0x029E, 0x0345, 0x0345, 0x0371, 0x0371, 0x0373, 0x0373, + 0x0377, 0x0377, 0x037B, 0x037D, 0x0390, 0x0390, 0x03AC, 0x03CE, + 0x03D0, 0x03D1, 0x03D5, 0x03D7, 0x03D9, 0x03D9, 0x03DB, 0x03DB, + 0x03DD, 0x03DD, 0x03DF, 0x03DF, 0x03E1, 0x03E1, 0x03E3, 0x03E3, + 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, + 0x03ED, 0x03ED, 0x03EF, 0x03F3, 0x03F5, 0x03F5, 0x03F8, 0x03F8, + 0x03FB, 0x03FB, 0x0430, 0x045F, 0x0461, 0x0461, 0x0463, 0x0463, + 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, + 0x046D, 0x046D, 0x046F, 0x046F, 0x0471, 0x0471, 0x0473, 0x0473, + 0x0475, 0x0475, 0x0477, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, + 0x047D, 0x047D, 0x047F, 0x047F, 0x0481, 0x0481, 0x048B, 0x048B, + 0x048D, 0x048D, 0x048F, 0x048F, 0x0491, 0x0491, 0x0493, 0x0493, + 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, + 0x049D, 0x049D, 0x049F, 0x049F, 0x04A1, 0x04A1, 0x04A3, 0x04A3, + 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, + 0x04AD, 0x04AD, 0x04AF, 0x04AF, 0x04B1, 0x04B1, 0x04B3, 0x04B3, + 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, + 0x04BD, 0x04BD, 0x04BF, 0x04BF, 0x04C2, 0x04C2, 0x04C4, 0x04C4, + 0x04C6, 0x04C6, 0x04C8, 0x04C8, 0x04CA, 0x04CA, 0x04CC, 0x04CC, + 0x04CE, 0x04CF, 0x04D1, 0x04D1, 0x04D3, 0x04D3, 0x04D5, 0x04D5, + 0x04D7, 0x04D7, 0x04D9, 0x04D9, 0x04DB, 0x04DB, 0x04DD, 0x04DD, + 0x04DF, 0x04DF, 0x04E1, 0x04E1, 0x04E3, 0x04E3, 0x04E5, 0x04E5, + 0x04E7, 0x04E7, 0x04E9, 0x04E9, 0x04EB, 0x04EB, 0x04ED, 0x04ED, + 0x04EF, 0x04EF, 0x04F1, 0x04F1, 0x04F3, 0x04F3, 0x04F5, 0x04F5, + 0x04F7, 0x04F7, 0x04F9, 0x04F9, 0x04FB, 0x04FB, 0x04FD, 0x04FD, + 0x04FF, 0x04FF, 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, + 0x0507, 0x0507, 0x0509, 0x0509, 0x050B, 0x050B, 0x050D, 0x050D, + 0x050F, 0x050F, 0x0511, 0x0511, 0x0513, 0x0513, 0x0515, 0x0515, + 0x0517, 0x0517, 0x0519, 0x0519, 0x051B, 0x051B, 0x051D, 0x051D, + 0x051F, 0x051F, 0x0521, 0x0521, 0x0523, 0x0523, 0x0525, 0x0525, + 0x0527, 0x0527, 0x0529, 0x0529, 0x052B, 0x052B, 0x052D, 0x052D, + 0x052F, 0x052F, 0x0561, 0x0587, 0x13F8, 0x13FD, 0x1C80, 0x1C88, + 0x1D79, 0x1D79, 0x1D7D, 0x1D7D, 0x1D8E, 0x1D8E, 0x1E01, 0x1E01, + 0x1E03, 0x1E03, 0x1E05, 0x1E05, 0x1E07, 0x1E07, 0x1E09, 0x1E09, + 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, 0x1E0F, 0x1E0F, 0x1E11, 0x1E11, + 0x1E13, 0x1E13, 0x1E15, 0x1E15, 0x1E17, 0x1E17, 0x1E19, 0x1E19, + 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, 0x1E1F, 0x1E1F, 0x1E21, 0x1E21, + 0x1E23, 0x1E23, 0x1E25, 0x1E25, 0x1E27, 0x1E27, 0x1E29, 0x1E29, + 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, 0x1E2F, 0x1E2F, 0x1E31, 0x1E31, + 0x1E33, 0x1E33, 0x1E35, 0x1E35, 0x1E37, 0x1E37, 0x1E39, 0x1E39, + 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, 0x1E3F, 0x1E3F, 0x1E41, 0x1E41, + 0x1E43, 0x1E43, 0x1E45, 0x1E45, 0x1E47, 0x1E47, 0x1E49, 0x1E49, + 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, 0x1E4F, 0x1E4F, 0x1E51, 0x1E51, + 0x1E53, 0x1E53, 0x1E55, 0x1E55, 0x1E57, 0x1E57, 0x1E59, 0x1E59, + 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, 0x1E5F, 0x1E5F, 0x1E61, 0x1E61, + 0x1E63, 0x1E63, 0x1E65, 0x1E65, 0x1E67, 0x1E67, 0x1E69, 0x1E69, + 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, 0x1E6F, 0x1E6F, 0x1E71, 0x1E71, + 0x1E73, 0x1E73, 0x1E75, 0x1E75, 0x1E77, 0x1E77, 0x1E79, 0x1E79, + 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, 0x1E7F, 0x1E7F, 0x1E81, 0x1E81, + 0x1E83, 0x1E83, 0x1E85, 0x1E85, 0x1E87, 0x1E87, 0x1E89, 0x1E89, + 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, 0x1E8F, 0x1E8F, 0x1E91, 0x1E91, + 0x1E93, 0x1E93, 0x1E95, 0x1E9B, 0x1EA1, 0x1EA1, 0x1EA3, 0x1EA3, + 0x1EA5, 0x1EA5, 0x1EA7, 0x1EA7, 0x1EA9, 0x1EA9, 0x1EAB, 0x1EAB, + 0x1EAD, 0x1EAD, 0x1EAF, 0x1EAF, 0x1EB1, 0x1EB1, 0x1EB3, 0x1EB3, + 0x1EB5, 0x1EB5, 0x1EB7, 0x1EB7, 0x1EB9, 0x1EB9, 0x1EBB, 0x1EBB, + 0x1EBD, 0x1EBD, 0x1EBF, 0x1EBF, 0x1EC1, 0x1EC1, 0x1EC3, 0x1EC3, + 0x1EC5, 0x1EC5, 0x1EC7, 0x1EC7, 0x1EC9, 0x1EC9, 0x1ECB, 0x1ECB, + 0x1ECD, 0x1ECD, 0x1ECF, 0x1ECF, 0x1ED1, 0x1ED1, 0x1ED3, 0x1ED3, + 0x1ED5, 0x1ED5, 0x1ED7, 0x1ED7, 0x1ED9, 0x1ED9, 0x1EDB, 0x1EDB, + 0x1EDD, 0x1EDD, 0x1EDF, 0x1EDF, 0x1EE1, 0x1EE1, 0x1EE3, 0x1EE3, + 0x1EE5, 0x1EE5, 0x1EE7, 0x1EE7, 0x1EE9, 0x1EE9, 0x1EEB, 0x1EEB, + 0x1EED, 0x1EED, 0x1EEF, 0x1EEF, 0x1EF1, 0x1EF1, 0x1EF3, 0x1EF3, + 0x1EF5, 0x1EF5, 0x1EF7, 0x1EF7, 0x1EF9, 0x1EF9, 0x1EFB, 0x1EFB, + 0x1EFD, 0x1EFD, 0x1EFF, 0x1F07, 0x1F10, 0x1F15, 0x1F20, 0x1F27, + 0x1F30, 0x1F37, 0x1F40, 0x1F45, 0x1F50, 0x1F57, 0x1F60, 0x1F67, + 0x1F70, 0x1F7D, 0x1F80, 0x1F87, 0x1F90, 0x1F97, 0x1FA0, 0x1FA7, + 0x1FB0, 0x1FB4, 0x1FB6, 0x1FB7, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, + 0x1FC6, 0x1FC7, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, + 0x1FF2, 0x1FF4, 0x1FF6, 0x1FF7, 0x214E, 0x214E, 0x2170, 0x217F, + 0x2184, 0x2184, 0x24D0, 0x24E9, 0x2C30, 0x2C5F, 0x2C61, 0x2C61, + 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, 0x2C6C, 0x2C6C, + 0x2C73, 0x2C73, 0x2C76, 0x2C76, 0x2C81, 0x2C81, 0x2C83, 0x2C83, + 0x2C85, 0x2C85, 0x2C87, 0x2C87, 0x2C89, 0x2C89, 0x2C8B, 0x2C8B, + 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, 0x2C91, 0x2C91, 0x2C93, 0x2C93, + 0x2C95, 0x2C95, 0x2C97, 0x2C97, 0x2C99, 0x2C99, 0x2C9B, 0x2C9B, + 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, 0x2CA1, 0x2CA1, 0x2CA3, 0x2CA3, + 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, 0x2CA9, 0x2CA9, 0x2CAB, 0x2CAB, + 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, 0x2CB1, 0x2CB1, 0x2CB3, 0x2CB3, + 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, 0x2CB9, 0x2CB9, 0x2CBB, 0x2CBB, + 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, 0x2CC1, 0x2CC1, 0x2CC3, 0x2CC3, + 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, 0x2CC9, 0x2CC9, 0x2CCB, 0x2CCB, + 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, 0x2CD1, 0x2CD1, 0x2CD3, 0x2CD3, + 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, 0x2CD9, 0x2CD9, 0x2CDB, 0x2CDB, + 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, 0x2CE1, 0x2CE1, 0x2CE3, 0x2CE3, + 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, 0x2CF3, 0x2CF3, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0xA641, 0xA641, 0xA643, 0xA643, + 0xA645, 0xA645, 0xA647, 0xA647, 0xA649, 0xA649, 0xA64B, 0xA64B, + 0xA64D, 0xA64D, 0xA64F, 0xA64F, 0xA651, 0xA651, 0xA653, 0xA653, + 0xA655, 0xA655, 0xA657, 0xA657, 0xA659, 0xA659, 0xA65B, 0xA65B, + 0xA65D, 0xA65D, 0xA65F, 0xA65F, 0xA661, 0xA661, 0xA663, 0xA663, + 0xA665, 0xA665, 0xA667, 0xA667, 0xA669, 0xA669, 0xA66B, 0xA66B, + 0xA66D, 0xA66D, 0xA681, 0xA681, 0xA683, 0xA683, 0xA685, 0xA685, + 0xA687, 0xA687, 0xA689, 0xA689, 0xA68B, 0xA68B, 0xA68D, 0xA68D, + 0xA68F, 0xA68F, 0xA691, 0xA691, 0xA693, 0xA693, 0xA695, 0xA695, + 0xA697, 0xA697, 0xA699, 0xA699, 0xA69B, 0xA69B, 0xA723, 0xA723, + 0xA725, 0xA725, 0xA727, 0xA727, 0xA729, 0xA729, 0xA72B, 0xA72B, + 0xA72D, 0xA72D, 0xA72F, 0xA72F, 0xA733, 0xA733, 0xA735, 0xA735, + 0xA737, 0xA737, 0xA739, 0xA739, 0xA73B, 0xA73B, 0xA73D, 0xA73D, + 0xA73F, 0xA73F, 0xA741, 0xA741, 0xA743, 0xA743, 0xA745, 0xA745, + 0xA747, 0xA747, 0xA749, 0xA749, 0xA74B, 0xA74B, 0xA74D, 0xA74D, + 0xA74F, 0xA74F, 0xA751, 0xA751, 0xA753, 0xA753, 0xA755, 0xA755, + 0xA757, 0xA757, 0xA759, 0xA759, 0xA75B, 0xA75B, 0xA75D, 0xA75D, + 0xA75F, 0xA75F, 0xA761, 0xA761, 0xA763, 0xA763, 0xA765, 0xA765, + 0xA767, 0xA767, 0xA769, 0xA769, 0xA76B, 0xA76B, 0xA76D, 0xA76D, + 0xA76F, 0xA76F, 0xA77A, 0xA77A, 0xA77C, 0xA77C, 0xA77F, 0xA77F, + 0xA781, 0xA781, 0xA783, 0xA783, 0xA785, 0xA785, 0xA787, 0xA787, + 0xA78C, 0xA78C, 0xA791, 0xA791, 0xA793, 0xA794, 0xA797, 0xA797, + 0xA799, 0xA799, 0xA79B, 0xA79B, 0xA79D, 0xA79D, 0xA79F, 0xA79F, + 0xA7A1, 0xA7A1, 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, 0xA7A7, 0xA7A7, + 0xA7A9, 0xA7A9, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, 0xA7B9, 0xA7B9, + 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, 0xA7C1, 0xA7C1, + 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, 0xA7D1, 0xA7D1, + 0xA7D7, 0xA7D7, 0xA7D9, 0xA7D9, 0xA7F6, 0xA7F6, 0xAB53, 0xAB53, + 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF41, 0xFF5A, + 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10CC0, 0x10CF2, 0x118C0, 0x118DF, + 0x16E60, 0x16E7F, 0x1E922, 0x1E943, + // #53 (8221+627): bp=Changes_When_Uppercased:CWU + 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00DF, 0x00F6, 0x00F8, 0x00FF, + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010B, 0x010B, 0x010D, 0x010D, 0x010F, 0x010F, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011B, 0x011B, 0x011D, 0x011D, 0x011F, 0x011F, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012B, 0x012B, 0x012D, 0x012D, 0x012F, 0x012F, + 0x0131, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, + 0x013A, 0x013A, 0x013C, 0x013C, 0x013E, 0x013E, 0x0140, 0x0140, + 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, 0x0149, + 0x014B, 0x014B, 0x014D, 0x014D, 0x014F, 0x014F, 0x0151, 0x0151, + 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, 0x0159, 0x0159, + 0x015B, 0x015B, 0x015D, 0x015D, 0x015F, 0x015F, 0x0161, 0x0161, + 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, 0x0169, 0x0169, + 0x016B, 0x016B, 0x016D, 0x016D, 0x016F, 0x016F, 0x0171, 0x0171, + 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, 0x017A, 0x017A, + 0x017C, 0x017C, 0x017E, 0x0180, 0x0183, 0x0183, 0x0185, 0x0185, + 0x0188, 0x0188, 0x018C, 0x018C, 0x0192, 0x0192, 0x0195, 0x0195, + 0x0199, 0x019A, 0x019E, 0x019E, 0x01A1, 0x01A1, 0x01A3, 0x01A3, + 0x01A5, 0x01A5, 0x01A8, 0x01A8, 0x01AD, 0x01AD, 0x01B0, 0x01B0, + 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x01B9, 0x01B9, 0x01BD, 0x01BD, + 0x01BF, 0x01BF, 0x01C5, 0x01C6, 0x01C8, 0x01C9, 0x01CB, 0x01CC, + 0x01CE, 0x01CE, 0x01D0, 0x01D0, 0x01D2, 0x01D2, 0x01D4, 0x01D4, + 0x01D6, 0x01D6, 0x01D8, 0x01D8, 0x01DA, 0x01DA, 0x01DC, 0x01DD, + 0x01DF, 0x01DF, 0x01E1, 0x01E1, 0x01E3, 0x01E3, 0x01E5, 0x01E5, + 0x01E7, 0x01E7, 0x01E9, 0x01E9, 0x01EB, 0x01EB, 0x01ED, 0x01ED, + 0x01EF, 0x01F0, 0x01F2, 0x01F3, 0x01F5, 0x01F5, 0x01F9, 0x01F9, + 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF, 0x0201, 0x0201, + 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, 0x0209, 0x0209, + 0x020B, 0x020B, 0x020D, 0x020D, 0x020F, 0x020F, 0x0211, 0x0211, + 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, 0x0219, 0x0219, + 0x021B, 0x021B, 0x021D, 0x021D, 0x021F, 0x021F, 0x0223, 0x0223, + 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, 0x022B, 0x022B, + 0x022D, 0x022D, 0x022F, 0x022F, 0x0231, 0x0231, 0x0233, 0x0233, + 0x023C, 0x023C, 0x023F, 0x0240, 0x0242, 0x0242, 0x0247, 0x0247, + 0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, 0x024F, 0x0254, + 0x0256, 0x0257, 0x0259, 0x0259, 0x025B, 0x025C, 0x0260, 0x0261, + 0x0263, 0x0263, 0x0265, 0x0266, 0x0268, 0x026C, 0x026F, 0x026F, + 0x0271, 0x0272, 0x0275, 0x0275, 0x027D, 0x027D, 0x0280, 0x0280, + 0x0282, 0x0283, 0x0287, 0x028C, 0x0292, 0x0292, 0x029D, 0x029E, + 0x0345, 0x0345, 0x0371, 0x0371, 0x0373, 0x0373, 0x0377, 0x0377, + 0x037B, 0x037D, 0x0390, 0x0390, 0x03AC, 0x03CE, 0x03D0, 0x03D1, + 0x03D5, 0x03D7, 0x03D9, 0x03D9, 0x03DB, 0x03DB, 0x03DD, 0x03DD, + 0x03DF, 0x03DF, 0x03E1, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, + 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, + 0x03EF, 0x03F3, 0x03F5, 0x03F5, 0x03F8, 0x03F8, 0x03FB, 0x03FB, + 0x0430, 0x045F, 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, + 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, 0x046D, 0x046D, + 0x046F, 0x046F, 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, + 0x0477, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, 0x047D, 0x047D, + 0x047F, 0x047F, 0x0481, 0x0481, 0x048B, 0x048B, 0x048D, 0x048D, + 0x048F, 0x048F, 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, + 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, 0x049D, 0x049D, + 0x049F, 0x049F, 0x04A1, 0x04A1, 0x04A3, 0x04A3, 0x04A5, 0x04A5, + 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, 0x04AD, 0x04AD, + 0x04AF, 0x04AF, 0x04B1, 0x04B1, 0x04B3, 0x04B3, 0x04B5, 0x04B5, + 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, 0x04BD, 0x04BD, + 0x04BF, 0x04BF, 0x04C2, 0x04C2, 0x04C4, 0x04C4, 0x04C6, 0x04C6, + 0x04C8, 0x04C8, 0x04CA, 0x04CA, 0x04CC, 0x04CC, 0x04CE, 0x04CF, + 0x04D1, 0x04D1, 0x04D3, 0x04D3, 0x04D5, 0x04D5, 0x04D7, 0x04D7, + 0x04D9, 0x04D9, 0x04DB, 0x04DB, 0x04DD, 0x04DD, 0x04DF, 0x04DF, + 0x04E1, 0x04E1, 0x04E3, 0x04E3, 0x04E5, 0x04E5, 0x04E7, 0x04E7, + 0x04E9, 0x04E9, 0x04EB, 0x04EB, 0x04ED, 0x04ED, 0x04EF, 0x04EF, + 0x04F1, 0x04F1, 0x04F3, 0x04F3, 0x04F5, 0x04F5, 0x04F7, 0x04F7, + 0x04F9, 0x04F9, 0x04FB, 0x04FB, 0x04FD, 0x04FD, 0x04FF, 0x04FF, + 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, 0x0507, 0x0507, + 0x0509, 0x0509, 0x050B, 0x050B, 0x050D, 0x050D, 0x050F, 0x050F, + 0x0511, 0x0511, 0x0513, 0x0513, 0x0515, 0x0515, 0x0517, 0x0517, + 0x0519, 0x0519, 0x051B, 0x051B, 0x051D, 0x051D, 0x051F, 0x051F, + 0x0521, 0x0521, 0x0523, 0x0523, 0x0525, 0x0525, 0x0527, 0x0527, + 0x0529, 0x0529, 0x052B, 0x052B, 0x052D, 0x052D, 0x052F, 0x052F, + 0x0561, 0x0587, 0x10D0, 0x10FA, 0x10FD, 0x10FF, 0x13F8, 0x13FD, + 0x1C80, 0x1C88, 0x1D79, 0x1D79, 0x1D7D, 0x1D7D, 0x1D8E, 0x1D8E, + 0x1E01, 0x1E01, 0x1E03, 0x1E03, 0x1E05, 0x1E05, 0x1E07, 0x1E07, + 0x1E09, 0x1E09, 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, 0x1E0F, 0x1E0F, + 0x1E11, 0x1E11, 0x1E13, 0x1E13, 0x1E15, 0x1E15, 0x1E17, 0x1E17, + 0x1E19, 0x1E19, 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, 0x1E1F, 0x1E1F, + 0x1E21, 0x1E21, 0x1E23, 0x1E23, 0x1E25, 0x1E25, 0x1E27, 0x1E27, + 0x1E29, 0x1E29, 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, 0x1E2F, 0x1E2F, + 0x1E31, 0x1E31, 0x1E33, 0x1E33, 0x1E35, 0x1E35, 0x1E37, 0x1E37, + 0x1E39, 0x1E39, 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, 0x1E3F, 0x1E3F, + 0x1E41, 0x1E41, 0x1E43, 0x1E43, 0x1E45, 0x1E45, 0x1E47, 0x1E47, + 0x1E49, 0x1E49, 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, 0x1E4F, 0x1E4F, + 0x1E51, 0x1E51, 0x1E53, 0x1E53, 0x1E55, 0x1E55, 0x1E57, 0x1E57, + 0x1E59, 0x1E59, 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, 0x1E5F, 0x1E5F, + 0x1E61, 0x1E61, 0x1E63, 0x1E63, 0x1E65, 0x1E65, 0x1E67, 0x1E67, + 0x1E69, 0x1E69, 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, 0x1E6F, 0x1E6F, + 0x1E71, 0x1E71, 0x1E73, 0x1E73, 0x1E75, 0x1E75, 0x1E77, 0x1E77, + 0x1E79, 0x1E79, 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, 0x1E7F, 0x1E7F, + 0x1E81, 0x1E81, 0x1E83, 0x1E83, 0x1E85, 0x1E85, 0x1E87, 0x1E87, + 0x1E89, 0x1E89, 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, 0x1E8F, 0x1E8F, + 0x1E91, 0x1E91, 0x1E93, 0x1E93, 0x1E95, 0x1E9B, 0x1EA1, 0x1EA1, + 0x1EA3, 0x1EA3, 0x1EA5, 0x1EA5, 0x1EA7, 0x1EA7, 0x1EA9, 0x1EA9, + 0x1EAB, 0x1EAB, 0x1EAD, 0x1EAD, 0x1EAF, 0x1EAF, 0x1EB1, 0x1EB1, + 0x1EB3, 0x1EB3, 0x1EB5, 0x1EB5, 0x1EB7, 0x1EB7, 0x1EB9, 0x1EB9, + 0x1EBB, 0x1EBB, 0x1EBD, 0x1EBD, 0x1EBF, 0x1EBF, 0x1EC1, 0x1EC1, + 0x1EC3, 0x1EC3, 0x1EC5, 0x1EC5, 0x1EC7, 0x1EC7, 0x1EC9, 0x1EC9, + 0x1ECB, 0x1ECB, 0x1ECD, 0x1ECD, 0x1ECF, 0x1ECF, 0x1ED1, 0x1ED1, + 0x1ED3, 0x1ED3, 0x1ED5, 0x1ED5, 0x1ED7, 0x1ED7, 0x1ED9, 0x1ED9, + 0x1EDB, 0x1EDB, 0x1EDD, 0x1EDD, 0x1EDF, 0x1EDF, 0x1EE1, 0x1EE1, + 0x1EE3, 0x1EE3, 0x1EE5, 0x1EE5, 0x1EE7, 0x1EE7, 0x1EE9, 0x1EE9, + 0x1EEB, 0x1EEB, 0x1EED, 0x1EED, 0x1EEF, 0x1EEF, 0x1EF1, 0x1EF1, + 0x1EF3, 0x1EF3, 0x1EF5, 0x1EF5, 0x1EF7, 0x1EF7, 0x1EF9, 0x1EF9, + 0x1EFB, 0x1EFB, 0x1EFD, 0x1EFD, 0x1EFF, 0x1F07, 0x1F10, 0x1F15, + 0x1F20, 0x1F27, 0x1F30, 0x1F37, 0x1F40, 0x1F45, 0x1F50, 0x1F57, + 0x1F60, 0x1F67, 0x1F70, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FB7, + 0x1FBC, 0x1FBC, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FC7, + 0x1FCC, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, + 0x1FF2, 0x1FF4, 0x1FF6, 0x1FF7, 0x1FFC, 0x1FFC, 0x214E, 0x214E, + 0x2170, 0x217F, 0x2184, 0x2184, 0x24D0, 0x24E9, 0x2C30, 0x2C5F, + 0x2C61, 0x2C61, 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, + 0x2C6C, 0x2C6C, 0x2C73, 0x2C73, 0x2C76, 0x2C76, 0x2C81, 0x2C81, + 0x2C83, 0x2C83, 0x2C85, 0x2C85, 0x2C87, 0x2C87, 0x2C89, 0x2C89, + 0x2C8B, 0x2C8B, 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, 0x2C91, 0x2C91, + 0x2C93, 0x2C93, 0x2C95, 0x2C95, 0x2C97, 0x2C97, 0x2C99, 0x2C99, + 0x2C9B, 0x2C9B, 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, 0x2CA1, 0x2CA1, + 0x2CA3, 0x2CA3, 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, 0x2CA9, 0x2CA9, + 0x2CAB, 0x2CAB, 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, 0x2CB1, 0x2CB1, + 0x2CB3, 0x2CB3, 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, 0x2CB9, 0x2CB9, + 0x2CBB, 0x2CBB, 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, 0x2CC1, 0x2CC1, + 0x2CC3, 0x2CC3, 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, 0x2CC9, 0x2CC9, + 0x2CCB, 0x2CCB, 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, 0x2CD1, 0x2CD1, + 0x2CD3, 0x2CD3, 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, 0x2CD9, 0x2CD9, + 0x2CDB, 0x2CDB, 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, 0x2CE1, 0x2CE1, + 0x2CE3, 0x2CE3, 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, 0x2CF3, 0x2CF3, + 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0xA641, 0xA641, + 0xA643, 0xA643, 0xA645, 0xA645, 0xA647, 0xA647, 0xA649, 0xA649, + 0xA64B, 0xA64B, 0xA64D, 0xA64D, 0xA64F, 0xA64F, 0xA651, 0xA651, + 0xA653, 0xA653, 0xA655, 0xA655, 0xA657, 0xA657, 0xA659, 0xA659, + 0xA65B, 0xA65B, 0xA65D, 0xA65D, 0xA65F, 0xA65F, 0xA661, 0xA661, + 0xA663, 0xA663, 0xA665, 0xA665, 0xA667, 0xA667, 0xA669, 0xA669, + 0xA66B, 0xA66B, 0xA66D, 0xA66D, 0xA681, 0xA681, 0xA683, 0xA683, + 0xA685, 0xA685, 0xA687, 0xA687, 0xA689, 0xA689, 0xA68B, 0xA68B, + 0xA68D, 0xA68D, 0xA68F, 0xA68F, 0xA691, 0xA691, 0xA693, 0xA693, + 0xA695, 0xA695, 0xA697, 0xA697, 0xA699, 0xA699, 0xA69B, 0xA69B, + 0xA723, 0xA723, 0xA725, 0xA725, 0xA727, 0xA727, 0xA729, 0xA729, + 0xA72B, 0xA72B, 0xA72D, 0xA72D, 0xA72F, 0xA72F, 0xA733, 0xA733, + 0xA735, 0xA735, 0xA737, 0xA737, 0xA739, 0xA739, 0xA73B, 0xA73B, + 0xA73D, 0xA73D, 0xA73F, 0xA73F, 0xA741, 0xA741, 0xA743, 0xA743, + 0xA745, 0xA745, 0xA747, 0xA747, 0xA749, 0xA749, 0xA74B, 0xA74B, + 0xA74D, 0xA74D, 0xA74F, 0xA74F, 0xA751, 0xA751, 0xA753, 0xA753, + 0xA755, 0xA755, 0xA757, 0xA757, 0xA759, 0xA759, 0xA75B, 0xA75B, + 0xA75D, 0xA75D, 0xA75F, 0xA75F, 0xA761, 0xA761, 0xA763, 0xA763, + 0xA765, 0xA765, 0xA767, 0xA767, 0xA769, 0xA769, 0xA76B, 0xA76B, + 0xA76D, 0xA76D, 0xA76F, 0xA76F, 0xA77A, 0xA77A, 0xA77C, 0xA77C, + 0xA77F, 0xA77F, 0xA781, 0xA781, 0xA783, 0xA783, 0xA785, 0xA785, + 0xA787, 0xA787, 0xA78C, 0xA78C, 0xA791, 0xA791, 0xA793, 0xA794, + 0xA797, 0xA797, 0xA799, 0xA799, 0xA79B, 0xA79B, 0xA79D, 0xA79D, + 0xA79F, 0xA79F, 0xA7A1, 0xA7A1, 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, + 0xA7A7, 0xA7A7, 0xA7A9, 0xA7A9, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, + 0xA7B9, 0xA7B9, 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, + 0xA7C1, 0xA7C1, 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, + 0xA7D1, 0xA7D1, 0xA7D7, 0xA7D7, 0xA7D9, 0xA7D9, 0xA7F6, 0xA7F6, + 0xAB53, 0xAB53, 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, + 0xFF41, 0xFF5A, 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10CC0, 0x10CF2, + 0x118C0, 0x118DF, 0x16E60, 0x16E7F, 0x1E922, 0x1E943, + // #54 (8848+23): bp=Dash + 0x002D, 0x002D, 0x058A, 0x058A, 0x05BE, 0x05BE, 0x1400, 0x1400, + 0x1806, 0x1806, 0x2010, 0x2015, 0x2053, 0x2053, 0x207B, 0x207B, + 0x208B, 0x208B, 0x2212, 0x2212, 0x2E17, 0x2E17, 0x2E1A, 0x2E1A, + 0x2E3A, 0x2E3B, 0x2E40, 0x2E40, 0x2E5D, 0x2E5D, 0x301C, 0x301C, + 0x3030, 0x3030, 0x30A0, 0x30A0, 0xFE31, 0xFE32, 0xFE58, 0xFE58, + 0xFE63, 0xFE63, 0xFF0D, 0xFF0D, 0x10EAD, 0x10EAD, + // #55 (8871+17): bp=Default_Ignorable_Code_Point:DI + 0x00AD, 0x00AD, 0x034F, 0x034F, 0x061C, 0x061C, 0x115F, 0x1160, + 0x17B4, 0x17B5, 0x180B, 0x180F, 0x200B, 0x200F, 0x202A, 0x202E, + 0x2060, 0x206F, 0x3164, 0x3164, 0xFE00, 0xFE0F, 0xFEFF, 0xFEFF, + 0xFFA0, 0xFFA0, 0xFFF0, 0xFFF8, 0x1BCA0, 0x1BCA3, 0x1D173, 0x1D17A, + 0xE0000, 0xE0FFF, + // #56 (8888+8): bp=Deprecated:Dep + 0x0149, 0x0149, 0x0673, 0x0673, 0x0F77, 0x0F77, 0x0F79, 0x0F79, + 0x17A3, 0x17A4, 0x206A, 0x206F, 0x2329, 0x232A, 0xE0001, 0xE0001, + // #57 (8896+192): bp=Diacritic:Dia + 0x005E, 0x005E, 0x0060, 0x0060, 0x00A8, 0x00A8, 0x00AF, 0x00AF, + 0x00B4, 0x00B4, 0x00B7, 0x00B8, 0x02B0, 0x034E, 0x0350, 0x0357, + 0x035D, 0x0362, 0x0374, 0x0375, 0x037A, 0x037A, 0x0384, 0x0385, + 0x0483, 0x0487, 0x0559, 0x0559, 0x0591, 0x05A1, 0x05A3, 0x05BD, + 0x05BF, 0x05BF, 0x05C1, 0x05C2, 0x05C4, 0x05C4, 0x064B, 0x0652, + 0x0657, 0x0658, 0x06DF, 0x06E0, 0x06E5, 0x06E6, 0x06EA, 0x06EC, + 0x0730, 0x074A, 0x07A6, 0x07B0, 0x07EB, 0x07F5, 0x0818, 0x0819, + 0x0898, 0x089F, 0x08C9, 0x08D2, 0x08E3, 0x08FE, 0x093C, 0x093C, + 0x094D, 0x094D, 0x0951, 0x0954, 0x0971, 0x0971, 0x09BC, 0x09BC, + 0x09CD, 0x09CD, 0x0A3C, 0x0A3C, 0x0A4D, 0x0A4D, 0x0ABC, 0x0ABC, + 0x0ACD, 0x0ACD, 0x0AFD, 0x0AFF, 0x0B3C, 0x0B3C, 0x0B4D, 0x0B4D, + 0x0B55, 0x0B55, 0x0BCD, 0x0BCD, 0x0C3C, 0x0C3C, 0x0C4D, 0x0C4D, + 0x0CBC, 0x0CBC, 0x0CCD, 0x0CCD, 0x0D3B, 0x0D3C, 0x0D4D, 0x0D4D, + 0x0DCA, 0x0DCA, 0x0E47, 0x0E4C, 0x0E4E, 0x0E4E, 0x0EBA, 0x0EBA, + 0x0EC8, 0x0ECC, 0x0F18, 0x0F19, 0x0F35, 0x0F35, 0x0F37, 0x0F37, + 0x0F39, 0x0F39, 0x0F3E, 0x0F3F, 0x0F82, 0x0F84, 0x0F86, 0x0F87, + 0x0FC6, 0x0FC6, 0x1037, 0x1037, 0x1039, 0x103A, 0x1063, 0x1064, + 0x1069, 0x106D, 0x1087, 0x108D, 0x108F, 0x108F, 0x109A, 0x109B, + 0x135D, 0x135F, 0x1714, 0x1715, 0x17C9, 0x17D3, 0x17DD, 0x17DD, + 0x1939, 0x193B, 0x1A75, 0x1A7C, 0x1A7F, 0x1A7F, 0x1AB0, 0x1ABE, + 0x1AC1, 0x1ACB, 0x1B34, 0x1B34, 0x1B44, 0x1B44, 0x1B6B, 0x1B73, + 0x1BAA, 0x1BAB, 0x1C36, 0x1C37, 0x1C78, 0x1C7D, 0x1CD0, 0x1CE8, + 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, 0x1CF7, 0x1CF9, 0x1D2C, 0x1D6A, + 0x1DC4, 0x1DCF, 0x1DF5, 0x1DFF, 0x1FBD, 0x1FBD, 0x1FBF, 0x1FC1, + 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF, 0x1FED, 0x1FEF, 0x1FFD, 0x1FFE, + 0x2CEF, 0x2CF1, 0x2E2F, 0x2E2F, 0x302A, 0x302F, 0x3099, 0x309C, + 0x30FC, 0x30FC, 0xA66F, 0xA66F, 0xA67C, 0xA67D, 0xA67F, 0xA67F, + 0xA69C, 0xA69D, 0xA6F0, 0xA6F1, 0xA700, 0xA721, 0xA788, 0xA78A, + 0xA7F8, 0xA7F9, 0xA8C4, 0xA8C4, 0xA8E0, 0xA8F1, 0xA92B, 0xA92E, + 0xA953, 0xA953, 0xA9B3, 0xA9B3, 0xA9C0, 0xA9C0, 0xA9E5, 0xA9E5, + 0xAA7B, 0xAA7D, 0xAABF, 0xAAC2, 0xAAF6, 0xAAF6, 0xAB5B, 0xAB5F, + 0xAB69, 0xAB6B, 0xABEC, 0xABED, 0xFB1E, 0xFB1E, 0xFE20, 0xFE2F, + 0xFF3E, 0xFF3E, 0xFF40, 0xFF40, 0xFF70, 0xFF70, 0xFF9E, 0xFF9F, + 0xFFE3, 0xFFE3, 0x102E0, 0x102E0, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x10AE5, 0x10AE6, 0x10D22, 0x10D27, 0x10F46, 0x10F50, + 0x10F82, 0x10F85, 0x11046, 0x11046, 0x11070, 0x11070, 0x110B9, 0x110BA, + 0x11133, 0x11134, 0x11173, 0x11173, 0x111C0, 0x111C0, 0x111CA, 0x111CC, + 0x11235, 0x11236, 0x112E9, 0x112EA, 0x1133C, 0x1133C, 0x1134D, 0x1134D, + 0x11366, 0x1136C, 0x11370, 0x11374, 0x11442, 0x11442, 0x11446, 0x11446, + 0x114C2, 0x114C3, 0x115BF, 0x115C0, 0x1163F, 0x1163F, 0x116B6, 0x116B7, + 0x1172B, 0x1172B, 0x11839, 0x1183A, 0x1193D, 0x1193E, 0x11943, 0x11943, + 0x119E0, 0x119E0, 0x11A34, 0x11A34, 0x11A47, 0x11A47, 0x11A99, 0x11A99, + 0x11C3F, 0x11C3F, 0x11D42, 0x11D42, 0x11D44, 0x11D45, 0x11D97, 0x11D97, + 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, 0x16F8F, 0x16F9F, 0x16FF0, 0x16FF1, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1CF00, 0x1CF2D, + 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, 0x1D16D, 0x1D172, 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1E130, 0x1E136, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E946, 0x1E948, 0x1E94A, + // #58 (9088+153): bp=Emoji + 0x0023, 0x0023, 0x002A, 0x002A, 0x0030, 0x0039, 0x00A9, 0x00A9, + 0x00AE, 0x00AE, 0x203C, 0x203C, 0x2049, 0x2049, 0x2122, 0x2122, + 0x2139, 0x2139, 0x2194, 0x2199, 0x21A9, 0x21AA, 0x231A, 0x231B, + 0x2328, 0x2328, 0x23CF, 0x23CF, 0x23E9, 0x23F3, 0x23F8, 0x23FA, + 0x24C2, 0x24C2, 0x25AA, 0x25AB, 0x25B6, 0x25B6, 0x25C0, 0x25C0, + 0x25FB, 0x25FE, 0x2600, 0x2604, 0x260E, 0x260E, 0x2611, 0x2611, + 0x2614, 0x2615, 0x2618, 0x2618, 0x261D, 0x261D, 0x2620, 0x2620, + 0x2622, 0x2623, 0x2626, 0x2626, 0x262A, 0x262A, 0x262E, 0x262F, + 0x2638, 0x263A, 0x2640, 0x2640, 0x2642, 0x2642, 0x2648, 0x2653, + 0x265F, 0x2660, 0x2663, 0x2663, 0x2665, 0x2666, 0x2668, 0x2668, + 0x267B, 0x267B, 0x267E, 0x267F, 0x2692, 0x2697, 0x2699, 0x2699, + 0x269B, 0x269C, 0x26A0, 0x26A1, 0x26A7, 0x26A7, 0x26AA, 0x26AB, + 0x26B0, 0x26B1, 0x26BD, 0x26BE, 0x26C4, 0x26C5, 0x26C8, 0x26C8, + 0x26CE, 0x26CF, 0x26D1, 0x26D1, 0x26D3, 0x26D4, 0x26E9, 0x26EA, + 0x26F0, 0x26F5, 0x26F7, 0x26FA, 0x26FD, 0x26FD, 0x2702, 0x2702, + 0x2705, 0x2705, 0x2708, 0x270D, 0x270F, 0x270F, 0x2712, 0x2712, + 0x2714, 0x2714, 0x2716, 0x2716, 0x271D, 0x271D, 0x2721, 0x2721, + 0x2728, 0x2728, 0x2733, 0x2734, 0x2744, 0x2744, 0x2747, 0x2747, + 0x274C, 0x274C, 0x274E, 0x274E, 0x2753, 0x2755, 0x2757, 0x2757, + 0x2763, 0x2764, 0x2795, 0x2797, 0x27A1, 0x27A1, 0x27B0, 0x27B0, + 0x27BF, 0x27BF, 0x2934, 0x2935, 0x2B05, 0x2B07, 0x2B1B, 0x2B1C, + 0x2B50, 0x2B50, 0x2B55, 0x2B55, 0x3030, 0x3030, 0x303D, 0x303D, + 0x3297, 0x3297, 0x3299, 0x3299, 0x1F004, 0x1F004, 0x1F0CF, 0x1F0CF, + 0x1F170, 0x1F171, 0x1F17E, 0x1F17F, 0x1F18E, 0x1F18E, 0x1F191, 0x1F19A, + 0x1F1E6, 0x1F1FF, 0x1F201, 0x1F202, 0x1F21A, 0x1F21A, 0x1F22F, 0x1F22F, + 0x1F232, 0x1F23A, 0x1F250, 0x1F251, 0x1F300, 0x1F321, 0x1F324, 0x1F393, + 0x1F396, 0x1F397, 0x1F399, 0x1F39B, 0x1F39E, 0x1F3F0, 0x1F3F3, 0x1F3F5, + 0x1F3F7, 0x1F4FD, 0x1F4FF, 0x1F53D, 0x1F549, 0x1F54E, 0x1F550, 0x1F567, + 0x1F56F, 0x1F570, 0x1F573, 0x1F57A, 0x1F587, 0x1F587, 0x1F58A, 0x1F58D, + 0x1F590, 0x1F590, 0x1F595, 0x1F596, 0x1F5A4, 0x1F5A5, 0x1F5A8, 0x1F5A8, + 0x1F5B1, 0x1F5B2, 0x1F5BC, 0x1F5BC, 0x1F5C2, 0x1F5C4, 0x1F5D1, 0x1F5D3, + 0x1F5DC, 0x1F5DE, 0x1F5E1, 0x1F5E1, 0x1F5E3, 0x1F5E3, 0x1F5E8, 0x1F5E8, + 0x1F5EF, 0x1F5EF, 0x1F5F3, 0x1F5F3, 0x1F5FA, 0x1F64F, 0x1F680, 0x1F6C5, + 0x1F6CB, 0x1F6D2, 0x1F6D5, 0x1F6D7, 0x1F6DD, 0x1F6E5, 0x1F6E9, 0x1F6E9, + 0x1F6EB, 0x1F6EC, 0x1F6F0, 0x1F6F0, 0x1F6F3, 0x1F6FC, 0x1F7E0, 0x1F7EB, + 0x1F7F0, 0x1F7F0, 0x1F90C, 0x1F93A, 0x1F93C, 0x1F945, 0x1F947, 0x1F9FF, + 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, + 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, + 0x1FAF0, 0x1FAF6, + // #59 (9241+10): bp=Emoji_Component:EComp + 0x0023, 0x0023, 0x002A, 0x002A, 0x0030, 0x0039, 0x200D, 0x200D, + 0x20E3, 0x20E3, 0xFE0F, 0xFE0F, 0x1F1E6, 0x1F1FF, 0x1F3FB, 0x1F3FF, + 0x1F9B0, 0x1F9B3, 0xE0020, 0xE007F, + // #60 (9251+1): bp=Emoji_Modifier:EMod + 0x1F3FB, 0x1F3FF, + // #61 (9252+40): bp=Emoji_Modifier_Base:EBase + 0x261D, 0x261D, 0x26F9, 0x26F9, 0x270A, 0x270D, 0x1F385, 0x1F385, + 0x1F3C2, 0x1F3C4, 0x1F3C7, 0x1F3C7, 0x1F3CA, 0x1F3CC, 0x1F442, 0x1F443, + 0x1F446, 0x1F450, 0x1F466, 0x1F478, 0x1F47C, 0x1F47C, 0x1F481, 0x1F483, + 0x1F485, 0x1F487, 0x1F48F, 0x1F48F, 0x1F491, 0x1F491, 0x1F4AA, 0x1F4AA, + 0x1F574, 0x1F575, 0x1F57A, 0x1F57A, 0x1F590, 0x1F590, 0x1F595, 0x1F596, + 0x1F645, 0x1F647, 0x1F64B, 0x1F64F, 0x1F6A3, 0x1F6A3, 0x1F6B4, 0x1F6B6, + 0x1F6C0, 0x1F6C0, 0x1F6CC, 0x1F6CC, 0x1F90C, 0x1F90C, 0x1F90F, 0x1F90F, + 0x1F918, 0x1F91F, 0x1F926, 0x1F926, 0x1F930, 0x1F939, 0x1F93C, 0x1F93E, + 0x1F977, 0x1F977, 0x1F9B5, 0x1F9B6, 0x1F9B8, 0x1F9B9, 0x1F9BB, 0x1F9BB, + 0x1F9CD, 0x1F9CF, 0x1F9D1, 0x1F9DD, 0x1FAC3, 0x1FAC5, 0x1FAF0, 0x1FAF6, + // #62 (9292+83): bp=Emoji_Presentation:EPres + 0x231A, 0x231B, 0x23E9, 0x23EC, 0x23F0, 0x23F0, 0x23F3, 0x23F3, + 0x25FD, 0x25FE, 0x2614, 0x2615, 0x2648, 0x2653, 0x267F, 0x267F, + 0x2693, 0x2693, 0x26A1, 0x26A1, 0x26AA, 0x26AB, 0x26BD, 0x26BE, + 0x26C4, 0x26C5, 0x26CE, 0x26CE, 0x26D4, 0x26D4, 0x26EA, 0x26EA, + 0x26F2, 0x26F3, 0x26F5, 0x26F5, 0x26FA, 0x26FA, 0x26FD, 0x26FD, + 0x2705, 0x2705, 0x270A, 0x270B, 0x2728, 0x2728, 0x274C, 0x274C, + 0x274E, 0x274E, 0x2753, 0x2755, 0x2757, 0x2757, 0x2795, 0x2797, + 0x27B0, 0x27B0, 0x27BF, 0x27BF, 0x2B1B, 0x2B1C, 0x2B50, 0x2B50, + 0x2B55, 0x2B55, 0x1F004, 0x1F004, 0x1F0CF, 0x1F0CF, 0x1F18E, 0x1F18E, + 0x1F191, 0x1F19A, 0x1F1E6, 0x1F1FF, 0x1F201, 0x1F201, 0x1F21A, 0x1F21A, + 0x1F22F, 0x1F22F, 0x1F232, 0x1F236, 0x1F238, 0x1F23A, 0x1F250, 0x1F251, + 0x1F300, 0x1F320, 0x1F32D, 0x1F335, 0x1F337, 0x1F37C, 0x1F37E, 0x1F393, + 0x1F3A0, 0x1F3CA, 0x1F3CF, 0x1F3D3, 0x1F3E0, 0x1F3F0, 0x1F3F4, 0x1F3F4, + 0x1F3F8, 0x1F43E, 0x1F440, 0x1F440, 0x1F442, 0x1F4FC, 0x1F4FF, 0x1F53D, + 0x1F54B, 0x1F54E, 0x1F550, 0x1F567, 0x1F57A, 0x1F57A, 0x1F595, 0x1F596, + 0x1F5A4, 0x1F5A4, 0x1F5FB, 0x1F64F, 0x1F680, 0x1F6C5, 0x1F6CC, 0x1F6CC, + 0x1F6D0, 0x1F6D2, 0x1F6D5, 0x1F6D7, 0x1F6DD, 0x1F6DF, 0x1F6EB, 0x1F6EC, + 0x1F6F4, 0x1F6FC, 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F90C, 0x1F93A, + 0x1F93C, 0x1F945, 0x1F947, 0x1F9FF, 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, + 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, + 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, + // #63 (9375+78): bp=Extended_Pictographic:ExtPict + 0x00A9, 0x00A9, 0x00AE, 0x00AE, 0x203C, 0x203C, 0x2049, 0x2049, + 0x2122, 0x2122, 0x2139, 0x2139, 0x2194, 0x2199, 0x21A9, 0x21AA, + 0x231A, 0x231B, 0x2328, 0x2328, 0x2388, 0x2388, 0x23CF, 0x23CF, + 0x23E9, 0x23F3, 0x23F8, 0x23FA, 0x24C2, 0x24C2, 0x25AA, 0x25AB, + 0x25B6, 0x25B6, 0x25C0, 0x25C0, 0x25FB, 0x25FE, 0x2600, 0x2605, + 0x2607, 0x2612, 0x2614, 0x2685, 0x2690, 0x2705, 0x2708, 0x2712, + 0x2714, 0x2714, 0x2716, 0x2716, 0x271D, 0x271D, 0x2721, 0x2721, + 0x2728, 0x2728, 0x2733, 0x2734, 0x2744, 0x2744, 0x2747, 0x2747, + 0x274C, 0x274C, 0x274E, 0x274E, 0x2753, 0x2755, 0x2757, 0x2757, + 0x2763, 0x2767, 0x2795, 0x2797, 0x27A1, 0x27A1, 0x27B0, 0x27B0, + 0x27BF, 0x27BF, 0x2934, 0x2935, 0x2B05, 0x2B07, 0x2B1B, 0x2B1C, + 0x2B50, 0x2B50, 0x2B55, 0x2B55, 0x3030, 0x3030, 0x303D, 0x303D, + 0x3297, 0x3297, 0x3299, 0x3299, 0x1F000, 0x1F0FF, 0x1F10D, 0x1F10F, + 0x1F12F, 0x1F12F, 0x1F16C, 0x1F171, 0x1F17E, 0x1F17F, 0x1F18E, 0x1F18E, + 0x1F191, 0x1F19A, 0x1F1AD, 0x1F1E5, 0x1F201, 0x1F20F, 0x1F21A, 0x1F21A, + 0x1F22F, 0x1F22F, 0x1F232, 0x1F23A, 0x1F23C, 0x1F23F, 0x1F249, 0x1F3FA, + 0x1F400, 0x1F53D, 0x1F546, 0x1F64F, 0x1F680, 0x1F6FF, 0x1F774, 0x1F77F, + 0x1F7D5, 0x1F7FF, 0x1F80C, 0x1F80F, 0x1F848, 0x1F84F, 0x1F85A, 0x1F85F, + 0x1F888, 0x1F88F, 0x1F8AE, 0x1F8FF, 0x1F90C, 0x1F93A, 0x1F93C, 0x1F945, + 0x1F947, 0x1FAFF, 0x1FC00, 0x1FFFD, + // #64 (9453+33): bp=Extender:Ext + 0x00B7, 0x00B7, 0x02D0, 0x02D1, 0x0640, 0x0640, 0x07FA, 0x07FA, + 0x0B55, 0x0B55, 0x0E46, 0x0E46, 0x0EC6, 0x0EC6, 0x180A, 0x180A, + 0x1843, 0x1843, 0x1AA7, 0x1AA7, 0x1C36, 0x1C36, 0x1C7B, 0x1C7B, + 0x3005, 0x3005, 0x3031, 0x3035, 0x309D, 0x309E, 0x30FC, 0x30FE, + 0xA015, 0xA015, 0xA60C, 0xA60C, 0xA9CF, 0xA9CF, 0xA9E6, 0xA9E6, + 0xAA70, 0xAA70, 0xAADD, 0xAADD, 0xAAF3, 0xAAF4, 0xFF70, 0xFF70, + 0x10781, 0x10782, 0x1135D, 0x1135D, 0x115C6, 0x115C8, 0x11A98, 0x11A98, + 0x16B42, 0x16B43, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x1E13C, 0x1E13D, + 0x1E944, 0x1E946, + // #65 (9486+861): bp=Grapheme_Base:Gr_Base + 0x0020, 0x007E, 0x00A0, 0x00AC, 0x00AE, 0x02FF, 0x0370, 0x0377, + 0x037A, 0x037F, 0x0384, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x0482, 0x048A, 0x052F, 0x0531, 0x0556, 0x0559, 0x058A, + 0x058D, 0x058F, 0x05BE, 0x05BE, 0x05C0, 0x05C0, 0x05C3, 0x05C3, + 0x05C6, 0x05C6, 0x05D0, 0x05EA, 0x05EF, 0x05F4, 0x0606, 0x060F, + 0x061B, 0x061B, 0x061D, 0x064A, 0x0660, 0x066F, 0x0671, 0x06D5, + 0x06DE, 0x06DE, 0x06E5, 0x06E6, 0x06E9, 0x06E9, 0x06EE, 0x070D, + 0x0710, 0x0710, 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, + 0x07C0, 0x07EA, 0x07F4, 0x07FA, 0x07FE, 0x0815, 0x081A, 0x081A, + 0x0824, 0x0824, 0x0828, 0x0828, 0x0830, 0x083E, 0x0840, 0x0858, + 0x085E, 0x085E, 0x0860, 0x086A, 0x0870, 0x088E, 0x08A0, 0x08C9, + 0x0903, 0x0939, 0x093B, 0x093B, 0x093D, 0x0940, 0x0949, 0x094C, + 0x094E, 0x0950, 0x0958, 0x0961, 0x0964, 0x0980, 0x0982, 0x0983, + 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, + 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BD, 0x09BD, 0x09BF, 0x09C0, + 0x09C7, 0x09C8, 0x09CB, 0x09CC, 0x09CE, 0x09CE, 0x09DC, 0x09DD, + 0x09DF, 0x09E1, 0x09E6, 0x09FD, 0x0A03, 0x0A03, 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, + 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A3E, 0x0A40, 0x0A59, 0x0A5C, + 0x0A5E, 0x0A5E, 0x0A66, 0x0A6F, 0x0A72, 0x0A74, 0x0A76, 0x0A76, + 0x0A83, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABD, 0x0AC0, + 0x0AC9, 0x0AC9, 0x0ACB, 0x0ACC, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, + 0x0AE6, 0x0AF1, 0x0AF9, 0x0AF9, 0x0B02, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, 0x0B40, 0x0B40, 0x0B47, 0x0B48, + 0x0B4B, 0x0B4C, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B66, 0x0B77, + 0x0B83, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, + 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, + 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBF, 0x0BBF, 0x0BC1, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCC, 0x0BD0, 0x0BD0, 0x0BE6, 0x0BFA, + 0x0C01, 0x0C03, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, 0x0C3D, 0x0C3D, 0x0C41, 0x0C44, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, 0x0C66, 0x0C6F, 0x0C77, 0x0C80, + 0x0C82, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, + 0x0CB5, 0x0CB9, 0x0CBD, 0x0CBE, 0x0CC0, 0x0CC1, 0x0CC3, 0x0CC4, + 0x0CC7, 0x0CC8, 0x0CCA, 0x0CCB, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE1, + 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x0D02, 0x0D0C, 0x0D0E, 0x0D10, + 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, 0x0D3F, 0x0D40, 0x0D46, 0x0D48, + 0x0D4A, 0x0D4C, 0x0D4E, 0x0D4F, 0x0D54, 0x0D56, 0x0D58, 0x0D61, + 0x0D66, 0x0D7F, 0x0D82, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DD0, 0x0DD1, + 0x0DD8, 0x0DDE, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF4, 0x0E01, 0x0E30, + 0x0E32, 0x0E33, 0x0E3F, 0x0E46, 0x0E4F, 0x0E5B, 0x0E81, 0x0E82, + 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, + 0x0EA7, 0x0EB0, 0x0EB2, 0x0EB3, 0x0EBD, 0x0EBD, 0x0EC0, 0x0EC4, + 0x0EC6, 0x0EC6, 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, 0x0F00, 0x0F17, + 0x0F1A, 0x0F34, 0x0F36, 0x0F36, 0x0F38, 0x0F38, 0x0F3A, 0x0F47, + 0x0F49, 0x0F6C, 0x0F7F, 0x0F7F, 0x0F85, 0x0F85, 0x0F88, 0x0F8C, + 0x0FBE, 0x0FC5, 0x0FC7, 0x0FCC, 0x0FCE, 0x0FDA, 0x1000, 0x102C, + 0x1031, 0x1031, 0x1038, 0x1038, 0x103B, 0x103C, 0x103F, 0x1057, + 0x105A, 0x105D, 0x1061, 0x1070, 0x1075, 0x1081, 0x1083, 0x1084, + 0x1087, 0x108C, 0x108E, 0x109C, 0x109E, 0x10C5, 0x10C7, 0x10C7, + 0x10CD, 0x10CD, 0x10D0, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, + 0x1258, 0x1258, 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, + 0x1290, 0x12B0, 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, + 0x12C2, 0x12C5, 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, + 0x1318, 0x135A, 0x1360, 0x137C, 0x1380, 0x1399, 0x13A0, 0x13F5, + 0x13F8, 0x13FD, 0x1400, 0x169C, 0x16A0, 0x16F8, 0x1700, 0x1711, + 0x1715, 0x1715, 0x171F, 0x1731, 0x1734, 0x1736, 0x1740, 0x1751, + 0x1760, 0x176C, 0x176E, 0x1770, 0x1780, 0x17B3, 0x17B6, 0x17B6, + 0x17BE, 0x17C5, 0x17C7, 0x17C8, 0x17D4, 0x17DC, 0x17E0, 0x17E9, + 0x17F0, 0x17F9, 0x1800, 0x180A, 0x1810, 0x1819, 0x1820, 0x1878, + 0x1880, 0x1884, 0x1887, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1923, 0x1926, 0x1929, 0x192B, 0x1930, 0x1931, + 0x1933, 0x1938, 0x1940, 0x1940, 0x1944, 0x196D, 0x1970, 0x1974, + 0x1980, 0x19AB, 0x19B0, 0x19C9, 0x19D0, 0x19DA, 0x19DE, 0x1A16, + 0x1A19, 0x1A1A, 0x1A1E, 0x1A55, 0x1A57, 0x1A57, 0x1A61, 0x1A61, + 0x1A63, 0x1A64, 0x1A6D, 0x1A72, 0x1A80, 0x1A89, 0x1A90, 0x1A99, + 0x1AA0, 0x1AAD, 0x1B04, 0x1B33, 0x1B3B, 0x1B3B, 0x1B3D, 0x1B41, + 0x1B43, 0x1B4C, 0x1B50, 0x1B6A, 0x1B74, 0x1B7E, 0x1B82, 0x1BA1, + 0x1BA6, 0x1BA7, 0x1BAA, 0x1BAA, 0x1BAE, 0x1BE5, 0x1BE7, 0x1BE7, + 0x1BEA, 0x1BEC, 0x1BEE, 0x1BEE, 0x1BF2, 0x1BF3, 0x1BFC, 0x1C2B, + 0x1C34, 0x1C35, 0x1C3B, 0x1C49, 0x1C4D, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CC7, 0x1CD3, 0x1CD3, 0x1CE1, 0x1CE1, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF7, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, + 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, + 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FC4, 0x1FC6, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FDD, 0x1FEF, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFE, + 0x2000, 0x200A, 0x2010, 0x2027, 0x202F, 0x205F, 0x2070, 0x2071, + 0x2074, 0x208E, 0x2090, 0x209C, 0x20A0, 0x20C0, 0x2100, 0x218B, + 0x2190, 0x2426, 0x2440, 0x244A, 0x2460, 0x2B73, 0x2B76, 0x2B95, + 0x2B97, 0x2CEE, 0x2CF2, 0x2CF3, 0x2CF9, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D70, 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, + 0x2E00, 0x2E5D, 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, + 0x2FF0, 0x2FFB, 0x3000, 0x3029, 0x3030, 0x303F, 0x3041, 0x3096, + 0x309B, 0x30FF, 0x3105, 0x312F, 0x3131, 0x318E, 0x3190, 0x31E3, + 0x31F0, 0x321E, 0x3220, 0xA48C, 0xA490, 0xA4C6, 0xA4D0, 0xA62B, + 0xA640, 0xA66E, 0xA673, 0xA673, 0xA67E, 0xA69D, 0xA6A0, 0xA6EF, + 0xA6F2, 0xA6F7, 0xA700, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, + 0xA7D5, 0xA7D9, 0xA7F2, 0xA801, 0xA803, 0xA805, 0xA807, 0xA80A, + 0xA80C, 0xA824, 0xA827, 0xA82B, 0xA830, 0xA839, 0xA840, 0xA877, + 0xA880, 0xA8C3, 0xA8CE, 0xA8D9, 0xA8F2, 0xA8FE, 0xA900, 0xA925, + 0xA92E, 0xA946, 0xA952, 0xA953, 0xA95F, 0xA97C, 0xA983, 0xA9B2, + 0xA9B4, 0xA9B5, 0xA9BA, 0xA9BB, 0xA9BE, 0xA9CD, 0xA9CF, 0xA9D9, + 0xA9DE, 0xA9E4, 0xA9E6, 0xA9FE, 0xAA00, 0xAA28, 0xAA2F, 0xAA30, + 0xAA33, 0xAA34, 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA4D, 0xAA4D, + 0xAA50, 0xAA59, 0xAA5C, 0xAA7B, 0xAA7D, 0xAAAF, 0xAAB1, 0xAAB1, + 0xAAB5, 0xAAB6, 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, + 0xAADB, 0xAAEB, 0xAAEE, 0xAAF5, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB6B, + 0xAB70, 0xABE4, 0xABE6, 0xABE7, 0xABE9, 0xABEC, 0xABF0, 0xABF9, + 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, + 0xFB1F, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, + 0xFB43, 0xFB44, 0xFB46, 0xFBC2, 0xFBD3, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDCF, 0xFDCF, 0xFDF0, 0xFDFF, 0xFE10, 0xFE19, 0xFE30, 0xFE52, + 0xFE54, 0xFE66, 0xFE68, 0xFE6B, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, + 0xFF01, 0xFF9D, 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, + 0xFFFC, 0xFFFD, 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, + 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, + 0x10100, 0x10102, 0x10107, 0x10133, 0x10137, 0x1018E, 0x10190, 0x1019C, + 0x101A0, 0x101A0, 0x101D0, 0x101FC, 0x10280, 0x1029C, 0x102A0, 0x102D0, + 0x102E1, 0x102FB, 0x10300, 0x10323, 0x1032D, 0x1034A, 0x10350, 0x10375, + 0x10380, 0x1039D, 0x1039F, 0x103C3, 0x103C8, 0x103D5, 0x10400, 0x1049D, + 0x104A0, 0x104A9, 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, + 0x10530, 0x10563, 0x1056F, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, + 0x105BB, 0x105BC, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, + 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, + 0x1083F, 0x10855, 0x10857, 0x1089E, 0x108A7, 0x108AF, 0x108E0, 0x108F2, + 0x108F4, 0x108F5, 0x108FB, 0x1091B, 0x1091F, 0x10939, 0x1093F, 0x1093F, + 0x10980, 0x109B7, 0x109BC, 0x109CF, 0x109D2, 0x10A00, 0x10A10, 0x10A13, + 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A40, 0x10A48, 0x10A50, 0x10A58, + 0x10A60, 0x10A9F, 0x10AC0, 0x10AE4, 0x10AEB, 0x10AF6, 0x10B00, 0x10B35, + 0x10B39, 0x10B55, 0x10B58, 0x10B72, 0x10B78, 0x10B91, 0x10B99, 0x10B9C, + 0x10BA9, 0x10BAF, 0x10C00, 0x10C48, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, + 0x10CFA, 0x10D23, 0x10D30, 0x10D39, 0x10E60, 0x10E7E, 0x10E80, 0x10EA9, + 0x10EAD, 0x10EAD, 0x10EB0, 0x10EB1, 0x10F00, 0x10F27, 0x10F30, 0x10F45, + 0x10F51, 0x10F59, 0x10F70, 0x10F81, 0x10F86, 0x10F89, 0x10FB0, 0x10FCB, + 0x10FE0, 0x10FF6, 0x11000, 0x11000, 0x11002, 0x11037, 0x11047, 0x1104D, + 0x11052, 0x1106F, 0x11071, 0x11072, 0x11075, 0x11075, 0x11082, 0x110B2, + 0x110B7, 0x110B8, 0x110BB, 0x110BC, 0x110BE, 0x110C1, 0x110D0, 0x110E8, + 0x110F0, 0x110F9, 0x11103, 0x11126, 0x1112C, 0x1112C, 0x11136, 0x11147, + 0x11150, 0x11172, 0x11174, 0x11176, 0x11182, 0x111B5, 0x111BF, 0x111C8, + 0x111CD, 0x111CE, 0x111D0, 0x111DF, 0x111E1, 0x111F4, 0x11200, 0x11211, + 0x11213, 0x1122E, 0x11232, 0x11233, 0x11235, 0x11235, 0x11238, 0x1123D, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A9, 0x112B0, 0x112DE, 0x112E0, 0x112E2, 0x112F0, 0x112F9, + 0x11302, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133D, 0x1133D, + 0x1133F, 0x1133F, 0x11341, 0x11344, 0x11347, 0x11348, 0x1134B, 0x1134D, + 0x11350, 0x11350, 0x1135D, 0x11363, 0x11400, 0x11437, 0x11440, 0x11441, + 0x11445, 0x11445, 0x11447, 0x1145B, 0x1145D, 0x1145D, 0x1145F, 0x11461, + 0x11480, 0x114AF, 0x114B1, 0x114B2, 0x114B9, 0x114B9, 0x114BB, 0x114BC, + 0x114BE, 0x114BE, 0x114C1, 0x114C1, 0x114C4, 0x114C7, 0x114D0, 0x114D9, + 0x11580, 0x115AE, 0x115B0, 0x115B1, 0x115B8, 0x115BB, 0x115BE, 0x115BE, + 0x115C1, 0x115DB, 0x11600, 0x11632, 0x1163B, 0x1163C, 0x1163E, 0x1163E, + 0x11641, 0x11644, 0x11650, 0x11659, 0x11660, 0x1166C, 0x11680, 0x116AA, + 0x116AC, 0x116AC, 0x116AE, 0x116AF, 0x116B6, 0x116B6, 0x116B8, 0x116B9, + 0x116C0, 0x116C9, 0x11700, 0x1171A, 0x11720, 0x11721, 0x11726, 0x11726, + 0x11730, 0x11746, 0x11800, 0x1182E, 0x11838, 0x11838, 0x1183B, 0x1183B, + 0x118A0, 0x118F2, 0x118FF, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, + 0x11915, 0x11916, 0x11918, 0x1192F, 0x11931, 0x11935, 0x11937, 0x11938, + 0x1193D, 0x1193D, 0x1193F, 0x11942, 0x11944, 0x11946, 0x11950, 0x11959, + 0x119A0, 0x119A7, 0x119AA, 0x119D3, 0x119DC, 0x119DF, 0x119E1, 0x119E4, + 0x11A00, 0x11A00, 0x11A0B, 0x11A32, 0x11A39, 0x11A3A, 0x11A3F, 0x11A46, + 0x11A50, 0x11A50, 0x11A57, 0x11A58, 0x11A5C, 0x11A89, 0x11A97, 0x11A97, + 0x11A9A, 0x11AA2, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, 0x11C0A, 0x11C2F, + 0x11C3E, 0x11C3E, 0x11C40, 0x11C45, 0x11C50, 0x11C6C, 0x11C70, 0x11C8F, + 0x11CA9, 0x11CA9, 0x11CB1, 0x11CB1, 0x11CB4, 0x11CB4, 0x11D00, 0x11D06, + 0x11D08, 0x11D09, 0x11D0B, 0x11D30, 0x11D46, 0x11D46, 0x11D50, 0x11D59, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, 0x11D93, 0x11D94, + 0x11D96, 0x11D96, 0x11D98, 0x11D98, 0x11DA0, 0x11DA9, 0x11EE0, 0x11EF2, + 0x11EF5, 0x11EF8, 0x11FB0, 0x11FB0, 0x11FC0, 0x11FF1, 0x11FFF, 0x12399, + 0x12400, 0x1246E, 0x12470, 0x12474, 0x12480, 0x12543, 0x12F90, 0x12FF2, + 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, 0x16A40, 0x16A5E, + 0x16A60, 0x16A69, 0x16A6E, 0x16ABE, 0x16AC0, 0x16AC9, 0x16AD0, 0x16AED, + 0x16AF5, 0x16AF5, 0x16B00, 0x16B2F, 0x16B37, 0x16B45, 0x16B50, 0x16B59, + 0x16B5B, 0x16B61, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16E40, 0x16E9A, + 0x16F00, 0x16F4A, 0x16F50, 0x16F87, 0x16F93, 0x16F9F, 0x16FE0, 0x16FE3, + 0x16FF0, 0x16FF1, 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, + 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, 0x1BC9C, 0x1BC9C, + 0x1BC9F, 0x1BC9F, 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, 0x1D100, 0x1D126, + 0x1D129, 0x1D164, 0x1D166, 0x1D166, 0x1D16A, 0x1D16D, 0x1D183, 0x1D184, + 0x1D18C, 0x1D1A9, 0x1D1AE, 0x1D1EA, 0x1D200, 0x1D241, 0x1D245, 0x1D245, + 0x1D2E0, 0x1D2F3, 0x1D300, 0x1D356, 0x1D360, 0x1D378, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D9FF, + 0x1DA37, 0x1DA3A, 0x1DA6D, 0x1DA74, 0x1DA76, 0x1DA83, 0x1DA85, 0x1DA8B, + 0x1DF00, 0x1DF1E, 0x1E100, 0x1E12C, 0x1E137, 0x1E13D, 0x1E140, 0x1E149, + 0x1E14E, 0x1E14F, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, 0x1E2F0, 0x1E2F9, + 0x1E2FF, 0x1E2FF, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E8C7, 0x1E8CF, 0x1E900, 0x1E943, + 0x1E94B, 0x1E94B, 0x1E950, 0x1E959, 0x1E95E, 0x1E95F, 0x1EC71, 0x1ECB4, + 0x1ED01, 0x1ED3D, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, 0x1F100, 0x1F1AD, 0x1F1E6, 0x1F202, 0x1F210, 0x1F23B, + 0x1F240, 0x1F248, 0x1F250, 0x1F251, 0x1F260, 0x1F265, 0x1F300, 0x1F6D7, + 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, 0x1F700, 0x1F773, 0x1F780, 0x1F7D8, + 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F800, 0x1F80B, 0x1F810, 0x1F847, + 0x1F850, 0x1F859, 0x1F860, 0x1F887, 0x1F890, 0x1F8AD, 0x1F8B0, 0x1F8B1, + 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, + 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, + 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, 0x1FB00, 0x1FB92, + 0x1FB94, 0x1FBCA, 0x1FBF0, 0x1FBF9, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, + 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + // #66 (10347+353): bp=Grapheme_Extend:Gr_Ext + 0x0300, 0x036F, 0x0483, 0x0489, 0x0591, 0x05BD, 0x05BF, 0x05BF, + 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x0610, 0x061A, + 0x064B, 0x065F, 0x0670, 0x0670, 0x06D6, 0x06DC, 0x06DF, 0x06E4, + 0x06E7, 0x06E8, 0x06EA, 0x06ED, 0x0711, 0x0711, 0x0730, 0x074A, + 0x07A6, 0x07B0, 0x07EB, 0x07F3, 0x07FD, 0x07FD, 0x0816, 0x0819, + 0x081B, 0x0823, 0x0825, 0x0827, 0x0829, 0x082D, 0x0859, 0x085B, + 0x0898, 0x089F, 0x08CA, 0x08E1, 0x08E3, 0x0902, 0x093A, 0x093A, + 0x093C, 0x093C, 0x0941, 0x0948, 0x094D, 0x094D, 0x0951, 0x0957, + 0x0962, 0x0963, 0x0981, 0x0981, 0x09BC, 0x09BC, 0x09BE, 0x09BE, + 0x09C1, 0x09C4, 0x09CD, 0x09CD, 0x09D7, 0x09D7, 0x09E2, 0x09E3, + 0x09FE, 0x09FE, 0x0A01, 0x0A02, 0x0A3C, 0x0A3C, 0x0A41, 0x0A42, + 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, 0x0A51, 0x0A51, 0x0A70, 0x0A71, + 0x0A75, 0x0A75, 0x0A81, 0x0A82, 0x0ABC, 0x0ABC, 0x0AC1, 0x0AC5, + 0x0AC7, 0x0AC8, 0x0ACD, 0x0ACD, 0x0AE2, 0x0AE3, 0x0AFA, 0x0AFF, + 0x0B01, 0x0B01, 0x0B3C, 0x0B3C, 0x0B3E, 0x0B3F, 0x0B41, 0x0B44, + 0x0B4D, 0x0B4D, 0x0B55, 0x0B57, 0x0B62, 0x0B63, 0x0B82, 0x0B82, + 0x0BBE, 0x0BBE, 0x0BC0, 0x0BC0, 0x0BCD, 0x0BCD, 0x0BD7, 0x0BD7, + 0x0C00, 0x0C00, 0x0C04, 0x0C04, 0x0C3C, 0x0C3C, 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, + 0x0C81, 0x0C81, 0x0CBC, 0x0CBC, 0x0CBF, 0x0CBF, 0x0CC2, 0x0CC2, + 0x0CC6, 0x0CC6, 0x0CCC, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CE2, 0x0CE3, + 0x0D00, 0x0D01, 0x0D3B, 0x0D3C, 0x0D3E, 0x0D3E, 0x0D41, 0x0D44, + 0x0D4D, 0x0D4D, 0x0D57, 0x0D57, 0x0D62, 0x0D63, 0x0D81, 0x0D81, + 0x0DCA, 0x0DCA, 0x0DCF, 0x0DCF, 0x0DD2, 0x0DD4, 0x0DD6, 0x0DD6, + 0x0DDF, 0x0DDF, 0x0E31, 0x0E31, 0x0E34, 0x0E3A, 0x0E47, 0x0E4E, + 0x0EB1, 0x0EB1, 0x0EB4, 0x0EBC, 0x0EC8, 0x0ECD, 0x0F18, 0x0F19, + 0x0F35, 0x0F35, 0x0F37, 0x0F37, 0x0F39, 0x0F39, 0x0F71, 0x0F7E, + 0x0F80, 0x0F84, 0x0F86, 0x0F87, 0x0F8D, 0x0F97, 0x0F99, 0x0FBC, + 0x0FC6, 0x0FC6, 0x102D, 0x1030, 0x1032, 0x1037, 0x1039, 0x103A, + 0x103D, 0x103E, 0x1058, 0x1059, 0x105E, 0x1060, 0x1071, 0x1074, + 0x1082, 0x1082, 0x1085, 0x1086, 0x108D, 0x108D, 0x109D, 0x109D, + 0x135D, 0x135F, 0x1712, 0x1714, 0x1732, 0x1733, 0x1752, 0x1753, + 0x1772, 0x1773, 0x17B4, 0x17B5, 0x17B7, 0x17BD, 0x17C6, 0x17C6, + 0x17C9, 0x17D3, 0x17DD, 0x17DD, 0x180B, 0x180D, 0x180F, 0x180F, + 0x1885, 0x1886, 0x18A9, 0x18A9, 0x1920, 0x1922, 0x1927, 0x1928, + 0x1932, 0x1932, 0x1939, 0x193B, 0x1A17, 0x1A18, 0x1A1B, 0x1A1B, + 0x1A56, 0x1A56, 0x1A58, 0x1A5E, 0x1A60, 0x1A60, 0x1A62, 0x1A62, + 0x1A65, 0x1A6C, 0x1A73, 0x1A7C, 0x1A7F, 0x1A7F, 0x1AB0, 0x1ACE, + 0x1B00, 0x1B03, 0x1B34, 0x1B3A, 0x1B3C, 0x1B3C, 0x1B42, 0x1B42, + 0x1B6B, 0x1B73, 0x1B80, 0x1B81, 0x1BA2, 0x1BA5, 0x1BA8, 0x1BA9, + 0x1BAB, 0x1BAD, 0x1BE6, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BED, + 0x1BEF, 0x1BF1, 0x1C2C, 0x1C33, 0x1C36, 0x1C37, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, + 0x1CF8, 0x1CF9, 0x1DC0, 0x1DFF, 0x200C, 0x200C, 0x20D0, 0x20F0, + 0x2CEF, 0x2CF1, 0x2D7F, 0x2D7F, 0x2DE0, 0x2DFF, 0x302A, 0x302F, + 0x3099, 0x309A, 0xA66F, 0xA672, 0xA674, 0xA67D, 0xA69E, 0xA69F, + 0xA6F0, 0xA6F1, 0xA802, 0xA802, 0xA806, 0xA806, 0xA80B, 0xA80B, + 0xA825, 0xA826, 0xA82C, 0xA82C, 0xA8C4, 0xA8C5, 0xA8E0, 0xA8F1, + 0xA8FF, 0xA8FF, 0xA926, 0xA92D, 0xA947, 0xA951, 0xA980, 0xA982, + 0xA9B3, 0xA9B3, 0xA9B6, 0xA9B9, 0xA9BC, 0xA9BD, 0xA9E5, 0xA9E5, + 0xAA29, 0xAA2E, 0xAA31, 0xAA32, 0xAA35, 0xAA36, 0xAA43, 0xAA43, + 0xAA4C, 0xAA4C, 0xAA7C, 0xAA7C, 0xAAB0, 0xAAB0, 0xAAB2, 0xAAB4, + 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xAAC1, 0xAAEC, 0xAAED, + 0xAAF6, 0xAAF6, 0xABE5, 0xABE5, 0xABE8, 0xABE8, 0xABED, 0xABED, + 0xFB1E, 0xFB1E, 0xFE00, 0xFE0F, 0xFE20, 0xFE2F, 0xFF9E, 0xFF9F, + 0x101FD, 0x101FD, 0x102E0, 0x102E0, 0x10376, 0x1037A, 0x10A01, 0x10A03, + 0x10A05, 0x10A06, 0x10A0C, 0x10A0F, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, + 0x10AE5, 0x10AE6, 0x10D24, 0x10D27, 0x10EAB, 0x10EAC, 0x10F46, 0x10F50, + 0x10F82, 0x10F85, 0x11001, 0x11001, 0x11038, 0x11046, 0x11070, 0x11070, + 0x11073, 0x11074, 0x1107F, 0x11081, 0x110B3, 0x110B6, 0x110B9, 0x110BA, + 0x110C2, 0x110C2, 0x11100, 0x11102, 0x11127, 0x1112B, 0x1112D, 0x11134, + 0x11173, 0x11173, 0x11180, 0x11181, 0x111B6, 0x111BE, 0x111C9, 0x111CC, + 0x111CF, 0x111CF, 0x1122F, 0x11231, 0x11234, 0x11234, 0x11236, 0x11237, + 0x1123E, 0x1123E, 0x112DF, 0x112DF, 0x112E3, 0x112EA, 0x11300, 0x11301, + 0x1133B, 0x1133C, 0x1133E, 0x1133E, 0x11340, 0x11340, 0x11357, 0x11357, + 0x11366, 0x1136C, 0x11370, 0x11374, 0x11438, 0x1143F, 0x11442, 0x11444, + 0x11446, 0x11446, 0x1145E, 0x1145E, 0x114B0, 0x114B0, 0x114B3, 0x114B8, + 0x114BA, 0x114BA, 0x114BD, 0x114BD, 0x114BF, 0x114C0, 0x114C2, 0x114C3, + 0x115AF, 0x115AF, 0x115B2, 0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, + 0x115DC, 0x115DD, 0x11633, 0x1163A, 0x1163D, 0x1163D, 0x1163F, 0x11640, + 0x116AB, 0x116AB, 0x116AD, 0x116AD, 0x116B0, 0x116B5, 0x116B7, 0x116B7, + 0x1171D, 0x1171F, 0x11722, 0x11725, 0x11727, 0x1172B, 0x1182F, 0x11837, + 0x11839, 0x1183A, 0x11930, 0x11930, 0x1193B, 0x1193C, 0x1193E, 0x1193E, + 0x11943, 0x11943, 0x119D4, 0x119D7, 0x119DA, 0x119DB, 0x119E0, 0x119E0, + 0x11A01, 0x11A0A, 0x11A33, 0x11A38, 0x11A3B, 0x11A3E, 0x11A47, 0x11A47, + 0x11A51, 0x11A56, 0x11A59, 0x11A5B, 0x11A8A, 0x11A96, 0x11A98, 0x11A99, + 0x11C30, 0x11C36, 0x11C38, 0x11C3D, 0x11C3F, 0x11C3F, 0x11C92, 0x11CA7, + 0x11CAA, 0x11CB0, 0x11CB2, 0x11CB3, 0x11CB5, 0x11CB6, 0x11D31, 0x11D36, + 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D45, 0x11D47, 0x11D47, + 0x11D90, 0x11D91, 0x11D95, 0x11D95, 0x11D97, 0x11D97, 0x11EF3, 0x11EF4, + 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, 0x16F4F, 0x16F4F, 0x16F8F, 0x16F92, + 0x16FE4, 0x16FE4, 0x1BC9D, 0x1BC9E, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, + 0x1D165, 0x1D165, 0x1D167, 0x1D169, 0x1D16E, 0x1D172, 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E130, 0x1E136, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E94A, 0xE0020, 0xE007F, + 0xE0100, 0xE01EF, + // #67 (10700+6): bp=Hex_Digit:Hex + 0x0030, 0x0039, 0x0041, 0x0046, 0x0061, 0x0066, 0xFF10, 0xFF19, + 0xFF21, 0xFF26, 0xFF41, 0xFF46, + // #68 (10706+2): bp=IDS_Binary_Operator:IDSB + 0x2FF0, 0x2FF1, 0x2FF4, 0x2FFB, + // #69 (10708+1): bp=IDS_Trinary_Operator:IDST + 0x2FF2, 0x2FF3, + // #70 (10709+756): bp=ID_Continue:IDC + 0x0030, 0x0039, 0x0041, 0x005A, 0x005F, 0x005F, 0x0061, 0x007A, + 0x00AA, 0x00AA, 0x00B5, 0x00B5, 0x00B7, 0x00B7, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, 0x02C6, 0x02D1, + 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, 0x0300, 0x0374, + 0x0376, 0x0377, 0x037A, 0x037D, 0x037F, 0x037F, 0x0386, 0x038A, + 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, + 0x0483, 0x0487, 0x048A, 0x052F, 0x0531, 0x0556, 0x0559, 0x0559, + 0x0560, 0x0588, 0x0591, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x05C2, + 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0610, 0x061A, 0x0620, 0x0669, 0x066E, 0x06D3, 0x06D5, 0x06DC, + 0x06DF, 0x06E8, 0x06EA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x074A, + 0x074D, 0x07B1, 0x07C0, 0x07F5, 0x07FA, 0x07FA, 0x07FD, 0x07FD, + 0x0800, 0x082D, 0x0840, 0x085B, 0x0860, 0x086A, 0x0870, 0x0887, + 0x0889, 0x088E, 0x0898, 0x08E1, 0x08E3, 0x0963, 0x0966, 0x096F, + 0x0971, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, + 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, + 0x09DF, 0x09E3, 0x09E6, 0x09F1, 0x09FC, 0x09FC, 0x09FE, 0x09FE, + 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A75, + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AE6, 0x0AEF, 0x0AF9, 0x0AFF, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3C, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, + 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B66, 0x0B6F, + 0x0B71, 0x0B71, 0x0B82, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, + 0x0BE6, 0x0BEF, 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, 0x0C3C, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, + 0x0C55, 0x0C56, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, + 0x0C66, 0x0C6F, 0x0C80, 0x0C83, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, + 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x0D00, 0x0D0C, + 0x0D0E, 0x0D10, 0x0D12, 0x0D44, 0x0D46, 0x0D48, 0x0D4A, 0x0D4E, + 0x0D54, 0x0D57, 0x0D5F, 0x0D63, 0x0D66, 0x0D6F, 0x0D7A, 0x0D7F, + 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, + 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF3, + 0x0E01, 0x0E3A, 0x0E40, 0x0E4E, 0x0E50, 0x0E59, 0x0E81, 0x0E82, + 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, + 0x0EA7, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EC8, 0x0ECD, + 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, 0x0F18, 0x0F19, + 0x0F20, 0x0F29, 0x0F35, 0x0F35, 0x0F37, 0x0F37, 0x0F39, 0x0F39, + 0x0F3E, 0x0F47, 0x0F49, 0x0F6C, 0x0F71, 0x0F84, 0x0F86, 0x0F97, + 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, 0x1000, 0x1049, 0x1050, 0x109D, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x135D, 0x135F, 0x1369, 0x1371, 0x1380, 0x138F, 0x13A0, 0x13F5, + 0x13F8, 0x13FD, 0x1401, 0x166C, 0x166F, 0x167F, 0x1681, 0x169A, + 0x16A0, 0x16EA, 0x16EE, 0x16F8, 0x1700, 0x1715, 0x171F, 0x1734, + 0x1740, 0x1753, 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + 0x1780, 0x17D3, 0x17D7, 0x17D7, 0x17DC, 0x17DD, 0x17E0, 0x17E9, + 0x180B, 0x180D, 0x180F, 0x1819, 0x1820, 0x1878, 0x1880, 0x18AA, + 0x18B0, 0x18F5, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, + 0x1946, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, 0x19B0, 0x19C9, + 0x19D0, 0x19DA, 0x1A00, 0x1A1B, 0x1A20, 0x1A5E, 0x1A60, 0x1A7C, + 0x1A7F, 0x1A89, 0x1A90, 0x1A99, 0x1AA7, 0x1AA7, 0x1AB0, 0x1ABD, + 0x1ABF, 0x1ACE, 0x1B00, 0x1B4C, 0x1B50, 0x1B59, 0x1B6B, 0x1B73, + 0x1B80, 0x1BF3, 0x1C00, 0x1C37, 0x1C40, 0x1C49, 0x1C4D, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CFA, 0x1D00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, + 0x203F, 0x2040, 0x2054, 0x2054, 0x2071, 0x2071, 0x207F, 0x207F, + 0x2090, 0x209C, 0x20D0, 0x20DC, 0x20E1, 0x20E1, 0x20E5, 0x20F0, + 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, + 0x2118, 0x211D, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, + 0x212A, 0x2139, 0x213C, 0x213F, 0x2145, 0x2149, 0x214E, 0x214E, + 0x2160, 0x2188, 0x2C00, 0x2CE4, 0x2CEB, 0x2CF3, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, + 0x2D7F, 0x2D96, 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, + 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, + 0x2DD8, 0x2DDE, 0x2DE0, 0x2DFF, 0x3005, 0x3007, 0x3021, 0x302F, + 0x3031, 0x3035, 0x3038, 0x303C, 0x3041, 0x3096, 0x3099, 0x309F, + 0x30A1, 0x30FA, 0x30FC, 0x30FF, 0x3105, 0x312F, 0x3131, 0x318E, + 0x31A0, 0x31BF, 0x31F0, 0x31FF, 0x3400, 0x4DBF, 0x4E00, 0xA48C, + 0xA4D0, 0xA4FD, 0xA500, 0xA60C, 0xA610, 0xA62B, 0xA640, 0xA66F, + 0xA674, 0xA67D, 0xA67F, 0xA6F1, 0xA717, 0xA71F, 0xA722, 0xA788, + 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, + 0xA7F2, 0xA827, 0xA82C, 0xA82C, 0xA840, 0xA873, 0xA880, 0xA8C5, + 0xA8D0, 0xA8D9, 0xA8E0, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA92D, + 0xA930, 0xA953, 0xA960, 0xA97C, 0xA980, 0xA9C0, 0xA9CF, 0xA9D9, + 0xA9E0, 0xA9FE, 0xAA00, 0xAA36, 0xAA40, 0xAA4D, 0xAA50, 0xAA59, + 0xAA60, 0xAA76, 0xAA7A, 0xAAC2, 0xAADB, 0xAADD, 0xAAE0, 0xAAEF, + 0xAAF2, 0xAAF6, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, 0xAB11, 0xAB16, + 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, 0xAB5C, 0xAB69, + 0xAB70, 0xABEA, 0xABEC, 0xABED, 0xABF0, 0xABF9, 0xAC00, 0xD7A3, + 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, + 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, 0xFE00, 0xFE0F, 0xFE20, 0xFE2F, 0xFE33, 0xFE34, + 0xFE4D, 0xFE4F, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0xFF10, 0xFF19, + 0xFF21, 0xFF3A, 0xFF3F, 0xFF3F, 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, + 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10140, 0x10174, + 0x101FD, 0x101FD, 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x102E0, 0x102E0, + 0x10300, 0x1031F, 0x1032D, 0x1034A, 0x10350, 0x1037A, 0x10380, 0x1039D, + 0x103A0, 0x103C3, 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, + 0x104A0, 0x104A9, 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, + 0x10530, 0x10563, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, + 0x105BB, 0x105BC, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, + 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, + 0x1083F, 0x10855, 0x10860, 0x10876, 0x10880, 0x1089E, 0x108E0, 0x108F2, + 0x108F4, 0x108F5, 0x10900, 0x10915, 0x10920, 0x10939, 0x10980, 0x109B7, + 0x109BE, 0x109BF, 0x10A00, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, 0x10A13, + 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, + 0x10A60, 0x10A7C, 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE6, + 0x10B00, 0x10B35, 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, + 0x10C00, 0x10C48, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D27, + 0x10D30, 0x10D39, 0x10E80, 0x10EA9, 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, + 0x10F00, 0x10F1C, 0x10F27, 0x10F27, 0x10F30, 0x10F50, 0x10F70, 0x10F85, + 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, 0x11000, 0x11046, 0x11066, 0x11075, + 0x1107F, 0x110BA, 0x110C2, 0x110C2, 0x110D0, 0x110E8, 0x110F0, 0x110F9, + 0x11100, 0x11134, 0x11136, 0x1113F, 0x11144, 0x11147, 0x11150, 0x11173, + 0x11176, 0x11176, 0x11180, 0x111C4, 0x111C9, 0x111CC, 0x111CE, 0x111DA, + 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x11237, 0x1123E, 0x1123E, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A8, 0x112B0, 0x112EA, 0x112F0, 0x112F9, 0x11300, 0x11303, + 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, 0x1132A, 0x11330, + 0x11332, 0x11333, 0x11335, 0x11339, 0x1133B, 0x11344, 0x11347, 0x11348, + 0x1134B, 0x1134D, 0x11350, 0x11350, 0x11357, 0x11357, 0x1135D, 0x11363, + 0x11366, 0x1136C, 0x11370, 0x11374, 0x11400, 0x1144A, 0x11450, 0x11459, + 0x1145E, 0x11461, 0x11480, 0x114C5, 0x114C7, 0x114C7, 0x114D0, 0x114D9, + 0x11580, 0x115B5, 0x115B8, 0x115C0, 0x115D8, 0x115DD, 0x11600, 0x11640, + 0x11644, 0x11644, 0x11650, 0x11659, 0x11680, 0x116B8, 0x116C0, 0x116C9, + 0x11700, 0x1171A, 0x1171D, 0x1172B, 0x11730, 0x11739, 0x11740, 0x11746, + 0x11800, 0x1183A, 0x118A0, 0x118E9, 0x118FF, 0x11906, 0x11909, 0x11909, + 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x11935, 0x11937, 0x11938, + 0x1193B, 0x11943, 0x11950, 0x11959, 0x119A0, 0x119A7, 0x119AA, 0x119D7, + 0x119DA, 0x119E1, 0x119E3, 0x119E4, 0x11A00, 0x11A3E, 0x11A47, 0x11A47, + 0x11A50, 0x11A99, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, + 0x11C0A, 0x11C36, 0x11C38, 0x11C40, 0x11C50, 0x11C59, 0x11C72, 0x11C8F, + 0x11C92, 0x11CA7, 0x11CA9, 0x11CB6, 0x11D00, 0x11D06, 0x11D08, 0x11D09, + 0x11D0B, 0x11D36, 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, + 0x11D50, 0x11D59, 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, + 0x11D90, 0x11D91, 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, 0x11EE0, 0x11EF6, + 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12400, 0x1246E, 0x12480, 0x12543, + 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, + 0x16A40, 0x16A5E, 0x16A60, 0x16A69, 0x16A70, 0x16ABE, 0x16AC0, 0x16AC9, + 0x16AD0, 0x16AED, 0x16AF0, 0x16AF4, 0x16B00, 0x16B36, 0x16B40, 0x16B43, + 0x16B50, 0x16B59, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16E40, 0x16E7F, + 0x16F00, 0x16F4A, 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, 0x16FE0, 0x16FE1, + 0x16FE3, 0x16FE4, 0x16FF0, 0x16FF1, 0x17000, 0x187F7, 0x18800, 0x18CD5, + 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, + 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1BC9D, 0x1BC9E, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D165, 0x1D169, + 0x1D16D, 0x1D172, 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, + 0x1D242, 0x1D244, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, + 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, + 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, + 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, + 0x1D716, 0x1D734, 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, + 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1D7CE, 0x1D7FF, + 0x1DA00, 0x1DA36, 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, + 0x1DA9B, 0x1DA9F, 0x1DAA1, 0x1DAAF, 0x1DF00, 0x1DF1E, 0x1E000, 0x1E006, + 0x1E008, 0x1E018, 0x1E01B, 0x1E021, 0x1E023, 0x1E024, 0x1E026, 0x1E02A, + 0x1E100, 0x1E12C, 0x1E130, 0x1E13D, 0x1E140, 0x1E149, 0x1E14E, 0x1E14E, + 0x1E290, 0x1E2AE, 0x1E2C0, 0x1E2F9, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, + 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E8D0, 0x1E8D6, + 0x1E900, 0x1E94B, 0x1E950, 0x1E959, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, + 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, + 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, + 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, + 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, + 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, + 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, + 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, + 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1FBF0, 0x1FBF9, + 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, + 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, 0xE0100, 0xE01EF, + // #71 (11465+648): bp=ID_Start:IDS + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, + 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, + 0x0370, 0x0374, 0x0376, 0x0377, 0x037A, 0x037D, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x03F5, 0x03F7, 0x0481, 0x048A, 0x052F, 0x0531, 0x0556, + 0x0559, 0x0559, 0x0560, 0x0588, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0620, 0x064A, 0x066E, 0x066F, 0x0671, 0x06D3, 0x06D5, 0x06D5, + 0x06E5, 0x06E6, 0x06EE, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, + 0x0710, 0x0710, 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, + 0x07CA, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x07FA, 0x0800, 0x0815, + 0x081A, 0x081A, 0x0824, 0x0824, 0x0828, 0x0828, 0x0840, 0x0858, + 0x0860, 0x086A, 0x0870, 0x0887, 0x0889, 0x088E, 0x08A0, 0x08C9, + 0x0904, 0x0939, 0x093D, 0x093D, 0x0950, 0x0950, 0x0958, 0x0961, + 0x0971, 0x0980, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BD, 0x09BD, + 0x09CE, 0x09CE, 0x09DC, 0x09DD, 0x09DF, 0x09E1, 0x09F0, 0x09F1, + 0x09FC, 0x09FC, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A72, 0x0A74, 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, 0x0ABD, 0x0ABD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, + 0x0AF9, 0x0AF9, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, + 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B71, 0x0B71, 0x0B83, 0x0B83, + 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, + 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, 0x0BD0, 0x0BD0, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3D, 0x0C3D, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, 0x0C80, 0x0C80, 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, + 0x0CBD, 0x0CBD, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE1, 0x0CF1, 0x0CF2, + 0x0D04, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, + 0x0D4E, 0x0D4E, 0x0D54, 0x0D56, 0x0D5F, 0x0D61, 0x0D7A, 0x0D7F, + 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, + 0x0DC0, 0x0DC6, 0x0E01, 0x0E30, 0x0E32, 0x0E33, 0x0E40, 0x0E46, + 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, + 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB0, 0x0EB2, 0x0EB3, 0x0EBD, 0x0EBD, + 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, + 0x0F40, 0x0F47, 0x0F49, 0x0F6C, 0x0F88, 0x0F8C, 0x1000, 0x102A, + 0x103F, 0x103F, 0x1050, 0x1055, 0x105A, 0x105D, 0x1061, 0x1061, + 0x1065, 0x1066, 0x106E, 0x1070, 0x1075, 0x1081, 0x108E, 0x108E, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x1380, 0x138F, 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1401, 0x166C, + 0x166F, 0x167F, 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16EE, 0x16F8, + 0x1700, 0x1711, 0x171F, 0x1731, 0x1740, 0x1751, 0x1760, 0x176C, + 0x176E, 0x1770, 0x1780, 0x17B3, 0x17D7, 0x17D7, 0x17DC, 0x17DC, + 0x1820, 0x1878, 0x1880, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, + 0x19B0, 0x19C9, 0x1A00, 0x1A16, 0x1A20, 0x1A54, 0x1AA7, 0x1AA7, + 0x1B05, 0x1B33, 0x1B45, 0x1B4C, 0x1B83, 0x1BA0, 0x1BAE, 0x1BAF, + 0x1BBA, 0x1BE5, 0x1C00, 0x1C23, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, + 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, + 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, + 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, + 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x2102, 0x2102, 0x2107, 0x2107, + 0x210A, 0x2113, 0x2115, 0x2115, 0x2118, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x2139, 0x213C, 0x213F, + 0x2145, 0x2149, 0x214E, 0x214E, 0x2160, 0x2188, 0x2C00, 0x2CE4, + 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, + 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, 0x3038, 0x303C, + 0x3041, 0x3096, 0x309B, 0x309F, 0x30A1, 0x30FA, 0x30FC, 0x30FF, + 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, + 0x3400, 0x4DBF, 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, 0xA500, 0xA60C, + 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA640, 0xA66E, 0xA67F, 0xA69D, + 0xA6A0, 0xA6EF, 0xA717, 0xA71F, 0xA722, 0xA788, 0xA78B, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA801, + 0xA803, 0xA805, 0xA807, 0xA80A, 0xA80C, 0xA822, 0xA840, 0xA873, + 0xA882, 0xA8B3, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, 0xA930, 0xA946, 0xA960, 0xA97C, 0xA984, 0xA9B2, + 0xA9CF, 0xA9CF, 0xA9E0, 0xA9E4, 0xA9E6, 0xA9EF, 0xA9FA, 0xA9FE, + 0xAA00, 0xAA28, 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA60, 0xAA76, + 0xAA7A, 0xAA7A, 0xAA7E, 0xAAAF, 0xAAB1, 0xAAB1, 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADD, + 0xAAE0, 0xAAEA, 0xAAF2, 0xAAF4, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, + 0xAB5C, 0xAB69, 0xAB70, 0xABE2, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0xFB00, 0xFB06, + 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, 0xFB1F, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0xFF21, 0xFF3A, + 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0x10000, 0x1000B, 0x1000D, 0x10026, + 0x10028, 0x1003A, 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, + 0x10080, 0x100FA, 0x10140, 0x10174, 0x10280, 0x1029C, 0x102A0, 0x102D0, + 0x10300, 0x1031F, 0x1032D, 0x1034A, 0x10350, 0x10375, 0x10380, 0x1039D, + 0x103A0, 0x103C3, 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, + 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, 0x10530, 0x10563, + 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, + 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, + 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, 0x10780, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, 0x10808, 0x10808, + 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, 0x1083F, 0x10855, + 0x10860, 0x10876, 0x10880, 0x1089E, 0x108E0, 0x108F2, 0x108F4, 0x108F5, + 0x10900, 0x10915, 0x10920, 0x10939, 0x10980, 0x109B7, 0x109BE, 0x109BF, + 0x10A00, 0x10A00, 0x10A10, 0x10A13, 0x10A15, 0x10A17, 0x10A19, 0x10A35, + 0x10A60, 0x10A7C, 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, + 0x10B00, 0x10B35, 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, + 0x10C00, 0x10C48, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D23, + 0x10E80, 0x10EA9, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, + 0x10F30, 0x10F45, 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, + 0x11003, 0x11037, 0x11071, 0x11072, 0x11075, 0x11075, 0x11083, 0x110AF, + 0x110D0, 0x110E8, 0x11103, 0x11126, 0x11144, 0x11144, 0x11147, 0x11147, + 0x11150, 0x11172, 0x11176, 0x11176, 0x11183, 0x111B2, 0x111C1, 0x111C4, + 0x111DA, 0x111DA, 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x1122B, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A8, 0x112B0, 0x112DE, 0x11305, 0x1130C, 0x1130F, 0x11310, + 0x11313, 0x11328, 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, + 0x1133D, 0x1133D, 0x11350, 0x11350, 0x1135D, 0x11361, 0x11400, 0x11434, + 0x11447, 0x1144A, 0x1145F, 0x11461, 0x11480, 0x114AF, 0x114C4, 0x114C5, + 0x114C7, 0x114C7, 0x11580, 0x115AE, 0x115D8, 0x115DB, 0x11600, 0x1162F, + 0x11644, 0x11644, 0x11680, 0x116AA, 0x116B8, 0x116B8, 0x11700, 0x1171A, + 0x11740, 0x11746, 0x11800, 0x1182B, 0x118A0, 0x118DF, 0x118FF, 0x11906, + 0x11909, 0x11909, 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x1192F, + 0x1193F, 0x1193F, 0x11941, 0x11941, 0x119A0, 0x119A7, 0x119AA, 0x119D0, + 0x119E1, 0x119E1, 0x119E3, 0x119E3, 0x11A00, 0x11A00, 0x11A0B, 0x11A32, + 0x11A3A, 0x11A3A, 0x11A50, 0x11A50, 0x11A5C, 0x11A89, 0x11A9D, 0x11A9D, + 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, 0x11C0A, 0x11C2E, 0x11C40, 0x11C40, + 0x11C72, 0x11C8F, 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D30, + 0x11D46, 0x11D46, 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D89, + 0x11D98, 0x11D98, 0x11EE0, 0x11EF2, 0x11FB0, 0x11FB0, 0x12000, 0x12399, + 0x12400, 0x1246E, 0x12480, 0x12543, 0x12F90, 0x12FF0, 0x13000, 0x1342E, + 0x14400, 0x14646, 0x16800, 0x16A38, 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, + 0x16AD0, 0x16AED, 0x16B00, 0x16B2F, 0x16B40, 0x16B43, 0x16B63, 0x16B77, + 0x16B7D, 0x16B8F, 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, 0x16F50, 0x16F50, + 0x16F93, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x17000, 0x187F7, + 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, + 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, + 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, + 0x1BC90, 0x1BC99, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, + 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, + 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, + 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, + 0x1D716, 0x1D734, 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, + 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1DF00, 0x1DF1E, + 0x1E100, 0x1E12C, 0x1E137, 0x1E13D, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, + 0x1E2C0, 0x1E2EB, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E900, 0x1E943, 0x1E94B, 0x1E94B, + 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, + 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, + 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, + 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, + 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, + 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, + 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, + 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, + 0x1EEAB, 0x1EEBB, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, + 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #72 (12113+19): bp=Ideographic:Ideo + 0x3006, 0x3007, 0x3021, 0x3029, 0x3038, 0x303A, 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0x16FE4, 0x16FE4, + 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1B170, 0x1B2FB, + 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, + 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #73 (12132+1): bp=Join_Control:Join_C + 0x200C, 0x200D, + // #74 (12133+7): bp=Logical_Order_Exception:LOE + 0x0E40, 0x0E44, 0x0EC0, 0x0EC4, 0x19B5, 0x19B7, 0x19BA, 0x19BA, + 0xAAB5, 0xAAB6, 0xAAB9, 0xAAB9, 0xAABB, 0xAABC, + // #75 (12140+668): bp=Lowercase:Lower + 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, 0x00BA, 0x00BA, + 0x00DF, 0x00F6, 0x00F8, 0x00FF, 0x0101, 0x0101, 0x0103, 0x0103, + 0x0105, 0x0105, 0x0107, 0x0107, 0x0109, 0x0109, 0x010B, 0x010B, + 0x010D, 0x010D, 0x010F, 0x010F, 0x0111, 0x0111, 0x0113, 0x0113, + 0x0115, 0x0115, 0x0117, 0x0117, 0x0119, 0x0119, 0x011B, 0x011B, + 0x011D, 0x011D, 0x011F, 0x011F, 0x0121, 0x0121, 0x0123, 0x0123, + 0x0125, 0x0125, 0x0127, 0x0127, 0x0129, 0x0129, 0x012B, 0x012B, + 0x012D, 0x012D, 0x012F, 0x012F, 0x0131, 0x0131, 0x0133, 0x0133, + 0x0135, 0x0135, 0x0137, 0x0138, 0x013A, 0x013A, 0x013C, 0x013C, + 0x013E, 0x013E, 0x0140, 0x0140, 0x0142, 0x0142, 0x0144, 0x0144, + 0x0146, 0x0146, 0x0148, 0x0149, 0x014B, 0x014B, 0x014D, 0x014D, + 0x014F, 0x014F, 0x0151, 0x0151, 0x0153, 0x0153, 0x0155, 0x0155, + 0x0157, 0x0157, 0x0159, 0x0159, 0x015B, 0x015B, 0x015D, 0x015D, + 0x015F, 0x015F, 0x0161, 0x0161, 0x0163, 0x0163, 0x0165, 0x0165, + 0x0167, 0x0167, 0x0169, 0x0169, 0x016B, 0x016B, 0x016D, 0x016D, + 0x016F, 0x016F, 0x0171, 0x0171, 0x0173, 0x0173, 0x0175, 0x0175, + 0x0177, 0x0177, 0x017A, 0x017A, 0x017C, 0x017C, 0x017E, 0x0180, + 0x0183, 0x0183, 0x0185, 0x0185, 0x0188, 0x0188, 0x018C, 0x018D, + 0x0192, 0x0192, 0x0195, 0x0195, 0x0199, 0x019B, 0x019E, 0x019E, + 0x01A1, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x01A8, 0x01A8, + 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x01B0, 0x01B0, 0x01B4, 0x01B4, + 0x01B6, 0x01B6, 0x01B9, 0x01BA, 0x01BD, 0x01BF, 0x01C6, 0x01C6, + 0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CE, 0x01CE, 0x01D0, 0x01D0, + 0x01D2, 0x01D2, 0x01D4, 0x01D4, 0x01D6, 0x01D6, 0x01D8, 0x01D8, + 0x01DA, 0x01DA, 0x01DC, 0x01DD, 0x01DF, 0x01DF, 0x01E1, 0x01E1, + 0x01E3, 0x01E3, 0x01E5, 0x01E5, 0x01E7, 0x01E7, 0x01E9, 0x01E9, + 0x01EB, 0x01EB, 0x01ED, 0x01ED, 0x01EF, 0x01F0, 0x01F3, 0x01F3, + 0x01F5, 0x01F5, 0x01F9, 0x01F9, 0x01FB, 0x01FB, 0x01FD, 0x01FD, + 0x01FF, 0x01FF, 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, + 0x0207, 0x0207, 0x0209, 0x0209, 0x020B, 0x020B, 0x020D, 0x020D, + 0x020F, 0x020F, 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, + 0x0217, 0x0217, 0x0219, 0x0219, 0x021B, 0x021B, 0x021D, 0x021D, + 0x021F, 0x021F, 0x0221, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, + 0x0227, 0x0227, 0x0229, 0x0229, 0x022B, 0x022B, 0x022D, 0x022D, + 0x022F, 0x022F, 0x0231, 0x0231, 0x0233, 0x0239, 0x023C, 0x023C, + 0x023F, 0x0240, 0x0242, 0x0242, 0x0247, 0x0247, 0x0249, 0x0249, + 0x024B, 0x024B, 0x024D, 0x024D, 0x024F, 0x0293, 0x0295, 0x02B8, + 0x02C0, 0x02C1, 0x02E0, 0x02E4, 0x0345, 0x0345, 0x0371, 0x0371, + 0x0373, 0x0373, 0x0377, 0x0377, 0x037A, 0x037D, 0x0390, 0x0390, + 0x03AC, 0x03CE, 0x03D0, 0x03D1, 0x03D5, 0x03D7, 0x03D9, 0x03D9, + 0x03DB, 0x03DB, 0x03DD, 0x03DD, 0x03DF, 0x03DF, 0x03E1, 0x03E1, + 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, + 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03F3, 0x03F5, 0x03F5, + 0x03F8, 0x03F8, 0x03FB, 0x03FC, 0x0430, 0x045F, 0x0461, 0x0461, + 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, + 0x046B, 0x046B, 0x046D, 0x046D, 0x046F, 0x046F, 0x0471, 0x0471, + 0x0473, 0x0473, 0x0475, 0x0475, 0x0477, 0x0477, 0x0479, 0x0479, + 0x047B, 0x047B, 0x047D, 0x047D, 0x047F, 0x047F, 0x0481, 0x0481, + 0x048B, 0x048B, 0x048D, 0x048D, 0x048F, 0x048F, 0x0491, 0x0491, + 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, + 0x049B, 0x049B, 0x049D, 0x049D, 0x049F, 0x049F, 0x04A1, 0x04A1, + 0x04A3, 0x04A3, 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, + 0x04AB, 0x04AB, 0x04AD, 0x04AD, 0x04AF, 0x04AF, 0x04B1, 0x04B1, + 0x04B3, 0x04B3, 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, + 0x04BB, 0x04BB, 0x04BD, 0x04BD, 0x04BF, 0x04BF, 0x04C2, 0x04C2, + 0x04C4, 0x04C4, 0x04C6, 0x04C6, 0x04C8, 0x04C8, 0x04CA, 0x04CA, + 0x04CC, 0x04CC, 0x04CE, 0x04CF, 0x04D1, 0x04D1, 0x04D3, 0x04D3, + 0x04D5, 0x04D5, 0x04D7, 0x04D7, 0x04D9, 0x04D9, 0x04DB, 0x04DB, + 0x04DD, 0x04DD, 0x04DF, 0x04DF, 0x04E1, 0x04E1, 0x04E3, 0x04E3, + 0x04E5, 0x04E5, 0x04E7, 0x04E7, 0x04E9, 0x04E9, 0x04EB, 0x04EB, + 0x04ED, 0x04ED, 0x04EF, 0x04EF, 0x04F1, 0x04F1, 0x04F3, 0x04F3, + 0x04F5, 0x04F5, 0x04F7, 0x04F7, 0x04F9, 0x04F9, 0x04FB, 0x04FB, + 0x04FD, 0x04FD, 0x04FF, 0x04FF, 0x0501, 0x0501, 0x0503, 0x0503, + 0x0505, 0x0505, 0x0507, 0x0507, 0x0509, 0x0509, 0x050B, 0x050B, + 0x050D, 0x050D, 0x050F, 0x050F, 0x0511, 0x0511, 0x0513, 0x0513, + 0x0515, 0x0515, 0x0517, 0x0517, 0x0519, 0x0519, 0x051B, 0x051B, + 0x051D, 0x051D, 0x051F, 0x051F, 0x0521, 0x0521, 0x0523, 0x0523, + 0x0525, 0x0525, 0x0527, 0x0527, 0x0529, 0x0529, 0x052B, 0x052B, + 0x052D, 0x052D, 0x052F, 0x052F, 0x0560, 0x0588, 0x10D0, 0x10FA, + 0x10FD, 0x10FF, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1D00, 0x1DBF, + 0x1E01, 0x1E01, 0x1E03, 0x1E03, 0x1E05, 0x1E05, 0x1E07, 0x1E07, + 0x1E09, 0x1E09, 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, 0x1E0F, 0x1E0F, + 0x1E11, 0x1E11, 0x1E13, 0x1E13, 0x1E15, 0x1E15, 0x1E17, 0x1E17, + 0x1E19, 0x1E19, 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, 0x1E1F, 0x1E1F, + 0x1E21, 0x1E21, 0x1E23, 0x1E23, 0x1E25, 0x1E25, 0x1E27, 0x1E27, + 0x1E29, 0x1E29, 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, 0x1E2F, 0x1E2F, + 0x1E31, 0x1E31, 0x1E33, 0x1E33, 0x1E35, 0x1E35, 0x1E37, 0x1E37, + 0x1E39, 0x1E39, 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, 0x1E3F, 0x1E3F, + 0x1E41, 0x1E41, 0x1E43, 0x1E43, 0x1E45, 0x1E45, 0x1E47, 0x1E47, + 0x1E49, 0x1E49, 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, 0x1E4F, 0x1E4F, + 0x1E51, 0x1E51, 0x1E53, 0x1E53, 0x1E55, 0x1E55, 0x1E57, 0x1E57, + 0x1E59, 0x1E59, 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, 0x1E5F, 0x1E5F, + 0x1E61, 0x1E61, 0x1E63, 0x1E63, 0x1E65, 0x1E65, 0x1E67, 0x1E67, + 0x1E69, 0x1E69, 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, 0x1E6F, 0x1E6F, + 0x1E71, 0x1E71, 0x1E73, 0x1E73, 0x1E75, 0x1E75, 0x1E77, 0x1E77, + 0x1E79, 0x1E79, 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, 0x1E7F, 0x1E7F, + 0x1E81, 0x1E81, 0x1E83, 0x1E83, 0x1E85, 0x1E85, 0x1E87, 0x1E87, + 0x1E89, 0x1E89, 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, 0x1E8F, 0x1E8F, + 0x1E91, 0x1E91, 0x1E93, 0x1E93, 0x1E95, 0x1E9D, 0x1E9F, 0x1E9F, + 0x1EA1, 0x1EA1, 0x1EA3, 0x1EA3, 0x1EA5, 0x1EA5, 0x1EA7, 0x1EA7, + 0x1EA9, 0x1EA9, 0x1EAB, 0x1EAB, 0x1EAD, 0x1EAD, 0x1EAF, 0x1EAF, + 0x1EB1, 0x1EB1, 0x1EB3, 0x1EB3, 0x1EB5, 0x1EB5, 0x1EB7, 0x1EB7, + 0x1EB9, 0x1EB9, 0x1EBB, 0x1EBB, 0x1EBD, 0x1EBD, 0x1EBF, 0x1EBF, + 0x1EC1, 0x1EC1, 0x1EC3, 0x1EC3, 0x1EC5, 0x1EC5, 0x1EC7, 0x1EC7, + 0x1EC9, 0x1EC9, 0x1ECB, 0x1ECB, 0x1ECD, 0x1ECD, 0x1ECF, 0x1ECF, + 0x1ED1, 0x1ED1, 0x1ED3, 0x1ED3, 0x1ED5, 0x1ED5, 0x1ED7, 0x1ED7, + 0x1ED9, 0x1ED9, 0x1EDB, 0x1EDB, 0x1EDD, 0x1EDD, 0x1EDF, 0x1EDF, + 0x1EE1, 0x1EE1, 0x1EE3, 0x1EE3, 0x1EE5, 0x1EE5, 0x1EE7, 0x1EE7, + 0x1EE9, 0x1EE9, 0x1EEB, 0x1EEB, 0x1EED, 0x1EED, 0x1EEF, 0x1EEF, + 0x1EF1, 0x1EF1, 0x1EF3, 0x1EF3, 0x1EF5, 0x1EF5, 0x1EF7, 0x1EF7, + 0x1EF9, 0x1EF9, 0x1EFB, 0x1EFB, 0x1EFD, 0x1EFD, 0x1EFF, 0x1F07, + 0x1F10, 0x1F15, 0x1F20, 0x1F27, 0x1F30, 0x1F37, 0x1F40, 0x1F45, + 0x1F50, 0x1F57, 0x1F60, 0x1F67, 0x1F70, 0x1F7D, 0x1F80, 0x1F87, + 0x1F90, 0x1F97, 0x1FA0, 0x1FA7, 0x1FB0, 0x1FB4, 0x1FB6, 0x1FB7, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FC7, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FF7, + 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, 0x210A, 0x210A, + 0x210E, 0x210F, 0x2113, 0x2113, 0x212F, 0x212F, 0x2134, 0x2134, + 0x2139, 0x2139, 0x213C, 0x213D, 0x2146, 0x2149, 0x214E, 0x214E, + 0x2170, 0x217F, 0x2184, 0x2184, 0x24D0, 0x24E9, 0x2C30, 0x2C5F, + 0x2C61, 0x2C61, 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, + 0x2C6C, 0x2C6C, 0x2C71, 0x2C71, 0x2C73, 0x2C74, 0x2C76, 0x2C7D, + 0x2C81, 0x2C81, 0x2C83, 0x2C83, 0x2C85, 0x2C85, 0x2C87, 0x2C87, + 0x2C89, 0x2C89, 0x2C8B, 0x2C8B, 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, + 0x2C91, 0x2C91, 0x2C93, 0x2C93, 0x2C95, 0x2C95, 0x2C97, 0x2C97, + 0x2C99, 0x2C99, 0x2C9B, 0x2C9B, 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, + 0x2CA1, 0x2CA1, 0x2CA3, 0x2CA3, 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, + 0x2CA9, 0x2CA9, 0x2CAB, 0x2CAB, 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, + 0x2CB1, 0x2CB1, 0x2CB3, 0x2CB3, 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, + 0x2CB9, 0x2CB9, 0x2CBB, 0x2CBB, 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, + 0x2CC1, 0x2CC1, 0x2CC3, 0x2CC3, 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, + 0x2CC9, 0x2CC9, 0x2CCB, 0x2CCB, 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, + 0x2CD1, 0x2CD1, 0x2CD3, 0x2CD3, 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, + 0x2CD9, 0x2CD9, 0x2CDB, 0x2CDB, 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, + 0x2CE1, 0x2CE1, 0x2CE3, 0x2CE4, 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, + 0x2CF3, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + 0xA641, 0xA641, 0xA643, 0xA643, 0xA645, 0xA645, 0xA647, 0xA647, + 0xA649, 0xA649, 0xA64B, 0xA64B, 0xA64D, 0xA64D, 0xA64F, 0xA64F, + 0xA651, 0xA651, 0xA653, 0xA653, 0xA655, 0xA655, 0xA657, 0xA657, + 0xA659, 0xA659, 0xA65B, 0xA65B, 0xA65D, 0xA65D, 0xA65F, 0xA65F, + 0xA661, 0xA661, 0xA663, 0xA663, 0xA665, 0xA665, 0xA667, 0xA667, + 0xA669, 0xA669, 0xA66B, 0xA66B, 0xA66D, 0xA66D, 0xA681, 0xA681, + 0xA683, 0xA683, 0xA685, 0xA685, 0xA687, 0xA687, 0xA689, 0xA689, + 0xA68B, 0xA68B, 0xA68D, 0xA68D, 0xA68F, 0xA68F, 0xA691, 0xA691, + 0xA693, 0xA693, 0xA695, 0xA695, 0xA697, 0xA697, 0xA699, 0xA699, + 0xA69B, 0xA69D, 0xA723, 0xA723, 0xA725, 0xA725, 0xA727, 0xA727, + 0xA729, 0xA729, 0xA72B, 0xA72B, 0xA72D, 0xA72D, 0xA72F, 0xA731, + 0xA733, 0xA733, 0xA735, 0xA735, 0xA737, 0xA737, 0xA739, 0xA739, + 0xA73B, 0xA73B, 0xA73D, 0xA73D, 0xA73F, 0xA73F, 0xA741, 0xA741, + 0xA743, 0xA743, 0xA745, 0xA745, 0xA747, 0xA747, 0xA749, 0xA749, + 0xA74B, 0xA74B, 0xA74D, 0xA74D, 0xA74F, 0xA74F, 0xA751, 0xA751, + 0xA753, 0xA753, 0xA755, 0xA755, 0xA757, 0xA757, 0xA759, 0xA759, + 0xA75B, 0xA75B, 0xA75D, 0xA75D, 0xA75F, 0xA75F, 0xA761, 0xA761, + 0xA763, 0xA763, 0xA765, 0xA765, 0xA767, 0xA767, 0xA769, 0xA769, + 0xA76B, 0xA76B, 0xA76D, 0xA76D, 0xA76F, 0xA778, 0xA77A, 0xA77A, + 0xA77C, 0xA77C, 0xA77F, 0xA77F, 0xA781, 0xA781, 0xA783, 0xA783, + 0xA785, 0xA785, 0xA787, 0xA787, 0xA78C, 0xA78C, 0xA78E, 0xA78E, + 0xA791, 0xA791, 0xA793, 0xA795, 0xA797, 0xA797, 0xA799, 0xA799, + 0xA79B, 0xA79B, 0xA79D, 0xA79D, 0xA79F, 0xA79F, 0xA7A1, 0xA7A1, + 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, 0xA7A7, 0xA7A7, 0xA7A9, 0xA7A9, + 0xA7AF, 0xA7AF, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, 0xA7B9, 0xA7B9, + 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, 0xA7C1, 0xA7C1, + 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, 0xA7D1, 0xA7D1, + 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D5, 0xA7D7, 0xA7D7, 0xA7D9, 0xA7D9, + 0xA7F6, 0xA7F6, 0xA7F8, 0xA7FA, 0xAB30, 0xAB5A, 0xAB5C, 0xAB68, + 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF41, 0xFF5A, + 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10780, 0x10780, 0x10783, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10CC0, 0x10CF2, 0x118C0, 0x118DF, + 0x16E60, 0x16E7F, 0x1D41A, 0x1D433, 0x1D44E, 0x1D454, 0x1D456, 0x1D467, + 0x1D482, 0x1D49B, 0x1D4B6, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D4CF, 0x1D4EA, 0x1D503, 0x1D51E, 0x1D537, 0x1D552, 0x1D56B, + 0x1D586, 0x1D59F, 0x1D5BA, 0x1D5D3, 0x1D5EE, 0x1D607, 0x1D622, 0x1D63B, + 0x1D656, 0x1D66F, 0x1D68A, 0x1D6A5, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6E1, + 0x1D6FC, 0x1D714, 0x1D716, 0x1D71B, 0x1D736, 0x1D74E, 0x1D750, 0x1D755, + 0x1D770, 0x1D788, 0x1D78A, 0x1D78F, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7C9, + 0x1D7CB, 0x1D7CB, 0x1DF00, 0x1DF09, 0x1DF0B, 0x1DF1E, 0x1E922, 0x1E943, + // #76 (12808+138): bp=Math + 0x002B, 0x002B, 0x003C, 0x003E, 0x005E, 0x005E, 0x007C, 0x007C, + 0x007E, 0x007E, 0x00AC, 0x00AC, 0x00B1, 0x00B1, 0x00D7, 0x00D7, + 0x00F7, 0x00F7, 0x03D0, 0x03D2, 0x03D5, 0x03D5, 0x03F0, 0x03F1, + 0x03F4, 0x03F6, 0x0606, 0x0608, 0x2016, 0x2016, 0x2032, 0x2034, + 0x2040, 0x2040, 0x2044, 0x2044, 0x2052, 0x2052, 0x2061, 0x2064, + 0x207A, 0x207E, 0x208A, 0x208E, 0x20D0, 0x20DC, 0x20E1, 0x20E1, + 0x20E5, 0x20E6, 0x20EB, 0x20EF, 0x2102, 0x2102, 0x2107, 0x2107, + 0x210A, 0x2113, 0x2115, 0x2115, 0x2118, 0x211D, 0x2124, 0x2124, + 0x2128, 0x2129, 0x212C, 0x212D, 0x212F, 0x2131, 0x2133, 0x2138, + 0x213C, 0x2149, 0x214B, 0x214B, 0x2190, 0x21A7, 0x21A9, 0x21AE, + 0x21B0, 0x21B1, 0x21B6, 0x21B7, 0x21BC, 0x21DB, 0x21DD, 0x21DD, + 0x21E4, 0x21E5, 0x21F4, 0x22FF, 0x2308, 0x230B, 0x2320, 0x2321, + 0x237C, 0x237C, 0x239B, 0x23B5, 0x23B7, 0x23B7, 0x23D0, 0x23D0, + 0x23DC, 0x23E2, 0x25A0, 0x25A1, 0x25AE, 0x25B7, 0x25BC, 0x25C1, + 0x25C6, 0x25C7, 0x25CA, 0x25CB, 0x25CF, 0x25D3, 0x25E2, 0x25E2, + 0x25E4, 0x25E4, 0x25E7, 0x25EC, 0x25F8, 0x25FF, 0x2605, 0x2606, + 0x2640, 0x2640, 0x2642, 0x2642, 0x2660, 0x2663, 0x266D, 0x266F, + 0x27C0, 0x27FF, 0x2900, 0x2AFF, 0x2B30, 0x2B44, 0x2B47, 0x2B4C, + 0xFB29, 0xFB29, 0xFE61, 0xFE66, 0xFE68, 0xFE68, 0xFF0B, 0xFF0B, + 0xFF1C, 0xFF1E, 0xFF3C, 0xFF3C, 0xFF3E, 0xFF3E, 0xFF5C, 0xFF5C, + 0xFF5E, 0xFF5E, 0xFFE2, 0xFFE2, 0xFFE9, 0xFFEC, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D7FF, + 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, + 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, + 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, + 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, + 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, + 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, + 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, + 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, + 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, + // #77 (12946+18): bp=Noncharacter_Code_Point:NChar + 0xFDD0, 0xFDEF, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, + 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, + 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, + 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF, + // #78 (12964+28): bp=Pattern_Syntax:Pat_Syn + 0x0021, 0x002F, 0x003A, 0x0040, 0x005B, 0x005E, 0x0060, 0x0060, + 0x007B, 0x007E, 0x00A1, 0x00A7, 0x00A9, 0x00A9, 0x00AB, 0x00AC, + 0x00AE, 0x00AE, 0x00B0, 0x00B1, 0x00B6, 0x00B6, 0x00BB, 0x00BB, + 0x00BF, 0x00BF, 0x00D7, 0x00D7, 0x00F7, 0x00F7, 0x2010, 0x2027, + 0x2030, 0x203E, 0x2041, 0x2053, 0x2055, 0x205E, 0x2190, 0x245F, + 0x2500, 0x2775, 0x2794, 0x2BFF, 0x2E00, 0x2E7F, 0x3001, 0x3003, + 0x3008, 0x3020, 0x3030, 0x3030, 0xFD3E, 0xFD3F, 0xFE45, 0xFE46, + // #79 (12992+5): bp=Pattern_White_Space:Pat_WS + 0x0009, 0x000D, 0x0020, 0x0020, 0x0085, 0x0085, 0x200E, 0x200F, + 0x2028, 0x2029, + // #80 (12997+13): bp=Quotation_Mark:QMark + 0x0022, 0x0022, 0x0027, 0x0027, 0x00AB, 0x00AB, 0x00BB, 0x00BB, + 0x2018, 0x201F, 0x2039, 0x203A, 0x2E42, 0x2E42, 0x300C, 0x300F, + 0x301D, 0x301F, 0xFE41, 0xFE44, 0xFF02, 0xFF02, 0xFF07, 0xFF07, + 0xFF62, 0xFF63, + // #81 (13010+3): bp=Radical + 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, + // #82 (13013+1): bp=Regional_Indicator:RI + 0x1F1E6, 0x1F1FF, + // #83 (13014+79): bp=Sentence_Terminal:STerm + 0x0021, 0x0021, 0x002E, 0x002E, 0x003F, 0x003F, 0x0589, 0x0589, + 0x061D, 0x061F, 0x06D4, 0x06D4, 0x0700, 0x0702, 0x07F9, 0x07F9, + 0x0837, 0x0837, 0x0839, 0x0839, 0x083D, 0x083E, 0x0964, 0x0965, + 0x104A, 0x104B, 0x1362, 0x1362, 0x1367, 0x1368, 0x166E, 0x166E, + 0x1735, 0x1736, 0x1803, 0x1803, 0x1809, 0x1809, 0x1944, 0x1945, + 0x1AA8, 0x1AAB, 0x1B5A, 0x1B5B, 0x1B5E, 0x1B5F, 0x1B7D, 0x1B7E, + 0x1C3B, 0x1C3C, 0x1C7E, 0x1C7F, 0x203C, 0x203D, 0x2047, 0x2049, + 0x2E2E, 0x2E2E, 0x2E3C, 0x2E3C, 0x2E53, 0x2E54, 0x3002, 0x3002, + 0xA4FF, 0xA4FF, 0xA60E, 0xA60F, 0xA6F3, 0xA6F3, 0xA6F7, 0xA6F7, + 0xA876, 0xA877, 0xA8CE, 0xA8CF, 0xA92F, 0xA92F, 0xA9C8, 0xA9C9, + 0xAA5D, 0xAA5F, 0xAAF0, 0xAAF1, 0xABEB, 0xABEB, 0xFE52, 0xFE52, + 0xFE56, 0xFE57, 0xFF01, 0xFF01, 0xFF0E, 0xFF0E, 0xFF1F, 0xFF1F, + 0xFF61, 0xFF61, 0x10A56, 0x10A57, 0x10F55, 0x10F59, 0x10F86, 0x10F89, + 0x11047, 0x11048, 0x110BE, 0x110C1, 0x11141, 0x11143, 0x111C5, 0x111C6, + 0x111CD, 0x111CD, 0x111DE, 0x111DF, 0x11238, 0x11239, 0x1123B, 0x1123C, + 0x112A9, 0x112A9, 0x1144B, 0x1144C, 0x115C2, 0x115C3, 0x115C9, 0x115D7, + 0x11641, 0x11642, 0x1173C, 0x1173E, 0x11944, 0x11944, 0x11946, 0x11946, + 0x11A42, 0x11A43, 0x11A9B, 0x11A9C, 0x11C41, 0x11C42, 0x11EF7, 0x11EF8, + 0x16A6E, 0x16A6F, 0x16AF5, 0x16AF5, 0x16B37, 0x16B38, 0x16B44, 0x16B44, + 0x16E98, 0x16E98, 0x1BC9F, 0x1BC9F, 0x1DA88, 0x1DA88, + // #84 (13093+32): bp=Soft_Dotted:SD + 0x0069, 0x006A, 0x012F, 0x012F, 0x0249, 0x0249, 0x0268, 0x0268, + 0x029D, 0x029D, 0x02B2, 0x02B2, 0x03F3, 0x03F3, 0x0456, 0x0456, + 0x0458, 0x0458, 0x1D62, 0x1D62, 0x1D96, 0x1D96, 0x1DA4, 0x1DA4, + 0x1DA8, 0x1DA8, 0x1E2D, 0x1E2D, 0x1ECB, 0x1ECB, 0x2071, 0x2071, + 0x2148, 0x2149, 0x2C7C, 0x2C7C, 0x1D422, 0x1D423, 0x1D456, 0x1D457, + 0x1D48A, 0x1D48B, 0x1D4BE, 0x1D4BF, 0x1D4F2, 0x1D4F3, 0x1D526, 0x1D527, + 0x1D55A, 0x1D55B, 0x1D58E, 0x1D58F, 0x1D5C2, 0x1D5C3, 0x1D5F6, 0x1D5F7, + 0x1D62A, 0x1D62B, 0x1D65E, 0x1D65F, 0x1D692, 0x1D693, 0x1DF1A, 0x1DF1A, + // #85 (13125+107): bp=Terminal_Punctuation:Term + 0x0021, 0x0021, 0x002C, 0x002C, 0x002E, 0x002E, 0x003A, 0x003B, + 0x003F, 0x003F, 0x037E, 0x037E, 0x0387, 0x0387, 0x0589, 0x0589, + 0x05C3, 0x05C3, 0x060C, 0x060C, 0x061B, 0x061B, 0x061D, 0x061F, + 0x06D4, 0x06D4, 0x0700, 0x070A, 0x070C, 0x070C, 0x07F8, 0x07F9, + 0x0830, 0x083E, 0x085E, 0x085E, 0x0964, 0x0965, 0x0E5A, 0x0E5B, + 0x0F08, 0x0F08, 0x0F0D, 0x0F12, 0x104A, 0x104B, 0x1361, 0x1368, + 0x166E, 0x166E, 0x16EB, 0x16ED, 0x1735, 0x1736, 0x17D4, 0x17D6, + 0x17DA, 0x17DA, 0x1802, 0x1805, 0x1808, 0x1809, 0x1944, 0x1945, + 0x1AA8, 0x1AAB, 0x1B5A, 0x1B5B, 0x1B5D, 0x1B5F, 0x1B7D, 0x1B7E, + 0x1C3B, 0x1C3F, 0x1C7E, 0x1C7F, 0x203C, 0x203D, 0x2047, 0x2049, + 0x2E2E, 0x2E2E, 0x2E3C, 0x2E3C, 0x2E41, 0x2E41, 0x2E4C, 0x2E4C, + 0x2E4E, 0x2E4F, 0x2E53, 0x2E54, 0x3001, 0x3002, 0xA4FE, 0xA4FF, + 0xA60D, 0xA60F, 0xA6F3, 0xA6F7, 0xA876, 0xA877, 0xA8CE, 0xA8CF, + 0xA92F, 0xA92F, 0xA9C7, 0xA9C9, 0xAA5D, 0xAA5F, 0xAADF, 0xAADF, + 0xAAF0, 0xAAF1, 0xABEB, 0xABEB, 0xFE50, 0xFE52, 0xFE54, 0xFE57, + 0xFF01, 0xFF01, 0xFF0C, 0xFF0C, 0xFF0E, 0xFF0E, 0xFF1A, 0xFF1B, + 0xFF1F, 0xFF1F, 0xFF61, 0xFF61, 0xFF64, 0xFF64, 0x1039F, 0x1039F, + 0x103D0, 0x103D0, 0x10857, 0x10857, 0x1091F, 0x1091F, 0x10A56, 0x10A57, + 0x10AF0, 0x10AF5, 0x10B3A, 0x10B3F, 0x10B99, 0x10B9C, 0x10F55, 0x10F59, + 0x10F86, 0x10F89, 0x11047, 0x1104D, 0x110BE, 0x110C1, 0x11141, 0x11143, + 0x111C5, 0x111C6, 0x111CD, 0x111CD, 0x111DE, 0x111DF, 0x11238, 0x1123C, + 0x112A9, 0x112A9, 0x1144B, 0x1144D, 0x1145A, 0x1145B, 0x115C2, 0x115C5, + 0x115C9, 0x115D7, 0x11641, 0x11642, 0x1173C, 0x1173E, 0x11944, 0x11944, + 0x11946, 0x11946, 0x11A42, 0x11A43, 0x11A9B, 0x11A9C, 0x11AA1, 0x11AA2, + 0x11C41, 0x11C43, 0x11C71, 0x11C71, 0x11EF7, 0x11EF8, 0x12470, 0x12474, + 0x16A6E, 0x16A6F, 0x16AF5, 0x16AF5, 0x16B37, 0x16B39, 0x16B44, 0x16B44, + 0x16E97, 0x16E98, 0x1BC9F, 0x1BC9F, 0x1DA87, 0x1DA8A, + // #86 (13232+15): bp=Unified_Ideograph:UIdeo + 0x3400, 0x4DBF, 0x4E00, 0x9FFF, 0xFA0E, 0xFA0F, 0xFA11, 0xFA11, + 0xFA13, 0xFA14, 0xFA1F, 0xFA1F, 0xFA21, 0xFA21, 0xFA23, 0xFA24, + 0xFA27, 0xFA29, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, + 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x30000, 0x3134A, + // #87 (13247+651): bp=Uppercase:Upper + 0x0041, 0x005A, 0x00C0, 0x00D6, 0x00D8, 0x00DE, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, + 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, 0x0141, 0x0141, + 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, 0x014A, 0x014A, + 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, 0x0152, 0x0152, + 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, 0x015A, 0x015A, + 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, 0x0162, 0x0162, + 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, 0x016A, 0x016A, + 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, 0x0172, 0x0172, + 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, 0x017B, 0x017B, + 0x017D, 0x017D, 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, + 0x0189, 0x018B, 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, + 0x019C, 0x019D, 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, + 0x01A6, 0x01A7, 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, + 0x01B1, 0x01B3, 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, + 0x01C4, 0x01C4, 0x01C7, 0x01C7, 0x01CA, 0x01CA, 0x01CD, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F1, 0x01F4, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, + 0x01FC, 0x01FC, 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, + 0x0204, 0x0204, 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, + 0x020C, 0x020C, 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, + 0x0214, 0x0214, 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, + 0x021C, 0x021C, 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, + 0x0224, 0x0224, 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, + 0x022C, 0x022C, 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, + 0x023A, 0x023B, 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, + 0x0248, 0x0248, 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, + 0x0370, 0x0370, 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, + 0x0391, 0x03A1, 0x03A3, 0x03AB, 0x03CF, 0x03CF, 0x03D2, 0x03D4, + 0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, + 0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, + 0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, + 0x03F4, 0x03F4, 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, + 0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, + 0x0468, 0x0468, 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, + 0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, + 0x0478, 0x0478, 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, + 0x0480, 0x0480, 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, + 0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, + 0x0498, 0x0498, 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, + 0x04A0, 0x04A0, 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, + 0x04A8, 0x04A8, 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, + 0x04B0, 0x04B0, 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, + 0x04B8, 0x04B8, 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, + 0x04C0, 0x04C1, 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, + 0x04C9, 0x04C9, 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, + 0x04D2, 0x04D2, 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, + 0x04DA, 0x04DA, 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, + 0x04E2, 0x04E2, 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, + 0x04EA, 0x04EA, 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, + 0x04F2, 0x04F2, 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, + 0x04FA, 0x04FA, 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, + 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, + 0x050A, 0x050A, 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, + 0x0512, 0x0512, 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, + 0x051A, 0x051A, 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, + 0x0522, 0x0522, 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, + 0x052A, 0x052A, 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x13A0, 0x13F5, + 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, + 0x1E04, 0x1E04, 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, + 0x1E0C, 0x1E0C, 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, + 0x1E14, 0x1E14, 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, + 0x1E1C, 0x1E1C, 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, + 0x1E24, 0x1E24, 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, + 0x1E2C, 0x1E2C, 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, + 0x1E34, 0x1E34, 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, + 0x1E3C, 0x1E3C, 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, + 0x1E44, 0x1E44, 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, + 0x1E4C, 0x1E4C, 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, + 0x1E54, 0x1E54, 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, + 0x1E5C, 0x1E5C, 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, + 0x1E64, 0x1E64, 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, + 0x1E6C, 0x1E6C, 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, + 0x1E74, 0x1E74, 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, + 0x1E7C, 0x1E7C, 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, + 0x1E84, 0x1E84, 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, + 0x1E8C, 0x1E8C, 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, + 0x1E94, 0x1E94, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, + 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, + 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, + 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, + 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, + 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, + 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, + 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, + 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, + 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, + 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, + 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, + 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, + 0x1FB8, 0x1FBB, 0x1FC8, 0x1FCB, 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, + 0x1FF8, 0x1FFB, 0x2102, 0x2102, 0x2107, 0x2107, 0x210B, 0x210D, + 0x2110, 0x2112, 0x2115, 0x2115, 0x2119, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, 0x2130, 0x2133, + 0x213E, 0x213F, 0x2145, 0x2145, 0x2160, 0x216F, 0x2183, 0x2183, + 0x24B6, 0x24CF, 0x2C00, 0x2C2F, 0x2C60, 0x2C60, 0x2C62, 0x2C64, + 0x2C67, 0x2C67, 0x2C69, 0x2C69, 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, + 0x2C72, 0x2C72, 0x2C75, 0x2C75, 0x2C7E, 0x2C80, 0x2C82, 0x2C82, + 0x2C84, 0x2C84, 0x2C86, 0x2C86, 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, + 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, 0x2C90, 0x2C90, 0x2C92, 0x2C92, + 0x2C94, 0x2C94, 0x2C96, 0x2C96, 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, + 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, + 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, + 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, + 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, + 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, + 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, + 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, + 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, + 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, + 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, 0x2CF2, 0x2CF2, 0xA640, 0xA640, + 0xA642, 0xA642, 0xA644, 0xA644, 0xA646, 0xA646, 0xA648, 0xA648, + 0xA64A, 0xA64A, 0xA64C, 0xA64C, 0xA64E, 0xA64E, 0xA650, 0xA650, + 0xA652, 0xA652, 0xA654, 0xA654, 0xA656, 0xA656, 0xA658, 0xA658, + 0xA65A, 0xA65A, 0xA65C, 0xA65C, 0xA65E, 0xA65E, 0xA660, 0xA660, + 0xA662, 0xA662, 0xA664, 0xA664, 0xA666, 0xA666, 0xA668, 0xA668, + 0xA66A, 0xA66A, 0xA66C, 0xA66C, 0xA680, 0xA680, 0xA682, 0xA682, + 0xA684, 0xA684, 0xA686, 0xA686, 0xA688, 0xA688, 0xA68A, 0xA68A, + 0xA68C, 0xA68C, 0xA68E, 0xA68E, 0xA690, 0xA690, 0xA692, 0xA692, + 0xA694, 0xA694, 0xA696, 0xA696, 0xA698, 0xA698, 0xA69A, 0xA69A, + 0xA722, 0xA722, 0xA724, 0xA724, 0xA726, 0xA726, 0xA728, 0xA728, + 0xA72A, 0xA72A, 0xA72C, 0xA72C, 0xA72E, 0xA72E, 0xA732, 0xA732, + 0xA734, 0xA734, 0xA736, 0xA736, 0xA738, 0xA738, 0xA73A, 0xA73A, + 0xA73C, 0xA73C, 0xA73E, 0xA73E, 0xA740, 0xA740, 0xA742, 0xA742, + 0xA744, 0xA744, 0xA746, 0xA746, 0xA748, 0xA748, 0xA74A, 0xA74A, + 0xA74C, 0xA74C, 0xA74E, 0xA74E, 0xA750, 0xA750, 0xA752, 0xA752, + 0xA754, 0xA754, 0xA756, 0xA756, 0xA758, 0xA758, 0xA75A, 0xA75A, + 0xA75C, 0xA75C, 0xA75E, 0xA75E, 0xA760, 0xA760, 0xA762, 0xA762, + 0xA764, 0xA764, 0xA766, 0xA766, 0xA768, 0xA768, 0xA76A, 0xA76A, + 0xA76C, 0xA76C, 0xA76E, 0xA76E, 0xA779, 0xA779, 0xA77B, 0xA77B, + 0xA77D, 0xA77E, 0xA780, 0xA780, 0xA782, 0xA782, 0xA784, 0xA784, + 0xA786, 0xA786, 0xA78B, 0xA78B, 0xA78D, 0xA78D, 0xA790, 0xA790, + 0xA792, 0xA792, 0xA796, 0xA796, 0xA798, 0xA798, 0xA79A, 0xA79A, + 0xA79C, 0xA79C, 0xA79E, 0xA79E, 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, + 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, + 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, + 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, + 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, + 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, 0xFF21, 0xFF3A, 0x10400, 0x10427, + 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10C80, 0x10CB2, 0x118A0, 0x118BF, 0x16E40, 0x16E5F, + 0x1D400, 0x1D419, 0x1D434, 0x1D44D, 0x1D468, 0x1D481, 0x1D49C, 0x1D49C, + 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, + 0x1D4AE, 0x1D4B5, 0x1D4D0, 0x1D4E9, 0x1D504, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D538, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D56C, 0x1D585, + 0x1D5A0, 0x1D5B9, 0x1D5D4, 0x1D5ED, 0x1D608, 0x1D621, 0x1D63C, 0x1D655, + 0x1D670, 0x1D689, 0x1D6A8, 0x1D6C0, 0x1D6E2, 0x1D6FA, 0x1D71C, 0x1D734, + 0x1D756, 0x1D76E, 0x1D790, 0x1D7A8, 0x1D7CA, 0x1D7CA, 0x1E900, 0x1E921, + 0x1F130, 0x1F149, 0x1F150, 0x1F169, 0x1F170, 0x1F189, + // #88 (13898+4): bp=Variation_Selector:VS + 0x180B, 0x180D, 0x180F, 0x180F, 0xFE00, 0xFE0F, 0xE0100, 0xE01EF, + // #89 (13902+10): bp=White_Space:space + 0x0009, 0x000D, 0x0020, 0x0020, 0x0085, 0x0085, 0x00A0, 0x00A0, + 0x1680, 0x1680, 0x2000, 0x200A, 0x2028, 0x2029, 0x202F, 0x202F, + 0x205F, 0x205F, 0x3000, 0x3000, + // #90 (13912+763): bp=XID_Continue:XIDC + 0x0030, 0x0039, 0x0041, 0x005A, 0x005F, 0x005F, 0x0061, 0x007A, + 0x00AA, 0x00AA, 0x00B5, 0x00B5, 0x00B7, 0x00B7, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, 0x02C6, 0x02D1, + 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, 0x0300, 0x0374, + 0x0376, 0x0377, 0x037B, 0x037D, 0x037F, 0x037F, 0x0386, 0x038A, + 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, + 0x0483, 0x0487, 0x048A, 0x052F, 0x0531, 0x0556, 0x0559, 0x0559, + 0x0560, 0x0588, 0x0591, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x05C2, + 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0610, 0x061A, 0x0620, 0x0669, 0x066E, 0x06D3, 0x06D5, 0x06DC, + 0x06DF, 0x06E8, 0x06EA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x074A, + 0x074D, 0x07B1, 0x07C0, 0x07F5, 0x07FA, 0x07FA, 0x07FD, 0x07FD, + 0x0800, 0x082D, 0x0840, 0x085B, 0x0860, 0x086A, 0x0870, 0x0887, + 0x0889, 0x088E, 0x0898, 0x08E1, 0x08E3, 0x0963, 0x0966, 0x096F, + 0x0971, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, + 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, + 0x09DF, 0x09E3, 0x09E6, 0x09F1, 0x09FC, 0x09FC, 0x09FE, 0x09FE, + 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A75, + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AE6, 0x0AEF, 0x0AF9, 0x0AFF, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3C, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, + 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B66, 0x0B6F, + 0x0B71, 0x0B71, 0x0B82, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, + 0x0BE6, 0x0BEF, 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, 0x0C3C, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, + 0x0C55, 0x0C56, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, + 0x0C66, 0x0C6F, 0x0C80, 0x0C83, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, + 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x0D00, 0x0D0C, + 0x0D0E, 0x0D10, 0x0D12, 0x0D44, 0x0D46, 0x0D48, 0x0D4A, 0x0D4E, + 0x0D54, 0x0D57, 0x0D5F, 0x0D63, 0x0D66, 0x0D6F, 0x0D7A, 0x0D7F, + 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, + 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF3, + 0x0E01, 0x0E3A, 0x0E40, 0x0E4E, 0x0E50, 0x0E59, 0x0E81, 0x0E82, + 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, + 0x0EA7, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EC8, 0x0ECD, + 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, 0x0F18, 0x0F19, + 0x0F20, 0x0F29, 0x0F35, 0x0F35, 0x0F37, 0x0F37, 0x0F39, 0x0F39, + 0x0F3E, 0x0F47, 0x0F49, 0x0F6C, 0x0F71, 0x0F84, 0x0F86, 0x0F97, + 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, 0x1000, 0x1049, 0x1050, 0x109D, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x135D, 0x135F, 0x1369, 0x1371, 0x1380, 0x138F, 0x13A0, 0x13F5, + 0x13F8, 0x13FD, 0x1401, 0x166C, 0x166F, 0x167F, 0x1681, 0x169A, + 0x16A0, 0x16EA, 0x16EE, 0x16F8, 0x1700, 0x1715, 0x171F, 0x1734, + 0x1740, 0x1753, 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + 0x1780, 0x17D3, 0x17D7, 0x17D7, 0x17DC, 0x17DD, 0x17E0, 0x17E9, + 0x180B, 0x180D, 0x180F, 0x1819, 0x1820, 0x1878, 0x1880, 0x18AA, + 0x18B0, 0x18F5, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, + 0x1946, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, 0x19B0, 0x19C9, + 0x19D0, 0x19DA, 0x1A00, 0x1A1B, 0x1A20, 0x1A5E, 0x1A60, 0x1A7C, + 0x1A7F, 0x1A89, 0x1A90, 0x1A99, 0x1AA7, 0x1AA7, 0x1AB0, 0x1ABD, + 0x1ABF, 0x1ACE, 0x1B00, 0x1B4C, 0x1B50, 0x1B59, 0x1B6B, 0x1B73, + 0x1B80, 0x1BF3, 0x1C00, 0x1C37, 0x1C40, 0x1C49, 0x1C4D, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CFA, 0x1D00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, + 0x203F, 0x2040, 0x2054, 0x2054, 0x2071, 0x2071, 0x207F, 0x207F, + 0x2090, 0x209C, 0x20D0, 0x20DC, 0x20E1, 0x20E1, 0x20E5, 0x20F0, + 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, + 0x2118, 0x211D, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, + 0x212A, 0x2139, 0x213C, 0x213F, 0x2145, 0x2149, 0x214E, 0x214E, + 0x2160, 0x2188, 0x2C00, 0x2CE4, 0x2CEB, 0x2CF3, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, + 0x2D7F, 0x2D96, 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, + 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, + 0x2DD8, 0x2DDE, 0x2DE0, 0x2DFF, 0x3005, 0x3007, 0x3021, 0x302F, + 0x3031, 0x3035, 0x3038, 0x303C, 0x3041, 0x3096, 0x3099, 0x309A, + 0x309D, 0x309F, 0x30A1, 0x30FA, 0x30FC, 0x30FF, 0x3105, 0x312F, + 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, 0x3400, 0x4DBF, + 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, 0xA500, 0xA60C, 0xA610, 0xA62B, + 0xA640, 0xA66F, 0xA674, 0xA67D, 0xA67F, 0xA6F1, 0xA717, 0xA71F, + 0xA722, 0xA788, 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, + 0xA7D5, 0xA7D9, 0xA7F2, 0xA827, 0xA82C, 0xA82C, 0xA840, 0xA873, + 0xA880, 0xA8C5, 0xA8D0, 0xA8D9, 0xA8E0, 0xA8F7, 0xA8FB, 0xA8FB, + 0xA8FD, 0xA92D, 0xA930, 0xA953, 0xA960, 0xA97C, 0xA980, 0xA9C0, + 0xA9CF, 0xA9D9, 0xA9E0, 0xA9FE, 0xAA00, 0xAA36, 0xAA40, 0xAA4D, + 0xAA50, 0xAA59, 0xAA60, 0xAA76, 0xAA7A, 0xAAC2, 0xAADB, 0xAADD, + 0xAAE0, 0xAAEF, 0xAAF2, 0xAAF6, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, + 0xAB5C, 0xAB69, 0xAB70, 0xABEA, 0xABEC, 0xABED, 0xABF0, 0xABF9, + 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB28, + 0xFB2A, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, + 0xFB43, 0xFB44, 0xFB46, 0xFBB1, 0xFBD3, 0xFC5D, 0xFC64, 0xFD3D, + 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, 0xFDF0, 0xFDF9, 0xFE00, 0xFE0F, + 0xFE20, 0xFE2F, 0xFE33, 0xFE34, 0xFE4D, 0xFE4F, 0xFE71, 0xFE71, + 0xFE73, 0xFE73, 0xFE77, 0xFE77, 0xFE79, 0xFE79, 0xFE7B, 0xFE7B, + 0xFE7D, 0xFE7D, 0xFE7F, 0xFEFC, 0xFF10, 0xFF19, 0xFF21, 0xFF3A, + 0xFF3F, 0xFF3F, 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, 0xFFC2, 0xFFC7, + 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0x10000, 0x1000B, + 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, 0x1003F, 0x1004D, + 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10140, 0x10174, 0x101FD, 0x101FD, + 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x102E0, 0x102E0, 0x10300, 0x1031F, + 0x1032D, 0x1034A, 0x10350, 0x1037A, 0x10380, 0x1039D, 0x103A0, 0x103C3, + 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, 0x104A0, 0x104A9, + 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, 0x10530, 0x10563, + 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, + 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, + 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, 0x10780, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, 0x10808, 0x10808, + 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, 0x1083F, 0x10855, + 0x10860, 0x10876, 0x10880, 0x1089E, 0x108E0, 0x108F2, 0x108F4, 0x108F5, + 0x10900, 0x10915, 0x10920, 0x10939, 0x10980, 0x109B7, 0x109BE, 0x109BF, + 0x10A00, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, 0x10A13, 0x10A15, 0x10A17, + 0x10A19, 0x10A35, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE6, 0x10B00, 0x10B35, + 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D27, 0x10D30, 0x10D39, + 0x10E80, 0x10EA9, 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, + 0x10F27, 0x10F27, 0x10F30, 0x10F50, 0x10F70, 0x10F85, 0x10FB0, 0x10FC4, + 0x10FE0, 0x10FF6, 0x11000, 0x11046, 0x11066, 0x11075, 0x1107F, 0x110BA, + 0x110C2, 0x110C2, 0x110D0, 0x110E8, 0x110F0, 0x110F9, 0x11100, 0x11134, + 0x11136, 0x1113F, 0x11144, 0x11147, 0x11150, 0x11173, 0x11176, 0x11176, + 0x11180, 0x111C4, 0x111C9, 0x111CC, 0x111CE, 0x111DA, 0x111DC, 0x111DC, + 0x11200, 0x11211, 0x11213, 0x11237, 0x1123E, 0x1123E, 0x11280, 0x11286, + 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, 0x1129F, 0x112A8, + 0x112B0, 0x112EA, 0x112F0, 0x112F9, 0x11300, 0x11303, 0x11305, 0x1130C, + 0x1130F, 0x11310, 0x11313, 0x11328, 0x1132A, 0x11330, 0x11332, 0x11333, + 0x11335, 0x11339, 0x1133B, 0x11344, 0x11347, 0x11348, 0x1134B, 0x1134D, + 0x11350, 0x11350, 0x11357, 0x11357, 0x1135D, 0x11363, 0x11366, 0x1136C, + 0x11370, 0x11374, 0x11400, 0x1144A, 0x11450, 0x11459, 0x1145E, 0x11461, + 0x11480, 0x114C5, 0x114C7, 0x114C7, 0x114D0, 0x114D9, 0x11580, 0x115B5, + 0x115B8, 0x115C0, 0x115D8, 0x115DD, 0x11600, 0x11640, 0x11644, 0x11644, + 0x11650, 0x11659, 0x11680, 0x116B8, 0x116C0, 0x116C9, 0x11700, 0x1171A, + 0x1171D, 0x1172B, 0x11730, 0x11739, 0x11740, 0x11746, 0x11800, 0x1183A, + 0x118A0, 0x118E9, 0x118FF, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, + 0x11915, 0x11916, 0x11918, 0x11935, 0x11937, 0x11938, 0x1193B, 0x11943, + 0x11950, 0x11959, 0x119A0, 0x119A7, 0x119AA, 0x119D7, 0x119DA, 0x119E1, + 0x119E3, 0x119E4, 0x11A00, 0x11A3E, 0x11A47, 0x11A47, 0x11A50, 0x11A99, + 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, 0x11C0A, 0x11C36, + 0x11C38, 0x11C40, 0x11C50, 0x11C59, 0x11C72, 0x11C8F, 0x11C92, 0x11CA7, + 0x11CA9, 0x11CB6, 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D36, + 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, 0x11D50, 0x11D59, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, 0x11D90, 0x11D91, + 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, 0x11EE0, 0x11EF6, 0x11FB0, 0x11FB0, + 0x12000, 0x12399, 0x12400, 0x1246E, 0x12480, 0x12543, 0x12F90, 0x12FF0, + 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, 0x16A40, 0x16A5E, + 0x16A60, 0x16A69, 0x16A70, 0x16ABE, 0x16AC0, 0x16AC9, 0x16AD0, 0x16AED, + 0x16AF0, 0x16AF4, 0x16B00, 0x16B36, 0x16B40, 0x16B43, 0x16B50, 0x16B59, + 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, + 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE4, + 0x16FF0, 0x16FF1, 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, + 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, 0x1BC9D, 0x1BC9E, + 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D165, 0x1D169, 0x1D16D, 0x1D172, + 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, + 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, + 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, + 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, + 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, + 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1D7CE, 0x1D7FF, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1DF00, 0x1DF1E, 0x1E000, 0x1E006, 0x1E008, 0x1E018, + 0x1E01B, 0x1E021, 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E100, 0x1E12C, + 0x1E130, 0x1E13D, 0x1E140, 0x1E149, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AE, + 0x1E2C0, 0x1E2F9, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E8D0, 0x1E8D6, 0x1E900, 0x1E94B, + 0x1E950, 0x1E959, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1FBF0, 0x1FBF9, 0x20000, 0x2A6DF, + 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, + 0x2F800, 0x2FA1D, 0x30000, 0x3134A, 0xE0100, 0xE01EF, + // #91 (14675+655): bp=XID_Start:XIDS + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, + 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, + 0x0370, 0x0374, 0x0376, 0x0377, 0x037B, 0x037D, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x03F5, 0x03F7, 0x0481, 0x048A, 0x052F, 0x0531, 0x0556, + 0x0559, 0x0559, 0x0560, 0x0588, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0620, 0x064A, 0x066E, 0x066F, 0x0671, 0x06D3, 0x06D5, 0x06D5, + 0x06E5, 0x06E6, 0x06EE, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, + 0x0710, 0x0710, 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, + 0x07CA, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x07FA, 0x0800, 0x0815, + 0x081A, 0x081A, 0x0824, 0x0824, 0x0828, 0x0828, 0x0840, 0x0858, + 0x0860, 0x086A, 0x0870, 0x0887, 0x0889, 0x088E, 0x08A0, 0x08C9, + 0x0904, 0x0939, 0x093D, 0x093D, 0x0950, 0x0950, 0x0958, 0x0961, + 0x0971, 0x0980, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BD, 0x09BD, + 0x09CE, 0x09CE, 0x09DC, 0x09DD, 0x09DF, 0x09E1, 0x09F0, 0x09F1, + 0x09FC, 0x09FC, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A72, 0x0A74, 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, 0x0ABD, 0x0ABD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, + 0x0AF9, 0x0AF9, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, + 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B71, 0x0B71, 0x0B83, 0x0B83, + 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, + 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, 0x0BD0, 0x0BD0, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3D, 0x0C3D, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, 0x0C80, 0x0C80, 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, + 0x0CBD, 0x0CBD, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE1, 0x0CF1, 0x0CF2, + 0x0D04, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, + 0x0D4E, 0x0D4E, 0x0D54, 0x0D56, 0x0D5F, 0x0D61, 0x0D7A, 0x0D7F, + 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, + 0x0DC0, 0x0DC6, 0x0E01, 0x0E30, 0x0E32, 0x0E32, 0x0E40, 0x0E46, + 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, + 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB0, 0x0EB2, 0x0EB2, 0x0EBD, 0x0EBD, + 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, + 0x0F40, 0x0F47, 0x0F49, 0x0F6C, 0x0F88, 0x0F8C, 0x1000, 0x102A, + 0x103F, 0x103F, 0x1050, 0x1055, 0x105A, 0x105D, 0x1061, 0x1061, + 0x1065, 0x1066, 0x106E, 0x1070, 0x1075, 0x1081, 0x108E, 0x108E, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x1380, 0x138F, 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1401, 0x166C, + 0x166F, 0x167F, 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16EE, 0x16F8, + 0x1700, 0x1711, 0x171F, 0x1731, 0x1740, 0x1751, 0x1760, 0x176C, + 0x176E, 0x1770, 0x1780, 0x17B3, 0x17D7, 0x17D7, 0x17DC, 0x17DC, + 0x1820, 0x1878, 0x1880, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, + 0x19B0, 0x19C9, 0x1A00, 0x1A16, 0x1A20, 0x1A54, 0x1AA7, 0x1AA7, + 0x1B05, 0x1B33, 0x1B45, 0x1B4C, 0x1B83, 0x1BA0, 0x1BAE, 0x1BAF, + 0x1BBA, 0x1BE5, 0x1C00, 0x1C23, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, + 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, + 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, + 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, + 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x2102, 0x2102, 0x2107, 0x2107, + 0x210A, 0x2113, 0x2115, 0x2115, 0x2118, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x2139, 0x213C, 0x213F, + 0x2145, 0x2149, 0x214E, 0x214E, 0x2160, 0x2188, 0x2C00, 0x2CE4, + 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, + 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, 0x3038, 0x303C, + 0x3041, 0x3096, 0x309D, 0x309F, 0x30A1, 0x30FA, 0x30FC, 0x30FF, + 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, + 0x3400, 0x4DBF, 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, 0xA500, 0xA60C, + 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA640, 0xA66E, 0xA67F, 0xA69D, + 0xA6A0, 0xA6EF, 0xA717, 0xA71F, 0xA722, 0xA788, 0xA78B, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA801, + 0xA803, 0xA805, 0xA807, 0xA80A, 0xA80C, 0xA822, 0xA840, 0xA873, + 0xA882, 0xA8B3, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, 0xA930, 0xA946, 0xA960, 0xA97C, 0xA984, 0xA9B2, + 0xA9CF, 0xA9CF, 0xA9E0, 0xA9E4, 0xA9E6, 0xA9EF, 0xA9FA, 0xA9FE, + 0xAA00, 0xAA28, 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA60, 0xAA76, + 0xAA7A, 0xAA7A, 0xAA7E, 0xAAAF, 0xAAB1, 0xAAB1, 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADD, + 0xAAE0, 0xAAEA, 0xAAF2, 0xAAF4, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, + 0xAB5C, 0xAB69, 0xAB70, 0xABE2, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0xFB00, 0xFB06, + 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, 0xFB1F, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFC5D, 0xFC64, 0xFD3D, 0xFD50, 0xFD8F, + 0xFD92, 0xFDC7, 0xFDF0, 0xFDF9, 0xFE71, 0xFE71, 0xFE73, 0xFE73, + 0xFE77, 0xFE77, 0xFE79, 0xFE79, 0xFE7B, 0xFE7B, 0xFE7D, 0xFE7D, + 0xFE7F, 0xFEFC, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0xFF66, 0xFF9D, + 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, + 0xFFDA, 0xFFDC, 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, + 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, + 0x10140, 0x10174, 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x10300, 0x1031F, + 0x1032D, 0x1034A, 0x10350, 0x10375, 0x10380, 0x1039D, 0x103A0, 0x103C3, + 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, 0x104B0, 0x104D3, + 0x104D8, 0x104FB, 0x10500, 0x10527, 0x10530, 0x10563, 0x10570, 0x1057A, + 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10600, 0x10736, + 0x10740, 0x10755, 0x10760, 0x10767, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, + 0x10837, 0x10838, 0x1083C, 0x1083C, 0x1083F, 0x10855, 0x10860, 0x10876, + 0x10880, 0x1089E, 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x10900, 0x10915, + 0x10920, 0x10939, 0x10980, 0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A00, + 0x10A10, 0x10A13, 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, 0x10B00, 0x10B35, + 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D23, 0x10E80, 0x10EA9, + 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, 0x10F30, 0x10F45, + 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, 0x11003, 0x11037, + 0x11071, 0x11072, 0x11075, 0x11075, 0x11083, 0x110AF, 0x110D0, 0x110E8, + 0x11103, 0x11126, 0x11144, 0x11144, 0x11147, 0x11147, 0x11150, 0x11172, + 0x11176, 0x11176, 0x11183, 0x111B2, 0x111C1, 0x111C4, 0x111DA, 0x111DA, + 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x1122B, 0x11280, 0x11286, + 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, 0x1129F, 0x112A8, + 0x112B0, 0x112DE, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133D, 0x1133D, + 0x11350, 0x11350, 0x1135D, 0x11361, 0x11400, 0x11434, 0x11447, 0x1144A, + 0x1145F, 0x11461, 0x11480, 0x114AF, 0x114C4, 0x114C5, 0x114C7, 0x114C7, + 0x11580, 0x115AE, 0x115D8, 0x115DB, 0x11600, 0x1162F, 0x11644, 0x11644, + 0x11680, 0x116AA, 0x116B8, 0x116B8, 0x11700, 0x1171A, 0x11740, 0x11746, + 0x11800, 0x1182B, 0x118A0, 0x118DF, 0x118FF, 0x11906, 0x11909, 0x11909, + 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x1192F, 0x1193F, 0x1193F, + 0x11941, 0x11941, 0x119A0, 0x119A7, 0x119AA, 0x119D0, 0x119E1, 0x119E1, + 0x119E3, 0x119E3, 0x11A00, 0x11A00, 0x11A0B, 0x11A32, 0x11A3A, 0x11A3A, + 0x11A50, 0x11A50, 0x11A5C, 0x11A89, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, + 0x11C00, 0x11C08, 0x11C0A, 0x11C2E, 0x11C40, 0x11C40, 0x11C72, 0x11C8F, + 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D30, 0x11D46, 0x11D46, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D89, 0x11D98, 0x11D98, + 0x11EE0, 0x11EF2, 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12400, 0x1246E, + 0x12480, 0x12543, 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, + 0x16800, 0x16A38, 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, 0x16AD0, 0x16AED, + 0x16B00, 0x16B2F, 0x16B40, 0x16B43, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, + 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, 0x16F50, 0x16F50, 0x16F93, 0x16F9F, + 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x17000, 0x187F7, 0x18800, 0x18CD5, + 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, + 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, + 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, + 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, + 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, + 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1DF00, 0x1DF1E, 0x1E100, 0x1E12C, + 0x1E137, 0x1E13D, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, + 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, + 0x1E800, 0x1E8C4, 0x1E900, 0x1E943, 0x1E94B, 0x1E94B, 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, + 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, + 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, + 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, + 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, + 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, + 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, + 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #92 (15330+3): sc=Adlam:Adlm + 0x1E900, 0x1E94B, 0x1E950, 0x1E959, 0x1E95E, 0x1E95F, + // #93 (15333+3): sc=Ahom:Ahom scx=Ahom:Ahom + 0x11700, 0x1171A, 0x1171D, 0x1172B, 0x11730, 0x11746, + // #94 (15336+1): sc=Anatolian_Hieroglyphs:Hluw scx=Anatolian_Hieroglyphs:Hluw + 0x14400, 0x14646, + // #95 (15337+57): sc=Arabic:Arab + 0x0600, 0x0604, 0x0606, 0x060B, 0x060D, 0x061A, 0x061C, 0x061E, + 0x0620, 0x063F, 0x0641, 0x064A, 0x0656, 0x066F, 0x0671, 0x06DC, + 0x06DE, 0x06FF, 0x0750, 0x077F, 0x0870, 0x088E, 0x0890, 0x0891, + 0x0898, 0x08E1, 0x08E3, 0x08FF, 0xFB50, 0xFBC2, 0xFBD3, 0xFD3D, + 0xFD40, 0xFD8F, 0xFD92, 0xFDC7, 0xFDCF, 0xFDCF, 0xFDF0, 0xFDFF, + 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0x10E60, 0x10E7E, 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, + 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, + 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, + 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, + 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, + 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, + 0x1EEF0, 0x1EEF1, + // #96 (15394+4): sc=Armenian:Armn scx=Armenian:Armn + 0x0531, 0x0556, 0x0559, 0x058A, 0x058D, 0x058F, 0xFB13, 0xFB17, + // #97 (15398+2): sc=Avestan:Avst scx=Avestan:Avst + 0x10B00, 0x10B35, 0x10B39, 0x10B3F, + // #98 (15400+2): sc=Balinese:Bali scx=Balinese:Bali + 0x1B00, 0x1B4C, 0x1B50, 0x1B7E, + // #99 (15402+2): sc=Bamum:Bamu scx=Bamum:Bamu + 0xA6A0, 0xA6F7, 0x16800, 0x16A38, + // #100 (15404+2): sc=Bassa_Vah:Bass scx=Bassa_Vah:Bass + 0x16AD0, 0x16AED, 0x16AF0, 0x16AF5, + // #101 (15406+2): sc=Batak:Batk scx=Batak:Batk + 0x1BC0, 0x1BF3, 0x1BFC, 0x1BFF, + // #102 (15408+14): sc=Bengali:Beng + 0x0980, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, + 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, + 0x09DF, 0x09E3, 0x09E6, 0x09FE, + // #103 (15422+4): sc=Bhaiksuki:Bhks scx=Bhaiksuki:Bhks + 0x11C00, 0x11C08, 0x11C0A, 0x11C36, 0x11C38, 0x11C45, 0x11C50, 0x11C6C, + // #104 (15426+3): sc=Bopomofo:Bopo + 0x02EA, 0x02EB, 0x3105, 0x312F, 0x31A0, 0x31BF, + // #105 (15429+3): sc=Brahmi:Brah scx=Brahmi:Brah + 0x11000, 0x1104D, 0x11052, 0x11075, 0x1107F, 0x1107F, + // #106 (15432+1): sc=Braille:Brai scx=Braille:Brai + 0x2800, 0x28FF, + // #107 (15433+2): sc=Buginese:Bugi + 0x1A00, 0x1A1B, 0x1A1E, 0x1A1F, + // #108 (15435+1): sc=Buhid:Buhd + 0x1740, 0x1753, + // #109 (15436+3): sc=Canadian_Aboriginal:Cans scx=Canadian_Aboriginal:Cans + 0x1400, 0x167F, 0x18B0, 0x18F5, 0x11AB0, 0x11ABF, + // #110 (15439+1): sc=Carian:Cari scx=Carian:Cari + 0x102A0, 0x102D0, + // #111 (15440+2): sc=Caucasian_Albanian:Aghb scx=Caucasian_Albanian:Aghb + 0x10530, 0x10563, 0x1056F, 0x1056F, + // #112 (15442+2): sc=Chakma:Cakm + 0x11100, 0x11134, 0x11136, 0x11147, + // #113 (15444+4): sc=Cham:Cham scx=Cham:Cham + 0xAA00, 0xAA36, 0xAA40, 0xAA4D, 0xAA50, 0xAA59, 0xAA5C, 0xAA5F, + // #114 (15448+3): sc=Cherokee:Cher scx=Cherokee:Cher + 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0xAB70, 0xABBF, + // #115 (15451+1): sc=Chorasmian:Chrs scx=Chorasmian:Chrs + 0x10FB0, 0x10FCB, + // #116 (15452+174): sc=Common:Zyyy + 0x0000, 0x0040, 0x005B, 0x0060, 0x007B, 0x00A9, 0x00AB, 0x00B9, + 0x00BB, 0x00BF, 0x00D7, 0x00D7, 0x00F7, 0x00F7, 0x02B9, 0x02DF, + 0x02E5, 0x02E9, 0x02EC, 0x02FF, 0x0374, 0x0374, 0x037E, 0x037E, + 0x0385, 0x0385, 0x0387, 0x0387, 0x0605, 0x0605, 0x060C, 0x060C, + 0x061B, 0x061B, 0x061F, 0x061F, 0x0640, 0x0640, 0x06DD, 0x06DD, + 0x08E2, 0x08E2, 0x0964, 0x0965, 0x0E3F, 0x0E3F, 0x0FD5, 0x0FD8, + 0x10FB, 0x10FB, 0x16EB, 0x16ED, 0x1735, 0x1736, 0x1802, 0x1803, + 0x1805, 0x1805, 0x1CD3, 0x1CD3, 0x1CE1, 0x1CE1, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF7, 0x1CFA, 0x1CFA, 0x2000, 0x200B, + 0x200E, 0x2064, 0x2066, 0x2070, 0x2074, 0x207E, 0x2080, 0x208E, + 0x20A0, 0x20C0, 0x2100, 0x2125, 0x2127, 0x2129, 0x212C, 0x2131, + 0x2133, 0x214D, 0x214F, 0x215F, 0x2189, 0x218B, 0x2190, 0x2426, + 0x2440, 0x244A, 0x2460, 0x27FF, 0x2900, 0x2B73, 0x2B76, 0x2B95, + 0x2B97, 0x2BFF, 0x2E00, 0x2E5D, 0x2FF0, 0x2FFB, 0x3000, 0x3004, + 0x3006, 0x3006, 0x3008, 0x3020, 0x3030, 0x3037, 0x303C, 0x303F, + 0x309B, 0x309C, 0x30A0, 0x30A0, 0x30FB, 0x30FC, 0x3190, 0x319F, + 0x31C0, 0x31E3, 0x3220, 0x325F, 0x327F, 0x32CF, 0x32FF, 0x32FF, + 0x3358, 0x33FF, 0x4DC0, 0x4DFF, 0xA700, 0xA721, 0xA788, 0xA78A, + 0xA830, 0xA839, 0xA92E, 0xA92E, 0xA9CF, 0xA9CF, 0xAB5B, 0xAB5B, + 0xAB6A, 0xAB6B, 0xFD3E, 0xFD3F, 0xFE10, 0xFE19, 0xFE30, 0xFE52, + 0xFE54, 0xFE66, 0xFE68, 0xFE6B, 0xFEFF, 0xFEFF, 0xFF01, 0xFF20, + 0xFF3B, 0xFF40, 0xFF5B, 0xFF65, 0xFF70, 0xFF70, 0xFF9E, 0xFF9F, + 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, 0xFFF9, 0xFFFD, 0x10100, 0x10102, + 0x10107, 0x10133, 0x10137, 0x1013F, 0x10190, 0x1019C, 0x101D0, 0x101FC, + 0x102E1, 0x102FB, 0x1BCA0, 0x1BCA3, 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, + 0x1D100, 0x1D126, 0x1D129, 0x1D166, 0x1D16A, 0x1D17A, 0x1D183, 0x1D184, + 0x1D18C, 0x1D1A9, 0x1D1AE, 0x1D1EA, 0x1D2E0, 0x1D2F3, 0x1D300, 0x1D356, + 0x1D360, 0x1D378, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, + 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, + 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, + 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D7FF, 0x1EC71, 0x1ECB4, 0x1ED01, 0x1ED3D, + 0x1F000, 0x1F02B, 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, + 0x1F0C1, 0x1F0CF, 0x1F0D1, 0x1F0F5, 0x1F100, 0x1F1AD, 0x1F1E6, 0x1F1FF, + 0x1F201, 0x1F202, 0x1F210, 0x1F23B, 0x1F240, 0x1F248, 0x1F250, 0x1F251, + 0x1F260, 0x1F265, 0x1F300, 0x1F6D7, 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, + 0x1F700, 0x1F773, 0x1F780, 0x1F7D8, 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, + 0x1F800, 0x1F80B, 0x1F810, 0x1F847, 0x1F850, 0x1F859, 0x1F860, 0x1F887, + 0x1F890, 0x1F8AD, 0x1F8B0, 0x1F8B1, 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, + 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, + 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, + 0x1FAF0, 0x1FAF6, 0x1FB00, 0x1FB92, 0x1FB94, 0x1FBCA, 0x1FBF0, 0x1FBF9, + 0xE0001, 0xE0001, 0xE0020, 0xE007F, + // #117 (15626+3): sc=Coptic:Copt:Qaac + 0x03E2, 0x03EF, 0x2C80, 0x2CF3, 0x2CF9, 0x2CFF, + // #118 (15629+1): sc=Cypro_Minoan:Cpmn + 0x12F90, 0x12FF2, + // #119 (15630+4): sc=Cuneiform:Xsux scx=Cuneiform:Xsux + 0x12000, 0x12399, 0x12400, 0x1246E, 0x12470, 0x12474, 0x12480, 0x12543, + // #120 (15634+6): sc=Cypriot:Cprt + 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, + 0x1083C, 0x1083C, 0x1083F, 0x1083F, + // #121 (15640+8): sc=Cyrillic:Cyrl + 0x0400, 0x0484, 0x0487, 0x052F, 0x1C80, 0x1C88, 0x1D2B, 0x1D2B, + 0x1D78, 0x1D78, 0x2DE0, 0x2DFF, 0xA640, 0xA69F, 0xFE2E, 0xFE2F, + // #122 (15648+1): sc=Deseret:Dsrt scx=Deseret:Dsrt + 0x10400, 0x1044F, + // #123 (15649+4): sc=Devanagari:Deva + 0x0900, 0x0950, 0x0955, 0x0963, 0x0966, 0x097F, 0xA8E0, 0xA8FF, + // #124 (15653+8): sc=Dives_Akuru:Diak scx=Dives_Akuru:Diak + 0x11900, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, 0x11915, 0x11916, + 0x11918, 0x11935, 0x11937, 0x11938, 0x1193B, 0x11946, 0x11950, 0x11959, + // #125 (15661+1): sc=Dogra:Dogr + 0x11800, 0x1183B, + // #126 (15662+5): sc=Duployan:Dupl + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1BC9C, 0x1BC9F, + // #127 (15667+2): sc=Egyptian_Hieroglyphs:Egyp scx=Egyptian_Hieroglyphs:Egyp + 0x13000, 0x1342E, 0x13430, 0x13438, + // #128 (15669+1): sc=Elbasan:Elba scx=Elbasan:Elba + 0x10500, 0x10527, + // #129 (15670+1): sc=Elymaic:Elym scx=Elymaic:Elym + 0x10FE0, 0x10FF6, + // #130 (15671+36): sc=Ethiopic:Ethi scx=Ethiopic:Ethi + 0x1200, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x135D, 0x137C, 0x1380, 0x1399, 0x2D80, 0x2D96, 0x2DA0, 0x2DA6, + 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, + 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, 0xAB01, 0xAB06, + 0xAB09, 0xAB0E, 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, + 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, + // #131 (15707+10): sc=Georgian:Geor + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x10FF, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + // #132 (15717+6): sc=Glagolitic:Glag + 0x2C00, 0x2C5F, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, + // #133 (15723+1): sc=Gothic:Goth scx=Gothic:Goth + 0x10330, 0x1034A, + // #134 (15724+15): sc=Grantha:Gran + 0x11300, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133C, 0x11344, + 0x11347, 0x11348, 0x1134B, 0x1134D, 0x11350, 0x11350, 0x11357, 0x11357, + 0x1135D, 0x11363, 0x11366, 0x1136C, 0x11370, 0x11374, + // #135 (15739+36): sc=Greek:Grek + 0x0370, 0x0373, 0x0375, 0x0377, 0x037A, 0x037D, 0x037F, 0x037F, + 0x0384, 0x0384, 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, + 0x038E, 0x03A1, 0x03A3, 0x03E1, 0x03F0, 0x03FF, 0x1D26, 0x1D2A, + 0x1D5D, 0x1D61, 0x1D66, 0x1D6A, 0x1DBF, 0x1DBF, 0x1F00, 0x1F15, + 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, + 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, + 0x1F80, 0x1FB4, 0x1FB6, 0x1FC4, 0x1FC6, 0x1FD3, 0x1FD6, 0x1FDB, + 0x1FDD, 0x1FEF, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFE, 0x2126, 0x2126, + 0xAB65, 0xAB65, 0x10140, 0x1018E, 0x101A0, 0x101A0, 0x1D200, 0x1D245, + // #136 (15775+14): sc=Gujarati:Gujr + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AE6, 0x0AF1, 0x0AF9, 0x0AFF, + // #137 (15789+6): sc=Gunjala_Gondi:Gong + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, 0x11D90, 0x11D91, + 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, + // #138 (15795+16): sc=Gurmukhi:Guru + 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A76, + // #139 (15811+20): sc=Han:Hani + 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, 0x3005, 0x3005, + 0x3007, 0x3007, 0x3021, 0x3029, 0x3038, 0x303B, 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0x16FE2, 0x16FE3, + 0x16FF0, 0x16FF1, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, + 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #140 (15831+14): sc=Hangul:Hang + 0x1100, 0x11FF, 0x302E, 0x302F, 0x3131, 0x318E, 0x3200, 0x321E, + 0x3260, 0x327E, 0xA960, 0xA97C, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + // #141 (15845+2): sc=Hanifi_Rohingya:Rohg + 0x10D00, 0x10D27, 0x10D30, 0x10D39, + // #142 (15847+1): sc=Hanunoo:Hano + 0x1720, 0x1734, + // #143 (15848+3): sc=Hatran:Hatr scx=Hatran:Hatr + 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x108FB, 0x108FF, + // #144 (15851+9): sc=Hebrew:Hebr scx=Hebrew:Hebr + 0x0591, 0x05C7, 0x05D0, 0x05EA, 0x05EF, 0x05F4, 0xFB1D, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFB4F, + // #145 (15860+5): sc=Hiragana:Hira + 0x3041, 0x3096, 0x309D, 0x309F, 0x1B001, 0x1B11F, 0x1B150, 0x1B152, + 0x1F200, 0x1F200, + // #146 (15865+2): sc=Imperial_Aramaic:Armi scx=Imperial_Aramaic:Armi + 0x10840, 0x10855, 0x10857, 0x1085F, + // #147 (15867+29): sc=Inherited:Zinh:Qaai + 0x0300, 0x036F, 0x0485, 0x0486, 0x064B, 0x0655, 0x0670, 0x0670, + 0x0951, 0x0954, 0x1AB0, 0x1ACE, 0x1CD0, 0x1CD2, 0x1CD4, 0x1CE0, + 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, 0x1CF8, 0x1CF9, + 0x1DC0, 0x1DFF, 0x200C, 0x200D, 0x20D0, 0x20F0, 0x302A, 0x302D, + 0x3099, 0x309A, 0xFE00, 0xFE0F, 0xFE20, 0xFE2D, 0x101FD, 0x101FD, + 0x102E0, 0x102E0, 0x1133B, 0x1133B, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, + 0x1D167, 0x1D169, 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, + 0xE0100, 0xE01EF, + // #148 (15896+2): sc=Inscriptional_Pahlavi:Phli scx=Inscriptional_Pahlavi:Phli + 0x10B60, 0x10B72, 0x10B78, 0x10B7F, + // #149 (15898+2): sc=Inscriptional_Parthian:Prti scx=Inscriptional_Parthian:Prti + 0x10B40, 0x10B55, 0x10B58, 0x10B5F, + // #150 (15900+3): sc=Javanese:Java + 0xA980, 0xA9CD, 0xA9D0, 0xA9D9, 0xA9DE, 0xA9DF, + // #151 (15903+2): sc=Kaithi:Kthi + 0x11080, 0x110C2, 0x110CD, 0x110CD, + // #152 (15905+13): sc=Kannada:Knda + 0x0C80, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, + 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, + 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, + 0x0CF1, 0x0CF2, + // #153 (15918+13): sc=Katakana:Kana + 0x30A1, 0x30FA, 0x30FD, 0x30FF, 0x31F0, 0x31FF, 0x32D0, 0x32FE, + 0x3300, 0x3357, 0xFF66, 0xFF6F, 0xFF71, 0xFF9D, 0x1AFF0, 0x1AFF3, + 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B000, 0x1B120, 0x1B122, + 0x1B164, 0x1B167, + // #154 (15931+2): sc=Kayah_Li:Kali + 0xA900, 0xA92D, 0xA92F, 0xA92F, + // #155 (15933+8): sc=Kharoshthi:Khar scx=Kharoshthi:Khar + 0x10A00, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, 0x10A13, 0x10A15, 0x10A17, + 0x10A19, 0x10A35, 0x10A38, 0x10A3A, 0x10A3F, 0x10A48, 0x10A50, 0x10A58, + // #156 (15941+2): sc=Khitan_Small_Script:Kits scx=Khitan_Small_Script:Kits + 0x16FE4, 0x16FE4, 0x18B00, 0x18CD5, + // #157 (15943+4): sc=Khmer:Khmr scx=Khmer:Khmr + 0x1780, 0x17DD, 0x17E0, 0x17E9, 0x17F0, 0x17F9, 0x19E0, 0x19FF, + // #158 (15947+2): sc=Khojki:Khoj + 0x11200, 0x11211, 0x11213, 0x1123E, + // #159 (15949+2): sc=Khudawadi:Sind + 0x112B0, 0x112EA, 0x112F0, 0x112F9, + // #160 (15951+11): sc=Lao:Laoo scx=Lao:Laoo + 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, + 0x0EA5, 0x0EA5, 0x0EA7, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, + 0x0EC8, 0x0ECD, 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, + // #161 (15962+38): sc=Latin:Latn + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02B8, 0x02E0, 0x02E4, + 0x1D00, 0x1D25, 0x1D2C, 0x1D5C, 0x1D62, 0x1D65, 0x1D6B, 0x1D77, + 0x1D79, 0x1DBE, 0x1E00, 0x1EFF, 0x2071, 0x2071, 0x207F, 0x207F, + 0x2090, 0x209C, 0x212A, 0x212B, 0x2132, 0x2132, 0x214E, 0x214E, + 0x2160, 0x2188, 0x2C60, 0x2C7F, 0xA722, 0xA787, 0xA78B, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA7FF, + 0xAB30, 0xAB5A, 0xAB5C, 0xAB64, 0xAB66, 0xAB69, 0xFB00, 0xFB06, + 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x1DF00, 0x1DF1E, + // #162 (16000+3): sc=Lepcha:Lepc scx=Lepcha:Lepc + 0x1C00, 0x1C37, 0x1C3B, 0x1C49, 0x1C4D, 0x1C4F, + // #163 (16003+5): sc=Limbu:Limb + 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, 0x1940, 0x1940, + 0x1944, 0x194F, + // #164 (16008+3): sc=Linear_A:Lina + 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + // #165 (16011+7): sc=Linear_B:Linb + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, + // #166 (16018+2): sc=Lisu:Lisu scx=Lisu:Lisu + 0xA4D0, 0xA4FF, 0x11FB0, 0x11FB0, + // #167 (16020+1): sc=Lycian:Lyci scx=Lycian:Lyci + 0x10280, 0x1029C, + // #168 (16021+2): sc=Lydian:Lydi scx=Lydian:Lydi + 0x10920, 0x10939, 0x1093F, 0x1093F, + // #169 (16023+1): sc=Mahajani:Mahj + 0x11150, 0x11176, + // #170 (16024+1): sc=Makasar:Maka scx=Makasar:Maka + 0x11EE0, 0x11EF8, + // #171 (16025+7): sc=Malayalam:Mlym + 0x0D00, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D44, 0x0D46, 0x0D48, + 0x0D4A, 0x0D4F, 0x0D54, 0x0D63, 0x0D66, 0x0D7F, + // #172 (16032+2): sc=Mandaic:Mand + 0x0840, 0x085B, 0x085E, 0x085E, + // #173 (16034+2): sc=Manichaean:Mani + 0x10AC0, 0x10AE6, 0x10AEB, 0x10AF6, + // #174 (16036+3): sc=Marchen:Marc scx=Marchen:Marc + 0x11C70, 0x11C8F, 0x11C92, 0x11CA7, 0x11CA9, 0x11CB6, + // #175 (16039+7): sc=Masaram_Gondi:Gonm + 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D36, 0x11D3A, 0x11D3A, + 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, 0x11D50, 0x11D59, + // #176 (16046+1): sc=Medefaidrin:Medf scx=Medefaidrin:Medf + 0x16E40, 0x16E9A, + // #177 (16047+3): sc=Meetei_Mayek:Mtei scx=Meetei_Mayek:Mtei + 0xAAE0, 0xAAF6, 0xABC0, 0xABED, 0xABF0, 0xABF9, + // #178 (16050+2): sc=Mende_Kikakui:Mend scx=Mende_Kikakui:Mend + 0x1E800, 0x1E8C4, 0x1E8C7, 0x1E8D6, + // #179 (16052+3): sc=Meroitic_Cursive:Merc scx=Meroitic_Cursive:Merc + 0x109A0, 0x109B7, 0x109BC, 0x109CF, 0x109D2, 0x109FF, + // #180 (16055+1): sc=Meroitic_Hieroglyphs:Mero scx=Meroitic_Hieroglyphs:Mero + 0x10980, 0x1099F, + // #181 (16056+3): sc=Miao:Plrd scx=Miao:Plrd + 0x16F00, 0x16F4A, 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, + // #182 (16059+2): sc=Modi:Modi + 0x11600, 0x11644, 0x11650, 0x11659, + // #183 (16061+6): sc=Mongolian:Mong + 0x1800, 0x1801, 0x1804, 0x1804, 0x1806, 0x1819, 0x1820, 0x1878, + 0x1880, 0x18AA, 0x11660, 0x1166C, + // #184 (16067+3): sc=Mro:Mroo scx=Mro:Mroo + 0x16A40, 0x16A5E, 0x16A60, 0x16A69, 0x16A6E, 0x16A6F, + // #185 (16070+5): sc=Multani:Mult + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A9, + // #186 (16075+3): sc=Myanmar:Mymr + 0x1000, 0x109F, 0xA9E0, 0xA9FE, 0xAA60, 0xAA7F, + // #187 (16078+2): sc=Nabataean:Nbat scx=Nabataean:Nbat + 0x10880, 0x1089E, 0x108A7, 0x108AF, + // #188 (16080+3): sc=Nandinagari:Nand + 0x119A0, 0x119A7, 0x119AA, 0x119D7, 0x119DA, 0x119E4, + // #189 (16083+4): sc=New_Tai_Lue:Talu scx=New_Tai_Lue:Talu + 0x1980, 0x19AB, 0x19B0, 0x19C9, 0x19D0, 0x19DA, 0x19DE, 0x19DF, + // #190 (16087+2): sc=Newa:Newa scx=Newa:Newa + 0x11400, 0x1145B, 0x1145D, 0x11461, + // #191 (16089+2): sc=Nko:Nkoo + 0x07C0, 0x07FA, 0x07FD, 0x07FF, + // #192 (16091+2): sc=Nushu:Nshu scx=Nushu:Nshu + 0x16FE1, 0x16FE1, 0x1B170, 0x1B2FB, + // #193 (16093+4): sc=Nyiakeng_Puachue_Hmong:Hmnp scx=Nyiakeng_Puachue_Hmong:Hmnp + 0x1E100, 0x1E12C, 0x1E130, 0x1E13D, 0x1E140, 0x1E149, 0x1E14E, 0x1E14F, + // #194 (16097+1): sc=Ogham:Ogam scx=Ogham:Ogam + 0x1680, 0x169C, + // #195 (16098+1): sc=Ol_Chiki:Olck scx=Ol_Chiki:Olck + 0x1C50, 0x1C7F, + // #196 (16099+3): sc=Old_Hungarian:Hung scx=Old_Hungarian:Hung + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10CFA, 0x10CFF, + // #197 (16102+2): sc=Old_Italic:Ital scx=Old_Italic:Ital + 0x10300, 0x10323, 0x1032D, 0x1032F, + // #198 (16104+1): sc=Old_North_Arabian:Narb scx=Old_North_Arabian:Narb + 0x10A80, 0x10A9F, + // #199 (16105+1): sc=Old_Permic:Perm + 0x10350, 0x1037A, + // #200 (16106+2): sc=Old_Persian:Xpeo scx=Old_Persian:Xpeo + 0x103A0, 0x103C3, 0x103C8, 0x103D5, + // #201 (16108+1): sc=Old_Sogdian:Sogo scx=Old_Sogdian:Sogo + 0x10F00, 0x10F27, + // #202 (16109+1): sc=Old_South_Arabian:Sarb scx=Old_South_Arabian:Sarb + 0x10A60, 0x10A7F, + // #203 (16110+1): sc=Old_Turkic:Orkh scx=Old_Turkic:Orkh + 0x10C00, 0x10C48, + // #204 (16111+1): sc=Old_Uyghur:Ougr + 0x10F70, 0x10F89, + // #205 (16112+14): sc=Oriya:Orya + 0x0B01, 0x0B03, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, 0x0B3C, 0x0B44, + 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, + 0x0B5F, 0x0B63, 0x0B66, 0x0B77, + // #206 (16126+2): sc=Osage:Osge scx=Osage:Osge + 0x104B0, 0x104D3, 0x104D8, 0x104FB, + // #207 (16128+2): sc=Osmanya:Osma scx=Osmanya:Osma + 0x10480, 0x1049D, 0x104A0, 0x104A9, + // #208 (16130+5): sc=Pahawh_Hmong:Hmng scx=Pahawh_Hmong:Hmng + 0x16B00, 0x16B45, 0x16B50, 0x16B59, 0x16B5B, 0x16B61, 0x16B63, 0x16B77, + 0x16B7D, 0x16B8F, + // #209 (16135+1): sc=Palmyrene:Palm scx=Palmyrene:Palm + 0x10860, 0x1087F, + // #210 (16136+1): sc=Pau_Cin_Hau:Pauc scx=Pau_Cin_Hau:Pauc + 0x11AC0, 0x11AF8, + // #211 (16137+1): sc=Phags_Pa:Phag + 0xA840, 0xA877, + // #212 (16138+2): sc=Phoenician:Phnx scx=Phoenician:Phnx + 0x10900, 0x1091B, 0x1091F, 0x1091F, + // #213 (16140+3): sc=Psalter_Pahlavi:Phlp + 0x10B80, 0x10B91, 0x10B99, 0x10B9C, 0x10BA9, 0x10BAF, + // #214 (16143+2): sc=Rejang:Rjng scx=Rejang:Rjng + 0xA930, 0xA953, 0xA95F, 0xA95F, + // #215 (16145+2): sc=Runic:Runr scx=Runic:Runr + 0x16A0, 0x16EA, 0x16EE, 0x16F8, + // #216 (16147+2): sc=Samaritan:Samr scx=Samaritan:Samr + 0x0800, 0x082D, 0x0830, 0x083E, + // #217 (16149+2): sc=Saurashtra:Saur scx=Saurashtra:Saur + 0xA880, 0xA8C5, 0xA8CE, 0xA8D9, + // #218 (16151+1): sc=Sharada:Shrd + 0x11180, 0x111DF, + // #219 (16152+1): sc=Shavian:Shaw scx=Shavian:Shaw + 0x10450, 0x1047F, + // #220 (16153+2): sc=Siddham:Sidd scx=Siddham:Sidd + 0x11580, 0x115B5, 0x115B8, 0x115DD, + // #221 (16155+3): sc=SignWriting:Sgnw scx=SignWriting:Sgnw + 0x1D800, 0x1DA8B, 0x1DA9B, 0x1DA9F, 0x1DAA1, 0x1DAAF, + // #222 (16158+13): sc=Sinhala:Sinh + 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, + 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF4, + 0x111E1, 0x111F4, + // #223 (16171+1): sc=Sogdian:Sogd + 0x10F30, 0x10F59, + // #224 (16172+2): sc=Sora_Sompeng:Sora scx=Sora_Sompeng:Sora + 0x110D0, 0x110E8, 0x110F0, 0x110F9, + // #225 (16174+1): sc=Soyombo:Soyo scx=Soyombo:Soyo + 0x11A50, 0x11AA2, + // #226 (16175+2): sc=Sundanese:Sund scx=Sundanese:Sund + 0x1B80, 0x1BBF, 0x1CC0, 0x1CC7, + // #227 (16177+1): sc=Syloti_Nagri:Sylo + 0xA800, 0xA82C, + // #228 (16178+4): sc=Syriac:Syrc + 0x0700, 0x070D, 0x070F, 0x074A, 0x074D, 0x074F, 0x0860, 0x086A, + // #229 (16182+2): sc=Tagalog:Tglg + 0x1700, 0x1715, 0x171F, 0x171F, + // #230 (16184+3): sc=Tagbanwa:Tagb + 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + // #231 (16187+2): sc=Tai_Le:Tale + 0x1950, 0x196D, 0x1970, 0x1974, + // #232 (16189+5): sc=Tai_Tham:Lana scx=Tai_Tham:Lana + 0x1A20, 0x1A5E, 0x1A60, 0x1A7C, 0x1A7F, 0x1A89, 0x1A90, 0x1A99, + 0x1AA0, 0x1AAD, + // #233 (16194+2): sc=Tai_Viet:Tavt scx=Tai_Viet:Tavt + 0xAA80, 0xAAC2, 0xAADB, 0xAADF, + // #234 (16196+2): sc=Takri:Takr + 0x11680, 0x116B9, 0x116C0, 0x116C9, + // #235 (16198+18): sc=Tamil:Taml + 0x0B82, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, + 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, + 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, + 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, 0x0BE6, 0x0BFA, + 0x11FC0, 0x11FF1, 0x11FFF, 0x11FFF, + // #236 (16216+2): sc=Tangsa:Tnsa scx=Tangsa:Tnsa + 0x16A70, 0x16ABE, 0x16AC0, 0x16AC9, + // #237 (16218+4): sc=Tangut:Tang scx=Tangut:Tang + 0x16FE0, 0x16FE0, 0x17000, 0x187F7, 0x18800, 0x18AFF, 0x18D00, 0x18D08, + // #238 (16222+13): sc=Telugu:Telu + 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C39, + 0x0C3C, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, + 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, 0x0C66, 0x0C6F, + 0x0C77, 0x0C7F, + // #239 (16235+1): sc=Thaana:Thaa + 0x0780, 0x07B1, + // #240 (16236+2): sc=Thai:Thai scx=Thai:Thai + 0x0E01, 0x0E3A, 0x0E40, 0x0E5B, + // #241 (16238+7): sc=Tibetan:Tibt scx=Tibetan:Tibt + 0x0F00, 0x0F47, 0x0F49, 0x0F6C, 0x0F71, 0x0F97, 0x0F99, 0x0FBC, + 0x0FBE, 0x0FCC, 0x0FCE, 0x0FD4, 0x0FD9, 0x0FDA, + // #242 (16245+3): sc=Tifinagh:Tfng scx=Tifinagh:Tfng + 0x2D30, 0x2D67, 0x2D6F, 0x2D70, 0x2D7F, 0x2D7F, + // #243 (16248+2): sc=Tirhuta:Tirh + 0x11480, 0x114C7, 0x114D0, 0x114D9, + // #244 (16250+1): sc=Toto scx=Toto + 0x1E290, 0x1E2AE, + // #245 (16251+2): sc=Ugaritic:Ugar scx=Ugaritic:Ugar + 0x10380, 0x1039D, 0x1039F, 0x1039F, + // #246 (16253+1): sc=Vai:Vaii scx=Vai:Vaii + 0xA500, 0xA62B, + // #247 (16254+8): sc=Vithkuqi:Vith scx=Vithkuqi:Vith + 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, + 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, + // #248 (16262+2): sc=Wancho:Wcho scx=Wancho:Wcho + 0x1E2C0, 0x1E2F9, 0x1E2FF, 0x1E2FF, + // #249 (16264+2): sc=Warang_Citi:Wara scx=Warang_Citi:Wara + 0x118A0, 0x118F2, 0x118FF, 0x118FF, + // #250 (16266+3): sc=Yezidi:Yezi + 0x10E80, 0x10EA9, 0x10EAB, 0x10EAD, 0x10EB0, 0x10EB1, + // #251 (16269+2): sc=Yi:Yiii + 0xA000, 0xA48C, 0xA490, 0xA4C6, + // #252 (16271+1): sc=Zanabazar_Square:Zanb scx=Zanabazar_Square:Zanb + 0x11A00, 0x11A47, + // #253 (16272+5): scx=Adlam:Adlm + 0x061F, 0x061F, 0x0640, 0x0640, 0x1E900, 0x1E94B, 0x1E950, 0x1E959, + 0x1E95E, 0x1E95F, + // #254 (16277+51): scx=Arabic:Arab + 0x0600, 0x0604, 0x0606, 0x06DC, 0x06DE, 0x06FF, 0x0750, 0x077F, + 0x0870, 0x088E, 0x0890, 0x0891, 0x0898, 0x08E1, 0x08E3, 0x08FF, + 0xFB50, 0xFBC2, 0xFBD3, 0xFD8F, 0xFD92, 0xFDC7, 0xFDCF, 0xFDCF, + 0xFDF0, 0xFDFF, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0x102E0, 0x102FB, + 0x10E60, 0x10E7E, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, + // #255 (16328+26): scx=Bengali:Beng + 0x0951, 0x0952, 0x0964, 0x0965, 0x0980, 0x0983, 0x0985, 0x098C, + 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, + 0x09B6, 0x09B9, 0x09BC, 0x09C4, 0x09C7, 0x09C8, 0x09CB, 0x09CE, + 0x09D7, 0x09D7, 0x09DC, 0x09DD, 0x09DF, 0x09E3, 0x09E6, 0x09FE, + 0x1CD0, 0x1CD0, 0x1CD2, 0x1CD2, 0x1CD5, 0x1CD6, 0x1CD8, 0x1CD8, + 0x1CE1, 0x1CE1, 0x1CEA, 0x1CEA, 0x1CED, 0x1CED, 0x1CF2, 0x1CF2, + 0x1CF5, 0x1CF7, 0xA8F1, 0xA8F1, + // #256 (16354+12): scx=Bopomofo:Bopo + 0x02EA, 0x02EB, 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, + 0x302A, 0x302D, 0x3030, 0x3030, 0x3037, 0x3037, 0x30FB, 0x30FB, + 0x3105, 0x312F, 0x31A0, 0x31BF, 0xFE45, 0xFE46, 0xFF61, 0xFF65, + // #257 (16366+3): scx=Buginese:Bugi + 0x1A00, 0x1A1B, 0x1A1E, 0x1A1F, 0xA9CF, 0xA9CF, + // #258 (16369+2): scx=Buhid:Buhd + 0x1735, 0x1736, 0x1740, 0x1753, + // #259 (16371+4): scx=Chakma:Cakm + 0x09E6, 0x09EF, 0x1040, 0x1049, 0x11100, 0x11134, 0x11136, 0x11147, + // #260 (16375+148): scx=Common:Zyyy + 0x0000, 0x0040, 0x005B, 0x0060, 0x007B, 0x00A9, 0x00AB, 0x00B9, + 0x00BB, 0x00BF, 0x00D7, 0x00D7, 0x00F7, 0x00F7, 0x02B9, 0x02DF, + 0x02E5, 0x02E9, 0x02EC, 0x02FF, 0x0374, 0x0374, 0x037E, 0x037E, + 0x0385, 0x0385, 0x0387, 0x0387, 0x0605, 0x0605, 0x06DD, 0x06DD, + 0x08E2, 0x08E2, 0x0E3F, 0x0E3F, 0x0FD5, 0x0FD8, 0x16EB, 0x16ED, + 0x2000, 0x200B, 0x200E, 0x202E, 0x2030, 0x2064, 0x2066, 0x2070, + 0x2074, 0x207E, 0x2080, 0x208E, 0x20A0, 0x20C0, 0x2100, 0x2125, + 0x2127, 0x2129, 0x212C, 0x2131, 0x2133, 0x214D, 0x214F, 0x215F, + 0x2189, 0x218B, 0x2190, 0x2426, 0x2440, 0x244A, 0x2460, 0x27FF, + 0x2900, 0x2B73, 0x2B76, 0x2B95, 0x2B97, 0x2BFF, 0x2E00, 0x2E42, + 0x2E44, 0x2E5D, 0x2FF0, 0x2FFB, 0x3000, 0x3000, 0x3004, 0x3004, + 0x3012, 0x3012, 0x3020, 0x3020, 0x3036, 0x3036, 0x3248, 0x325F, + 0x327F, 0x327F, 0x32B1, 0x32BF, 0x32CC, 0x32CF, 0x3371, 0x337A, + 0x3380, 0x33DF, 0x33FF, 0x33FF, 0x4DC0, 0x4DFF, 0xA708, 0xA721, + 0xA788, 0xA78A, 0xAB5B, 0xAB5B, 0xAB6A, 0xAB6B, 0xFE10, 0xFE19, + 0xFE30, 0xFE44, 0xFE47, 0xFE52, 0xFE54, 0xFE66, 0xFE68, 0xFE6B, + 0xFEFF, 0xFEFF, 0xFF01, 0xFF20, 0xFF3B, 0xFF40, 0xFF5B, 0xFF60, + 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, 0xFFF9, 0xFFFD, 0x10190, 0x1019C, + 0x101D0, 0x101FC, 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, 0x1D100, 0x1D126, + 0x1D129, 0x1D166, 0x1D16A, 0x1D17A, 0x1D183, 0x1D184, 0x1D18C, 0x1D1A9, + 0x1D1AE, 0x1D1EA, 0x1D2E0, 0x1D2F3, 0x1D300, 0x1D356, 0x1D372, 0x1D378, + 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, + 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, + 0x1D7CE, 0x1D7FF, 0x1EC71, 0x1ECB4, 0x1ED01, 0x1ED3D, 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, 0x1F100, 0x1F1AD, 0x1F1E6, 0x1F1FF, 0x1F201, 0x1F202, + 0x1F210, 0x1F23B, 0x1F240, 0x1F248, 0x1F260, 0x1F265, 0x1F300, 0x1F6D7, + 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, 0x1F700, 0x1F773, 0x1F780, 0x1F7D8, + 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F800, 0x1F80B, 0x1F810, 0x1F847, + 0x1F850, 0x1F859, 0x1F860, 0x1F887, 0x1F890, 0x1F8AD, 0x1F8B0, 0x1F8B1, + 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, + 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, + 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, 0x1FB00, 0x1FB92, + 0x1FB94, 0x1FBCA, 0x1FBF0, 0x1FBF9, 0xE0001, 0xE0001, 0xE0020, 0xE007F, + // #261 (16523+4): scx=Coptic:Copt:Qaac + 0x03E2, 0x03EF, 0x2C80, 0x2CF3, 0x2CF9, 0x2CFF, 0x102E0, 0x102FB, + // #262 (16527+2): scx=Cypro_Minoan:Cpmn + 0x10100, 0x10101, 0x12F90, 0x12FF2, + // #263 (16529+9): scx=Cypriot:Cprt + 0x10100, 0x10102, 0x10107, 0x10133, 0x10137, 0x1013F, 0x10800, 0x10805, + 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, + 0x1083F, 0x1083F, + // #264 (16538+9): scx=Cyrillic:Cyrl + 0x0400, 0x052F, 0x1C80, 0x1C88, 0x1D2B, 0x1D2B, 0x1D78, 0x1D78, + 0x1DF8, 0x1DF8, 0x2DE0, 0x2DFF, 0x2E43, 0x2E43, 0xA640, 0xA69F, + 0xFE2E, 0xFE2F, + // #265 (16547+7): scx=Devanagari:Deva + 0x0900, 0x0952, 0x0955, 0x097F, 0x1CD0, 0x1CF6, 0x1CF8, 0x1CF9, + 0x20F0, 0x20F0, 0xA830, 0xA839, 0xA8E0, 0xA8FF, + // #266 (16554+3): scx=Dogra:Dogr + 0x0964, 0x096F, 0xA830, 0xA839, 0x11800, 0x1183B, + // #267 (16557+5): scx=Duployan:Dupl + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1BC9C, 0x1BCA3, + // #268 (16562+9): scx=Georgian:Geor + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FF, + 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, + // #269 (16571+10): scx=Glagolitic:Glag + 0x0484, 0x0484, 0x0487, 0x0487, 0x2C00, 0x2C5F, 0x2E43, 0x2E43, + 0xA66F, 0xA66F, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, + // #270 (16581+25): scx=Grantha:Gran + 0x0951, 0x0952, 0x0964, 0x0965, 0x0BE6, 0x0BF3, 0x1CD0, 0x1CD0, + 0x1CD2, 0x1CD3, 0x1CF2, 0x1CF4, 0x1CF8, 0x1CF9, 0x20F0, 0x20F0, + 0x11300, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133B, 0x11344, + 0x11347, 0x11348, 0x1134B, 0x1134D, 0x11350, 0x11350, 0x11357, 0x11357, + 0x1135D, 0x11363, 0x11366, 0x1136C, 0x11370, 0x11374, 0x11FD0, 0x11FD1, + 0x11FD3, 0x11FD3, + // #271 (16606+38): scx=Greek:Grek + 0x0342, 0x0342, 0x0345, 0x0345, 0x0370, 0x0373, 0x0375, 0x0377, + 0x037A, 0x037D, 0x037F, 0x037F, 0x0384, 0x0384, 0x0386, 0x0386, + 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03E1, + 0x03F0, 0x03FF, 0x1D26, 0x1D2A, 0x1D5D, 0x1D61, 0x1D66, 0x1D6A, + 0x1DBF, 0x1DC1, 0x1F00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FC4, + 0x1FC6, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FDD, 0x1FEF, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FFE, 0x2126, 0x2126, 0xAB65, 0xAB65, 0x10140, 0x1018E, + 0x101A0, 0x101A0, 0x1D200, 0x1D245, + // #272 (16644+17): scx=Gujarati:Gujr + 0x0951, 0x0952, 0x0964, 0x0965, 0x0A81, 0x0A83, 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, + 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, 0x0AE6, 0x0AF1, 0x0AF9, 0x0AFF, + 0xA830, 0xA839, + // #273 (16661+7): scx=Gunjala_Gondi:Gong + 0x0964, 0x0965, 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, + 0x11D90, 0x11D91, 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, + // #274 (16668+19): scx=Gurmukhi:Guru + 0x0951, 0x0952, 0x0964, 0x0965, 0x0A01, 0x0A03, 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, + 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, + 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, 0x0A51, 0x0A51, 0x0A59, 0x0A5C, + 0x0A5E, 0x0A5E, 0x0A66, 0x0A76, 0xA830, 0xA839, + // #275 (16687+37): scx=Han:Hani + 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, 0x3001, 0x3003, + 0x3005, 0x3011, 0x3013, 0x301F, 0x3021, 0x302D, 0x3030, 0x3030, + 0x3037, 0x303F, 0x30FB, 0x30FB, 0x3190, 0x319F, 0x31C0, 0x31E3, + 0x3220, 0x3247, 0x3280, 0x32B0, 0x32C0, 0x32CB, 0x32FF, 0x32FF, + 0x3358, 0x3370, 0x337B, 0x337F, 0x33E0, 0x33FE, 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, 0xA700, 0xA707, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, + 0xFE45, 0xFE46, 0xFF61, 0xFF65, 0x16FE2, 0x16FE3, 0x16FF0, 0x16FF1, + 0x1D360, 0x1D371, 0x1F250, 0x1F251, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, + 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + // #276 (16724+21): scx=Hangul:Hang + 0x1100, 0x11FF, 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, + 0x302E, 0x3030, 0x3037, 0x3037, 0x30FB, 0x30FB, 0x3131, 0x318E, + 0x3200, 0x321E, 0x3260, 0x327E, 0xA960, 0xA97C, 0xAC00, 0xD7A3, + 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xFE45, 0xFE46, 0xFF61, 0xFF65, + 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, + 0xFFDA, 0xFFDC, + // #277 (16745+7): scx=Hanifi_Rohingya:Rohg + 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x0640, 0x0640, + 0x06D4, 0x06D4, 0x10D00, 0x10D27, 0x10D30, 0x10D39, + // #278 (16752+1): scx=Hanunoo:Hano + 0x1720, 0x1736, + // #279 (16753+16): scx=Hiragana:Hira + 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x3030, 0x3035, + 0x3037, 0x3037, 0x303C, 0x303D, 0x3041, 0x3096, 0x3099, 0x30A0, + 0x30FB, 0x30FC, 0xFE45, 0xFE46, 0xFF61, 0xFF65, 0xFF70, 0xFF70, + 0xFF9E, 0xFF9F, 0x1B001, 0x1B11F, 0x1B150, 0x1B152, 0x1F200, 0x1F200, + // #280 (16769+20): scx=Inherited:Zinh:Qaai + 0x0300, 0x0341, 0x0343, 0x0344, 0x0346, 0x0362, 0x0953, 0x0954, + 0x1AB0, 0x1ACE, 0x1DC2, 0x1DF7, 0x1DF9, 0x1DF9, 0x1DFB, 0x1DFF, + 0x200C, 0x200D, 0x20D0, 0x20EF, 0xFE00, 0xFE0F, 0xFE20, 0xFE2D, + 0x101FD, 0x101FD, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, + 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0xE0100, 0xE01EF, + // #281 (16789+3): scx=Javanese:Java + 0xA980, 0xA9CD, 0xA9CF, 0xA9D9, 0xA9DE, 0xA9DF, + // #282 (16792+4): scx=Kaithi:Kthi + 0x0966, 0x096F, 0xA830, 0xA839, 0x11080, 0x110C2, 0x110CD, 0x110CD, + // #283 (16796+21): scx=Kannada:Knda + 0x0951, 0x0952, 0x0964, 0x0965, 0x0C80, 0x0C8C, 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, + 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x1CD0, 0x1CD0, + 0x1CD2, 0x1CD2, 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, 0x1CF4, 0x1CF4, + 0xA830, 0xA835, + // #284 (16817+19): scx=Katakana:Kana + 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x3030, 0x3035, + 0x3037, 0x3037, 0x303C, 0x303D, 0x3099, 0x309C, 0x30A0, 0x30FF, + 0x31F0, 0x31FF, 0x32D0, 0x32FE, 0x3300, 0x3357, 0xFE45, 0xFE46, + 0xFF61, 0xFF9F, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, + 0x1B000, 0x1B000, 0x1B120, 0x1B122, 0x1B164, 0x1B167, + // #285 (16836+1): scx=Kayah_Li:Kali + 0xA900, 0xA92F, + // #286 (16837+4): scx=Khojki:Khoj + 0x0AE6, 0x0AEF, 0xA830, 0xA839, 0x11200, 0x11211, 0x11213, 0x1123E, + // #287 (16841+4): scx=Khudawadi:Sind + 0x0964, 0x0965, 0xA830, 0xA839, 0x112B0, 0x112EA, 0x112F0, 0x112F9, + // #288 (16845+46): scx=Latin:Latn + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02B8, 0x02E0, 0x02E4, + 0x0363, 0x036F, 0x0485, 0x0486, 0x0951, 0x0952, 0x10FB, 0x10FB, + 0x1D00, 0x1D25, 0x1D2C, 0x1D5C, 0x1D62, 0x1D65, 0x1D6B, 0x1D77, + 0x1D79, 0x1DBE, 0x1E00, 0x1EFF, 0x202F, 0x202F, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x20F0, 0x20F0, 0x212A, 0x212B, + 0x2132, 0x2132, 0x214E, 0x214E, 0x2160, 0x2188, 0x2C60, 0x2C7F, + 0xA700, 0xA707, 0xA722, 0xA787, 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, + 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA7FF, 0xA92E, 0xA92E, + 0xAB30, 0xAB5A, 0xAB5C, 0xAB64, 0xAB66, 0xAB69, 0xFB00, 0xFB06, + 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x1DF00, 0x1DF1E, + // #289 (16891+6): scx=Limbu:Limb + 0x0965, 0x0965, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, + 0x1940, 0x1940, 0x1944, 0x194F, + // #290 (16897+4): scx=Linear_A:Lina + 0x10107, 0x10133, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + // #291 (16901+10): scx=Linear_B:Linb + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10100, 0x10102, + 0x10107, 0x10133, 0x10137, 0x1013F, + // #292 (16911+3): scx=Mahajani:Mahj + 0x0964, 0x096F, 0xA830, 0xA839, 0x11150, 0x11176, + // #293 (16914+11): scx=Malayalam:Mlym + 0x0951, 0x0952, 0x0964, 0x0965, 0x0D00, 0x0D0C, 0x0D0E, 0x0D10, + 0x0D12, 0x0D44, 0x0D46, 0x0D48, 0x0D4A, 0x0D4F, 0x0D54, 0x0D63, + 0x0D66, 0x0D7F, 0x1CDA, 0x1CDA, 0xA830, 0xA832, + // #294 (16925+3): scx=Mandaic:Mand + 0x0640, 0x0640, 0x0840, 0x085B, 0x085E, 0x085E, + // #295 (16928+3): scx=Manichaean:Mani + 0x0640, 0x0640, 0x10AC0, 0x10AE6, 0x10AEB, 0x10AF6, + // #296 (16931+8): scx=Masaram_Gondi:Gonm + 0x0964, 0x0965, 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D36, + 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, 0x11D50, 0x11D59, + // #297 (16939+3): scx=Modi:Modi + 0xA830, 0xA839, 0x11600, 0x11644, 0x11650, 0x11659, + // #298 (16942+5): scx=Mongolian:Mong + 0x1800, 0x1819, 0x1820, 0x1878, 0x1880, 0x18AA, 0x202F, 0x202F, + 0x11660, 0x1166C, + // #299 (16947+6): scx=Multani:Mult + 0x0A66, 0x0A6F, 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, + 0x1128F, 0x1129D, 0x1129F, 0x112A9, + // #300 (16953+4): scx=Myanmar:Mymr + 0x1000, 0x109F, 0xA92E, 0xA92E, 0xA9E0, 0xA9FE, 0xAA60, 0xAA7F, + // #301 (16957+9): scx=Nandinagari:Nand + 0x0964, 0x0965, 0x0CE6, 0x0CEF, 0x1CE9, 0x1CE9, 0x1CF2, 0x1CF2, + 0x1CFA, 0x1CFA, 0xA830, 0xA835, 0x119A0, 0x119A7, 0x119AA, 0x119D7, + 0x119DA, 0x119E4, + // #302 (16966+6): scx=Nko:Nkoo + 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x07C0, 0x07FA, + 0x07FD, 0x07FF, 0xFD3E, 0xFD3F, + // #303 (16972+2): scx=Old_Permic:Perm + 0x0483, 0x0483, 0x10350, 0x1037A, + // #304 (16974+3): scx=Old_Uyghur:Ougr + 0x0640, 0x0640, 0x10AF2, 0x10AF2, 0x10F70, 0x10F89, + // #305 (16977+18): scx=Oriya:Orya + 0x0951, 0x0952, 0x0964, 0x0965, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3C, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, + 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B66, 0x0B77, + 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, + // #306 (16995+3): scx=Phags_Pa:Phag + 0x1802, 0x1803, 0x1805, 0x1805, 0xA840, 0xA877, + // #307 (16998+4): scx=Psalter_Pahlavi:Phlp + 0x0640, 0x0640, 0x10B80, 0x10B91, 0x10B99, 0x10B9C, 0x10BA9, 0x10BAF, + // #308 (17002+6): scx=Sharada:Shrd + 0x0951, 0x0951, 0x1CD7, 0x1CD7, 0x1CD9, 0x1CD9, 0x1CDC, 0x1CDD, + 0x1CE0, 0x1CE0, 0x11180, 0x111DF, + // #309 (17008+14): scx=Sinhala:Sinh + 0x0964, 0x0965, 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, + 0x0DCF, 0x0DD4, 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, + 0x0DF2, 0x0DF4, 0x111E1, 0x111F4, + // #310 (17022+2): scx=Sogdian:Sogd + 0x0640, 0x0640, 0x10F30, 0x10F59, + // #311 (17024+3): scx=Syloti_Nagri:Sylo + 0x0964, 0x0965, 0x09E6, 0x09EF, 0xA800, 0xA82C, + // #312 (17027+12): scx=Syriac:Syrc + 0x060C, 0x060C, 0x061B, 0x061C, 0x061F, 0x061F, 0x0640, 0x0640, + 0x064B, 0x0655, 0x0670, 0x0670, 0x0700, 0x070D, 0x070F, 0x074A, + 0x074D, 0x074F, 0x0860, 0x086A, 0x1DF8, 0x1DF8, 0x1DFA, 0x1DFA, + // #313 (17039+3): scx=Tagalog:Tglg + 0x1700, 0x1715, 0x171F, 0x171F, 0x1735, 0x1736, + // #314 (17042+4): scx=Tagbanwa:Tagb + 0x1735, 0x1736, 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + // #315 (17046+3): scx=Tai_Le:Tale + 0x1040, 0x1049, 0x1950, 0x196D, 0x1970, 0x1974, + // #316 (17049+4): scx=Takri:Takr + 0x0964, 0x0965, 0xA830, 0xA839, 0x11680, 0x116B9, 0x116C0, 0x116C9, + // #317 (17053+25): scx=Tamil:Taml + 0x0951, 0x0952, 0x0964, 0x0965, 0x0B82, 0x0B83, 0x0B85, 0x0B8A, + 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, + 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, + 0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, + 0x0BD7, 0x0BD7, 0x0BE6, 0x0BFA, 0x1CDA, 0x1CDA, 0xA8F3, 0xA8F3, + 0x11301, 0x11301, 0x11303, 0x11303, 0x1133B, 0x1133C, 0x11FC0, 0x11FF1, + 0x11FFF, 0x11FFF, + // #318 (17078+17): scx=Telugu:Telu + 0x0951, 0x0952, 0x0964, 0x0965, 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3C, 0x0C44, 0x0C46, 0x0C48, + 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, + 0x0C60, 0x0C63, 0x0C66, 0x0C6F, 0x0C77, 0x0C7F, 0x1CDA, 0x1CDA, + 0x1CF2, 0x1CF2, + // #319 (17095+7): scx=Thaana:Thaa + 0x060C, 0x060C, 0x061B, 0x061C, 0x061F, 0x061F, 0x0660, 0x0669, + 0x0780, 0x07B1, 0xFDF2, 0xFDF2, 0xFDFD, 0xFDFD, + // #320 (17102+6): scx=Tirhuta:Tirh + 0x0951, 0x0952, 0x0964, 0x0965, 0x1CF2, 0x1CF2, 0xA830, 0xA839, + 0x11480, 0x114C7, 0x114D0, 0x114D9, + // #321 (17108+7): scx=Yezidi:Yezi + 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x0660, 0x0669, + 0x10E80, 0x10EA9, 0x10EAB, 0x10EAD, 0x10EB0, 0x10EB1, + // #322 (17115+7): scx=Yi:Yiii + 0x3001, 0x3002, 0x3008, 0x3011, 0x3014, 0x301B, 0x30FB, 0x30FB, + 0xA000, 0xA48C, 0xA490, 0xA4C6, 0xFF61, 0xFF65 +}; + +template +const T5 unicode_property_data::rangenumbertable[] = +{ + { ptype::unknown, "*", 0 }, // #0 + { ptype::general_category, "Other:C", 1 }, // #1 + { ptype::general_category, "Control:Cc:cntrl", 2 }, // #2 + { ptype::general_category, "Format:Cf", 3 }, // #3 + { ptype::general_category, "Unassigned:Cn", 4 }, // #4 + { ptype::general_category, "Private_Use:Co", 5 }, // #5 + { ptype::general_category, "Surrogate:Cs", 6 }, // #6 + { ptype::general_category, "Letter:L", 7 }, // #7 + { ptype::general_category, "Cased_Letter:LC", 8 }, // #8 + { ptype::general_category, "Lowercase_Letter:Ll", 9 }, // #9 + { ptype::general_category, "Titlecase_Letter:Lt", 10 }, // #10 + { ptype::general_category, "Uppercase_Letter:Lu", 11 }, // #11 + { ptype::general_category, "Modifier_Letter:Lm", 12 }, // #12 + { ptype::general_category, "Other_Letter:Lo", 13 }, // #13 + { ptype::general_category, "Mark:M:Combining_Mark", 14 }, // #14 + { ptype::general_category, "Spacing_Mark:Mc", 15 }, // #15 + { ptype::general_category, "Enclosing_Mark:Me", 16 }, // #16 + { ptype::general_category, "Nonspacing_Mark:Mn", 17 }, // #17 + { ptype::general_category, "Number:N", 18 }, // #18 + { ptype::general_category, "Decimal_Number:Nd:digit", 19 }, // #19 + { ptype::general_category, "Letter_Number:Nl", 20 }, // #20 + { ptype::general_category, "Other_Number:No", 21 }, // #21 + { ptype::general_category, "Punctuation:P:punct", 22 }, // #22 + { ptype::general_category, "Connector_Punctuation:Pc", 23 }, // #23 + { ptype::general_category, "Dash_Punctuation:Pd", 24 }, // #24 + { ptype::general_category, "Close_Punctuation:Pe", 25 }, // #25 + { ptype::general_category, "Final_Punctuation:Pf", 26 }, // #26 + { ptype::general_category, "Initial_Punctuation:Pi", 27 }, // #27 + { ptype::general_category, "Other_Punctuation:Po", 28 }, // #28 + { ptype::general_category, "Open_Punctuation:Ps", 29 }, // #29 + { ptype::general_category, "Symbol:S", 30 }, // #30 + { ptype::general_category, "Currency_Symbol:Sc", 31 }, // #31 + { ptype::general_category, "Modifier_Symbol:Sk", 32 }, // #32 + { ptype::general_category, "Math_Symbol:Sm", 33 }, // #33 + { ptype::general_category, "Other_Symbol:So", 34 }, // #34 + { ptype::general_category, "Separator:Z", 35 }, // #35 + { ptype::general_category, "Line_Separator:Zl", 36 }, // #36 + { ptype::general_category, "Paragraph_Separator:Zp", 37 }, // #37 + { ptype::general_category, "Space_Separator:Zs", 38 }, // #38 + { ptype::binary, "ASCII", 39 }, // #39 + { ptype::binary, "ASCII_Hex_Digit:AHex", 40 }, // #40 + { ptype::binary, "Alphabetic:Alpha", 41 }, // #41 + { ptype::binary, "Any", 42 }, // #42 + { ptype::binary, "Assigned", 43 }, // #43 + { ptype::binary, "Bidi_Control:Bidi_C", 44 }, // #44 + { ptype::binary, "Bidi_Mirrored:Bidi_M", 45 }, // #45 + { ptype::binary, "Case_Ignorable:CI", 46 }, // #46 + { ptype::binary, "Cased", 47 }, // #47 + { ptype::binary, "Changes_When_Casefolded:CWCF", 48 }, // #48 + { ptype::binary, "Changes_When_Casemapped:CWCM", 49 }, // #49 + { ptype::binary, "Changes_When_Lowercased:CWL", 50 }, // #50 + { ptype::binary, "Changes_When_NFKC_Casefolded:CWKCF", 51 }, // #51 + { ptype::binary, "Changes_When_Titlecased:CWT", 52 }, // #52 + { ptype::binary, "Changes_When_Uppercased:CWU", 53 }, // #53 + { ptype::binary, "Dash", 54 }, // #54 + { ptype::binary, "Default_Ignorable_Code_Point:DI", 55 }, // #55 + { ptype::binary, "Deprecated:Dep", 56 }, // #56 + { ptype::binary, "Diacritic:Dia", 57 }, // #57 + { ptype::binary, "Emoji", 58 }, // #58 + { ptype::binary, "Emoji_Component:EComp", 59 }, // #59 + { ptype::binary, "Emoji_Modifier:EMod", 60 }, // #60 + { ptype::binary, "Emoji_Modifier_Base:EBase", 61 }, // #61 + { ptype::binary, "Emoji_Presentation:EPres", 62 }, // #62 + { ptype::binary, "Extended_Pictographic:ExtPict", 63 }, // #63 + { ptype::binary, "Extender:Ext", 64 }, // #64 + { ptype::binary, "Grapheme_Base:Gr_Base", 65 }, // #65 + { ptype::binary, "Grapheme_Extend:Gr_Ext", 66 }, // #66 + { ptype::binary, "Hex_Digit:Hex", 67 }, // #67 + { ptype::binary, "IDS_Binary_Operator:IDSB", 68 }, // #68 + { ptype::binary, "IDS_Trinary_Operator:IDST", 69 }, // #69 + { ptype::binary, "ID_Continue:IDC", 70 }, // #70 + { ptype::binary, "ID_Start:IDS", 71 }, // #71 + { ptype::binary, "Ideographic:Ideo", 72 }, // #72 + { ptype::binary, "Join_Control:Join_C", 73 }, // #73 + { ptype::binary, "Logical_Order_Exception:LOE", 74 }, // #74 + { ptype::binary, "Lowercase:Lower", 75 }, // #75 + { ptype::binary, "Math", 76 }, // #76 + { ptype::binary, "Noncharacter_Code_Point:NChar", 77 }, // #77 + { ptype::binary, "Pattern_Syntax:Pat_Syn", 78 }, // #78 + { ptype::binary, "Pattern_White_Space:Pat_WS", 79 }, // #79 + { ptype::binary, "Quotation_Mark:QMark", 80 }, // #80 + { ptype::binary, "Radical", 81 }, // #81 + { ptype::binary, "Regional_Indicator:RI", 82 }, // #82 + { ptype::binary, "Sentence_Terminal:STerm", 83 }, // #83 + { ptype::binary, "Soft_Dotted:SD", 84 }, // #84 + { ptype::binary, "Terminal_Punctuation:Term", 85 }, // #85 + { ptype::binary, "Unified_Ideograph:UIdeo", 86 }, // #86 + { ptype::binary, "Uppercase:Upper", 87 }, // #87 + { ptype::binary, "Variation_Selector:VS", 88 }, // #88 + { ptype::binary, "White_Space:space", 89 }, // #89 + { ptype::binary, "XID_Continue:XIDC", 90 }, // #90 + { ptype::binary, "XID_Start:XIDS", 91 }, // #91 + { ptype::script, "Adlam:Adlm", 92 }, // #92 + { ptype::script, "Ahom:Ahom", 93 }, // #93 + { ptype::script, "Anatolian_Hieroglyphs:Hluw", 94 }, // #94 + { ptype::script, "Arabic:Arab", 95 }, // #95 + { ptype::script, "Armenian:Armn", 96 }, // #96 + { ptype::script, "Avestan:Avst", 97 }, // #97 + { ptype::script, "Balinese:Bali", 98 }, // #98 + { ptype::script, "Bamum:Bamu", 99 }, // #99 + { ptype::script, "Bassa_Vah:Bass", 100 }, // #100 + { ptype::script, "Batak:Batk", 101 }, // #101 + { ptype::script, "Bengali:Beng", 102 }, // #102 + { ptype::script, "Bhaiksuki:Bhks", 103 }, // #103 + { ptype::script, "Bopomofo:Bopo", 104 }, // #104 + { ptype::script, "Brahmi:Brah", 105 }, // #105 + { ptype::script, "Braille:Brai", 106 }, // #106 + { ptype::script, "Buginese:Bugi", 107 }, // #107 + { ptype::script, "Buhid:Buhd", 108 }, // #108 + { ptype::script, "Canadian_Aboriginal:Cans", 109 }, // #109 + { ptype::script, "Carian:Cari", 110 }, // #110 + { ptype::script, "Caucasian_Albanian:Aghb", 111 }, // #111 + { ptype::script, "Chakma:Cakm", 112 }, // #112 + { ptype::script, "Cham:Cham", 113 }, // #113 + { ptype::script, "Cherokee:Cher", 114 }, // #114 + { ptype::script, "Chorasmian:Chrs", 115 }, // #115 + { ptype::script, "Common:Zyyy", 116 }, // #116 + { ptype::script, "Coptic:Copt:Qaac", 117 }, // #117 + { ptype::script, "Cypro_Minoan:Cpmn", 118 }, // #118 + { ptype::script, "Cuneiform:Xsux", 119 }, // #119 + { ptype::script, "Cypriot:Cprt", 120 }, // #120 + { ptype::script, "Cyrillic:Cyrl", 121 }, // #121 + { ptype::script, "Deseret:Dsrt", 122 }, // #122 + { ptype::script, "Devanagari:Deva", 123 }, // #123 + { ptype::script, "Dives_Akuru:Diak", 124 }, // #124 + { ptype::script, "Dogra:Dogr", 125 }, // #125 + { ptype::script, "Duployan:Dupl", 126 }, // #126 + { ptype::script, "Egyptian_Hieroglyphs:Egyp", 127 }, // #127 + { ptype::script, "Elbasan:Elba", 128 }, // #128 + { ptype::script, "Elymaic:Elym", 129 }, // #129 + { ptype::script, "Ethiopic:Ethi", 130 }, // #130 + { ptype::script, "Georgian:Geor", 131 }, // #131 + { ptype::script, "Glagolitic:Glag", 132 }, // #132 + { ptype::script, "Gothic:Goth", 133 }, // #133 + { ptype::script, "Grantha:Gran", 134 }, // #134 + { ptype::script, "Greek:Grek", 135 }, // #135 + { ptype::script, "Gujarati:Gujr", 136 }, // #136 + { ptype::script, "Gunjala_Gondi:Gong", 137 }, // #137 + { ptype::script, "Gurmukhi:Guru", 138 }, // #138 + { ptype::script, "Han:Hani", 139 }, // #139 + { ptype::script, "Hangul:Hang", 140 }, // #140 + { ptype::script, "Hanifi_Rohingya:Rohg", 141 }, // #141 + { ptype::script, "Hanunoo:Hano", 142 }, // #142 + { ptype::script, "Hatran:Hatr", 143 }, // #143 + { ptype::script, "Hebrew:Hebr", 144 }, // #144 + { ptype::script, "Hiragana:Hira", 145 }, // #145 + { ptype::script, "Imperial_Aramaic:Armi", 146 }, // #146 + { ptype::script, "Inherited:Zinh:Qaai", 147 }, // #147 + { ptype::script, "Inscriptional_Pahlavi:Phli", 148 }, // #148 + { ptype::script, "Inscriptional_Parthian:Prti", 149 }, // #149 + { ptype::script, "Javanese:Java", 150 }, // #150 + { ptype::script, "Kaithi:Kthi", 151 }, // #151 + { ptype::script, "Kannada:Knda", 152 }, // #152 + { ptype::script, "Katakana:Kana", 153 }, // #153 + { ptype::script, "Kayah_Li:Kali", 154 }, // #154 + { ptype::script, "Kharoshthi:Khar", 155 }, // #155 + { ptype::script, "Khitan_Small_Script:Kits", 156 }, // #156 + { ptype::script, "Khmer:Khmr", 157 }, // #157 + { ptype::script, "Khojki:Khoj", 158 }, // #158 + { ptype::script, "Khudawadi:Sind", 159 }, // #159 + { ptype::script, "Lao:Laoo", 160 }, // #160 + { ptype::script, "Latin:Latn", 161 }, // #161 + { ptype::script, "Lepcha:Lepc", 162 }, // #162 + { ptype::script, "Limbu:Limb", 163 }, // #163 + { ptype::script, "Linear_A:Lina", 164 }, // #164 + { ptype::script, "Linear_B:Linb", 165 }, // #165 + { ptype::script, "Lisu:Lisu", 166 }, // #166 + { ptype::script, "Lycian:Lyci", 167 }, // #167 + { ptype::script, "Lydian:Lydi", 168 }, // #168 + { ptype::script, "Mahajani:Mahj", 169 }, // #169 + { ptype::script, "Makasar:Maka", 170 }, // #170 + { ptype::script, "Malayalam:Mlym", 171 }, // #171 + { ptype::script, "Mandaic:Mand", 172 }, // #172 + { ptype::script, "Manichaean:Mani", 173 }, // #173 + { ptype::script, "Marchen:Marc", 174 }, // #174 + { ptype::script, "Masaram_Gondi:Gonm", 175 }, // #175 + { ptype::script, "Medefaidrin:Medf", 176 }, // #176 + { ptype::script, "Meetei_Mayek:Mtei", 177 }, // #177 + { ptype::script, "Mende_Kikakui:Mend", 178 }, // #178 + { ptype::script, "Meroitic_Cursive:Merc", 179 }, // #179 + { ptype::script, "Meroitic_Hieroglyphs:Mero", 180 }, // #180 + { ptype::script, "Miao:Plrd", 181 }, // #181 + { ptype::script, "Modi:Modi", 182 }, // #182 + { ptype::script, "Mongolian:Mong", 183 }, // #183 + { ptype::script, "Mro:Mroo", 184 }, // #184 + { ptype::script, "Multani:Mult", 185 }, // #185 + { ptype::script, "Myanmar:Mymr", 186 }, // #186 + { ptype::script, "Nabataean:Nbat", 187 }, // #187 + { ptype::script, "Nandinagari:Nand", 188 }, // #188 + { ptype::script, "New_Tai_Lue:Talu", 189 }, // #189 + { ptype::script, "Newa:Newa", 190 }, // #190 + { ptype::script, "Nko:Nkoo", 191 }, // #191 + { ptype::script, "Nushu:Nshu", 192 }, // #192 + { ptype::script, "Nyiakeng_Puachue_Hmong:Hmnp", 193 }, // #193 + { ptype::script, "Ogham:Ogam", 194 }, // #194 + { ptype::script, "Ol_Chiki:Olck", 195 }, // #195 + { ptype::script, "Old_Hungarian:Hung", 196 }, // #196 + { ptype::script, "Old_Italic:Ital", 197 }, // #197 + { ptype::script, "Old_North_Arabian:Narb", 198 }, // #198 + { ptype::script, "Old_Permic:Perm", 199 }, // #199 + { ptype::script, "Old_Persian:Xpeo", 200 }, // #200 + { ptype::script, "Old_Sogdian:Sogo", 201 }, // #201 + { ptype::script, "Old_South_Arabian:Sarb", 202 }, // #202 + { ptype::script, "Old_Turkic:Orkh", 203 }, // #203 + { ptype::script, "Old_Uyghur:Ougr", 204 }, // #204 + { ptype::script, "Oriya:Orya", 205 }, // #205 + { ptype::script, "Osage:Osge", 206 }, // #206 + { ptype::script, "Osmanya:Osma", 207 }, // #207 + { ptype::script, "Pahawh_Hmong:Hmng", 208 }, // #208 + { ptype::script, "Palmyrene:Palm", 209 }, // #209 + { ptype::script, "Pau_Cin_Hau:Pauc", 210 }, // #210 + { ptype::script, "Phags_Pa:Phag", 211 }, // #211 + { ptype::script, "Phoenician:Phnx", 212 }, // #212 + { ptype::script, "Psalter_Pahlavi:Phlp", 213 }, // #213 + { ptype::script, "Rejang:Rjng", 214 }, // #214 + { ptype::script, "Runic:Runr", 215 }, // #215 + { ptype::script, "Samaritan:Samr", 216 }, // #216 + { ptype::script, "Saurashtra:Saur", 217 }, // #217 + { ptype::script, "Sharada:Shrd", 218 }, // #218 + { ptype::script, "Shavian:Shaw", 219 }, // #219 + { ptype::script, "Siddham:Sidd", 220 }, // #220 + { ptype::script, "SignWriting:Sgnw", 221 }, // #221 + { ptype::script, "Sinhala:Sinh", 222 }, // #222 + { ptype::script, "Sogdian:Sogd", 223 }, // #223 + { ptype::script, "Sora_Sompeng:Sora", 224 }, // #224 + { ptype::script, "Soyombo:Soyo", 225 }, // #225 + { ptype::script, "Sundanese:Sund", 226 }, // #226 + { ptype::script, "Syloti_Nagri:Sylo", 227 }, // #227 + { ptype::script, "Syriac:Syrc", 228 }, // #228 + { ptype::script, "Tagalog:Tglg", 229 }, // #229 + { ptype::script, "Tagbanwa:Tagb", 230 }, // #230 + { ptype::script, "Tai_Le:Tale", 231 }, // #231 + { ptype::script, "Tai_Tham:Lana", 232 }, // #232 + { ptype::script, "Tai_Viet:Tavt", 233 }, // #233 + { ptype::script, "Takri:Takr", 234 }, // #234 + { ptype::script, "Tamil:Taml", 235 }, // #235 + { ptype::script, "Tangsa:Tnsa", 236 }, // #236 + { ptype::script, "Tangut:Tang", 237 }, // #237 + { ptype::script, "Telugu:Telu", 238 }, // #238 + { ptype::script, "Thaana:Thaa", 239 }, // #239 + { ptype::script, "Thai:Thai", 240 }, // #240 + { ptype::script, "Tibetan:Tibt", 241 }, // #241 + { ptype::script, "Tifinagh:Tfng", 242 }, // #242 + { ptype::script, "Tirhuta:Tirh", 243 }, // #243 + { ptype::script, "Toto", 244 }, // #244 + { ptype::script, "Ugaritic:Ugar", 245 }, // #245 + { ptype::script, "Vai:Vaii", 246 }, // #246 + { ptype::script, "Vithkuqi:Vith", 247 }, // #247 + { ptype::script, "Wancho:Wcho", 248 }, // #248 + { ptype::script, "Warang_Citi:Wara", 249 }, // #249 + { ptype::script, "Yezidi:Yezi", 250 }, // #250 + { ptype::script, "Yi:Yiii", 251 }, // #251 + { ptype::script, "Zanabazar_Square:Zanb", 252 }, // #252 + { ptype::script_extensions, "Adlam:Adlm", 253 }, // #253 + { ptype::script_extensions, "Ahom:Ahom", 93 }, // #254 + { ptype::script_extensions, "Anatolian_Hieroglyphs:Hluw", 94 }, // #255 + { ptype::script_extensions, "Arabic:Arab", 254 }, // #256 + { ptype::script_extensions, "Armenian:Armn", 96 }, // #257 + { ptype::script_extensions, "Avestan:Avst", 97 }, // #258 + { ptype::script_extensions, "Balinese:Bali", 98 }, // #259 + { ptype::script_extensions, "Bamum:Bamu", 99 }, // #260 + { ptype::script_extensions, "Bassa_Vah:Bass", 100 }, // #261 + { ptype::script_extensions, "Batak:Batk", 101 }, // #262 + { ptype::script_extensions, "Bengali:Beng", 255 }, // #263 + { ptype::script_extensions, "Bhaiksuki:Bhks", 103 }, // #264 + { ptype::script_extensions, "Bopomofo:Bopo", 256 }, // #265 + { ptype::script_extensions, "Brahmi:Brah", 105 }, // #266 + { ptype::script_extensions, "Braille:Brai", 106 }, // #267 + { ptype::script_extensions, "Buginese:Bugi", 257 }, // #268 + { ptype::script_extensions, "Buhid:Buhd", 258 }, // #269 + { ptype::script_extensions, "Canadian_Aboriginal:Cans", 109 }, // #270 + { ptype::script_extensions, "Carian:Cari", 110 }, // #271 + { ptype::script_extensions, "Caucasian_Albanian:Aghb", 111 }, // #272 + { ptype::script_extensions, "Chakma:Cakm", 259 }, // #273 + { ptype::script_extensions, "Cham:Cham", 113 }, // #274 + { ptype::script_extensions, "Cherokee:Cher", 114 }, // #275 + { ptype::script_extensions, "Chorasmian:Chrs", 115 }, // #276 + { ptype::script_extensions, "Common:Zyyy", 260 }, // #277 + { ptype::script_extensions, "Coptic:Copt:Qaac", 261 }, // #278 + { ptype::script_extensions, "Cypro_Minoan:Cpmn", 262 }, // #279 + { ptype::script_extensions, "Cuneiform:Xsux", 119 }, // #280 + { ptype::script_extensions, "Cypriot:Cprt", 263 }, // #281 + { ptype::script_extensions, "Cyrillic:Cyrl", 264 }, // #282 + { ptype::script_extensions, "Deseret:Dsrt", 122 }, // #283 + { ptype::script_extensions, "Devanagari:Deva", 265 }, // #284 + { ptype::script_extensions, "Dives_Akuru:Diak", 124 }, // #285 + { ptype::script_extensions, "Dogra:Dogr", 266 }, // #286 + { ptype::script_extensions, "Duployan:Dupl", 267 }, // #287 + { ptype::script_extensions, "Egyptian_Hieroglyphs:Egyp", 127 }, // #288 + { ptype::script_extensions, "Elbasan:Elba", 128 }, // #289 + { ptype::script_extensions, "Elymaic:Elym", 129 }, // #290 + { ptype::script_extensions, "Ethiopic:Ethi", 130 }, // #291 + { ptype::script_extensions, "Georgian:Geor", 268 }, // #292 + { ptype::script_extensions, "Glagolitic:Glag", 269 }, // #293 + { ptype::script_extensions, "Gothic:Goth", 133 }, // #294 + { ptype::script_extensions, "Grantha:Gran", 270 }, // #295 + { ptype::script_extensions, "Greek:Grek", 271 }, // #296 + { ptype::script_extensions, "Gujarati:Gujr", 272 }, // #297 + { ptype::script_extensions, "Gunjala_Gondi:Gong", 273 }, // #298 + { ptype::script_extensions, "Gurmukhi:Guru", 274 }, // #299 + { ptype::script_extensions, "Han:Hani", 275 }, // #300 + { ptype::script_extensions, "Hangul:Hang", 276 }, // #301 + { ptype::script_extensions, "Hanifi_Rohingya:Rohg", 277 }, // #302 + { ptype::script_extensions, "Hanunoo:Hano", 278 }, // #303 + { ptype::script_extensions, "Hatran:Hatr", 143 }, // #304 + { ptype::script_extensions, "Hebrew:Hebr", 144 }, // #305 + { ptype::script_extensions, "Hiragana:Hira", 279 }, // #306 + { ptype::script_extensions, "Imperial_Aramaic:Armi", 146 }, // #307 + { ptype::script_extensions, "Inherited:Zinh:Qaai", 280 }, // #308 + { ptype::script_extensions, "Inscriptional_Pahlavi:Phli", 148 }, // #309 + { ptype::script_extensions, "Inscriptional_Parthian:Prti", 149 }, // #310 + { ptype::script_extensions, "Javanese:Java", 281 }, // #311 + { ptype::script_extensions, "Kaithi:Kthi", 282 }, // #312 + { ptype::script_extensions, "Kannada:Knda", 283 }, // #313 + { ptype::script_extensions, "Katakana:Kana", 284 }, // #314 + { ptype::script_extensions, "Kayah_Li:Kali", 285 }, // #315 + { ptype::script_extensions, "Kharoshthi:Khar", 155 }, // #316 + { ptype::script_extensions, "Khitan_Small_Script:Kits", 156 }, // #317 + { ptype::script_extensions, "Khmer:Khmr", 157 }, // #318 + { ptype::script_extensions, "Khojki:Khoj", 286 }, // #319 + { ptype::script_extensions, "Khudawadi:Sind", 287 }, // #320 + { ptype::script_extensions, "Lao:Laoo", 160 }, // #321 + { ptype::script_extensions, "Latin:Latn", 288 }, // #322 + { ptype::script_extensions, "Lepcha:Lepc", 162 }, // #323 + { ptype::script_extensions, "Limbu:Limb", 289 }, // #324 + { ptype::script_extensions, "Linear_A:Lina", 290 }, // #325 + { ptype::script_extensions, "Linear_B:Linb", 291 }, // #326 + { ptype::script_extensions, "Lisu:Lisu", 166 }, // #327 + { ptype::script_extensions, "Lycian:Lyci", 167 }, // #328 + { ptype::script_extensions, "Lydian:Lydi", 168 }, // #329 + { ptype::script_extensions, "Mahajani:Mahj", 292 }, // #330 + { ptype::script_extensions, "Makasar:Maka", 170 }, // #331 + { ptype::script_extensions, "Malayalam:Mlym", 293 }, // #332 + { ptype::script_extensions, "Mandaic:Mand", 294 }, // #333 + { ptype::script_extensions, "Manichaean:Mani", 295 }, // #334 + { ptype::script_extensions, "Marchen:Marc", 174 }, // #335 + { ptype::script_extensions, "Masaram_Gondi:Gonm", 296 }, // #336 + { ptype::script_extensions, "Medefaidrin:Medf", 176 }, // #337 + { ptype::script_extensions, "Meetei_Mayek:Mtei", 177 }, // #338 + { ptype::script_extensions, "Mende_Kikakui:Mend", 178 }, // #339 + { ptype::script_extensions, "Meroitic_Cursive:Merc", 179 }, // #340 + { ptype::script_extensions, "Meroitic_Hieroglyphs:Mero", 180 }, // #341 + { ptype::script_extensions, "Miao:Plrd", 181 }, // #342 + { ptype::script_extensions, "Modi:Modi", 297 }, // #343 + { ptype::script_extensions, "Mongolian:Mong", 298 }, // #344 + { ptype::script_extensions, "Mro:Mroo", 184 }, // #345 + { ptype::script_extensions, "Multani:Mult", 299 }, // #346 + { ptype::script_extensions, "Myanmar:Mymr", 300 }, // #347 + { ptype::script_extensions, "Nabataean:Nbat", 187 }, // #348 + { ptype::script_extensions, "Nandinagari:Nand", 301 }, // #349 + { ptype::script_extensions, "New_Tai_Lue:Talu", 189 }, // #350 + { ptype::script_extensions, "Newa:Newa", 190 }, // #351 + { ptype::script_extensions, "Nko:Nkoo", 302 }, // #352 + { ptype::script_extensions, "Nushu:Nshu", 192 }, // #353 + { ptype::script_extensions, "Nyiakeng_Puachue_Hmong:Hmnp", 193 }, // #354 + { ptype::script_extensions, "Ogham:Ogam", 194 }, // #355 + { ptype::script_extensions, "Ol_Chiki:Olck", 195 }, // #356 + { ptype::script_extensions, "Old_Hungarian:Hung", 196 }, // #357 + { ptype::script_extensions, "Old_Italic:Ital", 197 }, // #358 + { ptype::script_extensions, "Old_North_Arabian:Narb", 198 }, // #359 + { ptype::script_extensions, "Old_Permic:Perm", 303 }, // #360 + { ptype::script_extensions, "Old_Persian:Xpeo", 200 }, // #361 + { ptype::script_extensions, "Old_Sogdian:Sogo", 201 }, // #362 + { ptype::script_extensions, "Old_South_Arabian:Sarb", 202 }, // #363 + { ptype::script_extensions, "Old_Turkic:Orkh", 203 }, // #364 + { ptype::script_extensions, "Old_Uyghur:Ougr", 304 }, // #365 + { ptype::script_extensions, "Oriya:Orya", 305 }, // #366 + { ptype::script_extensions, "Osage:Osge", 206 }, // #367 + { ptype::script_extensions, "Osmanya:Osma", 207 }, // #368 + { ptype::script_extensions, "Pahawh_Hmong:Hmng", 208 }, // #369 + { ptype::script_extensions, "Palmyrene:Palm", 209 }, // #370 + { ptype::script_extensions, "Pau_Cin_Hau:Pauc", 210 }, // #371 + { ptype::script_extensions, "Phags_Pa:Phag", 306 }, // #372 + { ptype::script_extensions, "Phoenician:Phnx", 212 }, // #373 + { ptype::script_extensions, "Psalter_Pahlavi:Phlp", 307 }, // #374 + { ptype::script_extensions, "Rejang:Rjng", 214 }, // #375 + { ptype::script_extensions, "Runic:Runr", 215 }, // #376 + { ptype::script_extensions, "Samaritan:Samr", 216 }, // #377 + { ptype::script_extensions, "Saurashtra:Saur", 217 }, // #378 + { ptype::script_extensions, "Sharada:Shrd", 308 }, // #379 + { ptype::script_extensions, "Shavian:Shaw", 219 }, // #380 + { ptype::script_extensions, "Siddham:Sidd", 220 }, // #381 + { ptype::script_extensions, "SignWriting:Sgnw", 221 }, // #382 + { ptype::script_extensions, "Sinhala:Sinh", 309 }, // #383 + { ptype::script_extensions, "Sogdian:Sogd", 310 }, // #384 + { ptype::script_extensions, "Sora_Sompeng:Sora", 224 }, // #385 + { ptype::script_extensions, "Soyombo:Soyo", 225 }, // #386 + { ptype::script_extensions, "Sundanese:Sund", 226 }, // #387 + { ptype::script_extensions, "Syloti_Nagri:Sylo", 311 }, // #388 + { ptype::script_extensions, "Syriac:Syrc", 312 }, // #389 + { ptype::script_extensions, "Tagalog:Tglg", 313 }, // #390 + { ptype::script_extensions, "Tagbanwa:Tagb", 314 }, // #391 + { ptype::script_extensions, "Tai_Le:Tale", 315 }, // #392 + { ptype::script_extensions, "Tai_Tham:Lana", 232 }, // #393 + { ptype::script_extensions, "Tai_Viet:Tavt", 233 }, // #394 + { ptype::script_extensions, "Takri:Takr", 316 }, // #395 + { ptype::script_extensions, "Tamil:Taml", 317 }, // #396 + { ptype::script_extensions, "Tangsa:Tnsa", 236 }, // #397 + { ptype::script_extensions, "Tangut:Tang", 237 }, // #398 + { ptype::script_extensions, "Telugu:Telu", 318 }, // #399 + { ptype::script_extensions, "Thaana:Thaa", 319 }, // #400 + { ptype::script_extensions, "Thai:Thai", 240 }, // #401 + { ptype::script_extensions, "Tibetan:Tibt", 241 }, // #402 + { ptype::script_extensions, "Tifinagh:Tfng", 242 }, // #403 + { ptype::script_extensions, "Tirhuta:Tirh", 320 }, // #404 + { ptype::script_extensions, "Toto", 244 }, // #405 + { ptype::script_extensions, "Ugaritic:Ugar", 245 }, // #406 + { ptype::script_extensions, "Vai:Vaii", 246 }, // #407 + { ptype::script_extensions, "Vithkuqi:Vith", 247 }, // #408 + { ptype::script_extensions, "Wancho:Wcho", 248 }, // #409 + { ptype::script_extensions, "Warang_Citi:Wara", 249 }, // #410 + { ptype::script_extensions, "Yezidi:Yezi", 321 }, // #411 + { ptype::script_extensions, "Yi:Yiii", 322 }, // #412 + { ptype::script_extensions, "Zanabazar_Square:Zanb", 252 }, // #413 + { ptype::unknown, "", 0 } +}; + +template +const T6 unicode_property_data::positiontable[] = +{ + { 0, 0 }, // #0 unknown + { 0, 725 }, // #1 gc=Other:C + { 0, 2 }, // #2 gc=Control:Cc:cntrl + { 2, 21 }, // #3 gc=Format:Cf + { 23, 698 }, // #4 gc=Unassigned:Cn + { 721, 3 }, // #5 gc=Private_Use:Co + { 724, 1 }, // #6 gc=Surrogate:Cs + { 725, 1883 }, // #7 gc=Letter:L + { 725, 1313 }, // #8 gc=Cased_Letter:LC + { 725, 657 }, // #9 gc=Lowercase_Letter:Ll + { 1382, 10 }, // #10 gc=Titlecase_Letter:Lt + { 1392, 646 }, // #11 gc=Uppercase_Letter:Lu + { 2038, 69 }, // #12 gc=Modifier_Letter:Lm + { 2107, 501 }, // #13 gc=Other_Letter:Lo + { 2608, 518 }, // #14 gc=Mark:M:Combining_Mark + { 2608, 177 }, // #15 gc=Spacing_Mark:Mc + { 2785, 5 }, // #16 gc=Enclosing_Mark:Me + { 2790, 336 }, // #17 gc=Nonspacing_Mark:Mn + { 3126, 145 }, // #18 gc=Number:N + { 3126, 62 }, // #19 gc=Decimal_Number:Nd:digit + { 3188, 12 }, // #20 gc=Letter_Number:Nl + { 3200, 71 }, // #21 gc=Other_Number:No + { 3271, 386 }, // #22 gc=Punctuation:P:punct + { 3271, 6 }, // #23 gc=Connector_Punctuation:Pc + { 3277, 19 }, // #24 gc=Dash_Punctuation:Pd + { 3296, 76 }, // #25 gc=Close_Punctuation:Pe + { 3372, 10 }, // #26 gc=Final_Punctuation:Pf + { 3382, 11 }, // #27 gc=Initial_Punctuation:Pi + { 3393, 185 }, // #28 gc=Other_Punctuation:Po + { 3578, 79 }, // #29 gc=Open_Punctuation:Ps + { 3657, 302 }, // #30 gc=Symbol:S + { 3657, 21 }, // #31 gc=Currency_Symbol:Sc + { 3678, 31 }, // #32 gc=Modifier_Symbol:Sk + { 3709, 64 }, // #33 gc=Math_Symbol:Sm + { 3773, 186 }, // #34 gc=Other_Symbol:So + { 3959, 9 }, // #35 gc=Separator:Z + { 3959, 1 }, // #36 gc=Line_Separator:Zl + { 3960, 1 }, // #37 gc=Paragraph_Separator:Zp + { 3961, 7 }, // #38 gc=Space_Separator:Zs + { 3968, 1 }, // #39 bp=ASCII + { 3969, 3 }, // #40 bp=ASCII_Hex_Digit:AHex + { 3972, 722 }, // #41 bp=Alphabetic:Alpha + { 4694, 1 }, // #42 bp=Any + { 4695, 0 }, // #43 bp=Assigned + { 4695, 4 }, // #44 bp=Bidi_Control:Bidi_C + { 4699, 114 }, // #45 bp=Bidi_Mirrored:Bidi_M + { 4813, 427 }, // #46 bp=Case_Ignorable:CI + { 5240, 155 }, // #47 bp=Cased + { 5395, 622 }, // #48 bp=Changes_When_Casefolded:CWCF + { 6017, 131 }, // #49 bp=Changes_When_Casemapped:CWCM + { 6148, 609 }, // #50 bp=Changes_When_Lowercased:CWL + { 6757, 838 }, // #51 bp=Changes_When_NFKC_Casefolded:CWKCF + { 7595, 626 }, // #52 bp=Changes_When_Titlecased:CWT + { 8221, 627 }, // #53 bp=Changes_When_Uppercased:CWU + { 8848, 23 }, // #54 bp=Dash + { 8871, 17 }, // #55 bp=Default_Ignorable_Code_Point:DI + { 8888, 8 }, // #56 bp=Deprecated:Dep + { 8896, 192 }, // #57 bp=Diacritic:Dia + { 9088, 153 }, // #58 bp=Emoji + { 9241, 10 }, // #59 bp=Emoji_Component:EComp + { 9251, 1 }, // #60 bp=Emoji_Modifier:EMod + { 9252, 40 }, // #61 bp=Emoji_Modifier_Base:EBase + { 9292, 83 }, // #62 bp=Emoji_Presentation:EPres + { 9375, 78 }, // #63 bp=Extended_Pictographic:ExtPict + { 9453, 33 }, // #64 bp=Extender:Ext + { 9486, 861 }, // #65 bp=Grapheme_Base:Gr_Base + { 10347, 353 }, // #66 bp=Grapheme_Extend:Gr_Ext + { 10700, 6 }, // #67 bp=Hex_Digit:Hex + { 10706, 2 }, // #68 bp=IDS_Binary_Operator:IDSB + { 10708, 1 }, // #69 bp=IDS_Trinary_Operator:IDST + { 10709, 756 }, // #70 bp=ID_Continue:IDC + { 11465, 648 }, // #71 bp=ID_Start:IDS + { 12113, 19 }, // #72 bp=Ideographic:Ideo + { 12132, 1 }, // #73 bp=Join_Control:Join_C + { 12133, 7 }, // #74 bp=Logical_Order_Exception:LOE + { 12140, 668 }, // #75 bp=Lowercase:Lower + { 12808, 138 }, // #76 bp=Math + { 12946, 18 }, // #77 bp=Noncharacter_Code_Point:NChar + { 12964, 28 }, // #78 bp=Pattern_Syntax:Pat_Syn + { 12992, 5 }, // #79 bp=Pattern_White_Space:Pat_WS + { 12997, 13 }, // #80 bp=Quotation_Mark:QMark + { 13010, 3 }, // #81 bp=Radical + { 13013, 1 }, // #82 bp=Regional_Indicator:RI + { 13014, 79 }, // #83 bp=Sentence_Terminal:STerm + { 13093, 32 }, // #84 bp=Soft_Dotted:SD + { 13125, 107 }, // #85 bp=Terminal_Punctuation:Term + { 13232, 15 }, // #86 bp=Unified_Ideograph:UIdeo + { 13247, 651 }, // #87 bp=Uppercase:Upper + { 13898, 4 }, // #88 bp=Variation_Selector:VS + { 13902, 10 }, // #89 bp=White_Space:space + { 13912, 763 }, // #90 bp=XID_Continue:XIDC + { 14675, 655 }, // #91 bp=XID_Start:XIDS + { 15330, 3 }, // #92 sc=Adlam:Adlm + { 15333, 3 }, // #93 sc=Ahom:Ahom scx=Ahom:Ahom + { 15336, 1 }, // #94 sc=Anatolian_Hieroglyphs:Hluw scx=Anatolian_Hieroglyphs:Hluw + { 15337, 57 }, // #95 sc=Arabic:Arab + { 15394, 4 }, // #96 sc=Armenian:Armn scx=Armenian:Armn + { 15398, 2 }, // #97 sc=Avestan:Avst scx=Avestan:Avst + { 15400, 2 }, // #98 sc=Balinese:Bali scx=Balinese:Bali + { 15402, 2 }, // #99 sc=Bamum:Bamu scx=Bamum:Bamu + { 15404, 2 }, // #100 sc=Bassa_Vah:Bass scx=Bassa_Vah:Bass + { 15406, 2 }, // #101 sc=Batak:Batk scx=Batak:Batk + { 15408, 14 }, // #102 sc=Bengali:Beng + { 15422, 4 }, // #103 sc=Bhaiksuki:Bhks scx=Bhaiksuki:Bhks + { 15426, 3 }, // #104 sc=Bopomofo:Bopo + { 15429, 3 }, // #105 sc=Brahmi:Brah scx=Brahmi:Brah + { 15432, 1 }, // #106 sc=Braille:Brai scx=Braille:Brai + { 15433, 2 }, // #107 sc=Buginese:Bugi + { 15435, 1 }, // #108 sc=Buhid:Buhd + { 15436, 3 }, // #109 sc=Canadian_Aboriginal:Cans scx=Canadian_Aboriginal:Cans + { 15439, 1 }, // #110 sc=Carian:Cari scx=Carian:Cari + { 15440, 2 }, // #111 sc=Caucasian_Albanian:Aghb scx=Caucasian_Albanian:Aghb + { 15442, 2 }, // #112 sc=Chakma:Cakm + { 15444, 4 }, // #113 sc=Cham:Cham scx=Cham:Cham + { 15448, 3 }, // #114 sc=Cherokee:Cher scx=Cherokee:Cher + { 15451, 1 }, // #115 sc=Chorasmian:Chrs scx=Chorasmian:Chrs + { 15452, 174 }, // #116 sc=Common:Zyyy + { 15626, 3 }, // #117 sc=Coptic:Copt:Qaac + { 15629, 1 }, // #118 sc=Cypro_Minoan:Cpmn + { 15630, 4 }, // #119 sc=Cuneiform:Xsux scx=Cuneiform:Xsux + { 15634, 6 }, // #120 sc=Cypriot:Cprt + { 15640, 8 }, // #121 sc=Cyrillic:Cyrl + { 15648, 1 }, // #122 sc=Deseret:Dsrt scx=Deseret:Dsrt + { 15649, 4 }, // #123 sc=Devanagari:Deva + { 15653, 8 }, // #124 sc=Dives_Akuru:Diak scx=Dives_Akuru:Diak + { 15661, 1 }, // #125 sc=Dogra:Dogr + { 15662, 5 }, // #126 sc=Duployan:Dupl + { 15667, 2 }, // #127 sc=Egyptian_Hieroglyphs:Egyp scx=Egyptian_Hieroglyphs:Egyp + { 15669, 1 }, // #128 sc=Elbasan:Elba scx=Elbasan:Elba + { 15670, 1 }, // #129 sc=Elymaic:Elym scx=Elymaic:Elym + { 15671, 36 }, // #130 sc=Ethiopic:Ethi scx=Ethiopic:Ethi + { 15707, 10 }, // #131 sc=Georgian:Geor + { 15717, 6 }, // #132 sc=Glagolitic:Glag + { 15723, 1 }, // #133 sc=Gothic:Goth scx=Gothic:Goth + { 15724, 15 }, // #134 sc=Grantha:Gran + { 15739, 36 }, // #135 sc=Greek:Grek + { 15775, 14 }, // #136 sc=Gujarati:Gujr + { 15789, 6 }, // #137 sc=Gunjala_Gondi:Gong + { 15795, 16 }, // #138 sc=Gurmukhi:Guru + { 15811, 20 }, // #139 sc=Han:Hani + { 15831, 14 }, // #140 sc=Hangul:Hang + { 15845, 2 }, // #141 sc=Hanifi_Rohingya:Rohg + { 15847, 1 }, // #142 sc=Hanunoo:Hano + { 15848, 3 }, // #143 sc=Hatran:Hatr scx=Hatran:Hatr + { 15851, 9 }, // #144 sc=Hebrew:Hebr scx=Hebrew:Hebr + { 15860, 5 }, // #145 sc=Hiragana:Hira + { 15865, 2 }, // #146 sc=Imperial_Aramaic:Armi scx=Imperial_Aramaic:Armi + { 15867, 29 }, // #147 sc=Inherited:Zinh:Qaai + { 15896, 2 }, // #148 sc=Inscriptional_Pahlavi:Phli scx=Inscriptional_Pahlavi:Phli + { 15898, 2 }, // #149 sc=Inscriptional_Parthian:Prti scx=Inscriptional_Parthian:Prti + { 15900, 3 }, // #150 sc=Javanese:Java + { 15903, 2 }, // #151 sc=Kaithi:Kthi + { 15905, 13 }, // #152 sc=Kannada:Knda + { 15918, 13 }, // #153 sc=Katakana:Kana + { 15931, 2 }, // #154 sc=Kayah_Li:Kali + { 15933, 8 }, // #155 sc=Kharoshthi:Khar scx=Kharoshthi:Khar + { 15941, 2 }, // #156 sc=Khitan_Small_Script:Kits scx=Khitan_Small_Script:Kits + { 15943, 4 }, // #157 sc=Khmer:Khmr scx=Khmer:Khmr + { 15947, 2 }, // #158 sc=Khojki:Khoj + { 15949, 2 }, // #159 sc=Khudawadi:Sind + { 15951, 11 }, // #160 sc=Lao:Laoo scx=Lao:Laoo + { 15962, 38 }, // #161 sc=Latin:Latn + { 16000, 3 }, // #162 sc=Lepcha:Lepc scx=Lepcha:Lepc + { 16003, 5 }, // #163 sc=Limbu:Limb + { 16008, 3 }, // #164 sc=Linear_A:Lina + { 16011, 7 }, // #165 sc=Linear_B:Linb + { 16018, 2 }, // #166 sc=Lisu:Lisu scx=Lisu:Lisu + { 16020, 1 }, // #167 sc=Lycian:Lyci scx=Lycian:Lyci + { 16021, 2 }, // #168 sc=Lydian:Lydi scx=Lydian:Lydi + { 16023, 1 }, // #169 sc=Mahajani:Mahj + { 16024, 1 }, // #170 sc=Makasar:Maka scx=Makasar:Maka + { 16025, 7 }, // #171 sc=Malayalam:Mlym + { 16032, 2 }, // #172 sc=Mandaic:Mand + { 16034, 2 }, // #173 sc=Manichaean:Mani + { 16036, 3 }, // #174 sc=Marchen:Marc scx=Marchen:Marc + { 16039, 7 }, // #175 sc=Masaram_Gondi:Gonm + { 16046, 1 }, // #176 sc=Medefaidrin:Medf scx=Medefaidrin:Medf + { 16047, 3 }, // #177 sc=Meetei_Mayek:Mtei scx=Meetei_Mayek:Mtei + { 16050, 2 }, // #178 sc=Mende_Kikakui:Mend scx=Mende_Kikakui:Mend + { 16052, 3 }, // #179 sc=Meroitic_Cursive:Merc scx=Meroitic_Cursive:Merc + { 16055, 1 }, // #180 sc=Meroitic_Hieroglyphs:Mero scx=Meroitic_Hieroglyphs:Mero + { 16056, 3 }, // #181 sc=Miao:Plrd scx=Miao:Plrd + { 16059, 2 }, // #182 sc=Modi:Modi + { 16061, 6 }, // #183 sc=Mongolian:Mong + { 16067, 3 }, // #184 sc=Mro:Mroo scx=Mro:Mroo + { 16070, 5 }, // #185 sc=Multani:Mult + { 16075, 3 }, // #186 sc=Myanmar:Mymr + { 16078, 2 }, // #187 sc=Nabataean:Nbat scx=Nabataean:Nbat + { 16080, 3 }, // #188 sc=Nandinagari:Nand + { 16083, 4 }, // #189 sc=New_Tai_Lue:Talu scx=New_Tai_Lue:Talu + { 16087, 2 }, // #190 sc=Newa:Newa scx=Newa:Newa + { 16089, 2 }, // #191 sc=Nko:Nkoo + { 16091, 2 }, // #192 sc=Nushu:Nshu scx=Nushu:Nshu + { 16093, 4 }, // #193 sc=Nyiakeng_Puachue_Hmong:Hmnp scx=Nyiakeng_Puachue_Hmong:Hmnp + { 16097, 1 }, // #194 sc=Ogham:Ogam scx=Ogham:Ogam + { 16098, 1 }, // #195 sc=Ol_Chiki:Olck scx=Ol_Chiki:Olck + { 16099, 3 }, // #196 sc=Old_Hungarian:Hung scx=Old_Hungarian:Hung + { 16102, 2 }, // #197 sc=Old_Italic:Ital scx=Old_Italic:Ital + { 16104, 1 }, // #198 sc=Old_North_Arabian:Narb scx=Old_North_Arabian:Narb + { 16105, 1 }, // #199 sc=Old_Permic:Perm + { 16106, 2 }, // #200 sc=Old_Persian:Xpeo scx=Old_Persian:Xpeo + { 16108, 1 }, // #201 sc=Old_Sogdian:Sogo scx=Old_Sogdian:Sogo + { 16109, 1 }, // #202 sc=Old_South_Arabian:Sarb scx=Old_South_Arabian:Sarb + { 16110, 1 }, // #203 sc=Old_Turkic:Orkh scx=Old_Turkic:Orkh + { 16111, 1 }, // #204 sc=Old_Uyghur:Ougr + { 16112, 14 }, // #205 sc=Oriya:Orya + { 16126, 2 }, // #206 sc=Osage:Osge scx=Osage:Osge + { 16128, 2 }, // #207 sc=Osmanya:Osma scx=Osmanya:Osma + { 16130, 5 }, // #208 sc=Pahawh_Hmong:Hmng scx=Pahawh_Hmong:Hmng + { 16135, 1 }, // #209 sc=Palmyrene:Palm scx=Palmyrene:Palm + { 16136, 1 }, // #210 sc=Pau_Cin_Hau:Pauc scx=Pau_Cin_Hau:Pauc + { 16137, 1 }, // #211 sc=Phags_Pa:Phag + { 16138, 2 }, // #212 sc=Phoenician:Phnx scx=Phoenician:Phnx + { 16140, 3 }, // #213 sc=Psalter_Pahlavi:Phlp + { 16143, 2 }, // #214 sc=Rejang:Rjng scx=Rejang:Rjng + { 16145, 2 }, // #215 sc=Runic:Runr scx=Runic:Runr + { 16147, 2 }, // #216 sc=Samaritan:Samr scx=Samaritan:Samr + { 16149, 2 }, // #217 sc=Saurashtra:Saur scx=Saurashtra:Saur + { 16151, 1 }, // #218 sc=Sharada:Shrd + { 16152, 1 }, // #219 sc=Shavian:Shaw scx=Shavian:Shaw + { 16153, 2 }, // #220 sc=Siddham:Sidd scx=Siddham:Sidd + { 16155, 3 }, // #221 sc=SignWriting:Sgnw scx=SignWriting:Sgnw + { 16158, 13 }, // #222 sc=Sinhala:Sinh + { 16171, 1 }, // #223 sc=Sogdian:Sogd + { 16172, 2 }, // #224 sc=Sora_Sompeng:Sora scx=Sora_Sompeng:Sora + { 16174, 1 }, // #225 sc=Soyombo:Soyo scx=Soyombo:Soyo + { 16175, 2 }, // #226 sc=Sundanese:Sund scx=Sundanese:Sund + { 16177, 1 }, // #227 sc=Syloti_Nagri:Sylo + { 16178, 4 }, // #228 sc=Syriac:Syrc + { 16182, 2 }, // #229 sc=Tagalog:Tglg + { 16184, 3 }, // #230 sc=Tagbanwa:Tagb + { 16187, 2 }, // #231 sc=Tai_Le:Tale + { 16189, 5 }, // #232 sc=Tai_Tham:Lana scx=Tai_Tham:Lana + { 16194, 2 }, // #233 sc=Tai_Viet:Tavt scx=Tai_Viet:Tavt + { 16196, 2 }, // #234 sc=Takri:Takr + { 16198, 18 }, // #235 sc=Tamil:Taml + { 16216, 2 }, // #236 sc=Tangsa:Tnsa scx=Tangsa:Tnsa + { 16218, 4 }, // #237 sc=Tangut:Tang scx=Tangut:Tang + { 16222, 13 }, // #238 sc=Telugu:Telu + { 16235, 1 }, // #239 sc=Thaana:Thaa + { 16236, 2 }, // #240 sc=Thai:Thai scx=Thai:Thai + { 16238, 7 }, // #241 sc=Tibetan:Tibt scx=Tibetan:Tibt + { 16245, 3 }, // #242 sc=Tifinagh:Tfng scx=Tifinagh:Tfng + { 16248, 2 }, // #243 sc=Tirhuta:Tirh + { 16250, 1 }, // #244 sc=Toto scx=Toto + { 16251, 2 }, // #245 sc=Ugaritic:Ugar scx=Ugaritic:Ugar + { 16253, 1 }, // #246 sc=Vai:Vaii scx=Vai:Vaii + { 16254, 8 }, // #247 sc=Vithkuqi:Vith scx=Vithkuqi:Vith + { 16262, 2 }, // #248 sc=Wancho:Wcho scx=Wancho:Wcho + { 16264, 2 }, // #249 sc=Warang_Citi:Wara scx=Warang_Citi:Wara + { 16266, 3 }, // #250 sc=Yezidi:Yezi + { 16269, 2 }, // #251 sc=Yi:Yiii + { 16271, 1 }, // #252 sc=Zanabazar_Square:Zanb scx=Zanabazar_Square:Zanb + { 16272, 5 }, // #253 scx=Adlam:Adlm + { 16277, 51 }, // #254 scx=Arabic:Arab + { 16328, 26 }, // #255 scx=Bengali:Beng + { 16354, 12 }, // #256 scx=Bopomofo:Bopo + { 16366, 3 }, // #257 scx=Buginese:Bugi + { 16369, 2 }, // #258 scx=Buhid:Buhd + { 16371, 4 }, // #259 scx=Chakma:Cakm + { 16375, 148 }, // #260 scx=Common:Zyyy + { 16523, 4 }, // #261 scx=Coptic:Copt:Qaac + { 16527, 2 }, // #262 scx=Cypro_Minoan:Cpmn + { 16529, 9 }, // #263 scx=Cypriot:Cprt + { 16538, 9 }, // #264 scx=Cyrillic:Cyrl + { 16547, 7 }, // #265 scx=Devanagari:Deva + { 16554, 3 }, // #266 scx=Dogra:Dogr + { 16557, 5 }, // #267 scx=Duployan:Dupl + { 16562, 9 }, // #268 scx=Georgian:Geor + { 16571, 10 }, // #269 scx=Glagolitic:Glag + { 16581, 25 }, // #270 scx=Grantha:Gran + { 16606, 38 }, // #271 scx=Greek:Grek + { 16644, 17 }, // #272 scx=Gujarati:Gujr + { 16661, 7 }, // #273 scx=Gunjala_Gondi:Gong + { 16668, 19 }, // #274 scx=Gurmukhi:Guru + { 16687, 37 }, // #275 scx=Han:Hani + { 16724, 21 }, // #276 scx=Hangul:Hang + { 16745, 7 }, // #277 scx=Hanifi_Rohingya:Rohg + { 16752, 1 }, // #278 scx=Hanunoo:Hano + { 16753, 16 }, // #279 scx=Hiragana:Hira + { 16769, 20 }, // #280 scx=Inherited:Zinh:Qaai + { 16789, 3 }, // #281 scx=Javanese:Java + { 16792, 4 }, // #282 scx=Kaithi:Kthi + { 16796, 21 }, // #283 scx=Kannada:Knda + { 16817, 19 }, // #284 scx=Katakana:Kana + { 16836, 1 }, // #285 scx=Kayah_Li:Kali + { 16837, 4 }, // #286 scx=Khojki:Khoj + { 16841, 4 }, // #287 scx=Khudawadi:Sind + { 16845, 46 }, // #288 scx=Latin:Latn + { 16891, 6 }, // #289 scx=Limbu:Limb + { 16897, 4 }, // #290 scx=Linear_A:Lina + { 16901, 10 }, // #291 scx=Linear_B:Linb + { 16911, 3 }, // #292 scx=Mahajani:Mahj + { 16914, 11 }, // #293 scx=Malayalam:Mlym + { 16925, 3 }, // #294 scx=Mandaic:Mand + { 16928, 3 }, // #295 scx=Manichaean:Mani + { 16931, 8 }, // #296 scx=Masaram_Gondi:Gonm + { 16939, 3 }, // #297 scx=Modi:Modi + { 16942, 5 }, // #298 scx=Mongolian:Mong + { 16947, 6 }, // #299 scx=Multani:Mult + { 16953, 4 }, // #300 scx=Myanmar:Mymr + { 16957, 9 }, // #301 scx=Nandinagari:Nand + { 16966, 6 }, // #302 scx=Nko:Nkoo + { 16972, 2 }, // #303 scx=Old_Permic:Perm + { 16974, 3 }, // #304 scx=Old_Uyghur:Ougr + { 16977, 18 }, // #305 scx=Oriya:Orya + { 16995, 3 }, // #306 scx=Phags_Pa:Phag + { 16998, 4 }, // #307 scx=Psalter_Pahlavi:Phlp + { 17002, 6 }, // #308 scx=Sharada:Shrd + { 17008, 14 }, // #309 scx=Sinhala:Sinh + { 17022, 2 }, // #310 scx=Sogdian:Sogd + { 17024, 3 }, // #311 scx=Syloti_Nagri:Sylo + { 17027, 12 }, // #312 scx=Syriac:Syrc + { 17039, 3 }, // #313 scx=Tagalog:Tglg + { 17042, 4 }, // #314 scx=Tagbanwa:Tagb + { 17046, 3 }, // #315 scx=Tai_Le:Tale + { 17049, 4 }, // #316 scx=Takri:Takr + { 17053, 25 }, // #317 scx=Tamil:Taml + { 17078, 17 }, // #318 scx=Telugu:Telu + { 17095, 7 }, // #319 scx=Thaana:Thaa + { 17102, 6 }, // #320 scx=Tirhuta:Tirh + { 17108, 7 }, // #321 scx=Yezidi:Yezi + { 17115, 7 } // #322 scx=Yi:Yiii +}; +#define SRELL_UPDATA_VERSION 110 +// ... "srell_updata.hpp"] + +//template +class unicode_property +{ +public: + + typedef uint_l32 property_type; + typedef simple_array pstring; + + static const property_type error_property = static_cast(-1); + + unicode_property() + { + } + + unicode_property &operator=(const unicode_property &) + { + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + unicode_property &operator=(unicode_property &&) SRELL_NOEXCEPT + { + return *this; + } +#endif + + static property_type lookup_property(const pstring &name, const pstring &value) + { + pname_type ptype = name.size() ? lookup_property_name(name) : updata::ptype::general_category; + property_type property_number = lookup_property_value(ptype, value); + + if (property_number == updata::unknown && name.size() == 0) + { + ptype = updata::ptype::binary; + property_number = lookup_property_value(ptype, value); + } + + return property_number != updata::unknown ? property_number : error_property; + } + + static std::size_t ranges_offset(const property_type property_number) + { +#if defined(SRELL_UPDATA_VERSION) + return updata::positiontable[property_number].offset; +#else + const offset_and_number *const postable = updata::position_table(); + return postable[property_number].offset; +#endif + } + + static std::size_t number_of_ranges(const property_type property_number) + { +#if defined(SRELL_UPDATA_VERSION) + return updata::positiontable[property_number].number_of_pairs; +#else + const offset_and_number *const postable = updata::position_table(); + return postable[property_number].number_of_pairs; +#endif + } + + static const uchar32 *ranges_address(const property_type property_number) + { +#if defined(SRELL_UPDATA_VERSION) + return &updata::rangetable[ranges_offset(property_number) << 1]; +#else + const uchar32 *const ranges = updata::ranges(); + return &ranges[ranges_offset(property_number) << 1]; +#endif + } + +private: + + typedef uint_l32 pname_type; + typedef const char *pname_string_type; + +#if defined(SRELL_UPDATA_VERSION) && (SRELL_UPDATA_VERSION >= 200) + struct pvalue_type + { + pname_type pname; + property_type pnumber; + pname_string_type csstrings; + }; +#else + struct pvalue_type + { + pname_type pname; + pname_string_type csstrings; + property_type pnumber; + }; +#endif + + struct offset_and_number + { + std::size_t offset; + std::size_t number_of_pairs; + }; + + typedef unicode_property_data + updata; + + static pname_type lookup_property_name(const pstring &name) + { +#if defined(SRELL_UPDATA_VERSION) + for (std::size_t pno = 0; *updata::propertynametable[pno]; ++pno) + { + if (check_if_included(name, updata::propertynametable[pno])) + return static_cast(pno); + } +#else + const pname_string_type *const pname_table = updata::propertyname_table(); + + for (std::size_t pno = 0; *pname_table[pno]; ++pno) + { + if (check_if_included(name, pname_table[pno])) + return static_cast(pno); + } +#endif + return updata::ptype::unknown; + } + + // Checks if value is included in colon-separated strings. + static bool check_if_included(const pstring &value, pname_string_type csstrings) + { + if (static_cast(*csstrings) != meta_char::mc_astrsk) // '*' + { + while (*csstrings) + { + const pname_string_type begin = csstrings; + + for (; static_cast(*csstrings) != meta_char::mc_colon && static_cast(*csstrings) != char_ctrl::cc_nul; ++csstrings); + + const std::size_t length = csstrings - begin; + + if (static_cast(value.size()) == length) + if (value.compare(0, value.size(), begin, length) == 0) + return true; + + if (static_cast(*csstrings) == meta_char::mc_colon) + ++csstrings; + } + } + return false; + } + + static property_type lookup_property_value(const pname_type ptype, const pstring &value) + { +#if defined(SRELL_UPDATA_VERSION) + for (std::size_t pno = 0; *updata::rangenumbertable[pno].csstrings; ++pno) + { + const pvalue_type &pvalue = updata::rangenumbertable[pno]; + if (pvalue.pname == ptype && check_if_included(value, pvalue.csstrings)) + return pvalue.pnumber; + } +#else + const pvalue_type *const pvalue_table = updata::rangenumber_table(); + + for (std::size_t pno = 0; *pvalue_table[pno].csstrings; ++pno) + { + const pvalue_type &pvalue = pvalue_table[pno]; + if (pvalue.pname == ptype && check_if_included(value, pvalue.csstrings)) + return pvalue.pnumber; + } +#endif + return updata::unknown; + } + +public: + + static const std::size_t number_of_properties = updata::last_property_number + 1; + static const std::size_t last_property_number = updata::last_property_number; +#if defined(SRELL_UPDATA_VERSION) && (SRELL_UPDATA_VERSION >= 200) + static const std::size_t last_pos_number = updata::last_pos_number; +#endif + static const property_type gc_Zs = updata::gc_Space_Separator; + static const property_type gc_Cn = updata::gc_Unassigned; + static const property_type bp_Assigned = updata::bp_Assigned; + +// UnicodeIDStart:: +// UnicodeIDContinue:: + static const property_type bp_ID_Start = updata::bp_ID_Start; + static const property_type bp_ID_Continue = updata::bp_ID_Continue; +}; +// unicode_property + +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + } // namespace regex_internal + +// ... "rei_up.hpp"] +// ["rei_char_class.hpp" ... + + namespace regex_internal + { + +struct range_pair // , public std::pair +{ + uchar32 second; + uchar32 first; + + void set(const uchar32 min, const uchar32 max) + { + this->first = min; + this->second = max; + } + + bool is_range_valid() const + { + return first <= second; + } + + bool operator==(const range_pair &right) const + { + return this->first == right.first && this->second == right.second; + } + + bool operator<(const range_pair &right) const + { + return this->second < right.first; // This assumes that optimise() has been called. + } + + void swap(range_pair &right) + { + const range_pair tmp = *this; + *this = right; + right = tmp; + } + + bool unify_range(const range_pair &right) + { + range_pair &left = *this; + + if (right.first <= left.second || left.second + 1 == right.first) // r1 <= l2 || l2+1 == r1 + { + // l1 l2+1 < r1 r2 excluded. + + if (left.first <= right.second || right.second + 1 == left.first) // l1 <= r2 || r2+1 == l1 + { + // r1 r2+1 < l1 l2 excluded. + + if (left.first > right.first) + left.first = right.first; + + if (left.second < right.second) + left.second = right.second; + + return true; + } + } + return false; + } +}; +// range_pair + +struct range_pair_helper : public range_pair +{ + range_pair_helper(const uchar32 min, const uchar32 max) + { + this->first = min; + this->second = max; + } + + range_pair_helper(const uchar32 minmax) + { + this->first = minmax; + this->second = minmax; + } +}; +// range_pair_helper + +struct range_pairs // : public simple_array +{ +public: + + typedef simple_array array_type; + typedef array_type::size_type size_type; + + range_pairs() + { + } + + range_pairs(const range_pairs &rp) : rparray_(rp.rparray_) + { + } + + range_pairs &operator=(const range_pairs &rp) + { + rparray_.operator=(rp.rparray_); + return *this; + } + + range_pairs(const size_type initsize) : rparray_(initsize) + { + } + + range_pairs(const range_pairs &right, size_type pos, size_type size) + : rparray_(right.rparray_, pos, size) + { + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + range_pairs(range_pairs &&rp) SRELL_NOEXCEPT + : rparray_(std::move(rp.rparray_)) + { + } + + range_pairs &operator=(range_pairs &&rp) SRELL_NOEXCEPT + { + rparray_.operator=(std::move(rp.rparray_)); + return *this; + } +#endif + + void clear() + { + rparray_.clear(); + } + + size_type size() const + { + return rparray_.size(); + } + + const range_pair &operator[](const size_type pos) const + { + return rparray_[pos]; + } + range_pair &operator[](const size_type pos) + { + return rparray_[pos]; + } + + void resize(const size_type size) + { + rparray_.resize(size); + } + + void swap(range_pairs &right) + { + rparray_.swap(right.rparray_); + } + + void set_solerange(const range_pair &right) + { + rparray_.clear(); + rparray_.push_back(right); + } + + void append_newclass(const range_pairs &right) + { + rparray_.append(right.rparray_); + } + + void append_newpair(const range_pair &right) + { + rparray_.push_back(right); + } + + void join(const range_pair &right) + { + size_type pos = 0; + + for (; pos < rparray_.size(); ++pos) + { + range_pair &curpair = rparray_[pos]; + + if (curpair.unify_range(right)) + { + for (++pos; pos < rparray_.size();) + { + if (curpair.unify_range(rparray_[pos])) + rparray_.erase(pos); + else + break; + } + return; + } + if (right.second < curpair.first) + break; + } + rparray_.insert(pos, right); + } + + void merge(const range_pairs &right) + { + for (size_type i = 0; i < right.size(); ++i) + join(right[i]); + } + + bool same(uchar32 pos, const uchar32 count, const range_pairs &right) const + { + if (count == right.size()) + { + for (uchar32 i = 0; i < count; ++i, ++pos) + if (!(rparray_[pos] == right[i])) + return false; + + return true; + } + return false; + } + + int relationship(const range_pairs &right) const + { + if (rparray_.size() == right.rparray_.size()) + { + for (size_type i = 0; i < rparray_.size(); ++i) + { + if (!(this->rparray_[i] == right.rparray_[i])) + { + if (i == 0) + goto check_overlap; + + return 1; // Overlapped. + } + } + return 0; // Same. + } + check_overlap: + return is_overlap(right) ? 1 : 2; // Overlapped or exclusive. + } + + void negation() + { + uchar32 begin = 0; + range_pairs newpairs; + + for (size_type i = 0; i < rparray_.size(); ++i) + { + const range_pair &range = rparray_[i]; + + if (begin < range.first) + newpairs.join(range_pair_helper(begin, range.first - 1)); + + begin = range.second + 1; + } + + if (begin <= constants::unicode_max_codepoint) + newpairs.join(range_pair_helper(begin, constants::unicode_max_codepoint)); + + *this = newpairs; + } + + bool is_overlap(const range_pairs &right) const + { + for (size_type i = 0; i < rparray_.size(); ++i) + { + const range_pair &leftrange = rparray_[i]; + + for (size_type j = 0; j < right.size(); ++j) + { + const range_pair &rightrange = right[j]; + + if (rightrange.first <= leftrange.second) // Excludes l1 l2 < r1 r2. + if (leftrange.first <= rightrange.second) // Excludes r1 r2 < l1 l2. + return true; + } + } + return false; + } + + void load_from_memory(const uchar32 *array, size_type number_of_pairs) + { + for (; number_of_pairs; --number_of_pairs, array += 2) + join(range_pair_helper(array[0], array[1])); + } + + void make_caseunfoldedcharset() + { + uchar32 table[unicode_case_folding::rev_maxset] = {}; + bitset bs; + + for (size_type i = 0; i < rparray_.size(); ++i) + { + const range_pair &range = rparray_[i]; + + for (uchar32 ucp = range.first; ucp <= range.second; ++ucp) + { + const uchar32 setnum = unicode_case_folding::casefoldedcharset(table, ucp); + + for (uchar32 j = 0; j < setnum; ++j) + bs.set(table[j]); + } + } + load_from_bitset(bs); + } + + // For updataout.hpp. + void remove_range(const range_pair &right) + { + for (size_type pos = 0; pos < rparray_.size();) + { + range_pair &left = rparray_[pos]; + + if (right.first <= left.first && left.first <= right.second) // r1 <= l1 <= r2. + { + if (left.second > right.second) // r1 <= l1 <= r2 < l2. + { + left.first = right.second + 1; // carry doesn't happen. + ++pos; + } + else // r1 <= l1 <= l2 <= r2. + rparray_.erase(pos); + } + else if (right.first <= left.second && left.second <= right.second) // r1 <= l2 <= r2. + { + if (left.first < right.first) // l1 < r1 <= l2 <= r2. + { + left.second = right.first - 1; + ++pos; + } + else // r1 <= l1 <= l2 <= r2. + rparray_.erase(pos); + } + else if (left.first < right.first && right.second < left.second) // l1 < r1 && r2 < l2. + { + range_pair newrange(left); + + left.second = right.first - 1; + newrange.first = right.second + 1; + rparray_.insert(++pos, newrange); + ++pos; + } + else + ++pos; + } + } + +// template + uchar32 consists_of_one_character(const bool icase) const + { + if (rparray_.size() >= 1) + { + uchar32 (*const casefolding_func)(const uchar32) = !icase ? do_nothing : unicode_case_folding::do_casefolding; + const uchar32 ucp1st = casefolding_func(rparray_[0].first); + + for (size_type no = 0; no < rparray_.size(); ++no) + { + const range_pair &cr = rparray_[no]; + + for (uchar32 ucp = cr.first;; ++ucp) + { + if (ucp1st != casefolding_func(ucp)) + return constants::invalid_u32value; + + if (ucp == cr.second) + break; + } + } + return ucp1st; + } + return constants::invalid_u32value; + } + + void split_ranges(range_pairs &kept, range_pairs &removed, const range_pairs &rightranges) const + { + range_pair newpair; + + kept.rparray_ = this->rparray_; // Subtraction set. + removed.clear(); // Intersection set. + + for (size_type i = 0;; ++i) + { + RETRY_SAMEINDEXNO: + if (i >= kept.rparray_.size()) + break; + + range_pair &left = kept.rparray_[i]; + + for (size_type j = 0; j < rightranges.rparray_.size(); ++j) + { + const range_pair &right = rightranges.rparray_[j]; + + if (right.first <= left.second) // Excludes l1 l2 < r1 r2. + { + if (left.first <= right.second) // Excludes r1 r2 < l1 l2. + { + if (left.first < right.first) + { + if (right.second < left.second) + { + removed.join(range_pair_helper(right.first, right.second)); + + newpair.set(right.second + 1, left.second); + left.second = right.first - 1; + kept.rparray_.insert(i + 1, newpair); + } + else + { + removed.join(range_pair_helper(right.first, left.second)); + left.second = right.first - 1; + } + } + else if (right.second < left.second) + { + removed.join(range_pair_helper(left.first, right.second)); + left.first = right.second + 1; + } + else + { + removed.join(range_pair_helper(left.first, left.second)); + kept.rparray_.erase(i); + goto RETRY_SAMEINDEXNO; + } + } + } + else + break; + } + } + } + +#if defined(SRELLDBG_NO_BITSET) + bool is_included(const uchar32 ch) const + { +#if 01 + const range_pair *const end = rparray_.data() + rparray_.size(); + + for (const range_pair *cur = rparray_.data(); cur != end; ++cur) + { + if (ch <= cur->second) + return ch >= cur->first; +#else + for (size_type i = 0; i < rparray_.size(); ++i) + { + if (rparray_[i].is_included(ch)) + return true; +#endif + } + return false; + } +#endif // defined(SRELLDBG_NO_BITSET) + + // For multiple_range_pairs functions. + + bool is_included_ls(const uchar32 pos, uchar32 count, const uchar32 c) const + { + const range_pair *cur = &rparray_[pos]; + + for (; count; ++cur, --count) + { + if (c <= cur->second) + return c >= cur->first; + } + return false; + } + + bool is_included(const uchar32 pos, uchar32 count, const uchar32 c) const + { + const range_pair *base = &rparray_[pos]; + + while (count) + { + uchar32 mid = count >> 1; + const range_pair &rp = base[mid]; + + if (c <= rp.second) + { + if (c >= rp.first) + return true; + + count = mid; + } + else + { + ++mid; + count -= mid; + base += mid; + } + } + return false; + } + + void replace(const size_type pos, const size_type count, const range_pairs &right) + { + rparray_.replace(pos, count, right.rparray_); + } + +#if !defined(SRELLDBG_NO_CCPOS) + + // For Eytzinger layout functions. + + bool is_included_el(uchar32 pos, const uchar32 len, const uchar32 c) const + { + const range_pair *const base = &rparray_[pos]; + +#if defined(__GNUC__) + __builtin_prefetch(base); +#endif + for (pos = 0; pos < len;) + { + const range_pair &rp = base[pos]; + + if (c <= rp.second) + { + if (c >= rp.first) + return true; + + pos = (pos << 1) + 1; + } + else + { + pos = (pos << 1) + 2; + } + } + return false; + } + + uchar32 create_el(const range_pair *srcbase, const uchar32 srcsize) + { + const uchar32 basepos = static_cast(rparray_.size()); + + rparray_.resize(basepos + srcsize); + set_eytzinger_layout(0, srcbase, srcsize, &rparray_[basepos], 0); + + return srcsize; + } + +#endif // !defined(SRELLDBG_NO_CCPOS) + + uint_l32 total_codepoints() const + { + uint_l32 num = 0; + + for (size_type no = 0; no < rparray_.size(); ++no) + { + const range_pair &cr = rparray_[no]; + + num += cr.second - cr.first + 1; + } + return num; + } + +private: + +#if !defined(SRELLDBG_NO_CCPOS) + + uchar32 set_eytzinger_layout(uchar32 srcpos, const range_pair *const srcbase, const uchar32 srclen, + range_pair *const destbase, const uchar32 destpos) + { + if (destpos < srclen) + { + const uchar32 nextpos = (destpos << 1) + 1; + + srcpos = set_eytzinger_layout(srcpos, srcbase, srclen, destbase, nextpos); + destbase[destpos] = srcbase[srcpos++]; + srcpos = set_eytzinger_layout(srcpos, srcbase, srclen, destbase, nextpos + 1); + } + return srcpos; + } + +#endif // !defined(SRELLDBG_NO_CCPOS) + + static uchar32 do_nothing(const uchar32 cp) + { + return cp; + } + + template + void load_from_bitset(const BitSetT &bs) + { + uchar32 begin = constants::invalid_u32value; + range_pairs newranges; + + for (uchar32 ucp = 0;; ++ucp) + { + if (ucp > constants::unicode_max_codepoint || !bs.test(ucp)) + { + if (begin != constants::invalid_u32value) + { + newranges.join(range_pair_helper(begin, ucp - 1)); + begin = constants::invalid_u32value; + } + if (ucp > constants::unicode_max_codepoint) + break; + } + else if (begin == constants::invalid_u32value && bs.test(ucp)) + begin = ucp; + } + rparray_.swap(newranges.rparray_); + } + + array_type rparray_; + +public: // For debug. + + void print_pairs(const int, const char *const = NULL, const char *const = NULL) const; +}; +// range_pairs + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + +// For RegExpIdentifierStart and RegExpIdentifierPart +struct identifier_charclass +{ +public: + + void clear() + { + char_class_.clear(); + char_class_pos_.clear(); + } + + void setup() + { + if (char_class_pos_.size() == 0) + { + static const uchar32 additions[] = { + // reg_exp_identifier_start, reg_exp_identifier_part. + 0x24, 0x24, 0x5f, 0x5f, 0x200c, 0x200d // '$' '_' - + }; + range_pairs ranges; + + // For reg_exp_identifier_start. + { + const uchar32 *const IDs_address = unicode_property::ranges_address(unicode_property::bp_ID_Start); + const std::size_t IDs_number = unicode_property::number_of_ranges(unicode_property::bp_ID_Start); + ranges.load_from_memory(IDs_address, IDs_number); + } + ranges.load_from_memory(&additions[0], 2); + append_charclass(ranges); + + // For reg_exp_identifier_part. + ranges.clear(); + { + const uchar32 *const IDc_address = unicode_property::ranges_address(unicode_property::bp_ID_Continue); + const std::size_t IDc_number = unicode_property::number_of_ranges(unicode_property::bp_ID_Continue); + ranges.load_from_memory(IDc_address, IDc_number); + } + ranges.load_from_memory(&additions[0], 3); + append_charclass(ranges); + } + } + + bool is_identifier(const uchar32 ch, const bool part) const + { + const range_pair &rp = char_class_pos_[part ? 1 : 0]; + + return char_class_.is_included(rp.first, rp.second, ch); + } + +private: + + void append_charclass(const range_pairs &rps) + { + char_class_pos_.push_back(range_pair_helper(static_cast(char_class_.size()), static_cast(rps.size()))); + char_class_.append_newclass(rps); + } + + range_pairs char_class_; + range_pairs::array_type char_class_pos_; +}; +// identifier_charclass +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + +class re_character_class +{ +public: + + enum + { // 0 1 2 3 4 5 + newline, dotall, space, digit, word, icase_word, + // 6 + number_of_predefcls + }; + static const uint_l32 error_property = static_cast(-1); + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + typedef unicode_property::pstring pstring; +#endif + + re_character_class() + { + setup_predefinedclass(); + } + + re_character_class &operator=(const re_character_class &that) + { + if (this != &that) + { + this->char_class_ = that.char_class_; + this->char_class_pos_ = that.char_class_pos_; +#if !defined(SRELLDBG_NO_CCPOS) + this->char_class_el_ = that.char_class_el_; + this->char_class_pos_el_ = that.char_class_pos_el_; +#endif + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_character_class &operator=(re_character_class &&that) SRELL_NOEXCEPT + { + if (this != &that) + { + this->char_class_ = std::move(that.char_class_); + this->char_class_pos_ = std::move(that.char_class_pos_); +#if !defined(SRELLDBG_NO_CCPOS) + this->char_class_el_ = std::move(that.char_class_el_); + this->char_class_pos_el_ = std::move(that.char_class_pos_el_); +#endif + } + return *this; + } +#endif + + bool is_included(const uint_l32 class_number, const uchar32 c) const + { +// return char_class_.is_included(char_class_pos_[class_number], c); + const range_pair &rp = char_class_pos_[class_number]; + + return char_class_.is_included(rp.first, rp.second, c); + } + +#if !defined(SRELLDBG_NO_CCPOS) +// bool is_included(const uint_l32 pos, const uint_l32 len, const uchar32 &c) const + bool is_included(const uchar32 pos, const uchar32 len, const uchar32 c) const + { + return char_class_el_.is_included_el(pos, len, c); + } +#endif + + void setup_icase_word() + { + range_pair &icase_pos = char_class_pos_[icase_word]; + + if (icase_pos.second == char_class_pos_[word].second) + { + range_pairs icasewordclass(char_class_, icase_pos.first, icase_pos.second); + + icasewordclass.make_caseunfoldedcharset(); + // Includes 017f and 212a so that they and their case-folded + // characters 's' and 'k' will be excluded from the character + // set that /[\W]/i matches. + + char_class_.replace(icase_pos.first, icase_pos.second, icasewordclass); + + if (icase_pos.second < static_cast(icasewordclass.size())) + { + const uchar32 delta = static_cast(icasewordclass.size() - icase_pos.second); + + for (int i = number_of_predefcls; i < static_cast(char_class_pos_.size()); ++i) + char_class_pos_[i].first += delta; + } + icase_pos.second = static_cast(icasewordclass.size()); + } + } + + void clear() + { + char_class_pos_.resize(number_of_predefcls); + + uchar32 basesize = 0; + for (int i = 0; i < number_of_predefcls; ++i) + basesize += char_class_pos_[i].second; + + char_class_.resize(basesize); + +#if !defined(SRELLDBG_NO_CCPOS) + char_class_el_.clear(); + char_class_pos_el_.clear(); +#endif + } + + uint_l32 register_newclass(const range_pairs &rps) + { + for (range_pairs::size_type no = 0; no < char_class_pos_.size(); ++no) + { + const range_pair &rp = char_class_pos_[no]; + + if (char_class_.same(rp.first, rp.second, rps)) + return static_cast(no); + } + + append_charclass(rps); + return static_cast(char_class_pos_.size() - 1); + } + + range_pairs operator[](const uint_l32 no) const + { + const range_pair &ccpos = char_class_pos_[no]; + range_pairs rp(ccpos.second); + + for (uchar32 i = 0; i < ccpos.second; ++i) + rp[i] = char_class_[ccpos.first + i]; + + return rp; + } + +#if !defined(SRELLDBG_NO_CCPOS) + const range_pair &charclasspos(const uint_l32 no) // const + { + const range_pair &pos = char_class_pos_el_[no]; + + if (pos.second == 0) + finalise(no); + return pos; + } + + void finalise() + { + char_class_el_.clear(); + char_class_pos_el_.resize(char_class_pos_.size()); + std::memset(&char_class_pos_el_[0], 0, char_class_pos_el_.size() * sizeof (range_pairs::array_type::value_type)); + } + + void finalise(const uint_l32 no) + { + const range_pair &posinfo = char_class_pos_[no]; + range_pair &outpair = char_class_pos_el_[no]; + + outpair.first = static_cast(char_class_el_.size()); + outpair.second = char_class_el_.create_el(&char_class_[posinfo.first], posinfo.second); //arraysize; + + } + +#endif // #if !defined(SRELLDBG_NO_CCPOS) + + void optimise() + { + } + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + + uint_l32 lookup_property(const pstring &pname, const pstring &pvalue, const bool icase) + { + const uint_l32 property_number = static_cast(unicode_property::lookup_property(pname, pvalue)); + + if (property_number != unicode_property::error_property && property_number < unicode_property::number_of_properties) + { + const uint_l32 charclass_number = register_property_as_charclass(property_number, icase); + return charclass_number; + } + return error_property; + } + +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + void swap(re_character_class &right) + { + if (this != &right) + { + this->char_class_.swap(right.char_class_); + this->char_class_pos_.swap(right.char_class_pos_); +#if !defined(SRELLDBG_NO_CCPOS) + this->char_class_el_.swap(right.char_class_el_); + this->char_class_pos_el_.swap(right.char_class_pos_el_); +#endif + } + } + +private: + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + + uint_l32 register_property_as_charclass(const uint_l32 property_number, const bool icase) + { + if (property_number == unicode_property::bp_Assigned) + { + // \p{Assigned} == \P{Cn} + return load_updata_and_register_as_charclass(unicode_property::gc_Cn, false, true); + } + return load_updata_and_register_as_charclass(property_number, icase, false); + } + + uint_l32 load_updata_and_register_as_charclass(const uint_l32 property_number, const bool /* icase */, const bool negation) + { + const uchar32 *const address = unicode_property::ranges_address(property_number); +// const std::size_t offset = unicode_property::ranges_offset(property_number); + const std::size_t number = unicode_property::number_of_ranges(property_number); + range_pairs newranges; + + newranges.load_from_memory(address, number); + + if (negation) + newranges.negation(); + + return register_newclass(newranges); + } + +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + void append_charclass(const range_pairs &rps) + { + char_class_pos_.push_back(range_pair_helper(static_cast(char_class_.size()), static_cast(rps.size()))); + char_class_.append_newclass(rps); + } + +// The production CharacterClassEscape::s evaluates as follows: +// Return the set of characters containing the characters that are on the right-hand side of the WhiteSpace or LineTerminator productions. +// WhiteSpace:: +// 0009 000B 000C 0020 00A0 FEFF Zs +// LineTerminator:: +// 000A 000D 2028 2029 + + void setup_predefinedclass() + { +#if !defined(SRELL_NO_UNICODE_PROPERTY) + const uchar32 *const Zs_address = unicode_property::ranges_address(unicode_property::gc_Zs); +// const std::size_t Zs_offset = unicode_property::ranges_offset(unicode_property::gc_Zs); + const std::size_t Zs_number = unicode_property::number_of_ranges(unicode_property::gc_Zs); +#else + static const uchar32 Zs[] = { + 0x1680, 0x1680, 0x2000, 0x200a, // 0x2028, 0x2029, + 0x202f, 0x202f, 0x205f, 0x205f, 0x3000, 0x3000 + }; +#endif // defined(SRELL_NO_UNICODE_PROPERTY) + static const uchar32 allranges[] = { + // dotall. + 0x0000, 0x10ffff, + // newline. + 0x0a, 0x0a, 0x0d, 0x0d, // \n \r + // newline, space. + 0x2028, 0x2029, + // space. + 0x09, 0x0d, // \t \n \v \f \r + 0x20, 0x20, // ' ' + 0xa0, 0xa0, // + 0xfeff, 0xfeff, // + // digit, word. + 0x30, 0x39, // '0'-'9' + 0x41, 0x5a, 0x5f, 0x5f, 0x61, 0x7a // 'A'-'Z' '_' 'a'-'z' + }; + range_pairs ranges; + + // newline. + ranges.load_from_memory(&allranges[2], 3); + append_charclass(ranges); + + // dotall. + ranges.clear(); + ranges.load_from_memory(&allranges[0], 1); + append_charclass(ranges); + + // space. + ranges.clear(); + ranges.load_from_memory(&allranges[6], 5); +#if !defined(SRELL_NO_UNICODE_PROPERTY) + ranges.load_from_memory(Zs_address, Zs_number); +#else + ranges.load_from_memory(Zs, 5); +#endif + append_charclass(ranges); + + // digit. + ranges.clear(); + ranges.load_from_memory(&allranges[16], 1); + append_charclass(ranges); + + // word. + ranges.clear(); + ranges.load_from_memory(&allranges[16], 4); + append_charclass(ranges); + + // Reservation for icase_word. + append_charclass(ranges); + } + +private: + + range_pairs char_class_; + range_pairs::array_type char_class_pos_; + +#if !defined(SRELLDBG_NO_CCPOS) + range_pairs char_class_el_; + range_pairs::array_type char_class_pos_el_; + +#endif + +public: // For debug. + + void print_classes(const int) const; +}; +// re_character_class + + } // namespace regex_internal + +// ... "rei_char_class.hpp"] +// ["rei_groupname_mapper.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELL_NO_NAMEDCAPTURE) + +template +class groupname_and_backrefnumber_mapper +{ +public: + + typedef simple_array gname_string; + typedef typename gname_string::size_type size_type; + static const numberT notfound = static_cast(-1); + + groupname_and_backrefnumber_mapper() + { + } + + groupname_and_backrefnumber_mapper(const groupname_and_backrefnumber_mapper &right) + : names_(right.names_), keysize_classno_(right.keysize_classno_) + { + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + groupname_and_backrefnumber_mapper(groupname_and_backrefnumber_mapper &&right) SRELL_NOEXCEPT + : names_(std::move(right.names_)), keysize_classno_(std::move(right.keysize_classno_)) + { + } +#endif + + groupname_and_backrefnumber_mapper &operator=(const groupname_and_backrefnumber_mapper &right) + { + if (this != &right) + { + names_ = right.names_; + keysize_classno_ = right.keysize_classno_; + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + groupname_and_backrefnumber_mapper &operator=(groupname_and_backrefnumber_mapper &&right) SRELL_NOEXCEPT + { + if (this != &right) + { + names_ = std::move(right.names_); + keysize_classno_ = std::move(right.keysize_classno_); + } + return *this; + } +#endif + + void clear() + { + names_.clear(); + keysize_classno_.clear(); + } + + numberT operator[](const gname_string &gname) const + { + numberT pos = 0; + for (std::size_t i = 0; i < static_cast(keysize_classno_.size()); i += 2) + { + const numberT keysize = keysize_classno_[i]; + + if (keysize == static_cast(gname.size()) && sameseq(pos, gname)) + return keysize_classno_[++i]; + + pos += keysize; + } + return notfound; + } + + gname_string operator[](const numberT indexno) const + { + numberT pos = 0; + for (std::size_t i = 0; i < static_cast(keysize_classno_.size()); ++i) + { + const numberT keysize = keysize_classno_[i]; + const numberT classno = keysize_classno_[++i]; + + if (classno == indexno) + return gname_string(names_, pos, keysize); + + pos += keysize; + } + return gname_string(); + } + + size_type size() const + { + return static_cast(keysize_classno_.size() >> 1); + } + + bool push_back(const gname_string &gname, const numberT class_number) + { + const numberT num = operator[](gname); + + if (num == notfound) + { + names_.append(gname); + keysize_classno_.append(1, static_cast(gname.size())); + keysize_classno_.append(1, class_number); + return true; + } + return false; // Already exists. + } + + void swap(groupname_and_backrefnumber_mapper &right) + { + this->names_.swap(right.names_); + keysize_classno_.swap(right.keysize_classno_); + } + +private: + + bool sameseq(size_type pos, const gname_string &gname) const + { + for (size_type i = 0; i < gname.size(); ++i, ++pos) + if (pos >= names_.size() || names_[pos] != gname[i]) + return false; + + return true; + } + + gname_string names_; + simple_array keysize_classno_; + +public: // For debug. + + void print_mappings(const int) const; +}; +// groupname_and_backrefnumber_mapper + +template +class groupname_mapper : public groupname_and_backrefnumber_mapper +{ +}; + +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + } // namespace regex_internal + +// ... "rei_groupname_mapper.hpp"] +// ["rei_state.hpp" ... + + namespace regex_internal + { + +struct re_quantifier +{ + static const uint_l32 infinity = static_cast(~0); + + // atleast and atmost: for check_counter. + // offset and length: for charcter_class. + // (Special case 1) in roundbracket_open and roundbracket_pop atleast and atmost represent + // the minimum and maximum bracket numbers respectively inside the brackets itself. + // (Special case 2) in repeat_in_push and repeat_in_pop atleast and atmost represent the + // minimum and maximum bracket numbers respectively inside the repetition. + union + { + uint_l32 atleast; + // (Special case 3: v1) in lookaround_open represents the number of characters to be rewound. + // (Special case 3: v2) in lookaround_open represents: 0=lookaheads, 1=lookbehinds, + // 2=matchpointrewinder. + // (Special case 4) in NFA_states[0] represents the class number of the first character class. + uchar32 offset; + }; + union + { + uint_l32 atmost; + uchar32 length; + }; + + union + { + bool is_greedy; + uint_l32 padding_; + }; + + void reset(const uint_l32 len = 1) + { + atleast = atmost = len; + is_greedy = true; + } + + void set(const uint_l32 min, const uint_l32 max) + { + atleast = min; + atmost = max; + } + + void set(const uint_l32 min, const uint_l32 max, const bool greedy) + { + atleast = min; + atmost = max; + is_greedy = greedy; + } + + void setccpos(const uchar32 o, const uchar32 l) + { + offset = o; + length = l; + } + + bool is_valid() const + { + return atleast <= atmost && atmost > 0; + } + + void set_infinity() + { + atmost = infinity; + } + + bool is_infinity() const + { + return atmost == infinity; + } + + bool is_same() const + { + return atleast == atmost; + } + + bool is_default() const + { + return atleast == 1 && atmost == 1; + } + + bool is_asterisk() const + { + return atleast == 0 && atmost == infinity; + } + bool is_plus() const + { + return atleast == 1 && atmost == infinity; + } + bool is_asterisk_or_plus() const + { + return atleast <= 1 && atmost == infinity; + } + bool is_question_or_asterisk() const + { + return atleast == 0 && (atmost == 1 || atmost == infinity); + } + + bool has_simple_equivalence() const + { + return (atleast <= 1 && atmost <= 3) || (atleast == 2 && atmost <= 4) || (atleast == atmost && atmost <= 6); + } + + void multiply(const re_quantifier &q) + { + if (atleast != infinity) + { + if (q.atleast != infinity) + atleast *= q.atleast; + else + atleast = infinity; + } + + if (atmost != infinity) + { + if (q.atmost != infinity) + atmost *= q.atmost; + else + atmost = infinity; + } + } + + void add(const re_quantifier &q) + { + if (atleast != infinity) + { + if (q.atleast != infinity && (atleast + q.atleast) >= atleast) + atleast += q.atleast; + else + atleast = infinity; + } + + if (atmost != infinity) + { + if (q.atmost != infinity && (atmost + q.atmost) >= atmost) + atmost += q.atmost; + else + atmost = infinity; + } + } +}; +// re_quantifier + +struct re_state +{ + union + { + uchar32 character; // For character. + uint_l32 number; // For character_class, brackets, counter, repeat, backreference. + }; + + re_state_type type; + + union + { + std::ptrdiff_t next1; + re_state *next_state1; + // Points to the next state. + // (Special case 1) in lookaround_open points to the next of lookaround_close. + }; + union + { + std::ptrdiff_t next2; + re_state *next_state2; + // character and character_class: points to another possibility, non-backtracking. + // epsilon: points to another possibility, backtracking. + // save_and_reset_counter, roundbracket_open, and repeat_in_push: points to a + // restore state, backtracking. + // check_counter: complementary to next1 based on quantifier.is_greedy. + // (Special case 1) roundbracket_close, check_0_width_repeat, and backreference: + // points to the next state as an exit after 0 width match. + // (Special case 2) in NFA_states[0] holds the entry point for match_continuous/regex_match. + // (Special case 3) in lookaround_open points to the contents of brackets. + }; + + re_quantifier quantifier; // For check_counter, roundbrackets, repeasts, (?<=...) and (? number of chars to be rewound (for (?<=...) (? 0: lookahead, 1: lookbehind, 2: mprewinder. + // q.atmost: - + // q.greedy: - + // is_not/dont_push: not + + // st_bol, // 0x0f + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + // st_eol, // 0x10 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + // st_boundary, // 0x11 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: not + + // st_success, // 0x12 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + // st_move_nextpos, // 0x13 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + void reset() + { + number = 0; + type = st_character; + next1 = 1; + next2 = 0; + is_not = false; + quantifier.reset(); + } + + bool is_character_or_class() const + { + return type == st_character || type == st_character_class; + } + + bool has_quantifier() const + { + // 1. character: size == 1 && type == character, + // 2. [...]: size == 1 && type == character_class, + // 3. (...): size == ? && type == roundbracket_open, + // 4. (?:...): size == ? && type == epsilon && character == ':', + // 5. backref: size == ? && type == backreference, + // -- assertions boundary -- + // 6. lookaround: size == ? && type == lookaround, + // 7. assertion: size == 0 && type == one of assertions (^, $, \b and \B). +#if !defined(SRELL_ENABLE_GT) + return type < st_zero_width_boundary; +#else + // 5.5. independent: size == ? && type == lookaround && character == '>', + return type < st_zero_width_boundary || (type == st_lookaround_open && character == meta_char::mc_gt); +#endif + } + + bool is_noncapturinggroup() const + { + return type == st_epsilon && character == meta_char::mc_colon; + } + + bool has_0widthchecker() const + { + return type == st_roundbracket_open || type == st_backreference; + } + + bool is_negcharclass() const + { + return type == st_character_class && is_not; + } + + bool is_branch() const + { + return type == st_epsilon && next2 != 0 && character == meta_char::mc_bar; // '|' + } +}; +// re_state + +template +//struct re_flags +struct re_compiler_state +{ +// bool i; +// bool m; +// bool s; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + bool back; +#endif + + bool backref_used; + + simple_array atleast_widths_of_brackets; +#if !defined(SRELL_NO_NAMEDCAPTURE) + groupname_mapper unresolved_gnames; +#endif + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + identifier_charclass idchecker; +#endif + + void reset(const regex_constants::syntax_option_type & /* flags */) + { +// i = (flags & regex_constants::icase) != 0; // Case-insensitive. +// m = (flags & regex_constants::multiline) != 0; +// s = (flags & regex_constants::dotall) != 0; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + back = false; +#endif + + backref_used = false; + atleast_widths_of_brackets.clear(); + +#if !defined(SRELL_NO_NAMEDCAPTURE) + unresolved_gnames.clear(); +#endif + +#if !defined(SRELL_NO_UNICODE_PROPERTY) +// idchecker.clear(); // Keeps data once created. +#endif + } + + void restore_from(const re_compiler_state &backup) + { +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + back = backup.back; +#endif + } +}; +// re_compiler_state + + } // namespace regex_internal + +// ... "rei_state.hpp"] +// ["rei_search_state.hpp" ... + +template +class sub_match /* : std::pair */; + + namespace regex_internal + { + +//template +struct re_state; + +template +struct re_search_state_core +{ + const re_state/* */ *in_NFA_states; + BidirectionalIterator in_string; +}; + +template +struct re_submatch_core +{ + BidirectionalIterator open_at; + BidirectionalIterator close_at; +}; + +template +struct re_submatch_type +{ + re_submatch_core core; + uint_l32 counter; +}; + +template +struct re_search_state_types +{ + typedef re_submatch_core submatch_core; + typedef re_submatch_type submatch_type; + typedef uint_l32 counter_type; + typedef BidirectionalIterator position_type; + + typedef std::vector submatch_array; + + typedef re_search_state_core search_core_state; + + typedef std::vector backtracking_array; + typedef std::vector capture_array; + typedef simple_array counter_array; + typedef std::vector repeat_array; +}; + +template +struct re_search_state_types +{ + typedef re_submatch_core submatch_core; + typedef re_submatch_type submatch_type; + typedef uint_l32 counter_type; + typedef const charT2 *position_type; + + typedef simple_array submatch_array; + + typedef re_search_state_core search_core_state; + + typedef simple_array backtracking_array; + typedef simple_array capture_array; + typedef simple_array repeat_array; + typedef simple_array counter_array; +}; +// re_search_state_types + +template +class re_search_state : public re_search_state_types +{ +private: + + typedef re_search_state_types base_type; + +public: + + typedef typename base_type::submatch_core submatchcore_type; + typedef typename base_type::submatch_type submatch_type; + typedef typename base_type::counter_type counter_type; + typedef typename base_type::position_type position_type; + + typedef typename base_type::submatch_array submatch_array; + + typedef typename base_type::search_core_state search_core_state; + + typedef typename base_type::backtracking_array backtracking_array; + typedef typename base_type::capture_array capture_array; + typedef typename base_type::counter_array counter_array; + typedef typename base_type::repeat_array repeat_array; + + typedef typename backtracking_array::size_type btstack_size_type; + +public: + + struct bottom_state + { + btstack_size_type btstack_size; + typename capture_array::size_type capturestack_size; + typename counter_array::size_type counterstack_size; + typename repeat_array::size_type repeatstack_size; + + bottom_state( + const btstack_size_type bt, + const typename capture_array::size_type h, + const typename counter_array::size_type c, + const typename repeat_array::size_type r) + : btstack_size(bt) + , capturestack_size(h) + , counterstack_size(c) + , repeatstack_size(r) + { + } + }; + +public: + + search_core_state nth; + +#if !defined(SRELL_NO_LIMIT_COUNTER) + std::size_t failure_counter; +#endif + + BidirectionalIterator srchend; + BidirectionalIterator lblim; + + BidirectionalIterator nextpos; + + backtracking_array bt_stack; + + capture_array capture_stack; + counter_array counter_stack; + repeat_array repeat_stack; + + submatch_array bracket; + counter_array counter; + repeat_array repeat; + + btstack_size_type btstack_size; + + BidirectionalIterator srchbegin; + +public: + + void init + ( + const BidirectionalIterator begin, + const BidirectionalIterator end, + const BidirectionalIterator lookbehindlimit, + const regex_constants::match_flag_type flags + ) + { + lblim = lookbehindlimit; + nextpos = srchbegin = begin; + srchend = end; + flags_ = flags; + } + + void set_entrypoint(const re_state *const entry) + { + entry_state_ = entry; + } + + void init_for_automaton + ( + uint_l32 num_of_submatches, + const uint_l32 num_of_counters, + const uint_l32 num_of_repeats + ) + { + + bracket.resize(num_of_submatches); + counter.resize(num_of_counters); + repeat.resize(num_of_repeats); + + nth.in_string = (flags_ & regex_constants::match_continuous) ? srchbegin : srchend; + + while (num_of_submatches > 1) + { + submatch_type &br = bracket[--num_of_submatches]; + + br.core.open_at = br.core.close_at = this->srchend; + br.counter = 0; + // 15.10.2.9; AtomEscape: + // If the regular expression has n or more capturing parentheses + // but the nth one is undefined because it hasn't captured anything, + // then the backreference always succeeds. + + // C.f., table 27 and 28 on TR1, table 142 and 143 on C++11. + } + + clear_stacks(); + } + +#if defined(SRELL_NO_LIMIT_COUNTER) + void reset(/* const BidirectionalIterator start */) +#else + void reset(/* const BidirectionalIterator start, */ const std::size_t limit) +#endif + { + nth.in_NFA_states = this->entry_state_; + + bracket[0].core.open_at = nth.in_string; + +#if !defined(SRELL_NO_LIMIT_COUNTER) + failure_counter = limit; +#endif + } + + bool is_at_lookbehindlimit() const + { + return nth.in_string == this->lblim; + } + + bool is_at_srchend() const + { + return nth.in_string == this->srchend; + } + + bool is_null() const + { + return nth.in_string == bracket[0].core.open_at; + } + +// regex_constants::match_flag_type flags() const +// { +// return this->flags_; +// } + + bool match_not_bol_flag() const + { + if (this->flags_ & regex_constants::match_not_bol) + return true; + return false; + } + + bool match_not_eol_flag() const + { + if (this->flags_ & regex_constants::match_not_eol) + return true; + return false; + } + + bool match_not_bow_flag() const + { + if (this->flags_ & regex_constants::match_not_bow) + return true; + return false; + } + + bool match_not_eow_flag() const + { + if (this->flags_ & regex_constants::match_not_eow) + return true; + return false; + } + + bool match_prev_avail_flag() const + { + if (this->flags_ & regex_constants::match_prev_avail) + return true; + return false; + } + + bool match_not_null_flag() const + { + if (this->flags_ & regex_constants::match_not_null) + return true; + return false; + } + + bool match_continuous_flag() const + { + if (this->flags_ & regex_constants::match_continuous) + return true; + return false; + } + + bool match_match_flag() const + { + if (this->flags_ & regex_constants::match_match_) + return true; + return false; + } + + bool set_bracket0(const BidirectionalIterator begin, const BidirectionalIterator end) + { + nth.in_string = begin; + nextpos = end; + return true; + } + + void clear_stacks() + { + btstack_size = 0; + bt_stack.clear(); + capture_stack.clear(); + repeat_stack.clear(); + counter_stack.clear(); + } + + btstack_size_type size() const // For debug. + { + return bt_stack.size(); + } + + bool is_empty() const // For debug. + { + if (btstack_size == 0 + && bt_stack.size() == 0 + && capture_stack.size() == 0 + && repeat_stack.size() == 0 + && counter_stack.size() == 0) + return true; + + return false; + } + +private: + + /* const */regex_constants::match_flag_type flags_; + const re_state/* */ * /* const */entry_state_; +}; +// re_search_state + + } // namespace regex_internal + +// ... "rei_search_state.hpp"] +// ["rei_bmh.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELLDBG_NO_BMH) + +template +class re_bmh +{ +public: + + re_bmh() + { + } + + re_bmh(const re_bmh &right) + { + operator=(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_bmh(re_bmh &&right) SRELL_NOEXCEPT + { + operator=(std::move(right)); + } +#endif + + re_bmh &operator=(const re_bmh &that) + { + if (this != &that) + { + this->u32string_ = that.u32string_; + + this->bmtable_ = that.bmtable_; + this->repseq_ = that.repseq_; + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_bmh &operator=(re_bmh &&that) SRELL_NOEXCEPT + { + if (this != &that) + { + this->u32string_ = std::move(that.u32string_); + + this->bmtable_ = std::move(that.bmtable_); + this->repseq_ = std::move(that.repseq_); + } + return *this; + } +#endif + + void clear() + { + u32string_.clear(); + + bmtable_.clear(); + repseq_.clear(); + } + + void setup(const simple_array &u32s, const bool icase) + { + u32string_ = u32s; + setup_(); + + if (!icase) + setup_for_casesensitive(); + else + setup_for_icase(); + } + + template + bool do_casesensitivesearch(re_search_state &sstate, const std::random_access_iterator_tag) const + { + RandomAccessIterator begin = sstate.srchbegin; + const RandomAccessIterator end = sstate.srchend; + std::size_t offset = static_cast(repseq_.size() - 1); + const charT *const relastchar = &repseq_[offset]; + + for (; static_cast(end - begin) > offset;) + { + begin += offset; + + if (*begin == *relastchar) + { + const charT *re = relastchar; + RandomAccessIterator tail = begin; + + for (; *--re == *--tail;) + { + if (re == repseq_.data()) + return sstate.set_bracket0(tail, ++begin); + } + } + offset = bmtable_[*begin & 0xff]; + } + return false; + } + + template + bool do_casesensitivesearch(re_search_state &sstate, const std::bidirectional_iterator_tag) const + { + BidirectionalIterator begin = sstate.srchbegin; + const BidirectionalIterator end = sstate.srchend; + std::size_t offset = static_cast(repseq_.size() - 1); + const charT *const relastchar = &repseq_[offset]; + + for (;;) + { + for (; offset; --offset, ++begin) + if (begin == end) + return false; + + if (*begin == *relastchar) + { + const charT *re = relastchar; + BidirectionalIterator tail = begin; + + for (; *--re == *--tail;) + { + if (re == repseq_.data()) + return sstate.set_bracket0(tail, ++begin); + } + } + offset = bmtable_[*begin & 0xff]; + } + } + + template + bool do_icasesearch(re_search_state &sstate, const std::random_access_iterator_tag) const + { + const RandomAccessIterator begin = sstate.srchbegin; + const RandomAccessIterator end = sstate.srchend; + std::size_t offset = bmtable_[256]; + const uchar32 entrychar = u32string_[u32string_.size() - 1]; + const uchar32 *const re2ndlastchar = &u32string_[u32string_.size() - 2]; + RandomAccessIterator curpos = begin; + + for (; static_cast(end - curpos) > offset;) + { + curpos += offset; + + for (; utf_traits::is_trailing(*curpos);) + if (++curpos == end) + return false; + + const uchar32 txtlastchar = utf_traits::codepoint(curpos, end); + + if (txtlastchar == entrychar || unicode_case_folding::do_casefolding(txtlastchar) == entrychar) + { + const uchar32 *re = re2ndlastchar; + RandomAccessIterator tail = curpos; + +// for (; *--re == unicode_case_folding::do_casefolding(utf_traits::dec_codepoint(tail, begin));) + for (; *re == unicode_case_folding::do_casefolding(utf_traits::dec_codepoint(tail, begin)); --re) + { + if (re == u32string_.data()) + { + utf_traits::codepoint_inc(curpos, end); + return sstate.set_bracket0(tail, curpos); + } + if (tail == begin) + break; + } + } + offset = bmtable_[txtlastchar & 0xff]; + } + return false; + } + + template + bool do_icasesearch(re_search_state &sstate, const std::bidirectional_iterator_tag) const + { + const BidirectionalIterator begin = sstate.srchbegin; + const BidirectionalIterator end = sstate.srchend; + + if (begin != end) + { + std::size_t offset = bmtable_[256]; //static_cast(u32string_.size() - 1); + const uchar32 entrychar = u32string_[offset]; + const uchar32 *const re2ndlastchar = &u32string_[offset - 1]; + BidirectionalIterator curpos = begin; + + for (;;) + { + for (;;) + { + if (++curpos == end) + return false; + if (!utf_traits::is_trailing(*curpos)) + if (--offset == 0) + break; + } +// const uchar32 txtlastchar = unicode_case_folding::do_casefolding(utf_traits::codepoint(curpos, end)); + const uchar32 txtlastchar = utf_traits::codepoint(curpos, end); + +// if (txtlastchar == *re2ndlastchar) +// if (txtlastchar == *re2ndlastchar || unicode_case_folding::do_casefolding(txtlastchar) == *re2ndlastchar) + if (txtlastchar == entrychar || unicode_case_folding::do_casefolding(txtlastchar) == entrychar) + { + const uchar32 *re = re2ndlastchar; + BidirectionalIterator tail = curpos; + + for (; *re == unicode_case_folding::do_casefolding(utf_traits::dec_codepoint(tail, begin)); --re) + { + if (re == u32string_.data()) + { + utf_traits::codepoint_inc(curpos, end); + return sstate.set_bracket0(tail, curpos); + } + if (tail == begin) + break; + } + } + offset = bmtable_[txtlastchar & 0xff]; + } + } + return false; + } + +private: + + void setup_() + { + bmtable_.resize(257); + } + + void setup_for_casesensitive() + { + charT mbstr[utf_traits::maxseqlen]; + const std::size_t u32str_lastcharpos_ = static_cast(u32string_.size() - 1); + + repseq_.clear(); + + for (std::size_t i = 0; i <= u32str_lastcharpos_; ++i) + { + const uchar32 seqlen = utf_traits::to_codeunits(mbstr, u32string_[i]); + + for (uchar32 j = 0; j < seqlen; ++j) + repseq_.push_back(mbstr[j]); + } + + for (std::size_t i = 0; i < 256; ++i) + bmtable_[i] = static_cast(repseq_.size()); + + const std::size_t repseq_lastcharpos_ = static_cast(repseq_.size() - 1); + + for (std::size_t i = 0; i < repseq_lastcharpos_; ++i) + bmtable_[repseq_[i] & 0xff] = repseq_lastcharpos_ - i; + } + + void setup_for_icase() + { + charT mbstr[utf_traits::maxseqlen]; + uchar32 u32table[unicode_case_folding::rev_maxset]; + const std::size_t u32str_lastcharpos = static_cast(u32string_.size() - 1); + simple_array minlen(u32string_.size()); + std::size_t cu_repseq_lastcharpos = 0; + + for (std::size_t i = 0; i <= u32str_lastcharpos; ++i) + { + const uchar32 setnum = unicode_case_folding::casefoldedcharset(u32table, u32string_[i]); + uchar32 u32c = u32table[0]; + + for (uchar32 j = 1; j < setnum; ++j) + if (u32c > u32table[j]) + u32c = u32table[j]; + + if (i < u32str_lastcharpos) + cu_repseq_lastcharpos += minlen[i] = utf_traits::to_codeunits(mbstr, u32c); + } + + ++cu_repseq_lastcharpos; + + for (std::size_t i = 0; i < 256; ++i) + bmtable_[i] = cu_repseq_lastcharpos; + + bmtable_[256] = --cu_repseq_lastcharpos; + + for (std::size_t i = 0; i < u32str_lastcharpos; ++i) + { + const uchar32 setnum = unicode_case_folding::casefoldedcharset(u32table, u32string_[i]); + + for (uchar32 j = 0; j < setnum; ++j) + bmtable_[u32table[j] & 0xff] = cu_repseq_lastcharpos; + + cu_repseq_lastcharpos -= minlen[i]; + } + } + +public: // For debug. + + void print_table() const; + void print_seq() const; + +private: + + simple_array u32string_; +// std::size_t bmtable_[256]; + simple_array bmtable_; + simple_array repseq_; +}; +// re_bmh + +#endif // !defined(SRELLDBG_NO_BMH) + } // namespace regex_internal + +// ... "rei_bmh.hpp"] +// ["rei_compiler.hpp" ... + + namespace regex_internal + { + +template +struct re_object_core +{ +protected: + + typedef re_state/**/ state_type; + typedef simple_array state_array; + + state_array NFA_states; + re_character_class character_class; + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + bitset firstchar_class_bs; + #else + range_pairs firstchar_class; + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) +public: + + std::size_t limit_counter; + +protected: +#endif + + typedef typename traits::utf_traits utf_traits; + + uint_l32 number_of_brackets; + uint_l32 number_of_counters; + uint_l32 number_of_repeats; + regex_constants::syntax_option_type soflags; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + groupname_mapper namedcaptures; + typedef typename groupname_mapper::gname_string gname_string; +#endif + +#if !defined(SRELLDBG_NO_BMH) + re_bmh *bmdata; +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) +private: + + static const std::size_t lcounter_defnum_ = 16777216; + +#endif + +protected: + + re_object_core() +#if !defined(SRELL_NO_LIMIT_COUNTER) + : limit_counter(lcounter_defnum_) + #if !defined(SRELLDBG_NO_BMH) + , bmdata(NULL) + #endif +#elif !defined(SRELLDBG_NO_BMH) + : bmdata(NULL) +#endif + { + } + + re_object_core(const re_object_core &right) +#if !defined(SRELLDBG_NO_BMH) + : bmdata(NULL) +#endif + { + operator=(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_object_core(re_object_core &&right) SRELL_NOEXCEPT +#if !defined(SRELLDBG_NO_BMH) + : bmdata(NULL) +#endif + { + operator=(std::move(right)); + } +#endif + +#if !defined(SRELLDBG_NO_BMH) + ~re_object_core() + { + if (bmdata) + delete bmdata; + } +#endif + + void reset(const regex_constants::syntax_option_type flags) + { + NFA_states.clear(); + character_class.clear(); + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + firstchar_class_bs.reset(); + #else + firstchar_class.clear(); + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + limit_counter = lcounter_defnum_; +#endif + + number_of_brackets = 1; + number_of_counters = 0; + number_of_repeats = 0; + soflags = flags; // regex_constants::ECMAScript; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + namedcaptures.clear(); +#endif + +#if !defined(SRELLDBG_NO_BMH) +// bmdata->clear(); + if (bmdata) + delete bmdata; + bmdata = NULL; +#endif + } + + re_object_core &operator=(const re_object_core &that) + { + if (this != &that) + { + this->NFA_states = that.NFA_states; + this->character_class = that.character_class; + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + this->firstchar_class_bs = that.firstchar_class_bs; + #else + this->firstchar_class = that.firstchar_class; + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + this->limit_counter = that.limit_counter; +#endif + +// this->utf_traits_inst = that.utf_traits_inst; + + this->number_of_brackets = that.number_of_brackets; + this->number_of_counters = that.number_of_counters; + this->number_of_repeats = that.number_of_repeats; + this->soflags = that.soflags; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->namedcaptures = that.namedcaptures; +#endif + +#if !defined(SRELLDBG_NO_BMH) + if (that.bmdata) + { + if (this->bmdata) + *this->bmdata = *that.bmdata; + else + this->bmdata = new re_bmh(*that.bmdata); + } + else if (this->bmdata) + { + delete this->bmdata; + this->bmdata = NULL; + } +#endif + + if (that.NFA_states.size()) + repair_nextstates(&that.NFA_states[0]); + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_object_core &operator=(re_object_core &&that) SRELL_NOEXCEPT + { + if (this != &that) + { + this->NFA_states = std::move(that.NFA_states); + this->character_class = std::move(that.character_class); + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + this->firstchar_class_bs = std::move(that.firstchar_class_bs); + #else + this->firstchar_class = std::move(that.firstchar_class); + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + this->limit_counter = that.limit_counter; +#endif + + this->number_of_brackets = that.number_of_brackets; + this->number_of_counters = that.number_of_counters; + this->number_of_repeats = that.number_of_repeats; + this->soflags = that.soflags; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->namedcaptures = std::move(that.namedcaptures); +#endif + +#if !defined(SRELLDBG_NO_BMH) + if (this->bmdata) + delete this->bmdata; + this->bmdata = that.bmdata; + that.bmdata = NULL; +#endif + } + return *this; + } +#endif // defined(SRELL_CPP11_MOVE_ENABLED) + + void swap(re_object_core &right) + { + if (this != &right) + { + this->NFA_states.swap(right.NFA_states); + this->character_class.swap(right.character_class); + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + this->firstchar_class_bs.swap(right.firstchar_class_bs); + #else + this->firstchar_class.swap(right.firstchar_class); + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + { + const std::size_t tmp_limit_counter = this->limit_counter; + this->limit_counter = right.limit_counter; + right.limit_counter = tmp_limit_counter; + } +#endif +// this->utf_traits_inst.swap(right.utf_traits_inst); + + { + const uint_l32 tmp_numof_brackets = this->number_of_brackets; + this->number_of_brackets = right.number_of_brackets; + right.number_of_brackets = tmp_numof_brackets; + } + { + const uint_l32 tmp_numof_counters = this->number_of_counters; + this->number_of_counters = right.number_of_counters; + right.number_of_counters = tmp_numof_counters; + } + { + const uint_l32 tmp_numof_repeats = this->number_of_repeats; + this->number_of_repeats = right.number_of_repeats; + right.number_of_repeats = tmp_numof_repeats; + } + { + const regex_constants::syntax_option_type tmp_soflags = this->soflags; + this->soflags = right.soflags; + right.soflags = tmp_soflags; + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->namedcaptures.swap(right.namedcaptures); +#endif + +#if !defined(SRELLDBG_NO_BMH) + { + re_bmh *const tmp_bmdata = this->bmdata; + this->bmdata = right.bmdata; + right.bmdata = tmp_bmdata; + } +#endif + } + } + + void throw_error(const regex_constants::error_type &e) + { +// reset(); + NFA_states.clear(); +#if !defined(SRELLDBG_NO_BMH) + if (bmdata) + delete bmdata; + bmdata = NULL; +#endif + throw regex_error(e); + } + +private: + + void repair_nextstates(const state_type *const oldbase) + { + state_type *const newbase = &this->NFA_states[0]; + + for (typename state_array::size_type i = 0; i < this->NFA_states.size(); ++i) + { + state_type &state = this->NFA_states[i]; + + if (state.next_state1) + state.next_state1 = state.next_state1 - oldbase + newbase; + + if (state.next_state2) + state.next_state2 = state.next_state2 - oldbase + newbase; + } + } +}; +// re_object_core + +template +class re_compiler : public re_object_core +{ +protected: + + template + bool compile(ForwardIterator begin, const ForwardIterator end, const regex_constants::syntax_option_type flags /* = regex_constants::ECMAScript */) + { + simple_array u32; + + while (begin != end) + { + const uchar32 u32c = utf_traits::codepoint_inc(begin, end); + if (u32c > constants::unicode_max_codepoint) + this->throw_error(regex_constants::error_utf8); + u32.push_back(u32c); + } + + return compile_core(u32.data(), u32.data() + u32.size(), flags); + } + + bool is_icase() const + { +#if !defined(SRELL_NO_ICASE) + if (this->soflags & regex_constants::icase) + return true; +#endif + return false; + } + bool is_ricase() const + { +#if !defined(SRELL_NO_ICASE) + return /* this->NFA_states.size() && */ this->NFA_states[0].icase == true; +#else + return false; +#endif + } + + bool is_multiline() const + { + if (this->soflags & regex_constants::multiline) + return true; + return false; + } + + bool is_dotall() const + { + return (this->soflags & regex_constants::dotall) ? true : false; + } + + bool is_optimize() const + { + return (this->soflags & regex_constants::optimize) ? true : false; + } + +private: + + typedef re_object_core base_type; + typedef typename base_type::utf_traits utf_traits; + typedef typename base_type::state_type state_type; + typedef typename base_type::state_array state_array; +#if !defined(SRELL_NO_NAMEDCAPTURE) + typedef typename base_type::gname_string gname_string; +#endif +#if !defined(SRELL_NO_UNICODE_PROPERTY) + typedef typename re_character_class::pstring pstring; +#endif + typedef typename state_array::size_type state_size_type; + + bool compile_core(const uchar32 *begin, const uchar32 *const end, const regex_constants::syntax_option_type flags) + { + re_quantifier piececharlen; + re_compiler_state cstate; + state_type atom; + + this->reset(flags); +// this->soflags = flags; + cstate.reset(flags); + + atom.reset(); + atom.type = st_epsilon; + atom.next2 = 1; + this->NFA_states.push_back(atom); + + if (!make_nfa_states(this->NFA_states, piececharlen, begin, end, cstate)) + { + return false; + } + + if (begin != end) + this->throw_error(regex_constants::error_paren); // ')'s are too many. + + if (!check_backreferences(cstate)) + this->throw_error(regex_constants::error_backref); + +#if !defined(SRELL_NO_ICASE) + if (this->is_icase()) + this->NFA_states[0].icase = check_if_really_needs_icase_search(); +#endif + +#if !defined(SRELLDBG_NO_BMH) + setup_bmhdata(); +#endif + + atom.type = st_success; + atom.next1 = 0; + atom.next2 = 0; + this->NFA_states.push_back(atom); + + optimise(); + relativejump_to_absolutejump(); + + return true; + } + + bool make_nfa_states(state_array &piece, re_quantifier &piececharlen, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + typename state_array::size_type prevbranch_end = 0; + state_type atom; + state_array branch; + re_quantifier branchsize; + + piececharlen.reset(0); + + for (;;) + { + branch.clear(); + + if (!make_branch(branch, branchsize, curpos, end, cstate)) + return false; + + // For piececharlen.atleast, 0 as the initial value and 0 as an + // actual value must be distinguished. + if (piececharlen.atmost == 0 || piececharlen.atleast > branchsize.atleast) + piececharlen.atleast = branchsize.atleast; + + if (piececharlen.atmost < branchsize.atmost) + piececharlen.atmost = branchsize.atmost; + + if (curpos != end && *curpos == meta_char::mc_bar) + { + atom.reset(); + atom.character = meta_char::mc_bar; + atom.type = st_epsilon; + atom.next2 = static_cast(branch.size()) + 2; + branch.insert(0, atom); + } + + if (prevbranch_end) + piece[prevbranch_end].next1 = static_cast(branch.size()) + 1; + + piece += branch; + + // end or ')' + if (curpos == end || *curpos == meta_char::mc_rbracl) + break; + + // *curpos == '|' + + prevbranch_end = piece.size(); + atom.reset(); + atom.type = st_epsilon; + piece.push_back(atom); + + ++curpos; + } + return true; + } + + bool make_branch(state_array &branch, re_quantifier &branchsize, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + state_array piece; + state_array piece_with_quantifier; + re_quantifier quantifier; + + branchsize.reset(0); + + for (;;) + { + re_quantifier piececharlen; + + if (curpos == end) + return true; + + piece.clear(); + piece_with_quantifier.clear(); + + switch (*curpos) + { +// case char_ctrl::cc_nul: // '\0': + case meta_char::mc_bar: // '|': + case meta_char::mc_rbracl: // ')': + return true; + + default: + if (!get_atom(piece, piececharlen, curpos, end, cstate)) + return false; + } + + if (piece.size()) + { + const state_type &firstatom = piece[0]; + + quantifier.reset(); // quantifier.atleast = quantifier.atmost = 1; + + if (firstatom.has_quantifier()) + { + if (curpos != end && !get_quantifier(quantifier, curpos, end)) + return false; + } + + if (piece.size() == 2 && firstatom.is_noncapturinggroup() && piece[1].is_noncapturinggroup()) + { + // (?:) alone or followed by a quantifier. +// piece_with_quantifier += piece; + ; // Do nothing. + } + else + combine_piece_with_quantifier(piece_with_quantifier, piece, quantifier, piececharlen); + +#if 01 + piececharlen.multiply(quantifier); + branchsize.add(piececharlen); +#else + branchsize.atleast += piececharlen.atleast * quantifier.atleast; + if (!branchsize.is_infinity()) + { + if (piececharlen.is_infinity() || quantifier.is_infinity()) + branchsize.set_infinity(); + else + branchsize.atmost += piececharlen.atmost * quantifier.atmost; + } +#endif + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + + if (!cstate.back) + branch += piece_with_quantifier; + else + branch.insert(0, piece_with_quantifier); +#else + branch += piece_with_quantifier; +#endif + } + } + } + + bool get_atom(state_array &piece, re_quantifier &atomsize, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + state_type atom; + + atom.reset(); + atom.character = *curpos++; + + switch (atom.character) + { + case meta_char::mc_rbraop: // '(': + return get_piece_in_roundbrackets(piece, atomsize, curpos, end, cstate); + + case meta_char::mc_sbraop: // '[': + if (!register_character_class(atom, curpos, end, cstate)) + return false; + + break; + + case meta_char::mc_escape: // '\\': + if (!translate_atom_escape(atom, curpos, end, cstate)) + return false; + + break; + + case meta_char::mc_period: // '.': + atom.type = st_character_class; +#if !defined(SRELL_NO_SINGLELINE) + if (this->is_dotall()) + { + atom.number = static_cast(re_character_class::dotall); + } + else +#endif + { +// atom.number = static_cast(re_character_class::newline); + range_pairs nlclass = this->character_class[static_cast(re_character_class::newline)]; + + nlclass.negation(); + atom.number = this->character_class.register_newclass(nlclass); + } + break; + + case meta_char::mc_caret: // '^': + atom.type = st_bol; + atom.quantifier.reset(0); +// if (current_flags.m) + if (is_multiline()) + atom.multiline = true; + break; + + case meta_char::mc_dollar: // '$': + atom.type = st_eol; + atom.quantifier.reset(0); +// if (current_flags.m) + if (is_multiline()) + atom.multiline = true; + break; + + case meta_char::mc_astrsk: // '*': + case meta_char::mc_plus: // '+': + case meta_char::mc_query: // '?': + case meta_char::mc_cbraop: // '{' + this->throw_error(regex_constants::error_badrepeat); + + default:; + } + + if (atom.type == st_character) + { + if (this->is_icase()) + atom.character = unicode_case_folding::do_casefolding(atom.character); + } + + piece.push_back(atom); + atomsize = atom.quantifier; + + return true; + } + + // '('. + + bool get_piece_in_roundbrackets(state_array &piece, re_quantifier &piececharlen, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + const re_compiler_state original_cstate(cstate); + state_type atom; + + if (curpos == end) + this->throw_error(regex_constants::error_paren); + + atom.reset(); + atom.type = st_roundbracket_open; + + if (*curpos == meta_char::mc_query) // '?' + { + if (!extended_roundbrackets(piece, atom, ++curpos, end, cstate)) + return false; + } + + if (atom.type == st_roundbracket_open) + { + push_bracket_open(piece, atom); + } + +// if (curpos == end) +// this->throw_error(regex_constants::error_paren); + + if (!make_nfa_states(piece, piececharlen, curpos, end, cstate)) + return false; + + // end or ')'? + if (curpos == end) + this->throw_error(regex_constants::error_paren); + + ++curpos; + + cstate.restore_from(original_cstate); + + switch (atom.type) + { + case st_epsilon: + +// if (piece.size() <= 2) // ':' or ':' + one. + if (piece.size() == 2) // ':' + something. + { + piece.erase(0); + return true; + } + + piece[0].quantifier.atmost = this->number_of_brackets - 1; + break; + +// case st_lookaround_pop: + case st_lookaround_open: + { + state_type &firstatom = piece[0]; + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) +// if (firstatom.reverse) + if (firstatom.quantifier.atleast) // > 0 means lookbehind. + { + if (!piececharlen.is_same() || piececharlen.is_infinity()) + this->throw_error(regex_constants::error_lookbehind); + + firstatom.quantifier = piececharlen; + } +#endif + +#if defined(SRELL_ENABLE_GT) + if (firstatom.character != meta_char::mc_gt) +#endif + piececharlen.reset(0); + + firstatom.next1 = static_cast(piece.size()) + 1; + + atom.type = st_lookaround_close; + atom.next1 = 0; + atom.next2 = 0; + } + break; + + default: + set_bracket_close(piece, atom, piececharlen, cstate); + } + + piece.push_back(atom); + return true; + } + + bool extended_roundbrackets(state_array &piece, state_type &atom, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + bool lookbehind = false; +#endif + + if (curpos == end) + this->throw_error(regex_constants::error_paren); + + atom.character = *curpos; + + if (atom.character == meta_char::mc_lt) // '<' + { +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + lookbehind = true; +#endif + if (++curpos == end) + this->throw_error(regex_constants::error_paren); + + atom.character = *curpos; + + if (atom.character != meta_char::mc_eq && atom.character != meta_char::mc_exclam) + { +#if !defined(SRELL_NO_NAMEDCAPTURE) + return parse_groupname(curpos, end, cstate); +#else + this->throw_error(regex_constants::error_paren); +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + } + } + else + atom.quantifier.atleast = 0; + // Sets atleast to 0 for other assertions than lookbehinds. The automaton + // checks atleast to know whether lookbehinds or other assertions. + + switch (atom.character) + { + case meta_char::mc_colon: + atom.type = st_epsilon; + atom.quantifier.atleast = this->number_of_brackets; + break; + + case meta_char::mc_exclam: // '!': + atom.is_not = true; + //@fallthrough@ + + case meta_char::mc_eq: // '=': +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + cstate.back = lookbehind; +#else +// atom.reverse = lookbehind; +#endif + +#if defined(SRELL_ENABLE_GT) + case meta_char::mc_gt: +#endif + atom.type = st_lookaround_open; + atom.next2 = 1; + break; + + default: + this->throw_error(regex_constants::error_paren); + } + + ++curpos; + piece.push_back(atom); + return true; + } + + void push_bracket_open(state_array &piece, state_type &atom) + { + atom.number = this->number_of_brackets; + atom.next1 = 2; + atom.next2 = 1; + piece.push_back(atom); + ++this->number_of_brackets; + + atom.type = st_roundbracket_pop; + atom.next1 = 0; + atom.next2 = 0; + piece.push_back(atom); + } + + void set_bracket_close(state_array &piece, state_type &atom, const re_quantifier &piececharlen, re_compiler_state &cstate) + { +// uint_l32 max_bracketno = atom.number; + + atom.type = st_roundbracket_close; + atom.next1 = 1; + atom.next2 = 1; +#if 0 + for (typename state_array::size_type i = 0; i < piece.size(); ++i) + { + const state_type &state = piece[i]; + + if (state.type == st_roundbracket_open && max_bracketno < state.number) + max_bracketno = state.number; + } +#endif + + re_quantifier &rb_open = piece[0].quantifier; + re_quantifier &rb_pop = piece[1].quantifier; + + rb_open.atleast = rb_pop.atleast = atom.number + 1; + rb_open.atmost = rb_pop.atmost = this->number_of_brackets - 1; // max_bracketno; + + if (cstate.atleast_widths_of_brackets.size() < atom.number) + cstate.atleast_widths_of_brackets.resize(atom.number, 0); + + cstate.atleast_widths_of_brackets[atom.number - 1] = piececharlen.atleast; + } + + void combine_piece_with_quantifier(state_array &piece_with_quantifier, state_array &piece, const re_quantifier &quantifier, const re_quantifier &piececharlen) + { + state_type &firstatom = piece[0]; +// const bool firstpiece_is_roundbracket_open = (firstatom.type == st_roundbracket_open); + const bool piece_has_0widthchecker = firstatom.has_0widthchecker(); + const bool piece_is_noncapturinggroup_contaning_capturinggroup = firstatom.is_noncapturinggroup() && firstatom.quantifier.is_valid(); + state_type atom; + + if (quantifier.atmost == 0) + return; + + atom.reset(); + atom.quantifier = quantifier; + if (firstatom.is_character_or_class()) + atom.character = meta_char::mc_astrsk; // For nextpos_optimisation1_3(). + + if (quantifier.atmost == 1) + { + if (quantifier.atleast == 0) + { + atom.type = st_epsilon; + atom.next2 = static_cast(piece.size()) + 1; + + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + + if (atom.character == meta_char::mc_astrsk) + firstatom.quantifier = quantifier; + + piece_with_quantifier.push_back(atom); + // (push) + } + + if (piece.size() >= 2 && firstatom.type == st_roundbracket_open && piece[1].type == st_roundbracket_pop) + { + firstatom.quantifier.atmost = 0u; + piece[1].quantifier.atmost = 0u; + } + + piece_with_quantifier += piece; + return; + } + + // atmost >= 2 + +#if !defined(SRELLDBG_NO_SIMPLEEQUIV) + // The counter requires at least 6 states: save, restore, check, inc, dec, atom(s). + // A character or charclass quantified by one of these has a simple equivalent representation: + // a{0,2} 1.epsilon(2|5), 2.CHorCL(3), 3.epsilon(4|5), 4.CHorCL(5), [5]. + // a{0,3} 1.epsilon(2|7), 2.CHorCL(3), 3.epsilon(4|7), 4.CHorCL(5), 5.epsilon(6|7), 6.CHorCL(7), [7]. + // a{1,2} 1.CHorCL(2), 2.epsilon(3|4), 3.CHorCL(4), [4]. + // a{1,3} 1.CHorCL(2), 2.epsilon(3|6), 3.CHorCL(4), 4.epsilon(5|6), 5.CHorCL(6), [6]. + // a{2,3} 1.CHorCL(2), 2.CHorCL(3), 3.epsilon(4|5), 4.CHorCL(5), [5]. + // a{2,4} 1.CHorCL(2), 2.CHorCL(3), 3.epsilon(4|7), 4.CHorCL(5), 5.epsilon(6|7), 6.CHorCL(7), [7]. + if (piece.size() == 1 && firstatom.is_character_or_class() && quantifier.has_simple_equivalence()) + { + const typename state_array::size_type branchsize = piece.size() + 1; + + for (uint_l32 i = 0; i < quantifier.atleast; ++i) + piece_with_quantifier += piece; + + if (atom.character == meta_char::mc_astrsk) + firstatom.quantifier.set(0, 1, quantifier.is_greedy); + + atom.type = st_epsilon; + atom.next2 = (quantifier.atmost - quantifier.atleast) * branchsize; + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + for (uint_l32 i = quantifier.atleast; i < quantifier.atmost; ++i) + { + piece_with_quantifier.push_back(atom); + piece_with_quantifier += piece; + quantifier.is_greedy ? (atom.next2 -= branchsize) : (atom.next1 -= branchsize); + } + return; + } +#endif // !defined(SRELLDBG_NO_SIMPLEEQUIV) + + atom.type = st_epsilon; + if (quantifier.is_asterisk()) // {0,} + { + // greedy: 1.epsilon(2|4), 2.piece, 3.LAorC0WR(1|0), 4.OutOfLoop. + // !greedy: 1.epsilon(4|2), 2.piece, 3.LAorC0WR(1|0), 4.OutOfLoop. + // LAorC0WR: LastAtomOfPiece or Check0WidthRepeat. + // atom.type points to 1. + } + else if (quantifier.is_plus()) // {1,} + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + + if (piece.size() == 1 && firstatom.is_character_or_class()) + { + piece_with_quantifier += piece; + --atom.quantifier.atleast; // /.+/ -> /..*/. + } + else +#endif + { + atom.next1 = 2; + atom.next2 = 0; + piece_with_quantifier.push_back(atom); + // greedy: 1.epsilon(3), 2.epsilon(3|5), 3.piece, 4.LAorC0WR(2|0), 5.OutOfLoop. + // !greedy: 1.epsilon(3), 2.epsilon(5|3), 3.piece, 4.LAorC0WR(2|0), 5.OutOfLoop. + // atom.type points to 2. + } + } + else + { + atom.number = this->number_of_counters; + ++this->number_of_counters; + + atom.type = st_save_and_reset_counter; + atom.next1 = 2; + atom.next2 = 1; + piece_with_quantifier.push_back(atom); + + atom.type = st_restore_counter; + atom.next1 = 0; + atom.next2 = 0; + piece_with_quantifier.push_back(atom); + // 1.save_and_reset_counter(3|2), 2.restore_counter(0|0), + + atom.next1 = 0; + atom.next2 = 0; + atom.type = st_decrement_counter; + piece.insert(0, atom); + + atom.next1 = 2; +// atom.next2 = piece[1].is_character_or_class() ? 0 : 1; +// atom.next2 = 0; + for (state_size_type i = 1; i < piece.size(); ++i) + { + const state_type &state = piece[i]; + + if (state.is_character_or_class() || (state.type == st_epsilon && state.next2 == 0)) + ; + else + { + atom.next2 = 1; + break; + } + } + atom.type = st_epsilon; // st_increment_counter; + piece.insert(0, atom); + piece[0].number = 0; + + atom.type = st_check_counter; + // greedy: 3.check_counter(4|6), 4.piece, 5.LAorC0WR(3|0), 6.OutOfLoop. + // !greedy: 3.check_counter(6|4), 4.piece, 5.LAorC0WR(3|0), 6.OutOfLoop. + // 4.piece = { 4a.increment_counter(4c|4b), 4b.decrement_counter(0|0), 4c.OriginalPiece }. + } + + // atom.type is epsilon or check_counter. + // Its "next"s point to piece and OutOfLoop. + + if (!piece_is_noncapturinggroup_contaning_capturinggroup && (piececharlen.atleast || piece_has_0widthchecker)) + { + const typename state_array::size_type piece_size = piece.size(); + state_type &lastatom = piece[piece_size - 1]; + + lastatom.next1 = 0 - static_cast(piece_size); + // Points to the one immediately before piece, which will be pushed last in this block. + + // atom.type has already been set. epsilon or check_counter. + atom.next1 = 1; + atom.next2 = static_cast(piece_size) + 1; + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + piece_with_quantifier.push_back(atom); + } + else + { + // atom.type has already been set. epsilon or check_counter. + atom.next1 = 1; + atom.next2 = static_cast(piece.size()) + 4; // To OutOfLoop. + // The reason for +3 than above is that push, pop, and check_0_width are added below. + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + piece_with_quantifier.push_back(atom); // *1 + + atom.number = this->number_of_repeats; + ++this->number_of_repeats; + + const state_size_type org1stpos = (atom.type == st_check_counter) ? 2 : 0; + + if (piece_is_noncapturinggroup_contaning_capturinggroup) + atom.quantifier = piece[org1stpos].quantifier; + else + atom.quantifier.set(1, 0); + + atom.type = st_repeat_in_pop; + atom.next1 = 0; + atom.next2 = 0; + piece.insert(org1stpos, atom); + + atom.type = st_repeat_in_push; + atom.next1 = 2; + atom.next2 = 1; + piece.insert(org1stpos, atom); + + atom.type = st_check_0_width_repeat; + atom.next1 = 0 - static_cast(piece.size()) - 1; // Points to *1. + atom.next2 = 1; + piece.push_back(atom); + // greedy: 1.epsilon(2|6), + // !greedy: 1.epsilon(6|2), + // 2.repeat_in_push(4|3), 3.repeat_in_pop(0|0), 4.piece, + // 5.check_0_width_repeat(1|6), 6.OutOfLoop. + // or + // greedy: 1.check_counter(2|8), + // !greedy: 1.check_counter(8|2), + // 2.increment_counter(4|3), 3.decrement_counter(0|0) + // 4.repeat_in_push(6|5), 5.repeat_in_pop(0|0), 6.piece, + // 7.check_0_width_repeat(1|8), 8.OutOfLoop. + } + piece_with_quantifier += piece; + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + bool parse_groupname(const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + const gname_string groupname = get_groupname(curpos, end, cstate); + + if (!this->namedcaptures.push_back(groupname, this->number_of_brackets)) + this->throw_error(regex_constants::error_backref); + + return true; + } +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + // '['. + + bool register_character_class(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, const re_compiler_state & /* cstate */) + { + range_pair code_range; + range_pairs ranges; + state_type classatom; + + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + atom.type = st_character_class; + + if (*curpos == meta_char::mc_caret) // '^' + { + atom.is_not = true; + ++curpos; + } + + for (;;) + { + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + if (*curpos == meta_char::mc_sbracl) // ']' + break; + + classatom.reset(); + + if (!get_character_in_class(classatom, curpos, end)) + return false; + + if (classatom.type == st_character_class) + { + add_predefclass_to_charclass(ranges, classatom); + continue; + } + + code_range.first = code_range.second = classatom.character; + + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + if (*curpos == meta_char::mc_minus) // '-' + { + ++curpos; + + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + if (*curpos == meta_char::mc_sbracl) + { + PUSH_SEPARATELY: + ranges.join(code_range); + code_range.first = code_range.second = meta_char::mc_minus; + } + else + { + if (!get_character_in_class(classatom, curpos, end)) + return false; + + if (classatom.type == st_character_class) + { + add_predefclass_to_charclass(ranges, classatom); + goto PUSH_SEPARATELY; + } + + code_range.second = classatom.character; + + if (!code_range.is_range_valid()) + this->throw_error(regex_constants::error_range); + } + } + ranges.join(code_range); + } + + // *curpos == ']' + ++curpos; + if (this->is_icase()) + ranges.make_caseunfoldedcharset(); + + if (atom.is_not) + { + ranges.negation(); + atom.is_not = false; + } + +// atom.character = this->is_icase() ? ranges.template consists_of_one_character() : ranges.template consists_of_one_character(); + atom.character = ranges.consists_of_one_character(this->is_icase()); + + if (atom.character != constants::invalid_u32value) + { + atom.type = st_character; + return true; + } + + atom.number = this->character_class.register_newclass(ranges); + + return true; + } + + bool get_character_in_class(state_type &atom, const uchar32 *&curpos, const uchar32 *const end /* , const re_compiler_state &cstate */) + { + atom.character = *curpos++; + + return atom.character != meta_char::mc_escape // '\\' + || translate_escseq(atom, curpos, end); + } + + void add_predefclass_to_charclass(range_pairs &cls, const state_type &classatom) + { + range_pairs predefclass = this->character_class[classatom.number]; + + if (classatom.is_not) + predefclass.negation(); + + cls.merge(predefclass); + } + + // Escape characters which appear both in and out of [] pairs. + bool translate_escseq(state_type &atom, const uchar32 *&curpos, const uchar32 *const end) + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + atom.character = *curpos++; + + switch (atom.character) + { + // Predefined classes. + + case char_alnum::ch_D: // 'D': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_d: // 'd': + atom.number = static_cast(re_character_class::digit); // \d, \D. + atom.type = st_character_class; + break; + + case char_alnum::ch_S: // 'S': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_s: // 's': + atom.number = static_cast(re_character_class::space); // \s, \S. + atom.type = st_character_class; + break; + + case char_alnum::ch_W: // 'W': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_w: // 'w': + if (this->is_icase()) + { + this->character_class.setup_icase_word(); + atom.number = static_cast(re_character_class::icase_word); + } + else + atom.number = static_cast(re_character_class::word); // \w, \W. + atom.type = st_character_class; + break; + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + // Prepared for Unicode properties and script names. + case char_alnum::ch_P: // \P{...} + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_p: // \p{...} + atom.number = get_property_number(curpos, end); + atom.type = st_character_class; + break; +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + case char_alnum::ch_b: + atom.character = char_ctrl::cc_bs; // '\b' 0x08:BS + break; + + case char_alnum::ch_t: + atom.character = char_ctrl::cc_htab; // '\t' 0x09:HT + break; + + case char_alnum::ch_n: + atom.character = char_ctrl::cc_nl; // '\n' 0x0a:LF + break; + + case char_alnum::ch_v: + atom.character = char_ctrl::cc_vtab; // '\v' 0x0b:VT + break; + + case char_alnum::ch_f: + atom.character = char_ctrl::cc_ff; // '\f' 0x0c:FF + break; + + case char_alnum::ch_r: + atom.character = char_ctrl::cc_cr; // '\r' 0x0d:CR + break; + + case char_alnum::ch_c: // \cX + if (curpos != end) + { +// atom.character = static_cast(utf_traits().codepoint_inc(curpos, end) & 0x1f); // *curpos++ + atom.character = static_cast(*curpos | constants::asc_icase); + + if (atom.character >= char_alnum::ch_a && atom.character <= char_alnum::ch_z) + atom.character = static_cast(*curpos++ & 0x1f); + else + { + this->throw_error(regex_constants::error_escape); // Strict. +// atom.character = char_alnum::ch_c; // Loose. + } + } + break; + + case char_alnum::ch_0: + atom.character = char_ctrl::cc_nul; // '\0' 0x00:NUL + break; + + case char_alnum::ch_u: // \uhhhh, \u{h~hhhhhh} + atom.character = parse_escape_u(curpos, end); + break; + + case char_alnum::ch_x: // \xhh + atom.character = translate_numbers(curpos, end, 16, 2, 2, 0xff); + break; + + // SyntaxCharacter, '/', and '-'. + case meta_char::mc_caret: // '^' + case meta_char::mc_dollar: // '$' + case meta_char::mc_escape: // '\\' + case meta_char::mc_period: // '.' + case meta_char::mc_astrsk: // '*' + case meta_char::mc_plus: // '+' + case meta_char::mc_query: // '?' + case meta_char::mc_rbraop: // '(' + case meta_char::mc_rbracl: // ')' + case meta_char::mc_sbraop: // '[' + case meta_char::mc_sbracl: // ']' + case meta_char::mc_cbraop: // '{' + case meta_char::mc_cbracl: // '}' + case meta_char::mc_bar: // '|' + case char_other::co_slash: // '/' + case meta_char::mc_minus: // '-' allowed only in charclass. + break; + + default: + atom.character = constants::invalid_u32value; + } + + if (atom.character == constants::invalid_u32value) + this->throw_error(regex_constants::error_escape); + + return true; + } + + uchar32 parse_escape_u(const uchar32 *&curpos, const uchar32 *const end) const + { + uchar32 ucp; + + if (curpos == end) + return constants::invalid_u32value; + + if (*curpos == meta_char::mc_cbraop) + { +// ucp = translate_numbers(++curpos, end, 16, 1, 6, constants::unicode_max_codepoint, true); + ucp = translate_numbers(++curpos, end, 16, 1, 0, constants::unicode_max_codepoint); + + if (curpos == end || *curpos != meta_char::mc_cbracl) + return constants::invalid_u32value; + + ++curpos; + } + else + { + ucp = translate_numbers(curpos, end, 16, 4, 4, 0xffff); + + if (ucp >= 0xd800 && ucp <= 0xdbff) + { + const uchar32 * prefetch = curpos; + + if (prefetch != end && *prefetch == meta_char::mc_escape && ++prefetch != end && *prefetch == char_alnum::ch_u) + { + const uchar32 nextucp = translate_numbers(++prefetch, end, 16, 4, 4, 0xffff); + + if (nextucp >= 0xdc00 && nextucp <= 0xdfff) + { + curpos = prefetch; + ucp = (((ucp << 10) & 0xffc00) | (nextucp & 0x3ff)) + 0x10000; + } + } + } + } + return ucp; + } + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + uint_l32 get_property_number(const uchar32 *&curpos, const uchar32 *const end) + { + if (curpos == end || *curpos != meta_char::mc_cbraop) // '{' + this->throw_error(regex_constants::error_escape); + + pstring pname; + pstring pvalue(get_property_name_or_value(++curpos, end)); + + if (!pvalue.size()) + this->throw_error(regex_constants::error_escape); + + if (static_cast(pvalue[pvalue.size() - 1]) != char_other::co_sp) // ' ', not a value. + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + if (*curpos == meta_char::mc_eq) // '=' + { + pname = pvalue; + pvalue = get_property_name_or_value(++curpos, end); + if (!pvalue.size()) + this->throw_error(regex_constants::error_escape); + } + } + + if (curpos == end || *curpos != meta_char::mc_cbracl) // '}' + this->throw_error(regex_constants::error_escape); + + if (static_cast(pvalue[pvalue.size() - 1]) == char_other::co_sp) // ' ', value. + pvalue.resize(pvalue.size() - 1); + + ++curpos; + + const uint_l32 class_number = this->character_class.lookup_property(pname, pvalue, this->is_icase()); + + if (class_number == re_character_class::error_property) + this->throw_error(regex_constants::error_escape); + + return class_number; + } + + pstring get_property_name_or_value(const uchar32 *&curpos, const uchar32 *const end) const + { + pstring name_or_value; + bool number_found = false; + + for (;; ++curpos) + { + if (curpos == end) + break; + + const uchar32 curchar = *curpos; + + if (curchar >= char_alnum::ch_A && curchar <= char_alnum::ch_Z) + ; + else if (curchar >= char_alnum::ch_a && curchar <= char_alnum::ch_z) + ; + else if (curchar == char_other::co_ll) // '_' + ; + else if (curchar >= char_alnum::ch_0 && curchar <= char_alnum::ch_9) + number_found = true; + else + break; + + name_or_value.append(1, static_cast(curchar)); + } + if (number_found) + name_or_value.append(1, char_other::co_sp); // ' ' + + return name_or_value; + } +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + // Escape characters which do not appear in [] pairs. + + bool translate_atom_escape(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, /* const */ re_compiler_state &cstate) + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + atom.character = *curpos; + + switch (atom.character) + { + case meta_char::mc_minus: // '-' + this->throw_error(regex_constants::error_escape); + //@fallthrough@ + + case char_alnum::ch_B: // 'B': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_b: // 'b': + atom.type = st_boundary; // \b, \B. + atom.quantifier.reset(0); +// atom.number = 0; + if (this->is_icase()) + { + this->character_class.setup_icase_word(); + atom.number = static_cast(re_character_class::icase_word); + } + else + atom.number = static_cast(re_character_class::word); // \w, \W. + break; + +// case char_alnum::ch_A: // 'A': +// atom.type = st_bol; // '\A' +// case char_alnum::ch_Z: // 'Z': +// atom.type = st_eol; // '\Z' +// case char_alnum::ch_z: // 'z': +// atom.type = st_eol; // '\z' + + // Backreferences. + +#if !defined(SRELL_NO_NAMEDCAPTURE) + // Prepared for named captures. + case char_alnum::ch_k: // 'k': + return parse_backreference_name(atom, curpos, end, cstate); // \k. +#endif + + default: + + if (atom.character >= char_alnum::ch_1 && atom.character <= char_alnum::ch_9) // \1, \9. + return parse_backreference_number(atom, curpos, end, cstate); + + translate_escseq(atom, curpos, end); + + if (atom.type == st_character_class) + { + range_pairs newclass = this->character_class[atom.number]; + + if (atom.is_not) + { + newclass.negation(); + atom.is_not = false; + } + + if (this->is_icase() && atom.number >= static_cast(re_character_class::number_of_predefcls)) + newclass.make_caseunfoldedcharset(); + + atom.number = this->character_class.register_newclass(newclass); + } + return true; + } + + ++curpos; + return true; + } + + bool parse_backreference_number(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, const re_compiler_state &cstate) + { + const uchar32 backrefno = translate_numbers(curpos, end, 10, 0, 0, 0xfffffffe); + // 22.2.1.1 Static Semantics: Early Errors: + // It is a Syntax Error if NcapturingParens >= 23^2 - 1. + + if (backrefno == constants::invalid_u32value) + this->throw_error(regex_constants::error_escape); + + atom.number = static_cast(backrefno); + atom.backrefnumber_unresolved = false; + + return backreference_postprocess(atom, cstate); + } + + bool backreference_postprocess(state_type &atom, const re_compiler_state & /* cstate */) const + { + atom.next2 = 1; + atom.type = st_backreference; + +// atom.quantifier.atleast = cstate.atleast_widths_of_brackets[atom.number - 1]; + // Moved to check_backreferences(). + + return true; + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + bool parse_backreference_name(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + if (++curpos == end || *curpos != meta_char::mc_lt) + this->throw_error(regex_constants::error_escape); + + const gname_string groupname = get_groupname(++curpos, end, cstate); + + atom.number = this->namedcaptures[groupname]; + + if (atom.number != groupname_mapper::notfound) + atom.backrefnumber_unresolved = false; + else + { + atom.backrefnumber_unresolved = true; + atom.number = static_cast(cstate.unresolved_gnames.size()); + cstate.unresolved_gnames.push_back(groupname, atom.number); + } + + return backreference_postprocess(atom, cstate); + } + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + gname_string get_groupname(const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) +#else + gname_string get_groupname(const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &) +#endif + { + charT mbstr[utf_traits::maxseqlen]; + gname_string groupname; + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + cstate.idchecker.setup(); +#endif + for (;;) + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + uchar32 curchar = *curpos++; + + if (curchar == meta_char::mc_gt) // '>' + break; + + if (curchar == meta_char::mc_escape && curpos != end && *curpos == char_alnum::ch_u) // '\\', 'u'. + curchar = parse_escape_u(++curpos, end); + +#if defined(SRELL_NO_UNICODE_PROPERTY) + if (curchar != meta_char::mc_escape) +#else + if (cstate.idchecker.is_identifier(curchar, groupname.size() != 0)) +#endif + ; // OK. + else + curchar = constants::invalid_u32value; + + if (curchar == constants::invalid_u32value) + this->throw_error(regex_constants::error_escape); + + const uchar32 seqlen = utf_traits::to_codeunits(mbstr, curchar); + for (uchar32 i = 0; i < seqlen; ++i) + groupname.append(1, mbstr[i]); + } + if (!groupname.size()) + this->throw_error(regex_constants::error_escape); + + return groupname; + } +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + bool get_quantifier(re_quantifier &quantifier, const uchar32 *&curpos, const uchar32 *const end) + { + switch (*curpos) + { + case meta_char::mc_astrsk: // '*': + --quantifier.atleast; + //@fallthrough@ + + case meta_char::mc_plus: // '+': + quantifier.set_infinity(); + break; + + case meta_char::mc_query: // '?': + --quantifier.atleast; + break; + + case meta_char::mc_cbraop: // '{': + get_brace_with_quantifier(quantifier, curpos, end); + break; + + default: + return true; + } + + if (++curpos != end && *curpos == meta_char::mc_query) // '?' + { + quantifier.is_greedy = false; + ++curpos; + } + return true; + } + + void get_brace_with_quantifier(re_quantifier &quantifier, const uchar32 *&curpos, const uchar32 *const end) + { + ++curpos; + + quantifier.atleast = static_cast(translate_numbers(curpos, end, 10, 1, 0, constants::max_u32value)); + + if (quantifier.atleast == static_cast(constants::invalid_u32value)) + goto THROW_ERROR_BRACE; + + if (curpos == end) + goto THROW_ERROR_BRACE; + + if (*curpos == meta_char::mc_comma) // ',' + { + ++curpos; + + quantifier.atmost = static_cast(translate_numbers(curpos, end, 10, 1, 0, constants::max_u32value)); + + if (quantifier.atmost == static_cast(constants::invalid_u32value)) + quantifier.set_infinity(); + + if (!quantifier.is_valid()) + this->throw_error(regex_constants::error_badbrace); + } + else + quantifier.atmost = quantifier.atleast; + + if (curpos == end || *curpos != meta_char::mc_cbracl) // '}' + { + THROW_ERROR_BRACE: + this->throw_error(regex_constants::error_brace); + } + // *curpos == '}' + } + + uchar32 translate_numbers(const uchar32 *&curpos, const uchar32 *const end, const int radix, const std::size_t minsize, const std::size_t maxsize, const uchar32 maxvalue) const + { + std::size_t count = 0; + uchar32 u32value = 0; + int num; + + for (; maxsize == 0 || count < maxsize; ++curpos, ++count) + { + + if (curpos == end || (num = tonumber(*curpos, radix)) == -1) + break; + + const uchar32 nextvalue = u32value * radix + num; + + if ((/* maxvalue != 0 && */ nextvalue > maxvalue) || nextvalue < u32value) + break; + + u32value = nextvalue; + } + + if (count >= minsize) + return u32value; + + return constants::invalid_u32value; + } + + int tonumber(const uchar32 ch, const int radix) const + { + if ((ch >= char_alnum::ch_0 && ch <= char_alnum::ch_7) || (radix >= 10 && (ch == char_alnum::ch_8 || ch == char_alnum::ch_9))) + return static_cast(ch - char_alnum::ch_0); + + if (radix == 16) + { + if (ch >= char_alnum::ch_a && ch <= char_alnum::ch_f) + return static_cast(ch - char_alnum::ch_a + 10); + + if (ch >= char_alnum::ch_A && ch <= char_alnum::ch_F) + return static_cast(ch - char_alnum::ch_A + 10); + } + return -1; + } + + bool check_backreferences(re_compiler_state &cstate) + { + for (typename state_array::size_type backrefpos = 0; backrefpos < this->NFA_states.size(); ++backrefpos) + { + state_type &brs = this->NFA_states[backrefpos]; + + if (brs.type == st_backreference) + { + const uint_l32 &backrefno = brs.number; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + if (brs.backrefnumber_unresolved) + { + if (backrefno >= cstate.unresolved_gnames.size()) + return false; // Internal error. + + brs.number = this->namedcaptures[cstate.unresolved_gnames[backrefno]]; + + if (backrefno == groupname_mapper::notfound) + return false; + + brs.backrefnumber_unresolved = false; + } +#endif + + for (typename state_array::size_type roundbracket_closepos = 0;; ++roundbracket_closepos) + { + if (roundbracket_closepos < this->NFA_states.size()) + { + const state_type &rbcs = this->NFA_states[roundbracket_closepos]; + + if (rbcs.type == st_roundbracket_close && rbcs.number == backrefno) + { + if (roundbracket_closepos < backrefpos) + { +// brs.quantifier.atleast = cstate.atleast_widths_of_brackets[backrefno - 1]; + // 20210429: It was reported that clang-tidy was dissatisfied with this code. + // 20211006: Replaced with the following code: + + const uint_l32 backrefnoindex = backrefno - 1; + + // This can never be true. Added only for satisfying clang-tidy. + if (backrefnoindex >= cstate.atleast_widths_of_brackets.size()) + return false; + + brs.quantifier.atleast = cstate.atleast_widths_of_brackets[backrefnoindex]; + + cstate.backref_used = true; + } + else + { + brs.type = st_epsilon; + brs.next2 = 0; + } + break; + } + } + else + return false; + } + } + } + return true; + } + +#if !defined(SRELLDBG_NO_1STCHRCLS) + + void create_firstchar_class() + { +#if !defined(SRELLDBG_NO_BITSET) + range_pairs fcc; +#else + range_pairs &fcc = this->firstchar_class; +#endif + + const bool canbe0length = gather_nextchars(fcc, static_cast(this->NFA_states[0].next1), 0u, false); + + if (canbe0length) + { + fcc.set_solerange(range_pair_helper(0, constants::unicode_max_codepoint)); + // Expressions would consist of assertions only, such as /^$/. + // We cannot but accept every codepoint. + } + +#if !defined(SRELLDBG_NO_BITSET) + this->NFA_states[0].quantifier.atleast = this->character_class.register_newclass(fcc); + + set_bitset_table(fcc); +#endif + } + +#if !defined(SRELLDBG_NO_BITSET) + void set_bitset_table(const range_pairs &fcc) + { + for (typename range_pairs::size_type i = 0; i < fcc.size(); ++i) + { + const range_pair &range = fcc[i]; + +#if 0 + uchar32 second = range.second <= constants::unicode_max_codepoint ? range.second : constants::unicode_max_codepoint; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (utf_traits::utftype == 16) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + if (second >= 0x10000 && range.first < 0x10000) + { + this->firstchar_class_bs.set_range(utf_traits::firstcodeunit(0x10000) & utf_traits::bitsetmask, utf_traits::firstcodeunit(second) & utf_traits::bitsetmask); + second = 0xffff; + } + } + this->firstchar_class_bs.set_range(utf_traits::firstcodeunit(range.first) & utf_traits::bitsetmask, utf_traits::firstcodeunit(second) & utf_traits::bitsetmask); + +#else + for (uchar32 ucp = range.first; ucp <= constants::unicode_max_codepoint; ++ucp) + { + this->firstchar_class_bs.set(utf_traits::firstcodeunit(ucp) & utf_traits::bitsetmask); + + if (ucp == range.second) + break; + } +#endif + } + } +#endif // !defined(SRELLDBG_NO_BITSET) +#endif // !defined(SRELLDBG_NO_1STCHRCLS) + + bool gather_nextchars(range_pairs &nextcharclass, typename state_array::size_type pos, simple_array &checked, const uint_l32 bracket_number, const bool subsequent) const + { + bool canbe0length = false; + + for (;;) + { + const state_type &state = this->NFA_states[pos]; + + if (checked[pos]) + break; + + checked[pos] = true; + + if (state.next2 + && (state.type != st_check_counter || !state.quantifier.is_greedy || state.quantifier.atleast == 0) + && (state.type != st_save_and_reset_counter) + && (state.type != st_roundbracket_open) + && (state.type != st_roundbracket_close || state.number != bracket_number) + && (state.type != st_repeat_in_push) + && (state.type != st_backreference || (state.quantifier.atleast == 0 && state.next1 != state.next2)) + && (state.type != st_lookaround_open)) + if (gather_nextchars(nextcharclass, pos + state.next2, checked, bracket_number, subsequent)) + canbe0length = true; + + switch (state.type) + { + case st_character: + nextcharclass.join(range_pair_helper(state.character)); + + if (this->is_ricase()) + nextcharclass.make_caseunfoldedcharset(); + + return canbe0length; + + case st_character_class: + nextcharclass.merge(this->character_class[state.number]); + return canbe0length; + + case st_backreference: + { + const typename state_array::size_type nextpos = find_next1_of_bracketopen(state.number); + + const bool length0 = gather_nextchars(nextcharclass, nextpos, state.number, subsequent); + + if (!length0) + return canbe0length; + } + break; + + case st_eol: + case st_bol: + if (!subsequent) + break; + + //@fallthrough@ + + case st_boundary: + if (subsequent) + nextcharclass.set_solerange(range_pair_helper(0, constants::unicode_max_codepoint)); + + break; + + case st_lookaround_open: +// if (!state.is_not && !state.reverse) + if (!state.is_not && state.quantifier.atleast == 0) + { + gather_nextchars(nextcharclass, pos + 1, checked, 0u, subsequent); + } + else if (subsequent) + nextcharclass.set_solerange(range_pair_helper(0, constants::unicode_max_codepoint)); + + break; + + case st_roundbracket_close: + if (/* bracket_number == 0 || */ state.number != bracket_number) + break; + //@fallthrough@ + + case st_success: // == st_lookaround_close. + return true; + + case st_check_counter: + if (!state.quantifier.is_greedy && state.quantifier.atleast >= 1) + return canbe0length; + //@fallthrough@ + + default:; + } + + if (state.next1) + pos += state.next1; + else + break; + } + return canbe0length; + } + + bool gather_nextchars(range_pairs &nextcharclass, const typename state_array::size_type pos, const uint_l32 bracket_number, const bool subsequent) const + { + simple_array checked; + + checked.resize(this->NFA_states.size(), false); + return gather_nextchars(nextcharclass, pos, checked, bracket_number, subsequent); + } + + typename state_array::size_type find_next1_of_bracketopen(const uint_l32 bracketno) const + { + for (typename state_array::size_type no = 0; no < this->NFA_states.size(); ++no) + { + const state_type &state = this->NFA_states[no]; + + if (state.type == st_roundbracket_open && state.number == bracketno) + return no + state.next1; + } + return 0; + } + + void relativejump_to_absolutejump() + { + for (typename state_array::size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + state_type &state = this->NFA_states[pos]; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (state.next1 || state.type == st_character || state.type == st_character_class) +#else + if (state.next1) +#endif + state.next_state1 = &this->NFA_states[pos + state.next1]; + else + state.next_state1 = NULL; + + if (state.next2) + state.next_state2 = &this->NFA_states[pos + state.next2]; + else + state.next_state2 = NULL; + } + } + + void optimise() + { +#if !defined(SRELLDBG_NO_BRANCH_OPT2) && !defined(SRELLDBG_NO_ASTERISK_OPT) + branch_optimisation2(); +#endif + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + asterisk_optimisation(); +#endif + +#if !defined(SRELLDBG_NO_BRANCH_OPT) && !defined(SRELLDBG_NO_ASTERISK_OPT) + branch_optimisation(); +#endif + +#if !defined(SRELLDBG_NO_1STCHRCLS) + create_firstchar_class(); +#endif + +#if !defined(SRELLDBG_NO_SKIP_EPSILON) + skip_epsilon(); +#endif + +#if !defined(SRELLDBG_NO_CCPOS) + set_charclass_posinfo(); +#endif + } + +#if !defined(SRELLDBG_NO_SKIP_EPSILON) + + void skip_epsilon() + { + for (typename state_array::size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + state_type &state = this->NFA_states[pos]; + + if (state.next1) + state.next1 = static_cast(skip_nonbranch_epsilon(pos + state.next1) - pos); + + if (state.next2) + state.next2 = static_cast(skip_nonbranch_epsilon(pos + state.next2) - pos); + } + } + + typename state_array::size_type skip_nonbranch_epsilon(typename state_array::size_type pos) const + { + for (;;) + { + const state_type &state = this->NFA_states[pos]; + + if (state.type == st_epsilon && state.next2 == 0) + { + pos += state.next1; + continue; + } + break; + } + return pos; + } + +#endif + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + + void asterisk_optimisation() + { + state_type *prevstate_is_astrskepsilon = NULL; + const state_type *prevcharstate = NULL; + state_size_type mnp_inspos = 0; + bool inspos_updatable = true; +#if !defined(SRELLDBG_NO_SPLITCC) + bool inserted = false; +#endif + + for (typename state_array::size_type cur = 1; cur < this->NFA_states.size(); ++cur) + { + state_type &curstate = this->NFA_states[cur]; + + switch (curstate.type) + { + case st_epsilon: + if (curstate.character == meta_char::mc_astrsk) + { + prevstate_is_astrskepsilon = &curstate; + } + else + { + prevstate_is_astrskepsilon = NULL; + inspos_updatable = false; + } + break; + + case st_character: + case st_character_class: + if (inspos_updatable) + { + if (prevcharstate) + { + if (prevcharstate->type != curstate.type || prevcharstate->number != curstate.number) + inspos_updatable = false; + } + if (inspos_updatable) + { + if (prevstate_is_astrskepsilon) + { + inspos_updatable = false; + if (prevstate_is_astrskepsilon->quantifier.is_asterisk_or_plus()) + { + mnp_inspos = cur + 1; + } + } + } + prevcharstate = &curstate; + } + if (prevstate_is_astrskepsilon) + { + const re_quantifier &eq = prevstate_is_astrskepsilon->quantifier; + const state_size_type epsilonno = cur - 1; + const state_size_type faroffset = eq.is_greedy ? prevstate_is_astrskepsilon->next2 : prevstate_is_astrskepsilon->next1; + const state_size_type nextno = epsilonno + faroffset; +#if !defined(SRELLDBG_NO_SPLITCC) + const state_size_type origlen = this->NFA_states.size(); +#endif + + if (is_exclusive_sequence(eq, cur, nextno)) + { + state_type &epsilonstate = this->NFA_states[epsilonno]; + state_type &curstate2 = this->NFA_states[cur]; + + epsilonstate.next1 = 1; + epsilonstate.next2 = 0; + epsilonstate.number = 0; +// curstate2.quantifier.is_greedy = true; + if (epsilonstate.quantifier.is_infinity()) + { + curstate2.next1 = 0; + curstate2.next2 = faroffset - 1; + } + else // ? or {0,1} + { + curstate2.next2 = faroffset - 1; + } + +#if !defined(SRELLDBG_NO_SPLITCC) + if (mnp_inspos == nextno && origlen != this->NFA_states.size()) + inserted = true; +#endif + } + prevstate_is_astrskepsilon = NULL; + } + break; + + default: + prevstate_is_astrskepsilon = NULL; + inspos_updatable = false; + } + } + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) + + if (mnp_inspos != 0) + { + state_size_type cur = mnp_inspos; + + if (this->NFA_states[cur].type != st_success) + { + const state_type &prevstate = this->NFA_states[cur - 1]; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) && !defined(SRELLDBG_NO_1STCHRCLS) && !defined(SRELLDBG_NO_BITSET) + +#if !defined(SRELLDBG_NO_SPLITCC) + if (!inserted && prevstate.next1 == 0) +#else + if (prevstate.next1 == 0) +#endif + { + range_pairs prevcc; + range_pairs nextcc; + +// gather_if_char_or_cc_strict(prevcc, prevstate); + if (prevstate.type == st_character) + { + prevcc.set_solerange(range_pair_helper(prevstate.character)); + } + else if (prevstate.type == st_character_class) + { + prevcc = this->character_class[prevstate.number]; + } + + gather_nextchars(nextcc, cur, 0u, true); + + const uint_l32 cpnum_prevcc = prevcc.total_codepoints(); + const uint_l32 cpnum_nextcc = nextcc.total_codepoints(); + + if (cpnum_nextcc != 0 && cpnum_nextcc < cpnum_prevcc) + { + state_array newNFAs; + state_type atom; + + atom.reset(); + atom.character = meta_char::mc_eq; // '=' + atom.type = st_lookaround_open; + atom.next1 = static_cast(cur - 1) * 2 + 2; + atom.next2 = 1; + atom.quantifier.atleast = 2; // Match point rewinder. + newNFAs.append(1, atom); + + newNFAs.append(this->NFA_states, 1, cur - 1); + + atom.type = st_lookaround_close; + atom.next1 = 0; + atom.next2 = 0; + newNFAs.append(1, atom); + + insert_at(1, newNFAs.size()); + this->NFA_states.replace(1, newNFAs.size(), newNFAs); + this->NFA_states[0].next2 = this->NFA_states[0].next1; + this->NFA_states[0].next1 = 1; + + return; + } + } +#endif // !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) && !defined(SRELLDBG_NO_1STCHRCLS) && !defined(SRELLDBG_NO_BITSET) + + insert_at(cur, 1); + state_type &mnpstate = this->NFA_states[cur]; + state_type &charstate = this->NFA_states[cur - 1]; + + mnpstate.type = st_move_nextpos; + +#if !defined(SRELLDBG_NO_SPLITCC) + + if (inserted) + { + charstate.next2 = 1; + } + else +#endif + if (charstate.next1 == 0) + { + mnpstate.next1 = charstate.next2 - 1; + charstate.next2 = 1; + } + else + { + mnpstate.next1 = -2; + charstate.next1 = 1; + } + } + } +#endif // !defined(SRELLDBG_NO_NEXTPOS_OPT) + } + + bool is_exclusive_sequence(const re_quantifier &eq, const state_size_type curno, const state_size_type nextno) // const + { + const state_type &curstate = this->NFA_states[curno]; + range_pairs curchar_class; + range_pairs nextchar_class; + + if (curstate.type == st_character) + { + curchar_class.join(range_pair_helper(curstate.character)); + } + else if (curstate.type == st_character_class) + { + curchar_class = this->character_class[curstate.number]; + if (curchar_class.size() == 0) // Means [], which always makes matching fail. + return true; // For preventing the automaton from pushing bt data. + } + else + { + return false; + } + + const bool canbe0length = gather_nextchars(nextchar_class, nextno, 0u, true); + + if (nextchar_class.size()) + { + if (!canbe0length || eq.is_greedy) + { +#if !defined(SRELLDBG_NO_SPLITCC) + + range_pairs kept; + range_pairs removed; + + curchar_class.split_ranges(kept, removed, nextchar_class); + + if (removed.size() == 0) // !curchar_class.is_overlap(nextchar_class) + return true; + + if (curstate.type == st_character_class && kept.size() && eq.is_infinity()) + { + { + state_type &curstate2 = this->NFA_states[curno]; + + curstate2.character = kept.consists_of_one_character(this->is_icase()); + if (curstate2.character != constants::invalid_u32value) + curstate2.type = st_character; + else + curstate2.number = this->character_class.register_newclass(kept); + } + const re_quantifier backupeq(eq); + + insert_at(nextno, 2); + state_type &n0 = this->NFA_states[nextno]; + state_type &n1 = this->NFA_states[nextno + 1]; + + n0.reset(); + n0.type = st_epsilon; + n0.character = meta_char::mc_astrsk; + n0.quantifier = backupeq; +// n0.next2 = 1; + n0.next2 = 2; + if (!n0.quantifier.is_greedy) + { + n0.next1 = n0.next2; + n0.next2 = 1; + } + + n1.reset(); + n1.type = st_character_class; + + n1.character = removed.consists_of_one_character(this->is_icase()); + if (n1.character != constants::invalid_u32value) + n1.type = st_character; + else + n1.number = this->character_class.register_newclass(removed); + + n1.next1 = -2; +// n1.next2 = 0; + return true; + } + +#else // defined(SRELLDBG_NO_SPLITCC) + + if (!curchar_class.is_overlap(nextchar_class)) + { + return true; + } + +#endif // !defined(SRELLDBG_NO_SPLITCC) + } + } + else if (/* nextchar_class.size() == 0 && */ (!canbe0length || only_success_left(nextno))) + { + // (size() == 0 && !canbe0length) means []. + return eq.is_greedy; + } + + return false; + } + + bool only_success_left(typename state_array::size_type pos) const + { + for (;;) + { + const state_type &state = this->NFA_states[pos]; + + switch (state.type) + { + case st_success: + return true; + + case st_roundbracket_close: + case st_backreference: + if (state.next2 != 0 && state.next1 != state.next2) + return false; + break; + + case st_epsilon: + if (state.next2 != 0 && !only_success_left(pos + state.next2)) + return false; + break; + + case st_roundbracket_open: + break; // /a*()/ + + default: + return false; + } + if (state.next1) + pos += state.next1; + else + return false; + } + } +#endif // !defined(SRELLDBG_NO_ASTERISK_OPT) + + void insert_at(const typename state_array::size_type pos, const std::ptrdiff_t len) + { + state_type newstate; + + for (typename state_array::size_type cur = 0; cur < pos; ++cur) + { + state_type &state = this->NFA_states[cur]; + + if (state.next1 && (cur + state.next1) >= pos) + state.next1 += len; + + if (state.next2 && (cur + state.next2) >= pos) + state.next2 += len; + } + + for (typename state_array::size_type cur = pos; cur < this->NFA_states.size(); ++cur) + { + state_type &state = this->NFA_states[cur]; + + if ((cur + state.next1) < pos) + state.next1 -= len; + + if ((cur + state.next2) < pos) + state.next2 -= len; + } + + newstate.reset(); + newstate.type = st_epsilon; + for (std::ptrdiff_t count = 0; count < len; ++count) + this->NFA_states.insert(pos, newstate); + } + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) +#endif // !defined(SRELLDBG_NO_NEXTPOS_OPT) + +#if !defined(SRELLDBG_NO_BRANCH_OPT) || defined(SRELLTEST_NEXTPOS_OPT2) + typename state_array::size_type gather_if_char_or_charclass(range_pairs &charclass, typename state_array::size_type pos) const + { + for (; pos < this->NFA_states.size();) + { + const state_type &curstate = this->NFA_states[pos]; + + if (curstate.type == st_character && curstate.next2 == 0) + { + charclass.set_solerange(range_pair_helper(curstate.character)); + return pos; + } + else if (curstate.type == st_character_class && curstate.next2 == 0) + { + charclass = this->character_class[curstate.number]; + return pos; + } + else if (curstate.type == st_epsilon && curstate.next2 == 0) + { + } + else + break; + + pos += curstate.next1; + } + return 0; + } +#endif // !defined(SRELLDBG_NO_BRANCH_OPT) || defined(SRELLTEST_NEXTPOS_OPT2) + +#if !defined(SRELLDBG_NO_BRANCH_OPT) + void branch_optimisation() + { + range_pairs nextcharclass1; + + for (typename state_array::size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + const state_type &state = this->NFA_states[pos]; + + if (state.is_branch()) + { + const typename state_array::size_type nextcharpos = gather_if_char_or_charclass(nextcharclass1, pos + state.next1); + + if (nextcharpos) + { + range_pairs nextcharclass2; + + const bool canbe0length = gather_nextchars(nextcharclass2, pos + state.next2, 0u /* bracket_number */, true); + + if (!canbe0length && !nextcharclass1.is_overlap(nextcharclass2)) + { + state_type &branch = this->NFA_states[pos]; + state_type &next1 = this->NFA_states[nextcharpos]; + + next1.next2 = pos + branch.next2 - nextcharpos; + branch.next2 = 0; + } + } + } + } + } +#endif // !defined(SRELLDBG_NO_BRANCH_OPT) + +#if !defined(SRELL_NO_ICASE) + bool check_if_really_needs_icase_search() + { + uchar32 u32chars[unicode_case_folding::rev_maxset]; + + for (typename state_array::size_type i = 0; i < this->NFA_states.size(); ++i) + { + const state_type &state = this->NFA_states[i]; + + if (state.type == st_character) + { + if (unicode_case_folding::casefoldedcharset(u32chars, state.character) > 1) + return true; + } + else if (state.type == st_backreference) + return true; + } +// this->soflags &= ~regex_constants::icase; + return false; + } +#endif // !defined(SRELL_NO_ICASE) + +#if !defined(SRELLDBG_NO_BMH) + void setup_bmhdata() + { + simple_array u32s; + + for (typename state_array::size_type i = 1; i < this->NFA_states.size(); ++i) + { + const state_type &state = this->NFA_states[i]; + + if (state.type == st_character) + u32s.push_back(state.character); + else + { + u32s.clear(); + break; + } + } + + if (u32s.size() > 1) +// if ((u32s.size() > 1 && !this->is_ricase()) || (u32s.size() > 2 && this->is_ricase())) + { + if (this->bmdata) + this->bmdata->clear(); + else + this->bmdata = new re_bmh; + + this->bmdata->setup(u32s, this->is_ricase()); + return /* false */; + } + + if (this->bmdata) + delete this->bmdata; + this->bmdata = NULL; +// return true; + } +#endif // !defined(SRELLDBG_NO_BMH) + +#if !defined(SRELLDBG_NO_CCPOS) + void set_charclass_posinfo() + { + this->character_class.finalise(); + for (typename state_array::size_type i = 1; i < this->NFA_states.size(); ++i) + { + state_type &state = this->NFA_states[i]; + + if (state.type == st_character_class) + { + const range_pair &posinfo = this->character_class.charclasspos(state.number); + state.quantifier.setccpos(posinfo.first, posinfo.second); + } + } + } +#endif // !defined(SRELLDBG_NO_CCPOS) + +#if !defined(SRELLDBG_NO_BRANCH_OPT2) + + bool gather_if_char_or_charclass_strict(range_pairs &out, const state_type &state) const + { + if (state.type == st_character /* && state.next2 == 0 */) + { + out.set_solerange(range_pair_helper(state.character)); + } + else if (state.type == st_character_class /* && state.next2 == 0 */) + { + out = this->character_class[state.number]; + } + else + return false; + + return true; + } + + void branch_optimisation2() + { + range_pairs basealt1stch; + range_pairs nextalt1stch; + + for (state_size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + const state_type &curstate = this->NFA_states[pos]; + + if (curstate.is_branch()) + { + const state_size_type next1pos = pos + curstate.next1; + state_size_type precharchainpos = pos; + + if (gather_if_char_or_charclass_strict(basealt1stch, this->NFA_states[next1pos])) + { + state_size_type next2pos = precharchainpos + curstate.next2; + state_size_type postcharchainpos = 0; + + for (;;) + { + state_size_type next2next1pos = next2pos; + state_type &nstate2 = this->NFA_states[next2pos]; + state_size_type next2next2pos = 0; + + if (nstate2.is_branch()) + { + next2next2pos = next2pos + nstate2.next2; + next2next1pos += nstate2.next1; + } + + if (gather_if_char_or_charclass_strict(nextalt1stch, this->NFA_states[next2next1pos])) + { + const int relation = basealt1stch.relationship(nextalt1stch); + + if (relation == 0) + { + if (next2next2pos) // if (nstate2.is_branch()) + { + nstate2.reset(); + nstate2.type = st_epsilon; + } + + if (postcharchainpos == 0) + { + postcharchainpos = next1pos + 1; + insert_at(postcharchainpos, 1); + this->NFA_states[next1pos].next1 = 1; + } + else + { + const state_size_type prevbranchpos = postcharchainpos; + + postcharchainpos = prevbranchpos + this->NFA_states[prevbranchpos].next2; + insert_at(postcharchainpos, 1); + this->NFA_states[prevbranchpos].next2 = postcharchainpos - prevbranchpos; + // Fix for bug210423. This line cannot be omitted, because + // NFA_states[prevbranchpos].next2 has been incremented in insert_at(). + } + +// if (next2next1pos >= postcharchainpos) + ++next2next1pos; + + if (precharchainpos >= postcharchainpos) + ++precharchainpos; + + state_type &prechainbranchpoint = this->NFA_states[precharchainpos]; + if (next2next2pos) + { +// if (next2next2pos >= postcharchainpos) + ++next2next2pos; + prechainbranchpoint.next2 = next2next2pos - precharchainpos; + } + else + { + prechainbranchpoint.next2 = 0; + } + + state_type &newbranchpoint = this->NFA_states[postcharchainpos]; + newbranchpoint.character = meta_char::mc_bar; +// newbranchpoint.next1 = 1; + newbranchpoint.next2 = next2next1pos + this->NFA_states[next2next1pos].next1 - postcharchainpos; + } + else if (relation == 1) + { + break; + } + else + precharchainpos = next2pos; + } + else + { + // Fix for bug210428. + // Original: /mm2|m|mm/ + // 1st step: /m(?:m2||m)/ <- No more optimisation can be performed. Must quit. + // 2nd step: /mm(?:2||)/ <- BUG. + break; + } + + if (next2next2pos == 0) + break; + + next2pos = next2next2pos; + } + } + } + } + } +#endif // !defined(SRELLDBG_NO_BRANCH_OPT2) + +public: // For debug. + + void print_NFA_states(const int) const; +}; +// re_compiler + + } // namespace regex_internal + +// ... "rei_compiler.hpp"] +// ["regex_sub_match.hpp" ... + +// 28.9, class template sub_match: +template +class sub_match : public std::pair +{ +public: + + typedef typename std::iterator_traits::value_type value_type; + typedef typename std::iterator_traits::difference_type difference_type; + typedef BidirectionalIterator iterator; + typedef std::basic_string string_type; + + bool matched; + +// constexpr sub_match(); // C++11. + + sub_match() : matched(false) + { + } + + difference_type length() const + { + return matched ? std::distance(this->first, this->second) : 0; + } + + operator string_type() const + { + return matched ? string_type(this->first, this->second) : string_type(); + } + + string_type str() const + { + return matched ? string_type(this->first, this->second) : string_type(); + } + + int compare(const sub_match &s) const + { + return str().compare(s.str()); + } + + int compare(const string_type &s) const + { + return str().compare(s); + } + + int compare(const value_type *const s) const + { + return str().compare(s); + } +}; + +// 28.9.2, sub_match non-member operators: +// [7.9.2] sub_match non-member operators + +// Compares sub_match & with sub_match &. +template +bool operator==(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) == 0; // 1 +} + +template +bool operator!=(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) != 0; // 2 +} + +template +bool operator<(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) < 0; // 3 +} + +template +bool operator<=(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) <= 0; // 4 +} + +template +bool operator>=(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) >= 0; // 5 +} + +template +bool operator>(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) > 0; // 6 +} + +// Compares basic_string & with sub_match &. +template +bool operator==( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs.c_str()) == 0; // 7 +} + +template +bool operator!=( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return !(lhs == rhs); // 8 +} + +template +bool operator<( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs.c_str()) > 0; // 9 +} + +template +bool operator>( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return rhs < lhs; // 10 +} + +template +bool operator>=( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return !(lhs < rhs); // 11 +} + +template +bool operator<=( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return !(rhs < lhs); // 12 +} + +// Compares sub_match & with basic_string &. +template +bool operator==( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return lhs.compare(rhs.c_str()) == 0; // 13 +} + +template +bool operator!=( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return !(lhs == rhs); // 14 +} + +template +bool operator<( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return lhs.compare(rhs.c_str()) < 0; // 15 +} + +template +bool operator>( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return rhs < lhs; // 16 +} + +template +bool operator>=( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return !(lhs < rhs); // 17 +} + +template +bool operator<=( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return !(rhs < lhs); // 18 +} + +// Compares iterator_traits::value_type * with sub_match &. +template +bool operator==( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs) == 0; // 19 +} + +template +bool operator!=( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return !(lhs == rhs); // 20 +} + +template +bool operator<( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs) > 0; // 21 +} + +template +bool operator>( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return rhs < lhs; // 22 +} + +template +bool operator>=( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return !(lhs < rhs); // 23 +} + +template +bool operator<=( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return !(rhs < lhs); // 24 +} + +// Compares sub_match & with iterator_traits::value_type *. +template +bool operator==( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return lhs.compare(rhs) == 0; // 25 +} + +template +bool operator!=( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return !(lhs == rhs); // 26 +} + +template +bool operator<( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return lhs.compare(rhs) < 0; // 27 +} + +template +bool operator>( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return rhs < lhs; // 28 +} + +template +bool operator>=( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return !(lhs < rhs); // 29 +} + +template +bool operator<=( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return !(rhs < lhs); // 30 +} + +// Compares iterator_traits::value_type & with sub_match &. +template +bool operator==( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return rhs.compare(typename sub_match::string_type(1, lhs)) == 0; // 31 +} + +template +bool operator!=( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return !(lhs == rhs); // 32 +} + +template +bool operator<( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return rhs.compare(typename sub_match::string_type(1, lhs)) > 0; // 33 +} + +template +bool operator>( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return rhs < lhs; // 34 +} + +template +bool operator>=( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return !(lhs < rhs); // 35 +} + +template +bool operator<=( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return !(rhs < lhs); // 36 +} + +// Compares sub_match & with iterator_traits::value_type &. +template +bool operator==( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return lhs.compare(typename sub_match::string_type(1, rhs)) == 0; // 37 +} + +template +bool operator!=( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return !(lhs == rhs); // 38 +} + +template +bool operator<( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return lhs.compare(typename sub_match::string_type(1, rhs)) < 0; // 39 +} + +template +bool operator>( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return rhs < lhs; // 40 +} + +template +bool operator>=( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return !(lhs < rhs); // 41 +} + +template +bool operator<=( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return !(rhs < lhs); // 42 +} + +template +std::basic_ostream &operator<<(std::basic_ostream &os, const sub_match &m) +{ + return (os << m.str()); +} + +typedef sub_match csub_match; +typedef sub_match wcsub_match; +typedef sub_match ssub_match; +typedef sub_match wssub_match; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef sub_match u16csub_match; + typedef sub_match u32csub_match; + typedef sub_match u16ssub_match; + typedef sub_match u32ssub_match; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef sub_match u8csub_match; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef sub_match u8ssub_match; +#endif + +typedef csub_match u8ccsub_match; +typedef ssub_match u8cssub_match; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccsub_match u8csub_match; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8cssub_match u8ssub_match; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcsub_match u32wcsub_match; + typedef wssub_match u32wssub_match; + typedef u32wcsub_match u1632wcsub_match; + typedef u32wssub_match u1632wssub_match; + #elif WCHAR_MAX >= 0xffff + typedef wcsub_match u16wcsub_match; + typedef wssub_match u16wssub_match; + typedef u16wcsub_match u1632wcsub_match; + typedef u16wssub_match u1632wssub_match; + #endif +#endif + +// ... "regex_sub_match.hpp"] +// ["regex_match_results.hpp" ... + +// 28.10, class template match_results: +template > > +class match_results +{ +public: + + typedef sub_match value_type; + typedef const value_type & const_reference; + typedef const_reference reference; +// typedef implementation defined const_iterator; + typedef typename std::vector::const_iterator const_iterator; + typedef const_iterator iterator; + typedef typename std::iterator_traits::difference_type difference_type; + +#if defined(__cplusplus) && __cplusplus >= 201103L + typedef typename std::allocator_traits::size_type size_type; +#else + typedef typename Allocator::size_type size_type; // TR1. +#endif + + typedef Allocator allocator_type; + typedef typename std::iterator_traits::value_type char_type; + typedef std::basic_string string_type; + +public: + + // 28.10.1, construct/copy/destroy: + // [7.10.1] construct/copy/destroy + explicit match_results(const Allocator &a = Allocator()) : ready_(false), sub_matches_(a) + { + } + + match_results(const match_results &m) + { + operator=(m); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + match_results(match_results &&m) SRELL_NOEXCEPT + { + operator=(std::move(m)); + } +#endif + + match_results &operator=(const match_results &m) + { + if (this != &m) + { +// this->sstate_ = m.sstate_; + this->ready_ = m.ready_; + this->sub_matches_ = m.sub_matches_; + this->prefix_ = m.prefix_; + this->suffix_ = m.suffix_; + this->base_ = m.base_; +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->gnames_ = m.gnames_; +#endif + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + match_results &operator=(match_results &&m) SRELL_NOEXCEPT + { + if (this != &m) + { +// this->sstate_ = std::move(m.sstate_); + this->ready_ = m.ready_; + this->sub_matches_ = std::move(m.sub_matches_); + this->prefix_ = std::move(m.prefix_); + this->suffix_ = std::move(m.suffix_); + this->base_ = m.base_; +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->gnames_ = std::move(m.gnames_); +#endif + } + return *this; + } +#endif + +// ~match_results(); + + // 28.10.2, state: + bool ready() const + { + return ready_; + } + + // 28.10.3, size: + // [7.10.2] size + size_type size() const + { + return sub_matches_.size(); + } + + size_type max_size() const + { + return sub_matches_.max_size(); +// return static_cast(~0) / sizeof (value_type); + } + + bool empty() const + { + return size() == 0; + } + + // 28.10.4, element access: + // [7.10.3] element access + difference_type length(const size_type sub = 0) const + { + return (*this)[sub].length(); + } + + difference_type position(const size_type sub = 0) const + { + const_reference ref = (*this)[sub]; + + return std::distance(base_, ref.first); + } + + string_type str(const size_type sub = 0) const + { + return string_type((*this)[sub]); + } + + const_reference operator[](const size_type n) const + { +#if defined(SRELL_STRICT_IMPL) + return n < sub_matches_.size() ? sub_matches_[n] : unmatched_; +#else + return sub_matches_[n]; +#endif + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + + // Helpers for overload resolution of the integer literal 0 of signed types. + template + difference_type length(const IntegerType zero) const + { + return length(static_cast(zero)); + } + template + difference_type position(const IntegerType zero) const + { + return position(static_cast(zero)); + } + template + string_type str(const IntegerType zero) const + { + return str(static_cast(zero)); + } + template + const_reference operator[](const IntegerType zero) const + { + return operator[](static_cast(zero)); + } + + difference_type length(const string_type &sub) const + { + return (*this)[sub].length(); + } + + difference_type position(const string_type &sub) const + { + const_reference ref = (*this)[sub]; + + return std::distance(base_, ref.first); + } + + string_type str(const string_type &sub) const + { + return string_type((*this)[sub]); + } + + const_reference operator[](const string_type &sub) const + { + return sub_matches_[lookup_and_check_backref_number(sub.c_str(), sub.c_str() + sub.size())]; + } + + difference_type length(const char_type *sub) const + { + return (*this)[sub].length(); + } + + difference_type position(const char_type *sub) const + { + const_reference ref = (*this)[sub]; + + return std::distance(base_, ref.first); + } + + string_type str(const char_type *sub) const + { + return string_type((*this)[sub]); + } + + const_reference operator[](const char_type *sub) const + { + return sub_matches_[lookup_and_check_backref_number(sub, sub + std::char_traits::length(sub))]; + } + +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + const_reference prefix() const + { + return prefix_; + } + + const_reference suffix() const + { + return suffix_; + } + + const_iterator begin() const + { + return sub_matches_.begin(); + } + + const_iterator end() const + { + return sub_matches_.end(); + } + + const_iterator cbegin() const + { + return sub_matches_.begin(); + } + + const_iterator cend() const + { + return sub_matches_.end(); + } + + // 28.10.5, format: + // [7.10.4] format + template + OutputIter format( + OutputIter out, + const char_type *fmt_first, + const char_type *const fmt_last, + regex_constants::match_flag_type /* flags */ = regex_constants::format_default + ) const + { + if (this->ready() && !this->empty()) + { +#if !defined(SRELL_NO_NAMEDCAPTURE) + const bool no_groupnames = gnames_.size() == 0; +#endif + const value_type &m0 = (*this)[0]; + + while (fmt_first != fmt_last) + { + if (*fmt_first != static_cast(regex_internal::meta_char::mc_dollar)) // '$' + { + *out++ = *fmt_first++; + } + else + { + ++fmt_first; + if (fmt_first == fmt_last) + { + *out++ = regex_internal::meta_char::mc_dollar; // '$'; + } + else if (*fmt_first == static_cast(regex_internal::char_other::co_amp)) // '&', $& + { + out = std::copy(m0.first, m0.second, out); + ++fmt_first; + } + else if (*fmt_first == static_cast(regex_internal::char_other::co_grav)) // '`', $`, prefix. + { + out = std::copy(this->prefix().first, this->prefix().second, out); + ++fmt_first; + } + else if (*fmt_first == static_cast(regex_internal::char_other::co_apos)) // '\'', $', suffix. + { + out = std::copy(this->suffix().first, this->suffix().second, out); + ++fmt_first; + } +#if !defined(SRELL_NO_NAMEDCAPTURE) + else if (*fmt_first == static_cast(regex_internal::meta_char::mc_lt) && !no_groupnames) // '<', $< + { + const char_type *const current_backup = fmt_first; + bool replaced = false; + + if (++fmt_first == fmt_last) + ; // Do nothing. + else + { + const char_type *const name_begin = fmt_first; + + for (;; ++fmt_first) + { + if (*fmt_first == static_cast(regex_internal::meta_char::mc_gt)) + { + const regex_internal::uint_l32 backref_number = lookup_backref_number(name_begin, fmt_first); + + if (backref_number != regex_internal::groupname_mapper::notfound) + { + const value_type &mn = (*this)[backref_number]; + + if (mn.matched) + out = std::copy(mn.first, mn.second, out); +// replaced = true; + } + replaced = true; + ++fmt_first; + break; + } + if (fmt_first == fmt_last) + break; + } + } + if (!replaced) + { + fmt_first = current_backup; + *out++ = regex_internal::meta_char::mc_dollar; // '$'; + } + } +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + else + { + const char_type *const backup_pos = fmt_first; + size_type backref_number = 0; + + if (fmt_first != fmt_last && *fmt_first >= static_cast(regex_internal::char_alnum::ch_0) && *fmt_first <= static_cast(regex_internal::char_alnum::ch_9)) // '0'-'9' + { + backref_number += *fmt_first - regex_internal::char_alnum::ch_0; // '0'; + + if (++fmt_first != fmt_last && *fmt_first >= static_cast(regex_internal::char_alnum::ch_0) && *fmt_first <= static_cast(regex_internal::char_alnum::ch_9)) // '0'-'9' + { + backref_number *= 10; + backref_number += *fmt_first - regex_internal::char_alnum::ch_0; // '0'; + ++fmt_first; + } + } + + if (backref_number && backref_number < this->size()) + { + const value_type &mn = (*this)[backref_number]; + + if (mn.matched) + out = std::copy(mn.first, mn.second, out); + } + else + { + *out++ = regex_internal::meta_char::mc_dollar; // '$'; + + fmt_first = backup_pos; + if (*fmt_first == static_cast(regex_internal::meta_char::mc_dollar)) + ++fmt_first; + } + } + } + } + } + return out; + } + + template + OutputIter format( + OutputIter out, + const std::basic_string &fmt, + regex_constants::match_flag_type flags = regex_constants::format_default + ) const + { + return format(out, fmt.data(), fmt.data() + fmt.size(), flags); + } + + template + std::basic_string format( + const string_type &fmt, + regex_constants::match_flag_type flags = regex_constants::format_default + ) const + { + std::basic_string result; + +// format(std::back_insert_iterator(result), fmt, flags); + format(std::back_inserter(result), fmt, flags); + return result; + } + + string_type format(const char_type *fmt, regex_constants::match_flag_type flags = regex_constants::format_default) const + { + string_type result; + + format(std::back_inserter(result), fmt, fmt + std::char_traits::length(fmt), flags); + return result; + } + + // 28.10.6, allocator: + // [7.10.5] allocator + allocator_type get_allocator() const + { + return allocator_type(); + } + + // 28.10.7, swap: + // [7.10.6] swap + void swap(match_results &that) + { + const match_results tmp(that); + that = *this; + *this = tmp; + } + +public: // For internal. + + typedef match_results match_results_type; + typedef typename match_results_type::size_type match_results_size_type; + typedef typename regex_internal::re_search_state search_state_type; + + search_state_type sstate_; + + void clear_() + { + ready_ = false; + sub_matches_.clear(); +// prefix_.matched = false; +// suffix_.matched = false; +#if !defined(SRELL_NO_NAMEDCAPTURE) + gnames_.clear(); +#endif + } + +// template +#if !defined(SRELL_NO_NAMEDCAPTURE) + bool set_match_results_(const regex_internal::groupname_mapper &gnames) +#else + bool set_match_results_() +#endif + { + sub_matches_.resize(sstate_.bracket.size()); +// value_type &m0 = sub_matches_[0]; + + sub_matches_[0].matched = true; + + for (regex_internal::uint_l32 i = 1; i < static_cast(sstate_.bracket.size()); ++i) + { + const typename search_state_type::submatch_type &br = sstate_.bracket[i]; + value_type &sm = sub_matches_[i]; + + sm.first = br.core.open_at; + sm.second = br.core.close_at; + sm.matched = br.counter != 0; + } + + base_ = sstate_.lblim; + prefix_.first = sstate_.srchbegin; + prefix_.second = sub_matches_[0].first = sstate_.bracket[0].core.open_at; + suffix_.first = sub_matches_[0].second = sstate_.nth.in_string; + suffix_.second = sstate_.srchend; + + prefix_.matched = prefix_.first != prefix_.second; // The spec says prefix().first != prefix().second + suffix_.matched = suffix_.first != suffix_.second; // The spec says suffix().first != suffix().second + +#if !defined(SRELL_NO_NAMEDCAPTURE) + gnames_ = gnames; +#endif + ready_ = true; + return true; + } + + bool set_match_results_bmh_() + { + sub_matches_.resize(1); +// value_type &m0 = sub_matches_[0]; + + sub_matches_[0].matched = true; + + base_ = sstate_.lblim; + prefix_.first = sstate_.srchbegin; + prefix_.second = sub_matches_[0].first = sstate_.nth.in_string; + suffix_.first = sub_matches_[0].second = sstate_.nextpos; + suffix_.second = sstate_.srchend; + + prefix_.matched = prefix_.first != prefix_.second; + suffix_.matched = suffix_.first != suffix_.second; + + ready_ = true; + return true; + } + + void set_prefix_first_(const BidirectionalIterator pf) + { + prefix_.first = pf; + } + + bool mark_as_failed_() + { + ready_ = true; // 30.11.2 and 3: Postconditions: m.ready() == true in all cases. + return false; + } + +private: + +#if !defined(SRELL_NO_NAMEDCAPTURE) + + regex_internal::uint_l32 lookup_backref_number(const char_type *begin, const char_type *const end) const + { + typename regex_internal::groupname_mapper::gname_string key(end - begin); + + for (std::size_t i = 0; begin != end; ++begin, ++i) + key[i] = *begin; + + return gnames_[key]; + } + + regex_internal::uint_l32 lookup_and_check_backref_number(const char_type *begin, const char_type *const end) const + { + const regex_internal::uint_l32 backrefno = lookup_backref_number(begin, end); + + if (backrefno == regex_internal::groupname_mapper::notfound) + throw regex_error(regex_constants::error_backref); + + return backrefno; + } + +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + +public: // For debug. + + template + void print_sub_matches(const BasicRegexT &, const int) const; + void print_addresses(const value_type &, const char *const) const; + +private: + + typedef std::vector sub_match_array; + + bool ready_; + sub_match_array sub_matches_; + value_type prefix_; + value_type suffix_; + BidirectionalIterator base_; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + regex_internal::groupname_mapper gnames_; +#endif +#if defined(SRELL_STRICT_IMPL) + value_type unmatched_; +#endif +}; + +// 28.10.7, match_results swap: +// [7.10.6] match_results swap +template +void swap( + match_results &m1, + match_results &m2 +) +{ + m1.swap(m2); +} + +// 28.10.8, match_results comparisons +template +bool operator==( + const match_results &m1, + const match_results &m2 +) +{ + if (!m1.ready() && !m2.ready()) + return true; + + if (m1.ready() && m2.ready()) + { + if (m1.empty() && m2.empty()) + return true; + + if (!m1.empty() && !m2.empty()) + { + return m1.prefix() == m2.prefix() && m1.size() == m2.size() && std::equal(m1.begin(), m1.end(), m2.begin()) && m1.suffix() == m2.suffix(); + } + } + return false; +} + +template +bool operator!=( + const match_results &m1, + const match_results &m2 +) +{ + return !(m1 == m2); +} + +typedef match_results cmatch; +typedef match_results wcmatch; +typedef match_results smatch; +typedef match_results wsmatch; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef match_results u16cmatch; + typedef match_results u32cmatch; + typedef match_results u16smatch; + typedef match_results u32smatch; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef match_results u8cmatch; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef match_results u8smatch; +#endif + +typedef cmatch u8ccmatch; +typedef smatch u8csmatch; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccmatch u8cmatch; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8csmatch u8smatch; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcmatch u32wcmatch; + typedef wsmatch u32wsmatch; + typedef u32wcmatch u1632wcmatch; + typedef u32wsmatch u1632wsmatch; + #elif WCHAR_MAX >= 0xffff + typedef wcmatch u16wcmatch; + typedef wsmatch u16wsmatch; + typedef u16wcmatch u1632wcmatch; + typedef u16wsmatch u1632wsmatch; + #endif +#endif + +// ... "regex_match_results.hpp"] +// ["rei_algorithm.hpp" ... + + namespace regex_internal + { + +template +class regex_object : public re_compiler +{ +public: + + template + bool search + ( + const BidirectionalIterator begin, + const BidirectionalIterator end, + const BidirectionalIterator lookbehind_limit, + match_results &results, + const regex_constants::match_flag_type flags /* = regex_constants::match_default */ + ) const + { + results.clear_(); + +// results.sstate_.template init(begin, end, lookbehind_limit, flags); + results.sstate_.init(begin, end, lookbehind_limit, flags); + + if (results.sstate_.match_continuous_flag()) + { + if (this->NFA_states.size()) + { + results.sstate_.set_entrypoint(this->NFA_states[0].next_state2); + goto DO_SEARCH; + } + } + else +#if !defined(SRELLDBG_NO_BMH) + if (this->bmdata) + { +#if !defined(SRELL_NO_ICASE) + if (!this->is_ricase() ? this->bmdata->do_casesensitivesearch(results.sstate_, typename std::iterator_traits::iterator_category()) : this->bmdata->do_icasesearch(results.sstate_, typename std::iterator_traits::iterator_category())) +#else + if (this->bmdata->do_casesensitivesearch(results.sstate_, typename std::iterator_traits::iterator_category())) +#endif + return results.set_match_results_bmh_(); + } + else +#endif + if (this->NFA_states.size()) + { + results.sstate_.set_entrypoint(this->NFA_states[0].next_state1); + + DO_SEARCH: + results.sstate_.init_for_automaton(this->number_of_brackets, this->number_of_counters, this->number_of_repeats); + +#if !defined(SRELL_NO_ICASE) + if (!this->is_ricase() ? do_search(results) : do_search(results)) +#else + if (do_search(results)) +#endif + { +#if !defined(SRELL_NO_NAMEDCAPTURE) + return results.set_match_results_(this->namedcaptures); +#else + return results.set_match_results_(); +#endif + } + } + return results.mark_as_failed_(); + } + +private: + + typedef typename traits::utf_traits utf_traits; + + template + bool do_search + ( + match_results &results + ) const + { + re_search_state &sstate = results.sstate_; + const BidirectionalIterator searchend = sstate.nth.in_string; + + for (;;) + { + const bool final = sstate.nextpos == searchend; + + sstate.nth.in_string = sstate.nextpos; + + if (!final) + { + +#ifdef SRELLDBG_NO_1STCHRCLS + utf_traits::codepoint_inc(sstate.nextpos, sstate.srchend); +#else + { + #if !defined(SRELLDBG_NO_BITSET) + if (!this->firstchar_class_bs.test((*sstate.nextpos++) & utf_traits::bitsetmask)) + #else + const uchar32 firstchar = utf_traits::codepoint_inc(sstate.nextpos, sstate.srchend); + + if (!this->firstchar_class.is_included(firstchar)) + #endif + continue; + } +#endif + } + // Even when final == true, we have to try for such expressions + // as "" =~ /^$/ or "..." =~ /$/. + +#if defined(SRELL_NO_LIMIT_COUNTER) + sstate.reset(/* first */); +#else + sstate.reset(/* first, */ this->limit_counter); +#endif + if (run_automaton(sstate /* , false */)) + return true; + + if (final) + break; + } + return false; + } + + template + struct casehelper + { + static T canonicalise(const T t) + { + return t; + } + }; + + template + struct casehelper + { + static T canonicalise(const T t) + { + return unicode_case_folding::do_casefolding(t); + } + }; + + template + bool run_automaton + ( +// match_results &results, + re_search_state &sstate +// , const bool is_recursive /* = false */ + ) const + { + typedef casehelper casehelper_type; + typedef typename re_object_core::state_type state_type; + typedef re_search_state ss_type; +// typedef typename ss_type::search_core_state scstate_type; + typedef typename ss_type::submatch_type submatch_type; + typedef typename ss_type::submatchcore_type submatchcore_type; + typedef typename ss_type::counter_type counter_type; + typedef typename ss_type::position_type position_type; + bool is_matched; + + goto START; + + JUDGE: + if (is_matched) + { + MATCHED: + sstate.nth.in_NFA_states = sstate.nth.in_NFA_states->next_state1; + } + else + { + NOT_MATCHED: + +#if !defined(SRELL_NO_LIMIT_COUNTER) + if (--sstate.failure_counter) + { +#endif + if (sstate.bt_stack.size() > sstate.btstack_size) + { + sstate.nth = sstate.bt_stack.back(); + sstate.bt_stack.pop_back(); + + sstate.nth.in_NFA_states = sstate.nth.in_NFA_states->next_state2; +// continue; + } + else + { + return false; + } +#if !defined(SRELL_NO_LIMIT_COUNTER) + } + else + throw regex_error(regex_constants::error_complexity); +#endif + } + +// START: + for (;;) + { + START: + const state_type ¤t_NFA = *sstate.nth.in_NFA_states; + + switch (current_NFA.type) + { + case st_character: + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + if (!sstate.is_at_srchend()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = casehelper_type::canonicalise(utf_traits::codepoint_inc(sstate.nth.in_string, sstate.srchend)); + RETRY_CF: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + + if (current_NFA2.character == uchar) + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + + if (sstate.nth.in_NFA_states->type == st_character) + goto RETRY_CF; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + else // reverse == true. + { + if (!sstate.is_at_lookbehindlimit()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = casehelper_type::canonicalise(utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim)); + RETRY_CB: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + + if (current_NFA2.character == uchar) + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + + if (sstate.nth.in_NFA_states->type == st_character) + goto RETRY_CB; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + goto NOT_MATCHED; + + case st_character_class: + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + if (!sstate.is_at_srchend()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = utf_traits::codepoint_inc(sstate.nth.in_string, sstate.srchend); +// RETRY_CCF: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + +#if !defined(SRELLDBG_NO_CCPOS) + if (this->character_class.is_included(current_NFA2.quantifier.offset, current_NFA2.quantifier.length, uchar)) +#else + if (this->character_class.is_included(current_NFA2.number, uchar)) +#endif + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + +// if (sstate.nth.in_NFA_states->type == st_character_class) +// goto RETRY_CCF; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + else // reverse == true. + { + if (!sstate.is_at_lookbehindlimit()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim); +// RETRY_CCB: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + +#if !defined(SRELLDBG_NO_CCPOS) + if (this->character_class.is_included(current_NFA2.quantifier.offset, current_NFA2.quantifier.length, uchar)) +#else + if (this->character_class.is_included(current_NFA2.number, uchar)) +#endif + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + +// if (sstate.nth.in_NFA_states->type == st_character_class) +// goto RETRY_CCB; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + goto NOT_MATCHED; + + case st_epsilon: + +#if defined(SRELLDBG_NO_SKIP_EPSILON) + if (current_NFA.next_state2) +#endif + { + sstate.bt_stack.push_back(sstate.nth); // sstate.push(); + } + + sstate.nth.in_NFA_states = current_NFA.next_state1; + continue; + + default: + switch (current_NFA.type) + { + + case st_check_counter: + { + const uint_l32 counter = sstate.counter[current_NFA.number]; + + if (counter < current_NFA.quantifier.atmost) + { + ++sstate.counter[current_NFA.number]; + + LOOP_WITHOUT_INCREMENT: + + if (counter >= current_NFA.quantifier.atleast) + { + sstate.bt_stack.push_back(sstate.nth); + sstate.nth.in_NFA_states = current_NFA.next_state1; + } + else + { + sstate.nth.in_NFA_states + = current_NFA.quantifier.is_greedy + ? current_NFA.next_state1 + : current_NFA.next_state2; + } + } + else + { + if (current_NFA.quantifier.is_infinity()) + goto LOOP_WITHOUT_INCREMENT; + + sstate.nth.in_NFA_states + = current_NFA.quantifier.is_greedy + ? current_NFA.next_state2 + : current_NFA.next_state1; + } + } + continue; + + case st_decrement_counter: + --sstate.counter[current_NFA.number]; + goto NOT_MATCHED; + + case st_save_and_reset_counter: + { + counter_type &c = sstate.counter[current_NFA.number]; + + sstate.counter_stack.push_back(c); + sstate.bt_stack.push_back(sstate.nth); + c = 0; + } + goto MATCHED; + + case st_restore_counter: + sstate.counter[current_NFA.number] = sstate.counter_stack.back(); + sstate.counter_stack.pop_back(); + goto NOT_MATCHED; + + case st_roundbracket_open: // '(': + { + submatch_type &bracket = sstate.bracket[current_NFA.number]; + + sstate.capture_stack.push_back(bracket.core); + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + bracket.core.open_at = sstate.nth.in_string; + } + else + bracket.core.close_at = sstate.nth.in_string; + + ++bracket.counter; + + for (uint_l32 brno = current_NFA.quantifier.atleast; brno <= current_NFA.quantifier.atmost; ++brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + sstate.capture_stack.push_back(inner_bracket.core); + sstate.counter_stack.push_back(inner_bracket.counter); + inner_bracket.core.open_at = inner_bracket.core.close_at = sstate.srchend; + inner_bracket.counter = 0; + // ECMAScript spec (3-5.1) 15.10.2.5, NOTE 3. + // ECMAScript 2018 (ES9) 21.2.2.5.1, Note 3. + } + + sstate.bt_stack.push_back(sstate.nth); + } + goto MATCHED; + + case st_roundbracket_pop: // '/': + { + for (uint_l32 brno = current_NFA.quantifier.atmost; brno >= current_NFA.quantifier.atleast; --brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + inner_bracket.counter = sstate.counter_stack.back(); + inner_bracket.core = sstate.capture_stack.back(); + sstate.counter_stack.pop_back(); + sstate.capture_stack.pop_back(); + } + + submatch_type &bracket = sstate.bracket[current_NFA.number]; + + bracket.core = sstate.capture_stack.back(); + sstate.capture_stack.pop_back(); + --bracket.counter; + } + goto NOT_MATCHED; + + case st_roundbracket_close: // ')': + { + submatch_type &bracket = sstate.bracket[current_NFA.number]; + submatchcore_type &brc = bracket.core; + + if ((!reverse ? brc.open_at : brc.close_at) != sstate.nth.in_string) + { + sstate.nth.in_NFA_states = current_NFA.next_state1; + } + else // 0 width match, breaks from the loop. + { + if (current_NFA.next_state1->type != st_check_counter) + { + if (bracket.counter > 1) + goto NOT_MATCHED; // ECMAScript spec 15.10.2.5, note 4. + + sstate.nth.in_NFA_states = current_NFA.next_state2; + // Accepts 0 width match and exits. + } + else + { + // A pair with check_counter. + const counter_type counter = sstate.counter[current_NFA.next_state1->number]; + + if (counter > current_NFA.next_state1->quantifier.atleast) + goto NOT_MATCHED; // Takes a captured string in the previous loop. + + sstate.nth.in_NFA_states = current_NFA.next_state1; + // Accepts 0 width match and continues. + } + } +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + brc.close_at = sstate.nth.in_string; + } + else // reverse == true. + { + brc.open_at = sstate.nth.in_string; + } + } + continue; + + case st_repeat_in_push: + { + position_type &r = sstate.repeat[current_NFA.number]; + + sstate.repeat_stack.push_back(r); + r = sstate.nth.in_string; + + for (uint_l32 brno = current_NFA.quantifier.atleast; brno <= current_NFA.quantifier.atmost; ++brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + sstate.capture_stack.push_back(inner_bracket.core); + sstate.counter_stack.push_back(inner_bracket.counter); + inner_bracket.core.open_at = inner_bracket.core.close_at = sstate.srchend; + inner_bracket.counter = 0; + // ECMAScript 2019 (ES10) 21.2.2.5.1, Note 3. + } + sstate.bt_stack.push_back(sstate.nth); + } + goto MATCHED; + + case st_repeat_in_pop: + for (uint_l32 brno = current_NFA.quantifier.atmost; brno >= current_NFA.quantifier.atleast; --brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + inner_bracket.counter = sstate.counter_stack.back(); + inner_bracket.core = sstate.capture_stack.back(); + sstate.counter_stack.pop_back(); + sstate.capture_stack.pop_back(); + } + + sstate.repeat[current_NFA.number] = sstate.repeat_stack.back(); + sstate.repeat_stack.pop_back(); + goto NOT_MATCHED; + + case st_check_0_width_repeat: + if (sstate.nth.in_string != sstate.repeat[current_NFA.number]) + goto MATCHED; + + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + + case st_backreference: // '\\': + { + const submatch_type &bracket = sstate.bracket[current_NFA.number]; + + if (!bracket.counter) // Undefined. + { + ESCAPE_FROM_ZERO_WIDTH_MATCH: + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } + else + { + const submatchcore_type &brc = bracket.core; + + if (brc.open_at == brc.close_at) + { + goto ESCAPE_FROM_ZERO_WIDTH_MATCH; + } + else + { +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + for (BidirectionalIterator backrefpos = brc.open_at; backrefpos != brc.close_at;) + { + if (!sstate.is_at_srchend()) + { + const uchar32 uchartxt = utf_traits::codepoint_inc(sstate.nth.in_string, sstate.srchend); + const uchar32 ucharref = utf_traits::codepoint_inc(backrefpos, brc.close_at); + + if (casehelper_type::canonicalise(uchartxt) == casehelper_type::canonicalise(ucharref)) + continue; + } + goto NOT_MATCHED; + } + } + else // reverse == true. + { + for (BidirectionalIterator backrefpos = brc.close_at; backrefpos != brc.open_at;) + { + if (!sstate.is_at_lookbehindlimit()) + { + const uchar32 uchartxt = utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim); + const uchar32 ucharref = utf_traits::dec_codepoint(backrefpos, brc.open_at); + + if (casehelper_type::canonicalise(uchartxt) == casehelper_type::canonicalise(ucharref)) + continue; + } + goto NOT_MATCHED; + } + } + } + } + } + goto MATCHED; + + case st_lookaround_open: + { + for (uint_l32 i = 1; i < this->number_of_brackets; ++i) + { + const submatch_type &sm = sstate.bracket[i]; + sstate.capture_stack.push_back(sm.core); + sstate.counter_stack.push_back(sm.counter); + } + + for (uint_l32 i = 0; i < this->number_of_counters; ++i) + sstate.counter_stack.push_back(sstate.counter[i]); + + for (uint_l32 i = 0; i < this->number_of_repeats; ++i) + sstate.repeat_stack.push_back(sstate.repeat[i]); + + const typename ss_type::bottom_state backup_bottom(sstate.btstack_size, sstate.capture_stack.size(), sstate.counter_stack.size(), sstate.repeat_stack.size()); + const BidirectionalIterator orgpos = sstate.nth.in_string; + + sstate.btstack_size = sstate.bt_stack.size(); + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) + if (current_NFA.quantifier.atleast == 2) + { + sstate.repeat_stack.push_back(sstate.lblim); + sstate.lblim = sstate.srchbegin; + } +#endif + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) + +// if (current_NFA.reverse) + { + for (uint_l32 i = 0; i < current_NFA.quantifier.atleast; ++i) + { + if (!sstate.is_at_lookbehindlimit()) + { + utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim); + continue; + } + is_matched = false; + goto AFTER_LOOKAROUND; + } + } +#endif + sstate.nth.in_NFA_states = current_NFA.next_state2; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + is_matched = current_NFA.quantifier.atleast == 0 ? run_automaton(sstate /* , true */) : run_automaton(sstate /* , true */); +#else + is_matched = run_automaton(sstate /* , true */); +#endif + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) + AFTER_LOOKAROUND: +#endif + { + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) + if (current_NFA.quantifier.atleast == 2) + { + sstate.lblim = sstate.repeat_stack[backup_bottom.repeatstack_size]; + if (is_matched) + sstate.bracket[0].core.open_at = sstate.nth.in_string; + } +#endif + +#if defined(SRELL_ENABLE_GT) + if (current_NFA.character != meta_char::mc_gt) // '>' +#endif + { + sstate.nth.in_string = orgpos; + } + sstate.bt_stack.resize(sstate.btstack_size); + + sstate.btstack_size = backup_bottom.btstack_size; + sstate.capture_stack.resize(backup_bottom.capturestack_size); + sstate.counter_stack.resize(backup_bottom.counterstack_size); + sstate.repeat_stack.resize(backup_bottom.repeatstack_size); + + is_matched ^= current_NFA.is_not; + } + } + if (is_matched) + { + sstate.nth.in_NFA_states = current_NFA.next_state1; + continue; + } + +// case st_lookaround_pop: + for (uint_l32 i = this->number_of_repeats; i;) + { + sstate.repeat[--i] = sstate.repeat_stack.back(); + sstate.repeat_stack.pop_back(); + } + + for (uint_l32 i = this->number_of_counters; i;) + { + sstate.counter[--i] = sstate.counter_stack.back(); + sstate.counter_stack.pop_back(); + } + + for (uint_l32 i = this->number_of_brackets; i > 1;) + { + submatch_type &sm = sstate.bracket[--i]; + + sm.counter = sstate.counter_stack.back(); + sm.core = sstate.capture_stack.back(); + sstate.counter_stack.pop_back(); + sstate.capture_stack.pop_back(); + } + goto NOT_MATCHED; + + case st_bol: // '^': + if (sstate.is_at_lookbehindlimit() && !sstate.match_prev_avail_flag()) + { + if (!sstate.match_not_bol_flag()) + goto MATCHED; + } + // !sstate.is_at_lookbehindlimit() || sstate.match_prev_avail_flag() + else if (current_NFA.multiline) + { + const uchar32 prevchar = utf_traits::prevcodepoint(sstate.nth.in_string, sstate.lblim); + + if (this->character_class.is_included(re_character_class::newline, prevchar)) + goto MATCHED; + } + goto NOT_MATCHED; + + case st_eol: // '$': + if (sstate.is_at_srchend()) + { + if (!sstate.match_not_eol_flag()) + goto MATCHED; + } + else if (current_NFA.multiline) + { + const uchar32 nextchar = utf_traits::codepoint(sstate.nth.in_string, sstate.srchend); + + if (this->character_class.is_included(re_character_class::newline, nextchar)) + goto MATCHED; + } + goto NOT_MATCHED; + + case st_boundary: // '\b' '\B' + is_matched = current_NFA.is_not; +// is_matched = current_NFA.character == char_alnum::ch_B; + + // First, suppose the previous character is not \w but \W. + + if (sstate.is_at_srchend()) + { + if (sstate.match_not_eow_flag()) + is_matched = !is_matched; + } + else if (this->character_class.is_included(current_NFA.number, utf_traits::codepoint(sstate.nth.in_string, sstate.srchend))) + { + is_matched = !is_matched; + } + // \W/last \w + // \b false true + // \B true false + + // Second, if the actual previous character is \w, flip is_matched. + + if (sstate.is_at_lookbehindlimit() && !sstate.match_prev_avail_flag()) + { + if (sstate.match_not_bow_flag()) + is_matched = !is_matched; + } + // !sstate.is_at_lookbehindlimit() || sstate.match_prev_avail_flag() + else if (this->character_class.is_included(current_NFA.number, utf_traits::prevcodepoint(sstate.nth.in_string, sstate.lblim))) + { + is_matched = !is_matched; + } + // \b \B + // pre cur \W/last \w pre cur \W/last \w + // \W/base false true \W/base true false + // \w true false \w false true + + goto JUDGE; + + case st_success: // == lookaround_close. +// if (is_recursive) + if (sstate.btstack_size) + return true; + + if + ( + (!sstate.match_not_null_flag() || !sstate.is_null()) + && + (!sstate.match_match_flag() || sstate.is_at_srchend()) + ) + return true; + + goto NOT_MATCHED; + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) + case st_move_nextpos: +#if !defined(SRELLDBG_NO_1STCHRCLS) && !defined(SRELLDBG_NO_BITSET) + sstate.nextpos = sstate.nth.in_string; + if (!sstate.is_at_srchend()) + ++sstate.nextpos; +#else // defined(SRELLDBG_NO_1STCHRCLS) || defined(SRELLDBG_NO_BITSET) + if (sstate.nth.in_string != sstate.bracket[0].core.open_at) + { + sstate.nextpos = sstate.nth.in_string; + if (!sstate.is_at_srchend()) + utf_traits::codepoint_inc(sstate.nextpos, sstate.srchend); + } +#endif + goto MATCHED; +#endif + + default: + // Reaching here means that this->NFA_states is corrupted. + throw regex_error(regex_constants::error_internal); + + } + } + } + } +}; +// regex_object + + } // namespace regex_internal + +// ... "rei_algorithm.hpp"] +// ["basic_regex.hpp" ... + +// 28.8, class template basic_regex: +template > +class basic_regex : public regex_internal::regex_object +{ +public: + + // Types: + typedef charT value_type; + typedef traits traits_type; + typedef typename traits::string_type string_type; + typedef regex_constants::syntax_option_type flag_type; + typedef typename traits::locale_type locale_type; + + // 28.8.1, constants: + // [7.8.1] constants + static const regex_constants::syntax_option_type icase = regex_constants::icase; + static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs; + static const regex_constants::syntax_option_type optimize = regex_constants::optimize; + static const regex_constants::syntax_option_type collate = regex_constants::collate; + static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; + static const regex_constants::syntax_option_type basic = regex_constants::basic; + static const regex_constants::syntax_option_type extended = regex_constants::extended; + static const regex_constants::syntax_option_type awk = regex_constants::awk; + static const regex_constants::syntax_option_type grep = regex_constants::grep; + static const regex_constants::syntax_option_type egrep = regex_constants::egrep; + static const regex_constants::syntax_option_type multiline = regex_constants::multiline; + + static const regex_constants::syntax_option_type dotall = regex_constants::dotall; + + // 28.8.2, construct/copy/destroy: + // [7.8.2] construct/copy/destroy + basic_regex() + { + } + + explicit basic_regex(const charT *const p, const flag_type f = regex_constants::ECMAScript) + { + assign(p, p + std::char_traits::length(p), f); + } + + basic_regex(const charT *const p, const std::size_t len, const flag_type f = regex_constants::ECMAScript) + { + assign(p, p + len, f); + } + + basic_regex(const basic_regex &e) + { + assign(e); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + basic_regex(basic_regex &&e) SRELL_NOEXCEPT + { + assign(std::move(e)); + } +#endif + + template + explicit basic_regex(const std::basic_string &p, const flag_type f = regex_constants::ECMAScript) + { + assign(p, f); + } + + template + basic_regex(ForwardIterator first, ForwardIterator last, const flag_type f = regex_constants::ECMAScript) + { + assign(first, last, f); + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + basic_regex(std::initializer_list il, const flag_type f = regex_constants::ECMAScript) + { + assign(il, f); + } +#endif + +// ~basic_regex(); + + basic_regex &operator=(const basic_regex &right) + { + return assign(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + basic_regex &operator=(basic_regex &&e) SRELL_NOEXCEPT + { + return assign(std::move(e)); + } +#endif + + basic_regex &operator=(const charT *const ptr) + { + return assign(ptr); + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + basic_regex &operator=(std::initializer_list il) + { + return assign(il.begin(), il.end()); + } +#endif + + template + basic_regex &operator=(const std::basic_string &p) + { + return assign(p); + } + + // 28.8.3, assign: + // [7.8.3] assign + basic_regex &assign(const basic_regex &right) + { + regex_internal::re_object_core::operator=(right); + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + basic_regex &assign(basic_regex &&right) SRELL_NOEXCEPT + { + regex_internal::re_object_core::operator=(std::move(right)); + return *this; + } +#endif + + basic_regex &assign(const charT *const ptr, const flag_type f = regex_constants::ECMAScript) + { + return assign(ptr, ptr + std::char_traits::length(ptr), f); + } + + basic_regex &assign(const charT *const p, std::size_t len, const flag_type f = regex_constants::ECMAScript) + { + return assign(p, p + len, f); + } + + template + basic_regex &assign(const std::basic_string &s, const flag_type f = regex_constants::ECMAScript) + { + return assign(s.c_str(), s.c_str() + s.size(), f); + } + + template + basic_regex &assign(InputIterator first, InputIterator last, const flag_type f = regex_constants::ECMAScript) + { +#if defined(SRELL_STRICT_IMPL) + basic_regex tmp; + tmp.compile(first, last, f); + tmp.swap(*this); +#else + this->compile(first, last, f); +#endif + return *this; + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + basic_regex &assign(std::initializer_list il, const flag_type f = regex_constants::ECMAScript) + { + return assign(il.begin(), il.end(), f); + } +#endif + + // 28.8.4, const operations: + // [7.8.4] const operations + unsigned mark_count() const + { + return this->number_of_brackets - 1; + } + + flag_type flags() const + { + return this->soflags; + } + + // 28.8.5, locale: + // [7.8.5] locale + locale_type imbue(locale_type loc) + { + return this->traits_inst.imbue(loc); + } + + locale_type getloc() const + { + return this->traits_inst.getloc(); + } + + // 28.8.6, swap: + // [7.8.6] swap + void swap(basic_regex &e) + { + regex_internal::re_object_core::swap(e); + } +}; + +// 28.8.6, basic_regex swap: +template +void swap(basic_regex &lhs, basic_regex &rhs) +{ + lhs.swap(rhs); +} + +typedef basic_regex regex; +typedef basic_regex wregex; + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wregex u32wregex; + typedef u32wregex u1632wregex; + #elif WCHAR_MAX >= 0xffff + typedef basic_regex > u16wregex; + typedef u16wregex u1632wregex; + #endif +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef basic_regex u8regex; +#endif + +typedef basic_regex > u8cregex; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8cregex u8regex; +#endif + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef basic_regex u16regex; + typedef basic_regex u32regex; +#endif + +// ... "basic_regex.hpp"] +// ["regex_iterator.hpp" ... + +// 28.12.1, class template regex_iterator: +template ::value_type, class traits = regex_traits > +class regex_iterator +{ +public: + + typedef basic_regex regex_type; + typedef match_results value_type; + typedef std::ptrdiff_t difference_type; + typedef const value_type * pointer; + typedef const value_type & reference; + typedef std::forward_iterator_tag iterator_category; + + regex_iterator() + { + // 28.12.1.1: Constructs an end-of-sequence iterator. + } + + regex_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + const regex_constants::match_flag_type m = regex_constants::match_default) + : begin(a), end(b), pregex(&re), flags(m) + { + regex_search(begin, end, begin, match, *pregex, flags); + // 28.12.1.1: If this call returns false the constructor + // sets *this to the end-of-sequence iterator. + } + + regex_iterator(const regex_iterator &that) + { + operator=(that); + } + + regex_iterator &operator=(const regex_iterator &that) + { + if (this != &that) + { + this->begin = that.begin; + this->end = that.end; + this->pregex = that.pregex; + this->flags = that.flags; + this->match = that.match; + } + return *this; + } + + bool operator==(const regex_iterator &right) const + { + // It is probably safe to assume that match.size() == 0 means + // end-of-sequence, because it happens only when 1) never tried + // regex_search, or 2) regex_search returned false. + + if (this->match.size() == 0 || right.match.size() == 0) + return this->match.size() == right.match.size(); + + return + this->begin == right.begin + && + this->end == right.end + && + this->pregex == right.pregex + && + this->flags == right.flags + && + this->match[0] == right.match[0]; + } + + bool operator!=(const regex_iterator &right) const + { + return !(*this == right); + } + + const value_type &operator*() const + { + return match; + } + + const value_type *operator->() const + { + return &match; + } + + regex_iterator &operator++() + { + if (this->match.size()) + { + BidirectionalIterator start = match[0].second; + + if (match[0].first == start) // The iterator holds a 0-length match. + { + if (start == end) + { + match.clear_(); + // 28.12.1.4.2: If the iterator holds a zero-length match and + // start == end the operator sets *this to the end-ofsequence + // iterator and returns *this. + } + else + { + // 28.12.1.4.3: Otherwise, if the iterator holds a zero-length match + // the operator calls regex_search(start, end, match, *pregex, flags + // | regex_constants::match_not_null | regex_constants::match_continuous). + // If the call returns true the operator returns *this. [Cont...] + + if (!regex_search(start, end, begin, match, *pregex, flags | regex_constants::match_not_null | regex_constants::match_continuous)) + { + const BidirectionalIterator prevend = start; + + // [...Cont] Otherwise the operator increments start and continues + // as if the most recent match was not a zero-length match. +// ++start; + utf_traits::codepoint_inc(start, end); + + flags |= regex_constants::match_prev_avail; + + if (regex_search(start, end, begin, match, *pregex, flags)) + { + // 28.12.1.4.5-6: In all cases in which the call to regex_search + // returns true, match.prefix().first shall be equal to the previous + // value of match[0].second, ... match[i].position() shall return + // distance(begin, match[i].first). + // This means that match[i].position() gives the offset from the + // beginning of the target sequence, which is often not the same as + // the offset from the sequence passed in the call to regex_search. + // + // To satisfy this: + match.set_prefix_first_(prevend); + } + } + } + } + else + { + // 28.12.1.4.4: If the most recent match was not a zero-length match, + // the operator sets flags to flags | regex_constants::match_prev_avail + // and calls regex_search(start, end, match, *pregex, flags). [Cont...] + flags |= regex_constants::match_prev_avail; + + regex_search(start, end, begin, match, *pregex, flags); + // [...Cont] If the call returns false the iterator sets *this to + // the end-of-sequence iterator. The iterator then returns *this. + // + // 28.12.1.4.5-6: In all cases in which the call to regex_search + // returns true, match.prefix().first shall be equal to the previous + // value of match[0].second, ... match[i].position() shall return + // distance(begin, match[i].first). + // This means that match[i].position() gives the offset from the + // beginning of the target sequence, which is often not the same as + // the offset from the sequence passed in the call to regex_search. + // + // These should already be done in regex_search. + } + } + return *this; + } + + regex_iterator operator++(int) + { + const regex_iterator tmp = *this; + ++(*this); + return tmp; + } + +private: + + BidirectionalIterator begin; + BidirectionalIterator end; + const regex_type *pregex; + regex_constants::match_flag_type flags; + match_results match; + + typedef typename traits::utf_traits utf_traits; +}; + +typedef regex_iterator cregex_iterator; +typedef regex_iterator wcregex_iterator; +typedef regex_iterator sregex_iterator; +typedef regex_iterator wsregex_iterator; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef regex_iterator u16cregex_iterator; + typedef regex_iterator u32cregex_iterator; + typedef regex_iterator u16sregex_iterator; + typedef regex_iterator u32sregex_iterator; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef regex_iterator u8cregex_iterator; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef regex_iterator u8sregex_iterator; +#endif + +typedef regex_iterator::value_type, u8regex_traits::value_type> > u8ccregex_iterator; +typedef regex_iterator::value_type, u8regex_traits::value_type> > u8csregex_iterator; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccregex_iterator u8cregex_iterator; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8csregex_iterator u8sregex_iterator; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcregex_iterator u32wcregex_iterator; + typedef wsregex_iterator u32wsregex_iterator; + typedef u32wcregex_iterator u1632wcregex_iterator; + typedef u32wsregex_iterator u1632wsregex_iterator; + #elif WCHAR_MAX >= 0xffff + typedef regex_iterator::value_type, u16regex_traits::value_type> > u16wcregex_iterator; + typedef regex_iterator::value_type, u16regex_traits::value_type> > u16wsregex_iterator; + typedef u16wcregex_iterator u1632wcregex_iterator; + typedef u16wsregex_iterator u1632wsregex_iterator; + #endif +#endif + +// ... "regex_iterator.hpp"] +// ["regex_algorithm.hpp" ... + +// 28.11.2, function template regex_match: +// [7.11.2] Function template regex_match +template +bool regex_match( + const BidirectionalIterator first, + const BidirectionalIterator last, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return e.search(first, last, first, m, flags | regex_constants::match_continuous | regex_constants::match_match_); +} + +template +bool regex_match( + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ +// 4 Effects: Behaves "as if" by constructing an instance of +// match_results what, and then returning the +// result of regex_match(first, last, what, e, flags). + + match_results what; + + return regex_match(first, last, what, e, flags); +} + +template +bool regex_match( + const charT *const str, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(str, str + std::char_traits::length(str), m, e, flags); +} + +template +bool regex_match( + const std::basic_string &s, + match_results::const_iterator, Allocator> &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(s.begin(), s.end(), m, e, flags); +} + +template +bool regex_match( + const charT *const str, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(str, str + std::char_traits::length(str), e, flags); +} + +template +bool regex_match( + const std::basic_string &s, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(s.begin(), s.end(), e, flags); +} + +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + const BidirectionalIterator lookbehind_limit, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return e.search(first, last, lookbehind_limit, m, flags); +} + +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + const BidirectionalIterator lookbehind_limit, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ +// 6 Effects: Behaves "as if" by constructing an object what of type +// match_results and then returning the result of +// regex_search(first, last, what, e, flags). + + match_results what; + return regex_search(first, last, lookbehind_limit, what, e, flags); +} + +// 28.11.3, function template regex_search: +// 7.11.3 regex_search [tr.re.alg.search] +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return e.search(first, last, first, m, flags); +} + +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ +// 6 Effects: Behaves "as if" by constructing an object what of type +// match_results and then returning the result of +// regex_search(first, last, what, e, flags). + + match_results what; + return regex_search(first, last, what, e, flags); +} + +template +bool regex_search( + const charT *const str, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(str, str + std::char_traits::length(str), m, e, flags); +} + +template +bool regex_search( + const charT *const str, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(str, str + std::char_traits::length(str), e, flags); +} + +template +bool regex_search( + const std::basic_string &s, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(s.begin(), s.end(), e, flags); +} + +template +bool regex_search( + const std::basic_string &s, + match_results::const_iterator, Allocator> &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(s.begin(), s.end(), m, e, flags); +} + +// 28.11.4, function template regex_replace: +// [7.11.4] Function template regex_replace +template +OutputIterator regex_replace( + OutputIterator out, + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const std::basic_string &fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + typedef regex_iterator iterator_type; + + const bool do_copy = !(flags & regex_constants::format_no_copy); + const iterator_type eos; + iterator_type i(first, last, e, flags); + typename iterator_type::value_type::value_type last_m_suffix; + + last_m_suffix.first = first; + last_m_suffix.second = last; + + for (; i != eos; ++i) + { + if (do_copy) + out = std::copy(i->prefix().first, i->prefix().second, out); + + out = i->format(out, fmt, flags); + last_m_suffix = i->suffix(); + + if (flags & regex_constants::format_first_only) + break; + } + + if (do_copy) + out = std::copy(last_m_suffix.first, last_m_suffix.second, out); + + return out; +} + +template +OutputIterator regex_replace( + OutputIterator out, + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const charT *const fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + // Strictly speaking, this should be implemented as a version different + // from the above with changing the line i->format(out, fmt, flags) to + // i->format(out, fmt, fmt + char_traits::length(fmt), flags). + + const std::basic_string fs(fmt, fmt + std::char_traits::length(fmt)); + + return regex_replace(out, first, last, e, fs, flags); +} + +template +std::basic_string regex_replace( + const std::basic_string &s, + const basic_regex &e, + const std::basic_string &fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s.begin(), s.end(), e, fmt, flags); + return result; +} + +template +std::basic_string regex_replace( + const std::basic_string &s, + const basic_regex &e, + const charT *const fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s.begin(), s.end(), e, fmt, flags); + return result; +} + +template +std::basic_string regex_replace( + const charT *const s, + const basic_regex &e, + const std::basic_string &fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s, s + std::char_traits::length(s), e, fmt, flags); + return result; +} + +template +std::basic_string regex_replace( + const charT *const s, + const basic_regex &e, + const charT *const fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s, s + std::char_traits::length(s), e, fmt, flags); + return result; +} + +// ... "regex_algorithm.hpp"] +// ["regex_token_iterator.hpp" ... + +// 28.12.2, class template regex_token_iterator: +template ::value_type, class traits = regex_traits > +class regex_token_iterator +{ +public: + + typedef basic_regex regex_type; + typedef sub_match value_type; + typedef std::ptrdiff_t difference_type; + typedef const value_type * pointer; + typedef const value_type & reference; + typedef std::forward_iterator_tag iterator_category; + + regex_token_iterator() : result(NULL) + { + // Constructs the end-of-sequence iterator. + } + + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + int submatch = 0, + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(1, submatch) + { + post_constructor(a, b); + } + + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + const std::vector &submatches, + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(submatches) + { + post_constructor(a, b); + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + std::initializer_list submatches, + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(submatches) + { + post_constructor(a, b); + } +#endif + + template // Was R in TR1. + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + const int (&submatches)[N], + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(submatches, submatches + N) + { + post_constructor(a, b); + } + + regex_token_iterator(const regex_token_iterator &that) + { + operator=(that); + } + + regex_token_iterator &operator=(const regex_token_iterator &that) + { + if (this != &that) + { + this->position = that.position; + this->result = that.result; + this->suffix = that.suffix; + this->N = that.N; + this->subs = that.subs; + } + return *this; + } + + bool operator==(const regex_token_iterator &right) + { + if (this->result == NULL || right.result == NULL) + return this->result == right.result; + + if (this->result == &this->suffix || right.result == &right.suffix) + return this->suffix == right.suffix; + + return + this->position == right.position + && + this->N == right.N + && + this->subs == right.subs; + } + + bool operator!=(const regex_token_iterator &right) + { + return !(*this == right); + } + + const value_type &operator*() + { + return *result; + } + + const value_type *operator->() + { + return result; + } + + regex_token_iterator &operator++() + { + position_iterator prev(position); + position_iterator eos_iterator; + + if (result != NULL) + // To avoid inifinite loop. The specification does not require, though. + { + if (result == &suffix) + { + result = NULL; // end-of-sequence. + } + else + { + ++this->N; + for (;;) + { + if (this->N < subs.size()) + { + result = subs[this->N] != -1 ? &((*position)[subs[this->N]]) : &((*position).prefix()); + break; + } + + this->N = 0; + ++position; + + if (position == eos_iterator) + { + if (this->N < subs.size() && prev->suffix().length() && minus1_in_subs()) + { + suffix = prev->suffix(); + result = &suffix; + } + else + { + result = NULL; + } + break; + } + } + } + } + return *this; + } + + regex_token_iterator operator++(int) + { + const regex_token_iterator tmp(*this); + ++(*this); + return tmp; + } + +private: + + void post_constructor(const BidirectionalIterator a, const BidirectionalIterator b) + { + position_iterator eos_iterator; + + this->N = 0; + + if (position != eos_iterator && subs.size()) + { + result = subs[this->N] != -1 ? &((*position)[subs[this->N]]) : &((*position).prefix()); + } + else if (minus1_in_subs()) // end-of-sequence. + { + suffix.first = a; + suffix.second = b; + suffix.matched = a != b; + // 28.1.2.7: In a suffix iterator the member result holds a pointer + // to the data member suffix, the value of the member suffix.match is true, + + if (suffix.matched) + result = &suffix; + else + result = NULL; // Means end-of-sequence. + } + } + + bool minus1_in_subs() const + { + for (std::size_t i = 0; i < subs.size(); ++i) + if (subs[i] == -1) + return true; + + return false; + } + +private: + + typedef regex_iterator position_iterator; + position_iterator position; + const value_type *result; + value_type suffix; + std::size_t N; + std::vector subs; +}; + +typedef regex_token_iterator cregex_token_iterator; +typedef regex_token_iterator wcregex_token_iterator; +typedef regex_token_iterator sregex_token_iterator; +typedef regex_token_iterator wsregex_token_iterator; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef regex_token_iterator u16cregex_token_iterator; + typedef regex_token_iterator u32cregex_token_iterator; + typedef regex_token_iterator u16sregex_token_iterator; + typedef regex_token_iterator u32sregex_token_iterator; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef regex_token_iterator u8cregex_token_iterator; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef regex_token_iterator u8sregex_token_iterator; +#endif + +typedef regex_token_iterator::value_type, u8regex_traits::value_type> > u8ccregex_token_iterator; +typedef regex_token_iterator::value_type, u8regex_traits::value_type> > u8csregex_token_iterator; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccregex_token_iterator u8cregex_token_iterator; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8csregex_token_iterator u8sregex_token_iterator; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcregex_token_iterator u32wcregex_token_iterator; + typedef wsregex_token_iterator u32wsregex_token_iterator; + typedef u32wcregex_token_iterator u1632wcregex_token_iterator; + typedef u32wsregex_token_iterator u1632wsregex_token_iterator; + #elif WCHAR_MAX >= 0xffff + typedef regex_token_iterator::value_type, u16regex_traits::value_type> > u16wcregex_token_iterator; + typedef regex_token_iterator::value_type, u16regex_traits::value_type> > u16wsregex_token_iterator; + typedef u16wcregex_token_iterator u1632wcregex_token_iterator; + typedef u16wsregex_token_iterator u1632wsregex_token_iterator; + #endif +#endif + +// ... "regex_token_iterator.hpp"] + +} // namespace srell + +#ifdef SRELL_NOEXCEPT +#undef SRELL_NOEXCEPT +#endif + +#ifdef SRELL_CPP20_CHAR8_ENABLED +#undef SRELL_CPP20_CHAR8_ENABLED +#endif + +#ifdef SRELL_CPP11_CHAR1632_ENABLED +#undef SRELL_CPP11_CHAR1632_ENABLED +#endif + +#ifdef SRELL_CPP11_INITIALIZER_LIST_ENABLED +#undef SRELL_CPP11_INITIALIZER_LIST_ENABLED +#endif + +#ifdef SRELL_CPP11_MOVE_ENABLED +#undef SRELL_CPP11_MOVE_ENABLED +#endif + +#endif // SRELL_REGEX_TEMPLATE_LIBRARY diff --git a/lib/srell3_009/srell.hpp b/lib/srell3_009/srell.hpp new file mode 100644 index 000000000..85377d7c6 --- /dev/null +++ b/lib/srell3_009/srell.hpp @@ -0,0 +1,9868 @@ +/***************************************************************************** +** +** SRELL (std::regex-like library) version 3.009 +** +** Copyright (c) 2012-2022, Nozomu Katoo. All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS +** IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +****************************************************************************** +**/ + +#ifndef SRELL_REGEX_TEMPLATE_LIBRARY +#define SRELL_REGEX_TEMPLATE_LIBRARY + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cpp_unicode_characters + #ifndef SRELL_CPP11_CHAR1632_ENABLED + #define SRELL_CPP11_CHAR1632_ENABLED + #endif +#endif +#ifdef __cpp_initializer_lists +#include + #ifndef SRELL_CPP11_INITIALIZER_LIST_ENABLED + #define SRELL_CPP11_INITIALIZER_LIST_ENABLED + #endif +#endif +#ifdef __cpp_rvalue_references + #ifndef SRELL_CPP11_MOVE_ENABLED + #define SRELL_CPP11_MOVE_ENABLED + #endif +#endif +#ifdef SRELL_CPP11_MOVE_ENABLED + #if defined(_MSC_VER) && _MSC_VER < 1900 + #define SRELL_NOEXCEPT + #else + #define SRELL_NOEXCEPT noexcept + #endif +#endif +#ifdef __cpp_char8_t + #ifndef SRELL_CPP20_CHAR8_ENABLED + #ifdef __cpp_lib_char8_t + #define SRELL_CPP20_CHAR8_ENABLED 2 + #else + #define SRELL_CPP20_CHAR8_ENABLED 1 + #endif + #endif +#endif + +// The following SRELL_NO_* macros would be useful when wanting to +// reduce the size of a binary by turning off some feature(s). + +#ifdef SRELL_NO_UNICODE_DATA + +// Prevents Unicode data used for icase (case-insensitive) matching +// from being output into a resulting binary. In this case only the +// ASCII characters are case-folded when icase matching is performed +// (i.e., [A-Z] -> [a-z] only). +#define SRELL_NO_UNICODE_ICASE + +// Disables the Unicode property (\p{...} and \P{...}) and prevents +// Unicode property data from being output into a resulting binary. +#define SRELL_NO_UNICODE_PROPERTY +#endif + +// Prevents icase matching specific functions into a resulting binary. +// In this case the icase flag is ignored and icase matching becomes +// unavailable. +#ifdef SRELL_NO_ICASE +#ifndef SRELL_NO_UNICODE_ICASE +#define SRELL_NO_UNICODE_ICASE +#endif +#endif + +// This macro might be removed in the future. +#ifdef SRELL_V1_COMPATIBLE +#ifndef SRELL_NO_UNICODE_PROPERTY +#define SRELL_NO_UNICODE_PROPERTY +#endif +#define SRELL_NO_NAMEDCAPTURE +#define SRELL_NO_SINGLELINE +#define SRELL_FIXEDWIDTHLOOKBEHIND +#endif + +namespace srell +{ +// ["regex_constants.h" ... + + namespace regex_constants + { + enum syntax_option_type + { + icase = 1 << 0, + nosubs = 1 << 1, + optimize = 1 << 2, + collate = 1 << 3, + ECMAScript = 1 << 4, + basic = 1 << 5, + extended = 1 << 6, + awk = 1 << 7, + grep = 1 << 8, + egrep = 1 << 9, + multiline = 1 << 10, + + // SRELL's extension. + dotall = 1 << 11 // singleline. + }; + + inline syntax_option_type operator&(const syntax_option_type left, const syntax_option_type right) + { + return static_cast(static_cast(left) & static_cast(right)); + } + inline syntax_option_type operator|(const syntax_option_type left, const syntax_option_type right) + { + return static_cast(static_cast(left) | static_cast(right)); + } + inline syntax_option_type operator^(const syntax_option_type left, const syntax_option_type right) + { + return static_cast(static_cast(left) ^ static_cast(right)); + } + inline syntax_option_type operator~(const syntax_option_type b) + { + return static_cast(~static_cast(b)); + } + inline syntax_option_type &operator&=(syntax_option_type &left, const syntax_option_type right) + { + left = left & right; + return left; + } + inline syntax_option_type &operator|=(syntax_option_type &left, const syntax_option_type right) + { + left = left | right; + return left; + } + inline syntax_option_type &operator^=(syntax_option_type &left, const syntax_option_type right) + { + left = left ^ right; + return left; + } + } + // namespace regex_constants + + namespace regex_constants + { + enum match_flag_type + { + match_default = 0, + match_not_bol = 1 << 0, + match_not_eol = 1 << 1, + match_not_bow = 1 << 2, + match_not_eow = 1 << 3, + match_any = 1 << 4, + match_not_null = 1 << 5, + match_continuous = 1 << 6, + match_prev_avail = 1 << 7, + + format_default = 0, + format_sed = 1 << 8, + format_no_copy = 1 << 9, + format_first_only = 1 << 10, + + // For internal use. + match_match_ = 1 << 11 + }; + + inline match_flag_type operator&(const match_flag_type left, const match_flag_type right) + { + return static_cast(static_cast(left) & static_cast(right)); + } + inline match_flag_type operator|(const match_flag_type left, const match_flag_type right) + { + return static_cast(static_cast(left) | static_cast(right)); + } + inline match_flag_type operator^(const match_flag_type left, const match_flag_type right) + { + return static_cast(static_cast(left) ^ static_cast(right)); + } + inline match_flag_type operator~(const match_flag_type b) + { + return static_cast(~static_cast(b)); + } + inline match_flag_type &operator&=(match_flag_type &left, const match_flag_type right) + { + left = left & right; + return left; + } + inline match_flag_type &operator|=(match_flag_type &left, const match_flag_type right) + { + left = left | right; + return left; + } + inline match_flag_type &operator^=(match_flag_type &left, const match_flag_type right) + { + left = left ^ right; + return left; + } + } + // namespace regex_constants + + // 28.5, regex constants: + namespace regex_constants + { + typedef int error_type; + + static const error_type error_collate = 100; + static const error_type error_ctype = 101; + static const error_type error_escape = 102; + static const error_type error_backref = 103; + static const error_type error_brack = 104; + static const error_type error_paren = 105; + static const error_type error_brace = 106; + static const error_type error_badbrace = 107; + static const error_type error_range = 108; + static const error_type error_space = 109; + static const error_type error_badrepeat = 110; + static const error_type error_complexity = 111; + static const error_type error_stack = 112; + + // SRELL's extension. + static const error_type error_utf8 = 113; + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) + static const error_type error_lookbehind = 200; +#endif + static const error_type error_internal = 999; + } + // namespace regex_constants + +// ... "regex_constants.h"] +// ["regex_error.hpp" ... + +// 28.6, class regex_error: +class regex_error : public std::runtime_error +{ +public: + + explicit regex_error(const regex_constants::error_type ecode) + : std::runtime_error("regex_error") // added for error C2512. + , ecode_(ecode) + { + } + + regex_constants::error_type code() const + { + return ecode_; + } + +private: + + regex_constants::error_type ecode_; +}; + +// ... "regex_error.hpp"] +// ["rei_type.h" ... + + namespace regex_internal + { + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + + typedef char32_t uchar32; + +#elif defined(UINT_MAX) && UINT_MAX >= 0xFFFFFFFF + + typedef unsigned int uchar32; + +#elif defined(ULONG_MAX) && ULONG_MAX >= 0xFFFFFFFF + + typedef unsigned long uchar32; + +#else +#error could not find a suitable type for 32-bit Unicode integer values. +#endif // defined(SRELL_CPP11_CHAR1632_ENABLED) + + typedef uchar32 uint_l32; // uint_least32. + + } // regex_internal + +// ... "rei_type.h"] +// ["rei_constants.h" ... + + namespace regex_internal + { + enum re_state_type + { + st_character, // 0x00 + st_character_class, // 0x01 + + st_epsilon, // 0x02 + + st_check_counter, // 0x03 +// st_increment_counter, // 0x04 + st_decrement_counter, // 0x04 + st_save_and_reset_counter, // 0x05 + st_restore_counter, // 0x06 + + st_roundbracket_open, // 0x07 + st_roundbracket_pop, // 0x08 + st_roundbracket_close, // 0x09 + + st_repeat_in_push, // 0x0a + st_repeat_in_pop, // 0x0b + st_check_0_width_repeat, // 0x0c + + st_backreference, // 0x0d + + st_lookaround_open, // 0x0e + +// st_lookaround_pop, // 0x10 + + st_bol, // 0x0f + st_eol, // 0x10 + st_boundary, // 0x11 + + st_success, // 0x12 + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) + st_move_nextpos, // 0x13 +#endif + + st_lookaround_close = st_success, + st_zero_width_boundary = st_lookaround_open, + }; + // re_state_type + + namespace constants + { + static const uchar32 unicode_max_codepoint = 0x10ffff; + static const uchar32 invalid_u32value = static_cast(-1); + static const uchar32 max_u32value = static_cast(-2); + static const uchar32 asc_icase = 0x20; + static const uchar32 ccstr_empty = static_cast(-3); + } + // constants + + namespace meta_char + { + static const uchar32 mc_exclam = 0x21; // '!' + static const uchar32 mc_dollar = 0x24; // '$' + static const uchar32 mc_rbraop = 0x28; // '(' + static const uchar32 mc_rbracl = 0x29; // ')' + static const uchar32 mc_astrsk = 0x2a; // '*' + static const uchar32 mc_plus = 0x2b; // '+' + static const uchar32 mc_comma = 0x2c; // ',' + static const uchar32 mc_minus = 0x2d; // '-' + static const uchar32 mc_period = 0x2e; // '.' + static const uchar32 mc_colon = 0x3a; // ':' + static const uchar32 mc_lt = 0x3c; // '<' + static const uchar32 mc_eq = 0x3d; // '=' + static const uchar32 mc_gt = 0x3e; // '>' + static const uchar32 mc_query = 0x3f; // '?' + static const uchar32 mc_sbraop = 0x5b; // '[' + static const uchar32 mc_escape = 0x5c; // '\\' + static const uchar32 mc_sbracl = 0x5d; // ']' + static const uchar32 mc_caret = 0x5e; // '^' + static const uchar32 mc_cbraop = 0x7b; // '{' + static const uchar32 mc_bar = 0x7c; // '|' + static const uchar32 mc_cbracl = 0x7d; // '}' + } + // meta_char + + namespace char_ctrl + { + static const uchar32 cc_nul = 0x00; // '\0' //0x00:NUL + static const uchar32 cc_bs = 0x08; // '\b' //0x08:BS + static const uchar32 cc_htab = 0x09; // '\t' //0x09:HT + static const uchar32 cc_nl = 0x0a; // '\n' //0x0a:LF + static const uchar32 cc_vtab = 0x0b; // '\v' //0x0b:VT + static const uchar32 cc_ff = 0x0c; // '\f' //0x0c:FF + static const uchar32 cc_cr = 0x0d; // '\r' //0x0d:CR + } + // char_ctrl + + namespace char_alnum + { + static const uchar32 ch_0 = 0x30; // '0' + static const uchar32 ch_1 = 0x31; // '1' + static const uchar32 ch_7 = 0x37; // '7' + static const uchar32 ch_8 = 0x38; // '8' + static const uchar32 ch_9 = 0x39; // '9' + static const uchar32 ch_A = 0x41; // 'A' + static const uchar32 ch_B = 0x42; // 'B' + static const uchar32 ch_D = 0x44; // 'D' + static const uchar32 ch_F = 0x46; // 'F' + static const uchar32 ch_P = 0x50; // 'P' + static const uchar32 ch_S = 0x53; // 'S' + static const uchar32 ch_W = 0x57; // 'W' + static const uchar32 ch_Z = 0x5a; // 'Z' + static const uchar32 ch_a = 0x61; // 'a' + static const uchar32 ch_b = 0x62; // 'b' + static const uchar32 ch_c = 0x63; // 'c' + static const uchar32 ch_d = 0x64; // 'd' + static const uchar32 ch_f = 0x66; // 'f' + static const uchar32 ch_k = 0x6b; // 'k' + static const uchar32 ch_n = 0x6e; // 'n' + static const uchar32 ch_p = 0x70; // 'p' + static const uchar32 ch_r = 0x72; // 'r' + static const uchar32 ch_s = 0x73; // 's' + static const uchar32 ch_t = 0x74; // 't' + static const uchar32 ch_u = 0x75; // 'u' + static const uchar32 ch_v = 0x76; // 'v' + static const uchar32 ch_w = 0x77; // 'w' + static const uchar32 ch_x = 0x78; // 'x' + static const uchar32 ch_z = 0x7a; // 'z' + } + // char_alnum + + namespace char_other + { + static const uchar32 co_sp = 0x20; // ' ' + static const uchar32 co_amp = 0x26; // '&' + static const uchar32 co_apos = 0x27; // '\'' + static const uchar32 co_slash = 0x2f; // '/' + static const uchar32 co_ll = 0x5f; // '_' + static const uchar32 co_grav = 0x60; // '`' + } + // char_other + } + // namespace regex_internal + +// ... "rei_constants.h"] +// ["rei_utf_traits.hpp" ... + + namespace regex_internal + { + +template +struct utf_traits_core +{ +public: + + static const std::size_t maxseqlen = 1; + static const int utftype = 0; + + static const std::size_t bitsetsize = 0x100; + static const uchar32 bitsetmask = 0xff; + static const uchar32 cumask = 0xff; + + // *iter + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator /* end */) + { + return static_cast(*begin); + // Caller is responsible for begin != end. + } + + // *iter++ + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator /* end */) + { + return static_cast(*begin++); + // Caller is responsible for begin != end. + } + + // iter2 = iter; return *--iter2; + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator /* begin */) + { + return static_cast(*--cur); + } + + // *--iter + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator /* begin */) + { + return static_cast(*--cur); + // Caller is responsible for cur != begin. + } + +#if !defined(SRELLDBG_NO_BMH) + + template + static bool is_trailing(const charT2 /* cu */) + { + return false; + } + +#endif // !defined(SRELLDBG_NO_BMH) + + static uchar32 to_codeunits(charT out[maxseqlen], uchar32 cp) + { + out[0] = static_cast(cp); + return 1; + } + + static uchar32 firstcodeunit(const uchar32 cp) + { + return cp; + } + + template + static bool seek_charboundary(ForwardIterator &begin, const ForwardIterator end) + { + return begin != end; + } +}; // utf_traits_core + +// common and utf-32. +template +struct utf_traits : public utf_traits_core +{ + static const int utftype = 32; + + static const std::size_t bitsetsize = 0x10000; + static const uchar32 bitsetmask = 0xffff; + static const uchar32 cumask = 0x1fffff; +}; // utf_traits + +// utf-8 specific. +template +struct utf8_traits : public utf_traits_core +{ +public: + + // utf-8 specific. + static const std::size_t maxseqlen = 4; + static const int utftype = 8; + + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator end) + { +// return codepoint_inc(begin, end); + + uchar32 codepoint = static_cast(*begin & 0xff); + + if ((codepoint & 0x80) == 0) // 1 octet. + return codepoint; + + if (++begin != end && (codepoint >= 0xc0 && codepoint <= 0xf7) && (*begin & 0xc0) == 0x80) + { + codepoint = static_cast((codepoint << 6) | (*begin & 0x3f)); + + if ((codepoint & 0x800) == 0) // 2 octets. + return static_cast(codepoint & 0x7ff); + + if (++begin != end && (*begin & 0xc0) == 0x80) + { + codepoint = static_cast((codepoint << 6) | (*begin & 0x3f)); + + if ((codepoint & 0x10000) == 0) // 3 octets. + return static_cast(codepoint & 0xffff); + + if (++begin != end && (*begin & 0xc0) == 0x80) // 4 octets. + { + codepoint = static_cast((codepoint << 6) | (*begin & 0x3f)); + + return static_cast(codepoint & 0x1fffff); + } + } + } +// else // 80-bf, f8-ff: invalid. + + return regex_internal::constants::invalid_u32value; + } + + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator end) + { + uchar32 codepoint = static_cast(*begin++ & 0xff); + + if ((codepoint & 0x80) == 0) // 1 octet. + return codepoint; + + // Expects transformation to (codepoint - 0xc0) <= 0x37 by optimisation. + // 0xF7 instead of 0xF4 is for consistency with reverse iterators. + if (begin != end && (codepoint >= 0xc0 && codepoint <= 0xf7) && (*begin & 0xc0) == 0x80) +// if (begin != end && (0x7f00 & (1 << ((codepoint >> 3) & 0xf))) && (*begin & 0xc0) == 0x80) // c0, c8, d0, d8, e0, e8, f0. + { + codepoint = static_cast((codepoint << 6) | (*begin++ & 0x3f)); + + // 11 ?aaa aabb bbbb + if ((codepoint & 0x800) == 0) // 2 octets. + return static_cast(codepoint & 0x7ff); + // c080-c1bf: invalid. 00-7F. + // c280-dfbf: valid. 080-7FF. + + // 11 1aaa aabb bbbb + if (begin != end && (*begin & 0xc0) == 0x80) + { + codepoint = static_cast((codepoint << 6) | (*begin++ & 0x3f)); + + // 111? aaaa bbbb bbcc cccc + if ((codepoint & 0x10000) == 0) // 3 octets. + return static_cast(codepoint & 0xffff); + // e08080-e09fbf: invalid. 000-7FF. + // e0a080-efbfbf: valid. 0800-FFFF. + + // 1111 0aaa bbbb bbcc cccc + if (begin != end && (*begin & 0xc0) == 0x80) // 4 octets. + { + codepoint = static_cast((codepoint << 6) | (*begin++ & 0x3f)); + // f0808080-f08fbfbf: invalid. 0000-FFFF. + // f0908080-f3bfbfbf: valid. 10000-FFFFF. + // f4808080-f48fbfbf: valid. 100000-10FFFF. + // f4908080-f4bfbfbf: invalid. 110000-13FFFF. + // f5808080-f7bfbfbf: invalid. 140000-1FFFFF. + + // 11 110a aabb bbbb cccc ccdd dddd + return static_cast(codepoint & 0x1fffff); + } + } + } +// else // 80-bf, f8-ff: invalid. + + return regex_internal::constants::invalid_u32value; + } + + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator begin) + { + uchar32 codepoint = static_cast(*--cur); + + if ((codepoint & 0x80) == 0) + return static_cast(codepoint & 0xff); + + if ((codepoint & 0x40) == 0 && cur != begin) + { + codepoint = static_cast((codepoint & 0x3f) | (*--cur << 6)); + + if ((codepoint & 0x3800) == 0x3000) // 2 octets. + return static_cast(codepoint & 0x7ff); + + if ((codepoint & 0x3000) == 0x2000 && cur != begin) + { + codepoint = static_cast((codepoint & 0xfff) | (*--cur << 12)); + + if ((codepoint & 0xf0000) == 0xe0000) // 3 octets. + return static_cast(codepoint & 0xffff); + + if ((codepoint & 0xc0000) == 0x80000 && cur != begin) + { + if ((*--cur & 0xf8) == 0xf0) // 4 octets. + return static_cast((codepoint & 0x3ffff) | ((*cur & 7) << 18)); + } + } + } + return regex_internal::constants::invalid_u32value; + } + + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator begin) + { + uchar32 codepoint = static_cast(*--cur); + + if ((codepoint & 0x80) == 0) + return static_cast(codepoint & 0xff); + + if ((codepoint & 0x40) == 0 && cur != begin) + { + codepoint = static_cast((codepoint & 0x3f) | (*--cur << 6)); + + // 11 0bbb bbaa aaaa? + if ((codepoint & 0x3800) == 0x3000) // 2 octets. +// if ((*cur & 0xe0) == 0xc0) + return static_cast(codepoint & 0x7ff); + + // 10 bbbb bbaa aaaa? + if ((codepoint & 0x3000) == 0x2000 && cur != begin) // [\x80-\xbf]{2}. +// if ((*cur & 0xc0) == 0x80 && cur != begin) + { + codepoint = static_cast((codepoint & 0xfff) | (*--cur << 12)); + + // 1110 cccc bbbb bbaa aaaa? + if ((codepoint & 0xf0000) == 0xe0000) // 3 octets. +// if ((*cur & 0xf0) == 0xe0) + return static_cast(codepoint & 0xffff); + + // 10cc cccc bbbb bbaa aaaa? + if ((codepoint & 0xc0000) == 0x80000 && cur != begin) // [\x80-\xbf]{3}. +// if ((*cur & 0xc0) == 0x80 && cur != begin) + { + if ((*--cur & 0xf8) == 0xf0) // 4 octets. + return static_cast((codepoint & 0x3ffff) | ((*cur & 7) << 18)); + // d ddcc cccc bbbb bbaa aaaa + //else // [\0-\xef\xf8-\xff][\x80-\xbf]{3}. + + // Sequences [\xc0-\xdf][\x80-\xbf] and [\xe0-\xef][\x80-\xbf]{2} are valid. + // To give a chance to them, rewinds cur. + ++cur; + } + //else // [\0-\x7f\xc0-\xdf\xf0-\xff][\x80-\xbf]{2}. + ++cur; // Sequence [\xc0-\xdf][\x80-\xbf] is valid. Rewinds to give a chance to it. + } + //else // [\0-\x7f\xe0-\xff][\x80-\xbf]. + ++cur; // Rewinds to give a chance to [\0-\x7f]. + } + //else // [\xc0-\xff]. + + return regex_internal::constants::invalid_u32value; + } + +#if !defined(SRELLDBG_NO_BMH) + + template + static bool is_trailing(const charT2 cu) + { + return (cu & 0xc0) == 0x80; + } + +#endif // !defined(SRELLDBG_NO_BMH) + + static uchar32 to_codeunits(charT out[maxseqlen], uchar32 cp) + { + if (cp < 0x80) + { + out[0] = static_cast(cp); + return 1; + } + else if (cp < 0x800) + { + out[0] = static_cast(((cp >> 6) & 0x1f) | 0xc0); + out[1] = static_cast((cp & 0x3f) | 0x80); + return 2; + } + else if (cp < 0x10000) + { + out[0] = static_cast(((cp >> 12) & 0x0f) | 0xe0); + out[1] = static_cast(((cp >> 6) & 0x3f) | 0x80); + out[2] = static_cast((cp & 0x3f) | 0x80); + return 3; + } +// else // if (cp < 0x110000) + { + out[0] = static_cast(((cp >> 18) & 0x07) | 0xf0); + out[1] = static_cast(((cp >> 12) & 0x3f) | 0x80); + out[2] = static_cast(((cp >> 6) & 0x3f) | 0x80); + out[3] = static_cast((cp & 0x3f) | 0x80); + return 4; + } + } + + static uchar32 firstcodeunit(const uchar32 cp) + { + if (cp < 0x80) + return cp; + + if (cp < 0x800) + return static_cast(((cp >> 6) & 0x1f) | 0xc0); + + if (cp < 0x10000) + return static_cast(((cp >> 12) & 0x0f) | 0xe0); + + return static_cast(((cp >> 18) & 0x07) | 0xf0); + } + + template + static bool seek_charboundary(ForwardIterator &begin, const ForwardIterator end) + { + for (; begin != end; ++begin) + { +// if ((*begin & 0xc0) != 0x80 && (*begin & 0xf8) != 0xf8) // 00-7f, c0-f7. + if ((*begin & 0xc0) != 0x80) // 00-7f, c0-ff. + return true; + } + return false; + } +}; // utf8_traits + +// utf-16 specific. +template +struct utf16_traits : public utf_traits_core +{ +public: + + // utf-16 specific. + static const std::size_t maxseqlen = 2; + static const int utftype = 16; + + static const std::size_t bitsetsize = 0x10000; + static const uchar32 bitsetmask = 0xffff; + static const uchar32 cumask = 0xffff; + + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator end) + { + const uchar32 codeunit = *begin; + + if ((codeunit & 0xdc00) != 0xd800) + return static_cast(codeunit & 0xffff); + + if (++begin != end && (*begin & 0xdc00) == 0xdc00) + return static_cast((((codeunit & 0x3ff) << 10) | (*begin & 0x3ff)) + 0x10000); + + return static_cast(codeunit & 0xffff); + } + + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator end) + { + const uchar32 codeunit = *begin++; + + if ((codeunit & 0xdc00) != 0xd800) + return static_cast(codeunit & 0xffff); + + if (begin != end && (*begin & 0xdc00) == 0xdc00) + return static_cast((((codeunit & 0x3ff) << 10) | (*begin++ & 0x3ff)) + 0x10000); + + return static_cast(codeunit & 0xffff); + } + + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator begin) + { + const uchar32 codeunit = *--cur; + + if ((codeunit & 0xdc00) != 0xdc00 || cur == begin) + return static_cast(codeunit & 0xffff); + + if ((*--cur & 0xdc00) == 0xd800) + return static_cast((((*cur & 0x3ff) << 10) | (codeunit & 0x3ff)) + 0x10000); + + return static_cast(codeunit & 0xffff); + } + + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator begin) + { + const uchar32 codeunit = *--cur; + + if ((codeunit & 0xdc00) != 0xdc00 || cur == begin) + return static_cast(codeunit & 0xffff); + + if ((*--cur & 0xdc00) == 0xd800) + return static_cast((((*cur & 0x3ff) << 10) | (codeunit & 0x3ff)) + 0x10000); + //else // (codeunit & 0xdc00) == 0xdc00 && (*cur & 0xdc00) != 0xd800 + + ++cur; + + return static_cast(codeunit & 0xffff); + } + +#if !defined(SRELLDBG_NO_BMH) + + template + static bool is_trailing(const charT2 cu) + { + return (cu & 0xdc00) == 0xdc00; + } + +#endif // !defined(SRELLDBG_NO_BMH) + + static uchar32 to_codeunits(charT out[maxseqlen], uchar32 cp) + { + if (cp < 0x10000) + { + out[0] = static_cast(cp); + return 1; + } +// else // if (cp < 0x110000) + { + cp -= 0x10000; + out[0] = static_cast(((cp >> 10) & 0x3ff) | 0xd800); + out[1] = static_cast((cp & 0x3ff) | 0xdc00); + return 2; + } + } + + static uchar32 firstcodeunit(const uchar32 cp) + { + if (cp < 0x10000) + return cp; + + return static_cast((cp >> 10) + 0xd7c0); + // aaaaa bbbbcccc ddddeeee -> AA AAbb bbcc/cc dddd eeee where AAAA = aaaaa - 1. + } + + template + static bool seek_charboundary(ForwardIterator &begin, const ForwardIterator end) + { + for (; begin != end; ++begin) + { + if ((*begin & 0xdc00) != 0xdc00) + return true; + } + return false; + } +}; // utf16_traits + +// specialisation for char. +template <> +struct utf_traits : public utf_traits_core +{ +public: + + template + static uchar32 codepoint(ForwardIterator begin, const ForwardIterator /* end */) + { + return static_cast(static_cast(*begin)); + } + + template + static uchar32 codepoint_inc(ForwardIterator &begin, const ForwardIterator /* end */) + { + return static_cast(static_cast(*begin++)); + } + + template + static uchar32 prevcodepoint(BidirectionalIterator cur, const BidirectionalIterator /* begin */) + { + return static_cast(static_cast(*--cur)); + } + + template + static uchar32 dec_codepoint(BidirectionalIterator &cur, const BidirectionalIterator /* begin */) + { + return static_cast(static_cast(*--cur)); + } + +#if !defined(SRELLDBG_NO_BMH) +#endif // !defined(SRELLDBG_NO_BMH) +}; // utf_traits + +// specialisation for signed char. +template <> +struct utf_traits : public utf_traits +{ +}; + +// (signed) short, (signed) int, (signed) long, (signed) long long, ... + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) +template <> +struct utf_traits : public utf16_traits +{ +}; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) +template <> +struct utf_traits : public utf8_traits +{ +}; +#endif + + } // regex_internal + +// ... "rei_utf_traits.hpp"] +// ["regex_traits.hpp" ... + +// 28.7, class template regex_traits: +template +struct regex_traits +{ +public: + + typedef charT char_type; + typedef std::basic_string string_type; + typedef std::locale locale_type; +// typedef bitmask_type char_class_type; + typedef int char_class_type; + + typedef regex_internal::utf_traits utf_traits; + +public: + +// regex_traits(); + + static std::size_t length(const char_type *p) + { + return std::char_traits::length(p); + } + + charT translate(const charT c) const + { + return c; + } + + charT translate_nocase(const charT c) const + { + return c; + } + + template + string_type transform(ForwardIterator first, ForwardIterator last) const + { + return string_type(first, last); + } + + template + string_type transform_primary(ForwardIterator first, ForwardIterator last) const + { + return string_type(first, last); + } + + template + string_type lookup_collatename(ForwardIterator first, ForwardIterator last) const + { + return string_type(first, last); + } + + template + char_class_type lookup_classname(ForwardIterator /* first */, ForwardIterator /* last */, bool /* icase */ = false) const + { + return static_cast(0); + } + + bool isctype(const charT /* c */, const char_class_type /* f */) const + { + return false; + } + + int value(const charT /* ch */, const int /* radix */) const + { + return -1; + } + + locale_type imbue(const locale_type /* l */) + { + return locale_type(); + } + + locale_type getloc() const + { + return locale_type(); + } +}; // regex_traits + +template +struct u8regex_traits : public regex_traits +{ + typedef regex_internal::utf8_traits utf_traits; +}; + +template +struct u16regex_traits : public regex_traits +{ + typedef regex_internal::utf16_traits utf_traits; +}; + +// ... "regex_traits.hpp"] +// ["rei_memory.hpp" ... + + namespace regex_internal + { +/* + * Similar to std::basic_string, except for: + * a. only allocates memory, does not initialise it. + * b. uses realloc() to avoid moving data as much as possible when + * resizing an allocated buffer. + */ +template +class simple_array +{ +public: + + typedef ElemT value_type; + typedef std::size_t size_type; + typedef ElemT &reference; + typedef const ElemT &const_reference; + typedef ElemT *pointer; + typedef const ElemT *const_pointer; + + static const size_type npos = static_cast(-1); + +public: + + simple_array() + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + } + + simple_array(const size_type initsize) + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + if (initsize) + { + buffer_ = static_cast(std::malloc(initsize * sizeof (ElemT))); + + if (buffer_ != NULL) + size_ = capacity_ = initsize; + else + throw std::bad_alloc(); + } + } + + simple_array(const simple_array &right, size_type pos, size_type len = npos) + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + if (pos > right.size_) + pos = right.size_; + + { + const size_type len2 = right.size_ - pos; + if (len > len2) + len = len2; + } + + if (len) + { + buffer_ = static_cast(std::malloc(len * sizeof (ElemT))); + + if (buffer_ != NULL) + { + for (capacity_ = len; size_ < capacity_;) + buffer_[size_++] = right[pos++]; + } + else + { + throw std::bad_alloc(); + } + } + } + + simple_array(const simple_array &right) + : buffer_(NULL) + , size_(0) + , capacity_(0) + { + operator=(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + simple_array(simple_array &&right) SRELL_NOEXCEPT + : buffer_(right.buffer_) + , size_(right.size_) + , capacity_(right.capacity_) + { + right.size_ = 0; + right.capacity_ = 0; + right.buffer_ = NULL; + } +#endif + + simple_array &operator=(const simple_array &right) + { + if (this != &right) + { + resize(right.size_); + for (size_type i = 0; i < right.size_; ++i) + buffer_[i] = right.buffer_[i]; + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + simple_array &operator=(simple_array &&right) SRELL_NOEXCEPT + { + if (this != &right) + { + if (this->buffer_ != NULL) + std::free(this->buffer_); + + this->size_ = right.size_; + this->capacity_ = right.capacity_; + this->buffer_ = right.buffer_; + + right.size_ = 0; + right.capacity_ = 0; + right.buffer_ = NULL; + } + return *this; + } +#endif + + ~simple_array() + { + if (buffer_ != NULL) + std::free(buffer_); + } + + size_type size() const + { + return size_; + } + + void clear() + { + size_ = 0; + } + + void resize(const size_type newsize) + { + if (newsize > capacity_) + reserve(newsize); + + size_ = newsize; + } + + void resize(const size_type newsize, const ElemT &type) + { + size_type oldsize = size_; + + resize(newsize); + for (; oldsize < size_; ++oldsize) + buffer_[oldsize] = type; + } + + reference operator[](const size_type pos) + { + return buffer_[pos]; + } + + const_reference operator[](const size_type pos) const + { + return buffer_[pos]; + } + + void push_back(const_reference n) + { + const size_type oldsize = size_; + + if (++size_ > capacity_) + reserve(size_); + + buffer_[oldsize] = n; + } + + const_reference back() const + { + return buffer_[size_ - 1]; + } + + reference back() + { + return buffer_[size_ - 1]; + } + + void pop_back() + { + --size_; + } + + simple_array &operator+=(const simple_array &right) + { + return append(right); + } + + simple_array &append(const size_type size, const ElemT &type) + { + resize(size_ + size, type); + return *this; + } + + simple_array &append(const simple_array &right) + { + size_type oldsize = size_; + + resize(size_ + right.size_); + for (size_type i = 0; i < right.size_; ++i, ++oldsize) + buffer_[oldsize] = right.buffer_[i]; + + return *this; + } + + simple_array &append(const simple_array &right, size_type pos, size_type len /* = npos */) + { + { + const size_type len2 = right.size_ - pos; + if (len > len2) + len = len2; + } + + size_type oldsize = size_; + + resize(size_ + len); + len += pos; // end. + for (; pos < len; ++oldsize, ++pos) + buffer_[oldsize] = right.buffer_[pos]; + + return *this; + } + + // For rei_char_class class. + void erase(const size_type pos) + { + if (pos < size_) + { + std::memmove(buffer_ + pos, buffer_ + pos + 1, (size_ - pos - 1) * sizeof (ElemT)); + --size_; + } + } + + // For rei_compiler class. + void insert(const size_type pos, const ElemT &type) + { + move_forward(pos, 1); + buffer_[pos] = type; + } + + void insert(size_type pos, const simple_array &right) + { + move_forward(pos, right.size_); + for (size_type i = 0; i < right.size_; ++i, ++pos) + buffer_[pos] = right.buffer_[i]; + } + + void insert(size_type destpos, const simple_array &right, size_type srcpos, size_type srclen = npos) + { + { + const size_type len2 = right.size_ - srcpos; + if (srclen > len2) + srclen = len2; + } + + move_forward(destpos, srclen); + srclen += srcpos; // srcend. + for (; srcpos < srclen; ++destpos, ++srcpos) + buffer_[destpos] = right.buffer_[srcpos]; + } + + simple_array &replace(size_type pos, size_type count, const simple_array &right) + { + if (count < right.size_) + move_forward(pos + count, right.size_ - count); + else if (count > right.size_) + { + const pointer base = buffer_ + pos; + + std::memmove(base + right.size_, base + count, (size_ - pos - count) * sizeof (ElemT)); + size_ -= count - right.size_; + } + + for (size_type i = 0; i < right.size_; ++pos, ++i) + buffer_[pos] = right[i]; + + return *this; + } + + size_type find(const value_type c, size_type pos = 0) const + { + for (; pos <= size_; ++pos) + if (buffer_[pos] == c) + return pos; + + return npos; + } + + const_pointer data() const + { + return buffer_; + } + + int compare(size_type pos, const size_type count1, const_pointer p, const size_type count2) const + { + size_type count = count1 <= count2 ? count1 : count2; + + for (; count; ++pos, ++p, --count) + { + const value_type &v = buffer_[pos]; + if (v != *p) + return v < *p ? -1 : 1; + } + return count1 == count2 ? 0 : (count1 < count2 ? -1 : 1); + } + + size_type max_size() const + { + return maxsize_; + } + + void swap(simple_array &right) + { + if (this != &right) + { + const pointer tmpbuffer = this->buffer_; + const size_type tmpsize = this->size_; + const size_type tmpcapacity = this->capacity_; + + this->buffer_ = right.buffer_; + this->size_ = right.size_; + this->capacity_ = right.capacity_; + + right.buffer_ = tmpbuffer; + right.size_ = tmpsize; + right.capacity_ = tmpcapacity; + } + } + +private: + + void reserve(const size_type newsize) + { +// if (newsize > capacity_) + { + if (newsize <= maxsize_) + { +// capacity_ = newsize + (newsize >> 1); // newsize * 1.5. + capacity_ = ((newsize >> 8) + 1) << 8; // Round up to a multiple of 256. + + if (capacity_ > maxsize_) + capacity_ = maxsize_; + + const size_type newsize_in_byte = capacity_ * sizeof (ElemT); + const pointer oldbuffer = buffer_; + + buffer_ = static_cast(std::realloc(buffer_, newsize_in_byte)); + if (buffer_ != NULL) + return; + + // Even if realloc() failed, already-existing buffer remains valid. + std::free(oldbuffer); +// buffer_ = NULL; + size_ = capacity_ = 0; + } + throw std::bad_alloc(); + } + } + + void move_forward(const size_type pos, const size_type count) + { + const size_type oldsize = size_; + + resize(size_ + count); + + if (pos < oldsize) + { + const pointer base = buffer_ + pos; + + std::memmove(base + count, base, (oldsize - pos) * sizeof (ElemT)); + } + } + +private: + + pointer buffer_; + size_type size_; + size_type capacity_; + +// static const size_type maxsize_ = (npos - sizeof (simple_array)) / sizeof (ElemT); + static const size_type maxsize_ = (npos - sizeof (pointer) - sizeof (size_type) * 2) / sizeof (ElemT) / 2; +}; +// simple_array + + } // namespace regex_internal + +// ... "rei_memory.hpp"] +// ["rei_bitset.hpp" ... + + namespace regex_internal + { + +// Always uses a heap instead of the stack. +template +class bitset +{ +private: + + typedef unsigned long array_type; + +public: + + bitset() + : buffer_(static_cast(std::malloc(size_in_byte_))) + { + if (buffer_ != NULL) + { + reset(); + return; + } + throw std::bad_alloc(); + } + + bitset(const bitset &right) + : buffer_(static_cast(std::malloc(size_in_byte_))) + { + if (buffer_ != NULL) + { + operator=(right); + return; + } + throw std::bad_alloc(); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + bitset(bitset &&right) SRELL_NOEXCEPT + : buffer_(right.buffer_) + { + right.buffer_ = NULL; + } +#endif + + bitset &operator=(const bitset &right) + { + if (this != &right) + { +// for (std::size_t i = 0; i < arraylength_; ++i) +// buffer_[i] = right.buffer_[i]; + std::memcpy(buffer_, right.buffer_, size_in_byte_); + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + bitset &operator=(bitset &&right) SRELL_NOEXCEPT + { + if (this != &right) + { + if (this->buffer_ != NULL) + std::free(this->buffer_); + + this->buffer_ = right.buffer_; + right.buffer_ = NULL; + } + return *this; + } +#endif + + ~bitset() + { + if (buffer_ != NULL) + std::free(buffer_); + } + + bitset &reset() + { + std::memset(buffer_, 0, size_in_byte_); + return *this; + } + + bitset &reset(const std::size_t bit) + { + buffer_[bit / bits_per_elem_] &= ~(1 << (bit & bitmask_)); + return *this; + } + + bitset &set(const std::size_t bit) + { + buffer_[bit / bits_per_elem_] |= (1 << (bit & bitmask_)); + return *this; + } + +#if 0 + void set_range(const std::size_t firstbit, const std::size_t lastbit) + { + const std::size_t lastelemidx = lastbit / bits_per_elem_; + std::size_t firstelemidx = firstbit / bits_per_elem_; + const array_type lastelemmask = ~(allbits1_ << ((lastbit & bitmask_) + 1)); + array_type ormask = allbits1_ << (firstbit & bitmask_); + + if (firstelemidx < lastelemidx) + { + buffer_[firstelemidx] |= ormask; + ormask = allbits1_; + + for (++firstelemidx; firstelemidx < lastelemidx; ++firstelemidx) + buffer_[firstelemidx] |= ormask; + } + ormask &= lastelemmask; + buffer_[lastelemidx] |= ormask; + + } +#endif + + bool test(const std::size_t bit) const + { + return (buffer_[bit / bits_per_elem_] & (1 << (bit & bitmask_))) != 0; + } + + bool operator[](const std::size_t bit) const + { + return (buffer_[bit / bits_per_elem_] & (1 << (bit & bitmask_))) != 0; + } + + bitset &flip() + { + for (std::size_t i = 0; i < arraylength_; ++i) + buffer_[i] = ~buffer_[i]; + return *this; + } + + void swap(bitset &right) + { + if (this != &right) + { + array_type *const tmpbuffer = this->buffer_; + this->buffer_ = right.buffer_; + right.buffer_ = tmpbuffer; + } + } + +private: + +#if defined(__cpp_constexpr) + static constexpr std::size_t pow2leN(const std::size_t n, const std::size_t p2) + { + return ((p2 << 1) == 0 || (p2 << 1) > n) ? p2 : pow2leN(n, p2 << 1); + } + static const std::size_t bits_per_elem_ = pow2leN(CHAR_BIT * sizeof (array_type), 8); +#else + static const std::size_t bpe_tmp_ = CHAR_BIT * sizeof (array_type); + static const std::size_t bits_per_elem_ = bpe_tmp_ >= 64 ? 64 : (bpe_tmp_ >= 32 ? 32 : (bpe_tmp_ >= 16 ? 16 : 8)); +#endif + static const std::size_t bitmask_ = bits_per_elem_ - 1; + static const std::size_t arraylength_ = (Bits + bitmask_) / bits_per_elem_; + static const std::size_t size_in_byte_ = arraylength_ * sizeof (array_type); + static const array_type allbits1_ = ~static_cast(0); + + array_type *buffer_; +}; + + } // namespace regex_internal + +// ... "rei_bitset.hpp"] +// ["rei_ucf.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELL_NO_UNICODE_ICASE) +#include "srell_ucfdata2.hpp" + + namespace ucf_internal + { + +typedef unicode_casefolding ucf_data; + + } // namespace ucf_internal +#endif // !defined(SRELL_NO_UNICODE_ICASE) + +class unicode_case_folding +{ +public: + +#if !defined(SRELL_NO_UNICODE_ICASE) + static const uchar32 rev_maxset = ucf_internal::ucf_data::rev_maxset; +#else + static const uchar32 rev_maxset = 2; +#endif + + static uchar32 do_casefolding(const uchar32 cp) + { +#if !defined(SRELL_NO_UNICODE_ICASE) + if (cp <= ucf_internal::ucf_data::ucf_maxcodepoint) + return cp + ucf_internal::ucf_data::ucf_deltatable[ucf_internal::ucf_data::ucf_segmenttable[cp >> 8] + (cp & 0xff)]; +#else + if (cp >= char_alnum::ch_A && cp <= char_alnum::ch_Z) // 'A' && 'Z' + return static_cast(cp - char_alnum::ch_A + char_alnum::ch_a); // - 'A' + 'a' +#endif + return cp; + } + + static uchar32 casefoldedcharset(uchar32 out[rev_maxset], const uchar32 cp) + { +#if !defined(SRELL_NO_UNICODE_ICASE) + uchar32 count = 0; + + if (cp <= ucf_internal::ucf_data::rev_maxcodepoint) + { + const uchar32 offset_of_charset = ucf_internal::ucf_data::rev_indextable[ucf_internal::ucf_data::rev_segmenttable[cp >> 8] + (cp & 0xff)]; + const uchar32 *ptr = &ucf_internal::ucf_data::rev_charsettable[offset_of_charset]; + + for (; *ptr != cfcharset_eos_ && count < rev_maxset; ++ptr, ++count) + out[count] = *ptr; + } + if (count == 0) + out[count++] = cp; + + return count; +#else +// const uchar32 nocase = static_cast(cp & ~0x20); + const uchar32 nocase = static_cast(cp | constants::asc_icase); + + out[0] = cp; +// if (nocase >= char_alnum::ch_A && nocase <= char_alnum::ch_Z) + if (nocase >= char_alnum::ch_a && nocase <= char_alnum::ch_z) + { + out[1] = static_cast(cp ^ constants::asc_icase); + return 2; + } + return 1; +#endif + } + + unicode_case_folding &operator=(const unicode_case_folding &) + { + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + unicode_case_folding &operator=(unicode_case_folding &&) SRELL_NOEXCEPT + { + return *this; + } +#endif + + void swap(unicode_case_folding & /* right */) + { + } + +private: + +#if !defined(SRELL_NO_UNICODE_ICASE) + static const uchar32 cfcharset_eos_ = ucf_internal::ucf_data::eos; +#endif + +public: // For debug. + + void print_tables() const; +}; +// unicode_case_folding + + } // namespace regex_internal + +// ... "rei_ucf.hpp"] +// ["rei_up.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELL_NO_UNICODE_PROPERTY) +#include "srell_updata.hpp" + +//template +class unicode_property +{ +public: + + typedef uint_l32 property_type; + typedef simple_array pstring; + + static const property_type error_property = static_cast(-1); + + unicode_property() + { + } + + unicode_property &operator=(const unicode_property &) + { + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + unicode_property &operator=(unicode_property &&) SRELL_NOEXCEPT + { + return *this; + } +#endif + + static property_type lookup_property(const pstring &name, const pstring &value) + { + pname_type ptype = name.size() ? lookup_property_name(name) : updata::ptype::general_category; + property_type property_number = lookup_property_value(ptype, value); + + if (property_number == updata::unknown && name.size() == 0) + { + ptype = updata::ptype::binary; + property_number = lookup_property_value(ptype, value); + } + + return property_number != updata::unknown ? property_number : error_property; + } + + static std::size_t ranges_offset(const property_type property_number) + { +#if defined(SRELL_UPDATA_VERSION) + return updata::positiontable[property_number].offset; +#else + const offset_and_number *const postable = updata::position_table(); + return postable[property_number].offset; +#endif + } + + static std::size_t number_of_ranges(const property_type property_number) + { +#if defined(SRELL_UPDATA_VERSION) + return updata::positiontable[property_number].number_of_pairs; +#else + const offset_and_number *const postable = updata::position_table(); + return postable[property_number].number_of_pairs; +#endif + } + + static const uchar32 *ranges_address(const property_type property_number) + { +#if defined(SRELL_UPDATA_VERSION) + return &updata::rangetable[ranges_offset(property_number) << 1]; +#else + const uchar32 *const ranges = updata::ranges(); + return &ranges[ranges_offset(property_number) << 1]; +#endif + } + +private: + + typedef uint_l32 pname_type; + typedef const char *pname_string_type; + +#if defined(SRELL_UPDATA_VERSION) && (SRELL_UPDATA_VERSION >= 200) + struct pvalue_type + { + pname_type pname; + property_type pnumber; + pname_string_type csstrings; + }; +#else + struct pvalue_type + { + pname_type pname; + pname_string_type csstrings; + property_type pnumber; + }; +#endif + + struct offset_and_number + { + std::size_t offset; + std::size_t number_of_pairs; + }; + + typedef unicode_property_data + updata; + + static pname_type lookup_property_name(const pstring &name) + { +#if defined(SRELL_UPDATA_VERSION) + for (std::size_t pno = 0; *updata::propertynametable[pno]; ++pno) + { + if (check_if_included(name, updata::propertynametable[pno])) + return static_cast(pno); + } +#else + const pname_string_type *const pname_table = updata::propertyname_table(); + + for (std::size_t pno = 0; *pname_table[pno]; ++pno) + { + if (check_if_included(name, pname_table[pno])) + return static_cast(pno); + } +#endif + return updata::ptype::unknown; + } + + // Checks if value is included in colon-separated strings. + static bool check_if_included(const pstring &value, pname_string_type csstrings) + { + if (static_cast(*csstrings) != meta_char::mc_astrsk) // '*' + { + while (*csstrings) + { + const pname_string_type begin = csstrings; + + for (; static_cast(*csstrings) != meta_char::mc_colon && static_cast(*csstrings) != char_ctrl::cc_nul; ++csstrings); + + const std::size_t length = csstrings - begin; + + if (static_cast(value.size()) == length) + if (value.compare(0, value.size(), begin, length) == 0) + return true; + + if (static_cast(*csstrings) == meta_char::mc_colon) + ++csstrings; + } + } + return false; + } + + static property_type lookup_property_value(const pname_type ptype, const pstring &value) + { +#if defined(SRELL_UPDATA_VERSION) + for (std::size_t pno = 0; *updata::rangenumbertable[pno].csstrings; ++pno) + { + const pvalue_type &pvalue = updata::rangenumbertable[pno]; + if (pvalue.pname == ptype && check_if_included(value, pvalue.csstrings)) + return pvalue.pnumber; + } +#else + const pvalue_type *const pvalue_table = updata::rangenumber_table(); + + for (std::size_t pno = 0; *pvalue_table[pno].csstrings; ++pno) + { + const pvalue_type &pvalue = pvalue_table[pno]; + if (pvalue.pname == ptype && check_if_included(value, pvalue.csstrings)) + return pvalue.pnumber; + } +#endif + return updata::unknown; + } + +public: + + static const std::size_t number_of_properties = updata::last_property_number + 1; + static const std::size_t last_property_number = updata::last_property_number; +#if defined(SRELL_UPDATA_VERSION) && (SRELL_UPDATA_VERSION >= 200) + static const std::size_t last_pos_number = updata::last_pos_number; +#endif + static const property_type gc_Zs = updata::gc_Space_Separator; + static const property_type gc_Cn = updata::gc_Unassigned; + static const property_type bp_Assigned = updata::bp_Assigned; + +// UnicodeIDStart:: +// UnicodeIDContinue:: + static const property_type bp_ID_Start = updata::bp_ID_Start; + static const property_type bp_ID_Continue = updata::bp_ID_Continue; +}; +// unicode_property + +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + } // namespace regex_internal + +// ... "rei_up.hpp"] +// ["rei_char_class.hpp" ... + + namespace regex_internal + { + +struct range_pair // , public std::pair +{ + uchar32 second; + uchar32 first; + + void set(const uchar32 min, const uchar32 max) + { + this->first = min; + this->second = max; + } + + bool is_range_valid() const + { + return first <= second; + } + + bool operator==(const range_pair &right) const + { + return this->first == right.first && this->second == right.second; + } + + bool operator<(const range_pair &right) const + { + return this->second < right.first; // This assumes that optimise() has been called. + } + + void swap(range_pair &right) + { + const range_pair tmp = *this; + *this = right; + right = tmp; + } + + bool unify_range(const range_pair &right) + { + range_pair &left = *this; + + if (right.first <= left.second || left.second + 1 == right.first) // r1 <= l2 || l2+1 == r1 + { + // l1 l2+1 < r1 r2 excluded. + + if (left.first <= right.second || right.second + 1 == left.first) // l1 <= r2 || r2+1 == l1 + { + // r1 r2+1 < l1 l2 excluded. + + if (left.first > right.first) + left.first = right.first; + + if (left.second < right.second) + left.second = right.second; + + return true; + } + } + return false; + } +}; +// range_pair + +struct range_pair_helper : public range_pair +{ + range_pair_helper(const uchar32 min, const uchar32 max) + { + this->first = min; + this->second = max; + } + + range_pair_helper(const uchar32 minmax) + { + this->first = minmax; + this->second = minmax; + } +}; +// range_pair_helper + +struct range_pairs // : public simple_array +{ +public: + + typedef simple_array array_type; + typedef array_type::size_type size_type; + + range_pairs() + { + } + + range_pairs(const range_pairs &rp) : rparray_(rp.rparray_) + { + } + + range_pairs &operator=(const range_pairs &rp) + { + rparray_.operator=(rp.rparray_); + return *this; + } + + range_pairs(const size_type initsize) : rparray_(initsize) + { + } + + range_pairs(const range_pairs &right, size_type pos, size_type size) + : rparray_(right.rparray_, pos, size) + { + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + range_pairs(range_pairs &&rp) SRELL_NOEXCEPT + : rparray_(std::move(rp.rparray_)) + { + } + + range_pairs &operator=(range_pairs &&rp) SRELL_NOEXCEPT + { + rparray_.operator=(std::move(rp.rparray_)); + return *this; + } +#endif + + void clear() + { + rparray_.clear(); + } + + size_type size() const + { + return rparray_.size(); + } + + const range_pair &operator[](const size_type pos) const + { + return rparray_[pos]; + } + range_pair &operator[](const size_type pos) + { + return rparray_[pos]; + } + + void resize(const size_type size) + { + rparray_.resize(size); + } + + void swap(range_pairs &right) + { + rparray_.swap(right.rparray_); + } + + void set_solerange(const range_pair &right) + { + rparray_.clear(); + rparray_.push_back(right); + } + + void append_newclass(const range_pairs &right) + { + rparray_.append(right.rparray_); + } + + void append_newpair(const range_pair &right) + { + rparray_.push_back(right); + } + + void join(const range_pair &right) + { + size_type pos = 0; + + for (; pos < rparray_.size(); ++pos) + { + range_pair &curpair = rparray_[pos]; + + if (curpair.unify_range(right)) + { + for (++pos; pos < rparray_.size();) + { + if (curpair.unify_range(rparray_[pos])) + rparray_.erase(pos); + else + break; + } + return; + } + if (right.second < curpair.first) + break; + } + rparray_.insert(pos, right); + } + + void merge(const range_pairs &right) + { + for (size_type i = 0; i < right.size(); ++i) + join(right[i]); + } + + bool same(uchar32 pos, const uchar32 count, const range_pairs &right) const + { + if (count == right.size()) + { + for (uchar32 i = 0; i < count; ++i, ++pos) + if (!(rparray_[pos] == right[i])) + return false; + + return true; + } + return false; + } + + int relationship(const range_pairs &right) const + { + if (rparray_.size() == right.rparray_.size()) + { + for (size_type i = 0; i < rparray_.size(); ++i) + { + if (!(this->rparray_[i] == right.rparray_[i])) + { + if (i == 0) + goto check_overlap; + + return 1; // Overlapped. + } + } + return 0; // Same. + } + check_overlap: + return is_overlap(right) ? 1 : 2; // Overlapped or exclusive. + } + + void negation() + { + uchar32 begin = 0; + range_pairs newpairs; + + for (size_type i = 0; i < rparray_.size(); ++i) + { + const range_pair &range = rparray_[i]; + + if (begin < range.first) + newpairs.join(range_pair_helper(begin, range.first - 1)); + + begin = range.second + 1; + } + + if (begin <= constants::unicode_max_codepoint) + newpairs.join(range_pair_helper(begin, constants::unicode_max_codepoint)); + + *this = newpairs; + } + + bool is_overlap(const range_pairs &right) const + { + for (size_type i = 0; i < rparray_.size(); ++i) + { + const range_pair &leftrange = rparray_[i]; + + for (size_type j = 0; j < right.size(); ++j) + { + const range_pair &rightrange = right[j]; + + if (rightrange.first <= leftrange.second) // Excludes l1 l2 < r1 r2. + if (leftrange.first <= rightrange.second) // Excludes r1 r2 < l1 l2. + return true; + } + } + return false; + } + + void load_from_memory(const uchar32 *array, size_type number_of_pairs) + { + for (; number_of_pairs; --number_of_pairs, array += 2) + join(range_pair_helper(array[0], array[1])); + } + + void make_caseunfoldedcharset() + { + uchar32 table[unicode_case_folding::rev_maxset] = {}; + bitset bs; + + for (size_type i = 0; i < rparray_.size(); ++i) + { + const range_pair &range = rparray_[i]; + + for (uchar32 ucp = range.first; ucp <= range.second; ++ucp) + { + const uchar32 setnum = unicode_case_folding::casefoldedcharset(table, ucp); + + for (uchar32 j = 0; j < setnum; ++j) + bs.set(table[j]); + } + } + load_from_bitset(bs); + } + + // For updataout.hpp. + void remove_range(const range_pair &right) + { + for (size_type pos = 0; pos < rparray_.size();) + { + range_pair &left = rparray_[pos]; + + if (right.first <= left.first && left.first <= right.second) // r1 <= l1 <= r2. + { + if (left.second > right.second) // r1 <= l1 <= r2 < l2. + { + left.first = right.second + 1; // carry doesn't happen. + ++pos; + } + else // r1 <= l1 <= l2 <= r2. + rparray_.erase(pos); + } + else if (right.first <= left.second && left.second <= right.second) // r1 <= l2 <= r2. + { + if (left.first < right.first) // l1 < r1 <= l2 <= r2. + { + left.second = right.first - 1; + ++pos; + } + else // r1 <= l1 <= l2 <= r2. + rparray_.erase(pos); + } + else if (left.first < right.first && right.second < left.second) // l1 < r1 && r2 < l2. + { + range_pair newrange(left); + + left.second = right.first - 1; + newrange.first = right.second + 1; + rparray_.insert(++pos, newrange); + ++pos; + } + else + ++pos; + } + } + +// template + uchar32 consists_of_one_character(const bool icase) const + { + if (rparray_.size() >= 1) + { + uchar32 (*const casefolding_func)(const uchar32) = !icase ? do_nothing : unicode_case_folding::do_casefolding; + const uchar32 ucp1st = casefolding_func(rparray_[0].first); + + for (size_type no = 0; no < rparray_.size(); ++no) + { + const range_pair &cr = rparray_[no]; + + for (uchar32 ucp = cr.first;; ++ucp) + { + if (ucp1st != casefolding_func(ucp)) + return constants::invalid_u32value; + + if (ucp == cr.second) + break; + } + } + return ucp1st; + } + return constants::invalid_u32value; + } + + void split_ranges(range_pairs &kept, range_pairs &removed, const range_pairs &rightranges) const + { + range_pair newpair; + + kept.rparray_ = this->rparray_; // Subtraction set. + removed.clear(); // Intersection set. + + for (size_type i = 0;; ++i) + { + RETRY_SAMEINDEXNO: + if (i >= kept.rparray_.size()) + break; + + range_pair &left = kept.rparray_[i]; + + for (size_type j = 0; j < rightranges.rparray_.size(); ++j) + { + const range_pair &right = rightranges.rparray_[j]; + + if (right.first <= left.second) // Excludes l1 l2 < r1 r2. + { + if (left.first <= right.second) // Excludes r1 r2 < l1 l2. + { + if (left.first < right.first) + { + if (right.second < left.second) + { + removed.join(range_pair_helper(right.first, right.second)); + + newpair.set(right.second + 1, left.second); + left.second = right.first - 1; + kept.rparray_.insert(i + 1, newpair); + } + else + { + removed.join(range_pair_helper(right.first, left.second)); + left.second = right.first - 1; + } + } + else if (right.second < left.second) + { + removed.join(range_pair_helper(left.first, right.second)); + left.first = right.second + 1; + } + else + { + removed.join(range_pair_helper(left.first, left.second)); + kept.rparray_.erase(i); + goto RETRY_SAMEINDEXNO; + } + } + } + else + break; + } + } + } + +#if defined(SRELLDBG_NO_BITSET) + bool is_included(const uchar32 ch) const + { +#if 01 + const range_pair *const end = rparray_.data() + rparray_.size(); + + for (const range_pair *cur = rparray_.data(); cur != end; ++cur) + { + if (ch <= cur->second) + return ch >= cur->first; +#else + for (size_type i = 0; i < rparray_.size(); ++i) + { + if (rparray_[i].is_included(ch)) + return true; +#endif + } + return false; + } +#endif // defined(SRELLDBG_NO_BITSET) + + // For multiple_range_pairs functions. + + bool is_included_ls(const uchar32 pos, uchar32 count, const uchar32 c) const + { + const range_pair *cur = &rparray_[pos]; + + for (; count; ++cur, --count) + { + if (c <= cur->second) + return c >= cur->first; + } + return false; + } + + bool is_included(const uchar32 pos, uchar32 count, const uchar32 c) const + { + const range_pair *base = &rparray_[pos]; + + while (count) + { + uchar32 mid = count >> 1; + const range_pair &rp = base[mid]; + + if (c <= rp.second) + { + if (c >= rp.first) + return true; + + count = mid; + } + else + { + ++mid; + count -= mid; + base += mid; + } + } + return false; + } + + void replace(const size_type pos, const size_type count, const range_pairs &right) + { + rparray_.replace(pos, count, right.rparray_); + } + +#if !defined(SRELLDBG_NO_CCPOS) + + // For Eytzinger layout functions. + + bool is_included_el(uchar32 pos, const uchar32 len, const uchar32 c) const + { + const range_pair *const base = &rparray_[pos]; + +#if defined(__GNUC__) + __builtin_prefetch(base); +#endif + for (pos = 0; pos < len;) + { + const range_pair &rp = base[pos]; + + if (c <= rp.second) + { + if (c >= rp.first) + return true; + + pos = (pos << 1) + 1; + } + else + { + pos = (pos << 1) + 2; + } + } + return false; + } + + uchar32 create_el(const range_pair *srcbase, const uchar32 srcsize) + { + const uchar32 basepos = static_cast(rparray_.size()); + + rparray_.resize(basepos + srcsize); + set_eytzinger_layout(0, srcbase, srcsize, &rparray_[basepos], 0); + + return srcsize; + } + +#endif // !defined(SRELLDBG_NO_CCPOS) + + uint_l32 total_codepoints() const + { + uint_l32 num = 0; + + for (size_type no = 0; no < rparray_.size(); ++no) + { + const range_pair &cr = rparray_[no]; + + num += cr.second - cr.first + 1; + } + return num; + } + +private: + +#if !defined(SRELLDBG_NO_CCPOS) + + uchar32 set_eytzinger_layout(uchar32 srcpos, const range_pair *const srcbase, const uchar32 srclen, + range_pair *const destbase, const uchar32 destpos) + { + if (destpos < srclen) + { + const uchar32 nextpos = (destpos << 1) + 1; + + srcpos = set_eytzinger_layout(srcpos, srcbase, srclen, destbase, nextpos); + destbase[destpos] = srcbase[srcpos++]; + srcpos = set_eytzinger_layout(srcpos, srcbase, srclen, destbase, nextpos + 1); + } + return srcpos; + } + +#endif // !defined(SRELLDBG_NO_CCPOS) + + static uchar32 do_nothing(const uchar32 cp) + { + return cp; + } + + template + void load_from_bitset(const BitSetT &bs) + { + uchar32 begin = constants::invalid_u32value; + range_pairs newranges; + + for (uchar32 ucp = 0;; ++ucp) + { + if (ucp > constants::unicode_max_codepoint || !bs.test(ucp)) + { + if (begin != constants::invalid_u32value) + { + newranges.join(range_pair_helper(begin, ucp - 1)); + begin = constants::invalid_u32value; + } + if (ucp > constants::unicode_max_codepoint) + break; + } + else if (begin == constants::invalid_u32value && bs.test(ucp)) + begin = ucp; + } + rparray_.swap(newranges.rparray_); + } + + array_type rparray_; + +public: // For debug. + + void print_pairs(const int, const char *const = NULL, const char *const = NULL) const; +}; +// range_pairs + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + +// For RegExpIdentifierStart and RegExpIdentifierPart +struct identifier_charclass +{ +public: + + void clear() + { + char_class_.clear(); + char_class_pos_.clear(); + } + + void setup() + { + if (char_class_pos_.size() == 0) + { + static const uchar32 additions[] = { + // reg_exp_identifier_start, reg_exp_identifier_part. + 0x24, 0x24, 0x5f, 0x5f, 0x200c, 0x200d // '$' '_' - + }; + range_pairs ranges; + + // For reg_exp_identifier_start. + { + const uchar32 *const IDs_address = unicode_property::ranges_address(unicode_property::bp_ID_Start); + const std::size_t IDs_number = unicode_property::number_of_ranges(unicode_property::bp_ID_Start); + ranges.load_from_memory(IDs_address, IDs_number); + } + ranges.load_from_memory(&additions[0], 2); + append_charclass(ranges); + + // For reg_exp_identifier_part. + ranges.clear(); + { + const uchar32 *const IDc_address = unicode_property::ranges_address(unicode_property::bp_ID_Continue); + const std::size_t IDc_number = unicode_property::number_of_ranges(unicode_property::bp_ID_Continue); + ranges.load_from_memory(IDc_address, IDc_number); + } + ranges.load_from_memory(&additions[0], 3); + append_charclass(ranges); + } + } + + bool is_identifier(const uchar32 ch, const bool part) const + { + const range_pair &rp = char_class_pos_[part ? 1 : 0]; + + return char_class_.is_included(rp.first, rp.second, ch); + } + +private: + + void append_charclass(const range_pairs &rps) + { + char_class_pos_.push_back(range_pair_helper(static_cast(char_class_.size()), static_cast(rps.size()))); + char_class_.append_newclass(rps); + } + + range_pairs char_class_; + range_pairs::array_type char_class_pos_; +}; +// identifier_charclass +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + +class re_character_class +{ +public: + + enum + { // 0 1 2 3 4 5 + newline, dotall, space, digit, word, icase_word, + // 6 + number_of_predefcls + }; + static const uint_l32 error_property = static_cast(-1); + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + typedef unicode_property::pstring pstring; +#endif + + re_character_class() + { + setup_predefinedclass(); + } + + re_character_class &operator=(const re_character_class &that) + { + if (this != &that) + { + this->char_class_ = that.char_class_; + this->char_class_pos_ = that.char_class_pos_; +#if !defined(SRELLDBG_NO_CCPOS) + this->char_class_el_ = that.char_class_el_; + this->char_class_pos_el_ = that.char_class_pos_el_; +#endif + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_character_class &operator=(re_character_class &&that) SRELL_NOEXCEPT + { + if (this != &that) + { + this->char_class_ = std::move(that.char_class_); + this->char_class_pos_ = std::move(that.char_class_pos_); +#if !defined(SRELLDBG_NO_CCPOS) + this->char_class_el_ = std::move(that.char_class_el_); + this->char_class_pos_el_ = std::move(that.char_class_pos_el_); +#endif + } + return *this; + } +#endif + + bool is_included(const uint_l32 class_number, const uchar32 c) const + { +// return char_class_.is_included(char_class_pos_[class_number], c); + const range_pair &rp = char_class_pos_[class_number]; + + return char_class_.is_included(rp.first, rp.second, c); + } + +#if !defined(SRELLDBG_NO_CCPOS) +// bool is_included(const uint_l32 pos, const uint_l32 len, const uchar32 &c) const + bool is_included(const uchar32 pos, const uchar32 len, const uchar32 c) const + { + return char_class_el_.is_included_el(pos, len, c); + } +#endif + + void setup_icase_word() + { + range_pair &icase_pos = char_class_pos_[icase_word]; + + if (icase_pos.second == char_class_pos_[word].second) + { + range_pairs icasewordclass(char_class_, icase_pos.first, icase_pos.second); + + icasewordclass.make_caseunfoldedcharset(); + // Includes 017f and 212a so that they and their case-folded + // characters 's' and 'k' will be excluded from the character + // set that /[\W]/i matches. + + char_class_.replace(icase_pos.first, icase_pos.second, icasewordclass); + + if (icase_pos.second < static_cast(icasewordclass.size())) + { + const uchar32 delta = static_cast(icasewordclass.size() - icase_pos.second); + + for (int i = number_of_predefcls; i < static_cast(char_class_pos_.size()); ++i) + char_class_pos_[i].first += delta; + } + icase_pos.second = static_cast(icasewordclass.size()); + } + } + + void clear() + { + char_class_pos_.resize(number_of_predefcls); + + uchar32 basesize = 0; + for (int i = 0; i < number_of_predefcls; ++i) + basesize += char_class_pos_[i].second; + + char_class_.resize(basesize); + +#if !defined(SRELLDBG_NO_CCPOS) + char_class_el_.clear(); + char_class_pos_el_.clear(); +#endif + } + + uint_l32 register_newclass(const range_pairs &rps) + { + for (range_pairs::size_type no = 0; no < char_class_pos_.size(); ++no) + { + const range_pair &rp = char_class_pos_[no]; + + if (char_class_.same(rp.first, rp.second, rps)) + return static_cast(no); + } + + append_charclass(rps); + return static_cast(char_class_pos_.size() - 1); + } + + range_pairs operator[](const uint_l32 no) const + { + const range_pair &ccpos = char_class_pos_[no]; + range_pairs rp(ccpos.second); + + for (uchar32 i = 0; i < ccpos.second; ++i) + rp[i] = char_class_[ccpos.first + i]; + + return rp; + } + +#if !defined(SRELLDBG_NO_CCPOS) + const range_pair &charclasspos(const uint_l32 no) // const + { + const range_pair &pos = char_class_pos_el_[no]; + + if (pos.second == 0) + finalise(no); + return pos; + } + + void finalise() + { + char_class_el_.clear(); + char_class_pos_el_.resize(char_class_pos_.size()); + std::memset(&char_class_pos_el_[0], 0, char_class_pos_el_.size() * sizeof (range_pairs::array_type::value_type)); + } + + void finalise(const uint_l32 no) + { + const range_pair &posinfo = char_class_pos_[no]; + range_pair &outpair = char_class_pos_el_[no]; + + outpair.first = static_cast(char_class_el_.size()); + outpair.second = char_class_el_.create_el(&char_class_[posinfo.first], posinfo.second); //arraysize; + + } + +#endif // #if !defined(SRELLDBG_NO_CCPOS) + + void optimise() + { + } + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + + uint_l32 lookup_property(const pstring &pname, const pstring &pvalue, const bool icase) + { + const uint_l32 property_number = static_cast(unicode_property::lookup_property(pname, pvalue)); + + if (property_number != unicode_property::error_property && property_number < unicode_property::number_of_properties) + { + const uint_l32 charclass_number = register_property_as_charclass(property_number, icase); + return charclass_number; + } + return error_property; + } + +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + void swap(re_character_class &right) + { + if (this != &right) + { + this->char_class_.swap(right.char_class_); + this->char_class_pos_.swap(right.char_class_pos_); +#if !defined(SRELLDBG_NO_CCPOS) + this->char_class_el_.swap(right.char_class_el_); + this->char_class_pos_el_.swap(right.char_class_pos_el_); +#endif + } + } + +private: + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + + uint_l32 register_property_as_charclass(const uint_l32 property_number, const bool icase) + { + if (property_number == unicode_property::bp_Assigned) + { + // \p{Assigned} == \P{Cn} + return load_updata_and_register_as_charclass(unicode_property::gc_Cn, false, true); + } + return load_updata_and_register_as_charclass(property_number, icase, false); + } + + uint_l32 load_updata_and_register_as_charclass(const uint_l32 property_number, const bool /* icase */, const bool negation) + { + const uchar32 *const address = unicode_property::ranges_address(property_number); +// const std::size_t offset = unicode_property::ranges_offset(property_number); + const std::size_t number = unicode_property::number_of_ranges(property_number); + range_pairs newranges; + + newranges.load_from_memory(address, number); + + if (negation) + newranges.negation(); + + return register_newclass(newranges); + } + +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + void append_charclass(const range_pairs &rps) + { + char_class_pos_.push_back(range_pair_helper(static_cast(char_class_.size()), static_cast(rps.size()))); + char_class_.append_newclass(rps); + } + +// The production CharacterClassEscape::s evaluates as follows: +// Return the set of characters containing the characters that are on the right-hand side of the WhiteSpace or LineTerminator productions. +// WhiteSpace:: +// 0009 000B 000C 0020 00A0 FEFF Zs +// LineTerminator:: +// 000A 000D 2028 2029 + + void setup_predefinedclass() + { +#if !defined(SRELL_NO_UNICODE_PROPERTY) + const uchar32 *const Zs_address = unicode_property::ranges_address(unicode_property::gc_Zs); +// const std::size_t Zs_offset = unicode_property::ranges_offset(unicode_property::gc_Zs); + const std::size_t Zs_number = unicode_property::number_of_ranges(unicode_property::gc_Zs); +#else + static const uchar32 Zs[] = { + 0x1680, 0x1680, 0x2000, 0x200a, // 0x2028, 0x2029, + 0x202f, 0x202f, 0x205f, 0x205f, 0x3000, 0x3000 + }; +#endif // defined(SRELL_NO_UNICODE_PROPERTY) + static const uchar32 allranges[] = { + // dotall. + 0x0000, 0x10ffff, + // newline. + 0x0a, 0x0a, 0x0d, 0x0d, // \n \r + // newline, space. + 0x2028, 0x2029, + // space. + 0x09, 0x0d, // \t \n \v \f \r + 0x20, 0x20, // ' ' + 0xa0, 0xa0, // + 0xfeff, 0xfeff, // + // digit, word. + 0x30, 0x39, // '0'-'9' + 0x41, 0x5a, 0x5f, 0x5f, 0x61, 0x7a // 'A'-'Z' '_' 'a'-'z' + }; + range_pairs ranges; + + // newline. + ranges.load_from_memory(&allranges[2], 3); + append_charclass(ranges); + + // dotall. + ranges.clear(); + ranges.load_from_memory(&allranges[0], 1); + append_charclass(ranges); + + // space. + ranges.clear(); + ranges.load_from_memory(&allranges[6], 5); +#if !defined(SRELL_NO_UNICODE_PROPERTY) + ranges.load_from_memory(Zs_address, Zs_number); +#else + ranges.load_from_memory(Zs, 5); +#endif + append_charclass(ranges); + + // digit. + ranges.clear(); + ranges.load_from_memory(&allranges[16], 1); + append_charclass(ranges); + + // word. + ranges.clear(); + ranges.load_from_memory(&allranges[16], 4); + append_charclass(ranges); + + // Reservation for icase_word. + append_charclass(ranges); + } + +private: + + range_pairs char_class_; + range_pairs::array_type char_class_pos_; + +#if !defined(SRELLDBG_NO_CCPOS) + range_pairs char_class_el_; + range_pairs::array_type char_class_pos_el_; + +#endif + +public: // For debug. + + void print_classes(const int) const; +}; +// re_character_class + + } // namespace regex_internal + +// ... "rei_char_class.hpp"] +// ["rei_groupname_mapper.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELL_NO_NAMEDCAPTURE) + +template +class groupname_and_backrefnumber_mapper +{ +public: + + typedef simple_array gname_string; + typedef typename gname_string::size_type size_type; + static const numberT notfound = static_cast(-1); + + groupname_and_backrefnumber_mapper() + { + } + + groupname_and_backrefnumber_mapper(const groupname_and_backrefnumber_mapper &right) + : names_(right.names_), keysize_classno_(right.keysize_classno_) + { + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + groupname_and_backrefnumber_mapper(groupname_and_backrefnumber_mapper &&right) SRELL_NOEXCEPT + : names_(std::move(right.names_)), keysize_classno_(std::move(right.keysize_classno_)) + { + } +#endif + + groupname_and_backrefnumber_mapper &operator=(const groupname_and_backrefnumber_mapper &right) + { + if (this != &right) + { + names_ = right.names_; + keysize_classno_ = right.keysize_classno_; + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + groupname_and_backrefnumber_mapper &operator=(groupname_and_backrefnumber_mapper &&right) SRELL_NOEXCEPT + { + if (this != &right) + { + names_ = std::move(right.names_); + keysize_classno_ = std::move(right.keysize_classno_); + } + return *this; + } +#endif + + void clear() + { + names_.clear(); + keysize_classno_.clear(); + } + + numberT operator[](const gname_string &gname) const + { + numberT pos = 0; + for (std::size_t i = 0; i < static_cast(keysize_classno_.size()); i += 2) + { + const numberT keysize = keysize_classno_[i]; + + if (keysize == static_cast(gname.size()) && sameseq(pos, gname)) + return keysize_classno_[++i]; + + pos += keysize; + } + return notfound; + } + + gname_string operator[](const numberT indexno) const + { + numberT pos = 0; + for (std::size_t i = 0; i < static_cast(keysize_classno_.size()); ++i) + { + const numberT keysize = keysize_classno_[i]; + const numberT classno = keysize_classno_[++i]; + + if (classno == indexno) + return gname_string(names_, pos, keysize); + + pos += keysize; + } + return gname_string(); + } + + size_type size() const + { + return static_cast(keysize_classno_.size() >> 1); + } + + bool push_back(const gname_string &gname, const numberT class_number) + { + const numberT num = operator[](gname); + + if (num == notfound) + { + names_.append(gname); + keysize_classno_.append(1, static_cast(gname.size())); + keysize_classno_.append(1, class_number); + return true; + } + return false; // Already exists. + } + + void swap(groupname_and_backrefnumber_mapper &right) + { + this->names_.swap(right.names_); + keysize_classno_.swap(right.keysize_classno_); + } + +private: + + bool sameseq(size_type pos, const gname_string &gname) const + { + for (size_type i = 0; i < gname.size(); ++i, ++pos) + if (pos >= names_.size() || names_[pos] != gname[i]) + return false; + + return true; + } + + gname_string names_; + simple_array keysize_classno_; + +public: // For debug. + + void print_mappings(const int) const; +}; +// groupname_and_backrefnumber_mapper + +template +class groupname_mapper : public groupname_and_backrefnumber_mapper +{ +}; + +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + } // namespace regex_internal + +// ... "rei_groupname_mapper.hpp"] +// ["rei_state.hpp" ... + + namespace regex_internal + { + +struct re_quantifier +{ + static const uint_l32 infinity = static_cast(~0); + + // atleast and atmost: for check_counter. + // offset and length: for charcter_class. + // (Special case 1) in roundbracket_open and roundbracket_pop atleast and atmost represent + // the minimum and maximum bracket numbers respectively inside the brackets itself. + // (Special case 2) in repeat_in_push and repeat_in_pop atleast and atmost represent the + // minimum and maximum bracket numbers respectively inside the repetition. + union + { + uint_l32 atleast; + // (Special case 3: v1) in lookaround_open represents the number of characters to be rewound. + // (Special case 3: v2) in lookaround_open represents: 0=lookaheads, 1=lookbehinds, + // 2=matchpointrewinder. + // (Special case 4) in NFA_states[0] represents the class number of the first character class. + uchar32 offset; + }; + union + { + uint_l32 atmost; + uchar32 length; + }; + + union + { + bool is_greedy; + uint_l32 padding_; + }; + + void reset(const uint_l32 len = 1) + { + atleast = atmost = len; + is_greedy = true; + } + + void set(const uint_l32 min, const uint_l32 max) + { + atleast = min; + atmost = max; + } + + void set(const uint_l32 min, const uint_l32 max, const bool greedy) + { + atleast = min; + atmost = max; + is_greedy = greedy; + } + + void setccpos(const uchar32 o, const uchar32 l) + { + offset = o; + length = l; + } + + bool is_valid() const + { + return atleast <= atmost && atmost > 0; + } + + void set_infinity() + { + atmost = infinity; + } + + bool is_infinity() const + { + return atmost == infinity; + } + + bool is_same() const + { + return atleast == atmost; + } + + bool is_default() const + { + return atleast == 1 && atmost == 1; + } + + bool is_asterisk() const + { + return atleast == 0 && atmost == infinity; + } + bool is_plus() const + { + return atleast == 1 && atmost == infinity; + } + bool is_asterisk_or_plus() const + { + return atleast <= 1 && atmost == infinity; + } + bool is_question_or_asterisk() const + { + return atleast == 0 && (atmost == 1 || atmost == infinity); + } + + bool has_simple_equivalence() const + { + return (atleast <= 1 && atmost <= 3) || (atleast == 2 && atmost <= 4) || (atleast == atmost && atmost <= 6); + } + + void multiply(const re_quantifier &q) + { + if (atleast != infinity) + { + if (q.atleast != infinity) + atleast *= q.atleast; + else + atleast = infinity; + } + + if (atmost != infinity) + { + if (q.atmost != infinity) + atmost *= q.atmost; + else + atmost = infinity; + } + } + + void add(const re_quantifier &q) + { + if (atleast != infinity) + { + if (q.atleast != infinity && (atleast + q.atleast) >= atleast) + atleast += q.atleast; + else + atleast = infinity; + } + + if (atmost != infinity) + { + if (q.atmost != infinity && (atmost + q.atmost) >= atmost) + atmost += q.atmost; + else + atmost = infinity; + } + } +}; +// re_quantifier + +struct re_state +{ + union + { + uchar32 character; // For character. + uint_l32 number; // For character_class, brackets, counter, repeat, backreference. + }; + + re_state_type type; + + union + { + std::ptrdiff_t next1; + re_state *next_state1; + // Points to the next state. + // (Special case 1) in lookaround_open points to the next of lookaround_close. + }; + union + { + std::ptrdiff_t next2; + re_state *next_state2; + // character and character_class: points to another possibility, non-backtracking. + // epsilon: points to another possibility, backtracking. + // save_and_reset_counter, roundbracket_open, and repeat_in_push: points to a + // restore state, backtracking. + // check_counter: complementary to next1 based on quantifier.is_greedy. + // (Special case 1) roundbracket_close, check_0_width_repeat, and backreference: + // points to the next state as an exit after 0 width match. + // (Special case 2) in NFA_states[0] holds the entry point for match_continuous/regex_match. + // (Special case 3) in lookaround_open points to the contents of brackets. + }; + + re_quantifier quantifier; // For check_counter, roundbrackets, repeasts, (?<=...) and (? number of chars to be rewound (for (?<=...) (? 0: lookahead, 1: lookbehind, 2: mprewinder. + // q.atmost: - + // q.greedy: - + // is_not/dont_push: not + + // st_bol, // 0x0f + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + // st_eol, // 0x10 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + // st_boundary, // 0x11 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: not + + // st_success, // 0x12 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + // st_move_nextpos, // 0x13 + // char/number: - + // next1/next2: - + // quantifiers: - + // is_not/dont_push: - + + void reset() + { + number = 0; + type = st_character; + next1 = 1; + next2 = 0; + is_not = false; + quantifier.reset(); + } + + bool is_character_or_class() const + { + return type == st_character || type == st_character_class; + } + + bool has_quantifier() const + { + // 1. character: size == 1 && type == character, + // 2. [...]: size == 1 && type == character_class, + // 3. (...): size == ? && type == roundbracket_open, + // 4. (?:...): size == ? && type == epsilon && character == ':', + // 5. backref: size == ? && type == backreference, + // -- assertions boundary -- + // 6. lookaround: size == ? && type == lookaround, + // 7. assertion: size == 0 && type == one of assertions (^, $, \b and \B). +#if !defined(SRELL_ENABLE_GT) + return type < st_zero_width_boundary; +#else + // 5.5. independent: size == ? && type == lookaround && character == '>', + return type < st_zero_width_boundary || (type == st_lookaround_open && character == meta_char::mc_gt); +#endif + } + + bool is_noncapturinggroup() const + { + return type == st_epsilon && character == meta_char::mc_colon; + } + + bool has_0widthchecker() const + { + return type == st_roundbracket_open || type == st_backreference; + } + + bool is_negcharclass() const + { + return type == st_character_class && is_not; + } + + bool is_branch() const + { + return type == st_epsilon && next2 != 0 && character == meta_char::mc_bar; // '|' + } +}; +// re_state + +template +//struct re_flags +struct re_compiler_state +{ +// bool i; +// bool m; +// bool s; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + bool back; +#endif + + bool backref_used; + + simple_array atleast_widths_of_brackets; +#if !defined(SRELL_NO_NAMEDCAPTURE) + groupname_mapper unresolved_gnames; +#endif + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + identifier_charclass idchecker; +#endif + + void reset(const regex_constants::syntax_option_type & /* flags */) + { +// i = (flags & regex_constants::icase) != 0; // Case-insensitive. +// m = (flags & regex_constants::multiline) != 0; +// s = (flags & regex_constants::dotall) != 0; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + back = false; +#endif + + backref_used = false; + atleast_widths_of_brackets.clear(); + +#if !defined(SRELL_NO_NAMEDCAPTURE) + unresolved_gnames.clear(); +#endif + +#if !defined(SRELL_NO_UNICODE_PROPERTY) +// idchecker.clear(); // Keeps data once created. +#endif + } + + void restore_from(const re_compiler_state &backup) + { +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + back = backup.back; +#endif + } +}; +// re_compiler_state + + } // namespace regex_internal + +// ... "rei_state.hpp"] +// ["rei_search_state.hpp" ... + +template +class sub_match /* : std::pair */; + + namespace regex_internal + { + +//template +struct re_state; + +template +struct re_search_state_core +{ + const re_state/* */ *in_NFA_states; + BidirectionalIterator in_string; +}; + +template +struct re_submatch_core +{ + BidirectionalIterator open_at; + BidirectionalIterator close_at; +}; + +template +struct re_submatch_type +{ + re_submatch_core core; + uint_l32 counter; +}; + +template +struct re_search_state_types +{ + typedef re_submatch_core submatch_core; + typedef re_submatch_type submatch_type; + typedef uint_l32 counter_type; + typedef BidirectionalIterator position_type; + + typedef std::vector submatch_array; + + typedef re_search_state_core search_core_state; + + typedef std::vector backtracking_array; + typedef std::vector capture_array; + typedef simple_array counter_array; + typedef std::vector repeat_array; +}; + +template +struct re_search_state_types +{ + typedef re_submatch_core submatch_core; + typedef re_submatch_type submatch_type; + typedef uint_l32 counter_type; + typedef const charT2 *position_type; + + typedef simple_array submatch_array; + + typedef re_search_state_core search_core_state; + + typedef simple_array backtracking_array; + typedef simple_array capture_array; + typedef simple_array repeat_array; + typedef simple_array counter_array; +}; +// re_search_state_types + +template +class re_search_state : public re_search_state_types +{ +private: + + typedef re_search_state_types base_type; + +public: + + typedef typename base_type::submatch_core submatchcore_type; + typedef typename base_type::submatch_type submatch_type; + typedef typename base_type::counter_type counter_type; + typedef typename base_type::position_type position_type; + + typedef typename base_type::submatch_array submatch_array; + + typedef typename base_type::search_core_state search_core_state; + + typedef typename base_type::backtracking_array backtracking_array; + typedef typename base_type::capture_array capture_array; + typedef typename base_type::counter_array counter_array; + typedef typename base_type::repeat_array repeat_array; + + typedef typename backtracking_array::size_type btstack_size_type; + +public: + + struct bottom_state + { + btstack_size_type btstack_size; + typename capture_array::size_type capturestack_size; + typename counter_array::size_type counterstack_size; + typename repeat_array::size_type repeatstack_size; + + bottom_state( + const btstack_size_type bt, + const typename capture_array::size_type h, + const typename counter_array::size_type c, + const typename repeat_array::size_type r) + : btstack_size(bt) + , capturestack_size(h) + , counterstack_size(c) + , repeatstack_size(r) + { + } + }; + +public: + + search_core_state nth; + +#if !defined(SRELL_NO_LIMIT_COUNTER) + std::size_t failure_counter; +#endif + + BidirectionalIterator srchend; + BidirectionalIterator lblim; + + BidirectionalIterator nextpos; + + backtracking_array bt_stack; + + capture_array capture_stack; + counter_array counter_stack; + repeat_array repeat_stack; + + submatch_array bracket; + counter_array counter; + repeat_array repeat; + + btstack_size_type btstack_size; + + BidirectionalIterator srchbegin; + +public: + + void init + ( + const BidirectionalIterator begin, + const BidirectionalIterator end, + const BidirectionalIterator lookbehindlimit, + const regex_constants::match_flag_type flags + ) + { + lblim = lookbehindlimit; + nextpos = srchbegin = begin; + srchend = end; + flags_ = flags; + } + + void set_entrypoint(const re_state *const entry) + { + entry_state_ = entry; + } + + void init_for_automaton + ( + uint_l32 num_of_submatches, + const uint_l32 num_of_counters, + const uint_l32 num_of_repeats + ) + { + + bracket.resize(num_of_submatches); + counter.resize(num_of_counters); + repeat.resize(num_of_repeats); + + nth.in_string = (flags_ & regex_constants::match_continuous) ? srchbegin : srchend; + + while (num_of_submatches > 1) + { + submatch_type &br = bracket[--num_of_submatches]; + + br.core.open_at = br.core.close_at = this->srchend; + br.counter = 0; + // 15.10.2.9; AtomEscape: + // If the regular expression has n or more capturing parentheses + // but the nth one is undefined because it hasn't captured anything, + // then the backreference always succeeds. + + // C.f., table 27 and 28 on TR1, table 142 and 143 on C++11. + } + + clear_stacks(); + } + +#if defined(SRELL_NO_LIMIT_COUNTER) + void reset(/* const BidirectionalIterator start */) +#else + void reset(/* const BidirectionalIterator start, */ const std::size_t limit) +#endif + { + nth.in_NFA_states = this->entry_state_; + + bracket[0].core.open_at = nth.in_string; + +#if !defined(SRELL_NO_LIMIT_COUNTER) + failure_counter = limit; +#endif + } + + bool is_at_lookbehindlimit() const + { + return nth.in_string == this->lblim; + } + + bool is_at_srchend() const + { + return nth.in_string == this->srchend; + } + + bool is_null() const + { + return nth.in_string == bracket[0].core.open_at; + } + +// regex_constants::match_flag_type flags() const +// { +// return this->flags_; +// } + + bool match_not_bol_flag() const + { + if (this->flags_ & regex_constants::match_not_bol) + return true; + return false; + } + + bool match_not_eol_flag() const + { + if (this->flags_ & regex_constants::match_not_eol) + return true; + return false; + } + + bool match_not_bow_flag() const + { + if (this->flags_ & regex_constants::match_not_bow) + return true; + return false; + } + + bool match_not_eow_flag() const + { + if (this->flags_ & regex_constants::match_not_eow) + return true; + return false; + } + + bool match_prev_avail_flag() const + { + if (this->flags_ & regex_constants::match_prev_avail) + return true; + return false; + } + + bool match_not_null_flag() const + { + if (this->flags_ & regex_constants::match_not_null) + return true; + return false; + } + + bool match_continuous_flag() const + { + if (this->flags_ & regex_constants::match_continuous) + return true; + return false; + } + + bool match_match_flag() const + { + if (this->flags_ & regex_constants::match_match_) + return true; + return false; + } + + bool set_bracket0(const BidirectionalIterator begin, const BidirectionalIterator end) + { + nth.in_string = begin; + nextpos = end; + return true; + } + + void clear_stacks() + { + btstack_size = 0; + bt_stack.clear(); + capture_stack.clear(); + repeat_stack.clear(); + counter_stack.clear(); + } + + btstack_size_type size() const // For debug. + { + return bt_stack.size(); + } + + bool is_empty() const // For debug. + { + if (btstack_size == 0 + && bt_stack.size() == 0 + && capture_stack.size() == 0 + && repeat_stack.size() == 0 + && counter_stack.size() == 0) + return true; + + return false; + } + +private: + + /* const */regex_constants::match_flag_type flags_; + const re_state/* */ * /* const */entry_state_; +}; +// re_search_state + + } // namespace regex_internal + +// ... "rei_search_state.hpp"] +// ["rei_bmh.hpp" ... + + namespace regex_internal + { + +#if !defined(SRELLDBG_NO_BMH) + +template +class re_bmh +{ +public: + + re_bmh() + { + } + + re_bmh(const re_bmh &right) + { + operator=(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_bmh(re_bmh &&right) SRELL_NOEXCEPT + { + operator=(std::move(right)); + } +#endif + + re_bmh &operator=(const re_bmh &that) + { + if (this != &that) + { + this->u32string_ = that.u32string_; + + this->bmtable_ = that.bmtable_; + this->repseq_ = that.repseq_; + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_bmh &operator=(re_bmh &&that) SRELL_NOEXCEPT + { + if (this != &that) + { + this->u32string_ = std::move(that.u32string_); + + this->bmtable_ = std::move(that.bmtable_); + this->repseq_ = std::move(that.repseq_); + } + return *this; + } +#endif + + void clear() + { + u32string_.clear(); + + bmtable_.clear(); + repseq_.clear(); + } + + void setup(const simple_array &u32s, const bool icase) + { + u32string_ = u32s; + setup_(); + + if (!icase) + setup_for_casesensitive(); + else + setup_for_icase(); + } + + template + bool do_casesensitivesearch(re_search_state &sstate, const std::random_access_iterator_tag) const + { + RandomAccessIterator begin = sstate.srchbegin; + const RandomAccessIterator end = sstate.srchend; + std::size_t offset = static_cast(repseq_.size() - 1); + const charT *const relastchar = &repseq_[offset]; + + for (; static_cast(end - begin) > offset;) + { + begin += offset; + + if (*begin == *relastchar) + { + const charT *re = relastchar; + RandomAccessIterator tail = begin; + + for (; *--re == *--tail;) + { + if (re == repseq_.data()) + return sstate.set_bracket0(tail, ++begin); + } + } + offset = bmtable_[*begin & 0xff]; + } + return false; + } + + template + bool do_casesensitivesearch(re_search_state &sstate, const std::bidirectional_iterator_tag) const + { + BidirectionalIterator begin = sstate.srchbegin; + const BidirectionalIterator end = sstate.srchend; + std::size_t offset = static_cast(repseq_.size() - 1); + const charT *const relastchar = &repseq_[offset]; + + for (;;) + { + for (; offset; --offset, ++begin) + if (begin == end) + return false; + + if (*begin == *relastchar) + { + const charT *re = relastchar; + BidirectionalIterator tail = begin; + + for (; *--re == *--tail;) + { + if (re == repseq_.data()) + return sstate.set_bracket0(tail, ++begin); + } + } + offset = bmtable_[*begin & 0xff]; + } + } + + template + bool do_icasesearch(re_search_state &sstate, const std::random_access_iterator_tag) const + { + const RandomAccessIterator begin = sstate.srchbegin; + const RandomAccessIterator end = sstate.srchend; + std::size_t offset = bmtable_[256]; + const uchar32 entrychar = u32string_[u32string_.size() - 1]; + const uchar32 *const re2ndlastchar = &u32string_[u32string_.size() - 2]; + RandomAccessIterator curpos = begin; + + for (; static_cast(end - curpos) > offset;) + { + curpos += offset; + + for (; utf_traits::is_trailing(*curpos);) + if (++curpos == end) + return false; + + const uchar32 txtlastchar = utf_traits::codepoint(curpos, end); + + if (txtlastchar == entrychar || unicode_case_folding::do_casefolding(txtlastchar) == entrychar) + { + const uchar32 *re = re2ndlastchar; + RandomAccessIterator tail = curpos; + +// for (; *--re == unicode_case_folding::do_casefolding(utf_traits::dec_codepoint(tail, begin));) + for (; *re == unicode_case_folding::do_casefolding(utf_traits::dec_codepoint(tail, begin)); --re) + { + if (re == u32string_.data()) + { + utf_traits::codepoint_inc(curpos, end); + return sstate.set_bracket0(tail, curpos); + } + if (tail == begin) + break; + } + } + offset = bmtable_[txtlastchar & 0xff]; + } + return false; + } + + template + bool do_icasesearch(re_search_state &sstate, const std::bidirectional_iterator_tag) const + { + const BidirectionalIterator begin = sstate.srchbegin; + const BidirectionalIterator end = sstate.srchend; + + if (begin != end) + { + std::size_t offset = bmtable_[256]; //static_cast(u32string_.size() - 1); + const uchar32 entrychar = u32string_[offset]; + const uchar32 *const re2ndlastchar = &u32string_[offset - 1]; + BidirectionalIterator curpos = begin; + + for (;;) + { + for (;;) + { + if (++curpos == end) + return false; + if (!utf_traits::is_trailing(*curpos)) + if (--offset == 0) + break; + } +// const uchar32 txtlastchar = unicode_case_folding::do_casefolding(utf_traits::codepoint(curpos, end)); + const uchar32 txtlastchar = utf_traits::codepoint(curpos, end); + +// if (txtlastchar == *re2ndlastchar) +// if (txtlastchar == *re2ndlastchar || unicode_case_folding::do_casefolding(txtlastchar) == *re2ndlastchar) + if (txtlastchar == entrychar || unicode_case_folding::do_casefolding(txtlastchar) == entrychar) + { + const uchar32 *re = re2ndlastchar; + BidirectionalIterator tail = curpos; + + for (; *re == unicode_case_folding::do_casefolding(utf_traits::dec_codepoint(tail, begin)); --re) + { + if (re == u32string_.data()) + { + utf_traits::codepoint_inc(curpos, end); + return sstate.set_bracket0(tail, curpos); + } + if (tail == begin) + break; + } + } + offset = bmtable_[txtlastchar & 0xff]; + } + } + return false; + } + +private: + + void setup_() + { + bmtable_.resize(257); + } + + void setup_for_casesensitive() + { + charT mbstr[utf_traits::maxseqlen]; + const std::size_t u32str_lastcharpos_ = static_cast(u32string_.size() - 1); + + repseq_.clear(); + + for (std::size_t i = 0; i <= u32str_lastcharpos_; ++i) + { + const uchar32 seqlen = utf_traits::to_codeunits(mbstr, u32string_[i]); + + for (uchar32 j = 0; j < seqlen; ++j) + repseq_.push_back(mbstr[j]); + } + + for (std::size_t i = 0; i < 256; ++i) + bmtable_[i] = static_cast(repseq_.size()); + + const std::size_t repseq_lastcharpos_ = static_cast(repseq_.size() - 1); + + for (std::size_t i = 0; i < repseq_lastcharpos_; ++i) + bmtable_[repseq_[i] & 0xff] = repseq_lastcharpos_ - i; + } + + void setup_for_icase() + { + charT mbstr[utf_traits::maxseqlen]; + uchar32 u32table[unicode_case_folding::rev_maxset]; + const std::size_t u32str_lastcharpos = static_cast(u32string_.size() - 1); + simple_array minlen(u32string_.size()); + std::size_t cu_repseq_lastcharpos = 0; + + for (std::size_t i = 0; i <= u32str_lastcharpos; ++i) + { + const uchar32 setnum = unicode_case_folding::casefoldedcharset(u32table, u32string_[i]); + uchar32 u32c = u32table[0]; + + for (uchar32 j = 1; j < setnum; ++j) + if (u32c > u32table[j]) + u32c = u32table[j]; + + if (i < u32str_lastcharpos) + cu_repseq_lastcharpos += minlen[i] = utf_traits::to_codeunits(mbstr, u32c); + } + + ++cu_repseq_lastcharpos; + + for (std::size_t i = 0; i < 256; ++i) + bmtable_[i] = cu_repseq_lastcharpos; + + bmtable_[256] = --cu_repseq_lastcharpos; + + for (std::size_t i = 0; i < u32str_lastcharpos; ++i) + { + const uchar32 setnum = unicode_case_folding::casefoldedcharset(u32table, u32string_[i]); + + for (uchar32 j = 0; j < setnum; ++j) + bmtable_[u32table[j] & 0xff] = cu_repseq_lastcharpos; + + cu_repseq_lastcharpos -= minlen[i]; + } + } + +public: // For debug. + + void print_table() const; + void print_seq() const; + +private: + + simple_array u32string_; +// std::size_t bmtable_[256]; + simple_array bmtable_; + simple_array repseq_; +}; +// re_bmh + +#endif // !defined(SRELLDBG_NO_BMH) + } // namespace regex_internal + +// ... "rei_bmh.hpp"] +// ["rei_compiler.hpp" ... + + namespace regex_internal + { + +template +struct re_object_core +{ +protected: + + typedef re_state/**/ state_type; + typedef simple_array state_array; + + state_array NFA_states; + re_character_class character_class; + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + bitset firstchar_class_bs; + #else + range_pairs firstchar_class; + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) +public: + + std::size_t limit_counter; + +protected: +#endif + + typedef typename traits::utf_traits utf_traits; + + uint_l32 number_of_brackets; + uint_l32 number_of_counters; + uint_l32 number_of_repeats; + regex_constants::syntax_option_type soflags; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + groupname_mapper namedcaptures; + typedef typename groupname_mapper::gname_string gname_string; +#endif + +#if !defined(SRELLDBG_NO_BMH) + re_bmh *bmdata; +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) +private: + + static const std::size_t lcounter_defnum_ = 16777216; + +#endif + +protected: + + re_object_core() +#if !defined(SRELL_NO_LIMIT_COUNTER) + : limit_counter(lcounter_defnum_) + #if !defined(SRELLDBG_NO_BMH) + , bmdata(NULL) + #endif +#elif !defined(SRELLDBG_NO_BMH) + : bmdata(NULL) +#endif + { + } + + re_object_core(const re_object_core &right) +#if !defined(SRELLDBG_NO_BMH) + : bmdata(NULL) +#endif + { + operator=(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_object_core(re_object_core &&right) SRELL_NOEXCEPT +#if !defined(SRELLDBG_NO_BMH) + : bmdata(NULL) +#endif + { + operator=(std::move(right)); + } +#endif + +#if !defined(SRELLDBG_NO_BMH) + ~re_object_core() + { + if (bmdata) + delete bmdata; + } +#endif + + void reset(const regex_constants::syntax_option_type flags) + { + NFA_states.clear(); + character_class.clear(); + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + firstchar_class_bs.reset(); + #else + firstchar_class.clear(); + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + limit_counter = lcounter_defnum_; +#endif + + number_of_brackets = 1; + number_of_counters = 0; + number_of_repeats = 0; + soflags = flags; // regex_constants::ECMAScript; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + namedcaptures.clear(); +#endif + +#if !defined(SRELLDBG_NO_BMH) +// bmdata->clear(); + if (bmdata) + delete bmdata; + bmdata = NULL; +#endif + } + + re_object_core &operator=(const re_object_core &that) + { + if (this != &that) + { + this->NFA_states = that.NFA_states; + this->character_class = that.character_class; + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + this->firstchar_class_bs = that.firstchar_class_bs; + #else + this->firstchar_class = that.firstchar_class; + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + this->limit_counter = that.limit_counter; +#endif + +// this->utf_traits_inst = that.utf_traits_inst; + + this->number_of_brackets = that.number_of_brackets; + this->number_of_counters = that.number_of_counters; + this->number_of_repeats = that.number_of_repeats; + this->soflags = that.soflags; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->namedcaptures = that.namedcaptures; +#endif + +#if !defined(SRELLDBG_NO_BMH) + if (that.bmdata) + { + if (this->bmdata) + *this->bmdata = *that.bmdata; + else + this->bmdata = new re_bmh(*that.bmdata); + } + else if (this->bmdata) + { + delete this->bmdata; + this->bmdata = NULL; + } +#endif + + if (that.NFA_states.size()) + repair_nextstates(&that.NFA_states[0]); + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + re_object_core &operator=(re_object_core &&that) SRELL_NOEXCEPT + { + if (this != &that) + { + this->NFA_states = std::move(that.NFA_states); + this->character_class = std::move(that.character_class); + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + this->firstchar_class_bs = std::move(that.firstchar_class_bs); + #else + this->firstchar_class = std::move(that.firstchar_class); + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + this->limit_counter = that.limit_counter; +#endif + + this->number_of_brackets = that.number_of_brackets; + this->number_of_counters = that.number_of_counters; + this->number_of_repeats = that.number_of_repeats; + this->soflags = that.soflags; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->namedcaptures = std::move(that.namedcaptures); +#endif + +#if !defined(SRELLDBG_NO_BMH) + if (this->bmdata) + delete this->bmdata; + this->bmdata = that.bmdata; + that.bmdata = NULL; +#endif + } + return *this; + } +#endif // defined(SRELL_CPP11_MOVE_ENABLED) + + void swap(re_object_core &right) + { + if (this != &right) + { + this->NFA_states.swap(right.NFA_states); + this->character_class.swap(right.character_class); + +#if !defined(SRELLDBG_NO_1STCHRCLS) + #if !defined(SRELLDBG_NO_BITSET) + this->firstchar_class_bs.swap(right.firstchar_class_bs); + #else + this->firstchar_class.swap(right.firstchar_class); + #endif +#endif + +#if !defined(SRELL_NO_LIMIT_COUNTER) + { + const std::size_t tmp_limit_counter = this->limit_counter; + this->limit_counter = right.limit_counter; + right.limit_counter = tmp_limit_counter; + } +#endif +// this->utf_traits_inst.swap(right.utf_traits_inst); + + { + const uint_l32 tmp_numof_brackets = this->number_of_brackets; + this->number_of_brackets = right.number_of_brackets; + right.number_of_brackets = tmp_numof_brackets; + } + { + const uint_l32 tmp_numof_counters = this->number_of_counters; + this->number_of_counters = right.number_of_counters; + right.number_of_counters = tmp_numof_counters; + } + { + const uint_l32 tmp_numof_repeats = this->number_of_repeats; + this->number_of_repeats = right.number_of_repeats; + right.number_of_repeats = tmp_numof_repeats; + } + { + const regex_constants::syntax_option_type tmp_soflags = this->soflags; + this->soflags = right.soflags; + right.soflags = tmp_soflags; + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->namedcaptures.swap(right.namedcaptures); +#endif + +#if !defined(SRELLDBG_NO_BMH) + { + re_bmh *const tmp_bmdata = this->bmdata; + this->bmdata = right.bmdata; + right.bmdata = tmp_bmdata; + } +#endif + } + } + + void throw_error(const regex_constants::error_type &e) + { +// reset(); + NFA_states.clear(); +#if !defined(SRELLDBG_NO_BMH) + if (bmdata) + delete bmdata; + bmdata = NULL; +#endif + throw regex_error(e); + } + +private: + + void repair_nextstates(const state_type *const oldbase) + { + state_type *const newbase = &this->NFA_states[0]; + + for (typename state_array::size_type i = 0; i < this->NFA_states.size(); ++i) + { + state_type &state = this->NFA_states[i]; + + if (state.next_state1) + state.next_state1 = state.next_state1 - oldbase + newbase; + + if (state.next_state2) + state.next_state2 = state.next_state2 - oldbase + newbase; + } + } +}; +// re_object_core + +template +class re_compiler : public re_object_core +{ +protected: + + template + bool compile(ForwardIterator begin, const ForwardIterator end, const regex_constants::syntax_option_type flags /* = regex_constants::ECMAScript */) + { + simple_array u32; + + while (begin != end) + { + const uchar32 u32c = utf_traits::codepoint_inc(begin, end); + if (u32c > constants::unicode_max_codepoint) + this->throw_error(regex_constants::error_utf8); + u32.push_back(u32c); + } + + return compile_core(u32.data(), u32.data() + u32.size(), flags); + } + + bool is_icase() const + { +#if !defined(SRELL_NO_ICASE) + if (this->soflags & regex_constants::icase) + return true; +#endif + return false; + } + bool is_ricase() const + { +#if !defined(SRELL_NO_ICASE) + return /* this->NFA_states.size() && */ this->NFA_states[0].icase == true; +#else + return false; +#endif + } + + bool is_multiline() const + { + if (this->soflags & regex_constants::multiline) + return true; + return false; + } + + bool is_dotall() const + { + return (this->soflags & regex_constants::dotall) ? true : false; + } + + bool is_optimize() const + { + return (this->soflags & regex_constants::optimize) ? true : false; + } + +private: + + typedef re_object_core base_type; + typedef typename base_type::utf_traits utf_traits; + typedef typename base_type::state_type state_type; + typedef typename base_type::state_array state_array; +#if !defined(SRELL_NO_NAMEDCAPTURE) + typedef typename base_type::gname_string gname_string; +#endif +#if !defined(SRELL_NO_UNICODE_PROPERTY) + typedef typename re_character_class::pstring pstring; +#endif + typedef typename state_array::size_type state_size_type; + + bool compile_core(const uchar32 *begin, const uchar32 *const end, const regex_constants::syntax_option_type flags) + { + re_quantifier piececharlen; + re_compiler_state cstate; + state_type atom; + + this->reset(flags); +// this->soflags = flags; + cstate.reset(flags); + + atom.reset(); + atom.type = st_epsilon; + atom.next2 = 1; + this->NFA_states.push_back(atom); + + if (!make_nfa_states(this->NFA_states, piececharlen, begin, end, cstate)) + { + return false; + } + + if (begin != end) + this->throw_error(regex_constants::error_paren); // ')'s are too many. + + if (!check_backreferences(cstate)) + this->throw_error(regex_constants::error_backref); + +#if !defined(SRELL_NO_ICASE) + if (this->is_icase()) + this->NFA_states[0].icase = check_if_really_needs_icase_search(); +#endif + +#if !defined(SRELLDBG_NO_BMH) + setup_bmhdata(); +#endif + + atom.type = st_success; + atom.next1 = 0; + atom.next2 = 0; + this->NFA_states.push_back(atom); + + optimise(); + relativejump_to_absolutejump(); + + return true; + } + + bool make_nfa_states(state_array &piece, re_quantifier &piececharlen, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + typename state_array::size_type prevbranch_end = 0; + state_type atom; + state_array branch; + re_quantifier branchsize; + + piececharlen.reset(0); + + for (;;) + { + branch.clear(); + + if (!make_branch(branch, branchsize, curpos, end, cstate)) + return false; + + // For piececharlen.atleast, 0 as the initial value and 0 as an + // actual value must be distinguished. + if (piececharlen.atmost == 0 || piececharlen.atleast > branchsize.atleast) + piececharlen.atleast = branchsize.atleast; + + if (piececharlen.atmost < branchsize.atmost) + piececharlen.atmost = branchsize.atmost; + + if (curpos != end && *curpos == meta_char::mc_bar) + { + atom.reset(); + atom.character = meta_char::mc_bar; + atom.type = st_epsilon; + atom.next2 = static_cast(branch.size()) + 2; + branch.insert(0, atom); + } + + if (prevbranch_end) + piece[prevbranch_end].next1 = static_cast(branch.size()) + 1; + + piece += branch; + + // end or ')' + if (curpos == end || *curpos == meta_char::mc_rbracl) + break; + + // *curpos == '|' + + prevbranch_end = piece.size(); + atom.reset(); + atom.type = st_epsilon; + piece.push_back(atom); + + ++curpos; + } + return true; + } + + bool make_branch(state_array &branch, re_quantifier &branchsize, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + state_array piece; + state_array piece_with_quantifier; + re_quantifier quantifier; + + branchsize.reset(0); + + for (;;) + { + re_quantifier piececharlen; + + if (curpos == end) + return true; + + piece.clear(); + piece_with_quantifier.clear(); + + switch (*curpos) + { +// case char_ctrl::cc_nul: // '\0': + case meta_char::mc_bar: // '|': + case meta_char::mc_rbracl: // ')': + return true; + + default: + if (!get_atom(piece, piececharlen, curpos, end, cstate)) + return false; + } + + if (piece.size()) + { + const state_type &firstatom = piece[0]; + + quantifier.reset(); // quantifier.atleast = quantifier.atmost = 1; + + if (firstatom.has_quantifier()) + { + if (curpos != end && !get_quantifier(quantifier, curpos, end)) + return false; + } + + if (piece.size() == 2 && firstatom.is_noncapturinggroup() && piece[1].is_noncapturinggroup()) + { + // (?:) alone or followed by a quantifier. +// piece_with_quantifier += piece; + ; // Do nothing. + } + else + combine_piece_with_quantifier(piece_with_quantifier, piece, quantifier, piececharlen); + +#if 01 + piececharlen.multiply(quantifier); + branchsize.add(piececharlen); +#else + branchsize.atleast += piececharlen.atleast * quantifier.atleast; + if (!branchsize.is_infinity()) + { + if (piececharlen.is_infinity() || quantifier.is_infinity()) + branchsize.set_infinity(); + else + branchsize.atmost += piececharlen.atmost * quantifier.atmost; + } +#endif + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + + if (!cstate.back) + branch += piece_with_quantifier; + else + branch.insert(0, piece_with_quantifier); +#else + branch += piece_with_quantifier; +#endif + } + } + } + + bool get_atom(state_array &piece, re_quantifier &atomsize, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + state_type atom; + + atom.reset(); + atom.character = *curpos++; + + switch (atom.character) + { + case meta_char::mc_rbraop: // '(': + return get_piece_in_roundbrackets(piece, atomsize, curpos, end, cstate); + + case meta_char::mc_sbraop: // '[': + if (!register_character_class(atom, curpos, end, cstate)) + return false; + + break; + + case meta_char::mc_escape: // '\\': + if (!translate_atom_escape(atom, curpos, end, cstate)) + return false; + + break; + + case meta_char::mc_period: // '.': + atom.type = st_character_class; +#if !defined(SRELL_NO_SINGLELINE) + if (this->is_dotall()) + { + atom.number = static_cast(re_character_class::dotall); + } + else +#endif + { +// atom.number = static_cast(re_character_class::newline); + range_pairs nlclass = this->character_class[static_cast(re_character_class::newline)]; + + nlclass.negation(); + atom.number = this->character_class.register_newclass(nlclass); + } + break; + + case meta_char::mc_caret: // '^': + atom.type = st_bol; + atom.quantifier.reset(0); +// if (current_flags.m) + if (is_multiline()) + atom.multiline = true; + break; + + case meta_char::mc_dollar: // '$': + atom.type = st_eol; + atom.quantifier.reset(0); +// if (current_flags.m) + if (is_multiline()) + atom.multiline = true; + break; + + case meta_char::mc_astrsk: // '*': + case meta_char::mc_plus: // '+': + case meta_char::mc_query: // '?': + case meta_char::mc_cbraop: // '{' + this->throw_error(regex_constants::error_badrepeat); + + default:; + } + + if (atom.type == st_character) + { + if (this->is_icase()) + atom.character = unicode_case_folding::do_casefolding(atom.character); + } + + piece.push_back(atom); + atomsize = atom.quantifier; + + return true; + } + + // '('. + + bool get_piece_in_roundbrackets(state_array &piece, re_quantifier &piececharlen, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + const re_compiler_state original_cstate(cstate); + state_type atom; + + if (curpos == end) + this->throw_error(regex_constants::error_paren); + + atom.reset(); + atom.type = st_roundbracket_open; + + if (*curpos == meta_char::mc_query) // '?' + { + if (!extended_roundbrackets(piece, atom, ++curpos, end, cstate)) + return false; + } + + if (atom.type == st_roundbracket_open) + { + push_bracket_open(piece, atom); + } + +// if (curpos == end) +// this->throw_error(regex_constants::error_paren); + + if (!make_nfa_states(piece, piececharlen, curpos, end, cstate)) + return false; + + // end or ')'? + if (curpos == end) + this->throw_error(regex_constants::error_paren); + + ++curpos; + + cstate.restore_from(original_cstate); + + switch (atom.type) + { + case st_epsilon: + +// if (piece.size() <= 2) // ':' or ':' + one. + if (piece.size() == 2) // ':' + something. + { + piece.erase(0); + return true; + } + + piece[0].quantifier.atmost = this->number_of_brackets - 1; + break; + +// case st_lookaround_pop: + case st_lookaround_open: + { + state_type &firstatom = piece[0]; + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) +// if (firstatom.reverse) + if (firstatom.quantifier.atleast) // > 0 means lookbehind. + { + if (!piececharlen.is_same() || piececharlen.is_infinity()) + this->throw_error(regex_constants::error_lookbehind); + + firstatom.quantifier = piececharlen; + } +#endif + +#if defined(SRELL_ENABLE_GT) + if (firstatom.character != meta_char::mc_gt) +#endif + piececharlen.reset(0); + + firstatom.next1 = static_cast(piece.size()) + 1; + + atom.type = st_lookaround_close; + atom.next1 = 0; + atom.next2 = 0; + } + break; + + default: + set_bracket_close(piece, atom, piececharlen, cstate); + } + + piece.push_back(atom); + return true; + } + + bool extended_roundbrackets(state_array &piece, state_type &atom, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + bool lookbehind = false; +#endif + + if (curpos == end) + this->throw_error(regex_constants::error_paren); + + atom.character = *curpos; + + if (atom.character == meta_char::mc_lt) // '<' + { +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + lookbehind = true; +#endif + if (++curpos == end) + this->throw_error(regex_constants::error_paren); + + atom.character = *curpos; + + if (atom.character != meta_char::mc_eq && atom.character != meta_char::mc_exclam) + { +#if !defined(SRELL_NO_NAMEDCAPTURE) + return parse_groupname(curpos, end, cstate); +#else + this->throw_error(regex_constants::error_paren); +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + } + } + else + atom.quantifier.atleast = 0; + // Sets atleast to 0 for other assertions than lookbehinds. The automaton + // checks atleast to know whether lookbehinds or other assertions. + + switch (atom.character) + { + case meta_char::mc_colon: + atom.type = st_epsilon; + atom.quantifier.atleast = this->number_of_brackets; + break; + + case meta_char::mc_exclam: // '!': + atom.is_not = true; + //@fallthrough@ + + case meta_char::mc_eq: // '=': +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + cstate.back = lookbehind; +#else +// atom.reverse = lookbehind; +#endif + +#if defined(SRELL_ENABLE_GT) + case meta_char::mc_gt: +#endif + atom.type = st_lookaround_open; + atom.next2 = 1; + break; + + default: + this->throw_error(regex_constants::error_paren); + } + + ++curpos; + piece.push_back(atom); + return true; + } + + void push_bracket_open(state_array &piece, state_type &atom) + { + atom.number = this->number_of_brackets; + atom.next1 = 2; + atom.next2 = 1; + piece.push_back(atom); + ++this->number_of_brackets; + + atom.type = st_roundbracket_pop; + atom.next1 = 0; + atom.next2 = 0; + piece.push_back(atom); + } + + void set_bracket_close(state_array &piece, state_type &atom, const re_quantifier &piececharlen, re_compiler_state &cstate) + { +// uint_l32 max_bracketno = atom.number; + + atom.type = st_roundbracket_close; + atom.next1 = 1; + atom.next2 = 1; +#if 0 + for (typename state_array::size_type i = 0; i < piece.size(); ++i) + { + const state_type &state = piece[i]; + + if (state.type == st_roundbracket_open && max_bracketno < state.number) + max_bracketno = state.number; + } +#endif + + re_quantifier &rb_open = piece[0].quantifier; + re_quantifier &rb_pop = piece[1].quantifier; + + rb_open.atleast = rb_pop.atleast = atom.number + 1; + rb_open.atmost = rb_pop.atmost = this->number_of_brackets - 1; // max_bracketno; + + if (cstate.atleast_widths_of_brackets.size() < atom.number) + cstate.atleast_widths_of_brackets.resize(atom.number, 0); + + cstate.atleast_widths_of_brackets[atom.number - 1] = piececharlen.atleast; + } + + void combine_piece_with_quantifier(state_array &piece_with_quantifier, state_array &piece, const re_quantifier &quantifier, const re_quantifier &piececharlen) + { + state_type &firstatom = piece[0]; +// const bool firstpiece_is_roundbracket_open = (firstatom.type == st_roundbracket_open); + const bool piece_has_0widthchecker = firstatom.has_0widthchecker(); + const bool piece_is_noncapturinggroup_contaning_capturinggroup = firstatom.is_noncapturinggroup() && firstatom.quantifier.is_valid(); + state_type atom; + + if (quantifier.atmost == 0) + return; + + atom.reset(); + atom.quantifier = quantifier; + if (firstatom.is_character_or_class()) + atom.character = meta_char::mc_astrsk; // For nextpos_optimisation1_3(). + + if (quantifier.atmost == 1) + { + if (quantifier.atleast == 0) + { + atom.type = st_epsilon; + atom.next2 = static_cast(piece.size()) + 1; + + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + + if (atom.character == meta_char::mc_astrsk) + firstatom.quantifier = quantifier; + + piece_with_quantifier.push_back(atom); + // (push) + } + + if (piece.size() >= 2 && firstatom.type == st_roundbracket_open && piece[1].type == st_roundbracket_pop) + { + firstatom.quantifier.atmost = 0u; + piece[1].quantifier.atmost = 0u; + } + + piece_with_quantifier += piece; + return; + } + + // atmost >= 2 + +#if !defined(SRELLDBG_NO_SIMPLEEQUIV) + // The counter requires at least 6 states: save, restore, check, inc, dec, atom(s). + // A character or charclass quantified by one of these has a simple equivalent representation: + // a{0,2} 1.epsilon(2|5), 2.CHorCL(3), 3.epsilon(4|5), 4.CHorCL(5), [5]. + // a{0,3} 1.epsilon(2|7), 2.CHorCL(3), 3.epsilon(4|7), 4.CHorCL(5), 5.epsilon(6|7), 6.CHorCL(7), [7]. + // a{1,2} 1.CHorCL(2), 2.epsilon(3|4), 3.CHorCL(4), [4]. + // a{1,3} 1.CHorCL(2), 2.epsilon(3|6), 3.CHorCL(4), 4.epsilon(5|6), 5.CHorCL(6), [6]. + // a{2,3} 1.CHorCL(2), 2.CHorCL(3), 3.epsilon(4|5), 4.CHorCL(5), [5]. + // a{2,4} 1.CHorCL(2), 2.CHorCL(3), 3.epsilon(4|7), 4.CHorCL(5), 5.epsilon(6|7), 6.CHorCL(7), [7]. + if (piece.size() == 1 && firstatom.is_character_or_class() && quantifier.has_simple_equivalence()) + { + const typename state_array::size_type branchsize = piece.size() + 1; + + for (uint_l32 i = 0; i < quantifier.atleast; ++i) + piece_with_quantifier += piece; + + if (atom.character == meta_char::mc_astrsk) + firstatom.quantifier.set(0, 1, quantifier.is_greedy); + + atom.type = st_epsilon; + atom.next2 = (quantifier.atmost - quantifier.atleast) * branchsize; + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + for (uint_l32 i = quantifier.atleast; i < quantifier.atmost; ++i) + { + piece_with_quantifier.push_back(atom); + piece_with_quantifier += piece; + quantifier.is_greedy ? (atom.next2 -= branchsize) : (atom.next1 -= branchsize); + } + return; + } +#endif // !defined(SRELLDBG_NO_SIMPLEEQUIV) + + atom.type = st_epsilon; + if (quantifier.is_asterisk()) // {0,} + { + // greedy: 1.epsilon(2|4), 2.piece, 3.LAorC0WR(1|0), 4.OutOfLoop. + // !greedy: 1.epsilon(4|2), 2.piece, 3.LAorC0WR(1|0), 4.OutOfLoop. + // LAorC0WR: LastAtomOfPiece or Check0WidthRepeat. + // atom.type points to 1. + } + else if (quantifier.is_plus()) // {1,} + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + + if (piece.size() == 1 && firstatom.is_character_or_class()) + { + piece_with_quantifier += piece; + --atom.quantifier.atleast; // /.+/ -> /..*/. + } + else +#endif + { + atom.next1 = 2; + atom.next2 = 0; + piece_with_quantifier.push_back(atom); + // greedy: 1.epsilon(3), 2.epsilon(3|5), 3.piece, 4.LAorC0WR(2|0), 5.OutOfLoop. + // !greedy: 1.epsilon(3), 2.epsilon(5|3), 3.piece, 4.LAorC0WR(2|0), 5.OutOfLoop. + // atom.type points to 2. + } + } + else + { + atom.number = this->number_of_counters; + ++this->number_of_counters; + + atom.type = st_save_and_reset_counter; + atom.next1 = 2; + atom.next2 = 1; + piece_with_quantifier.push_back(atom); + + atom.type = st_restore_counter; + atom.next1 = 0; + atom.next2 = 0; + piece_with_quantifier.push_back(atom); + // 1.save_and_reset_counter(3|2), 2.restore_counter(0|0), + + atom.next1 = 0; + atom.next2 = 0; + atom.type = st_decrement_counter; + piece.insert(0, atom); + + atom.next1 = 2; +// atom.next2 = piece[1].is_character_or_class() ? 0 : 1; +// atom.next2 = 0; + for (state_size_type i = 1; i < piece.size(); ++i) + { + const state_type &state = piece[i]; + + if (state.is_character_or_class() || (state.type == st_epsilon && state.next2 == 0)) + ; + else + { + atom.next2 = 1; + break; + } + } + atom.type = st_epsilon; // st_increment_counter; + piece.insert(0, atom); + piece[0].number = 0; + + atom.type = st_check_counter; + // greedy: 3.check_counter(4|6), 4.piece, 5.LAorC0WR(3|0), 6.OutOfLoop. + // !greedy: 3.check_counter(6|4), 4.piece, 5.LAorC0WR(3|0), 6.OutOfLoop. + // 4.piece = { 4a.increment_counter(4c|4b), 4b.decrement_counter(0|0), 4c.OriginalPiece }. + } + + // atom.type is epsilon or check_counter. + // Its "next"s point to piece and OutOfLoop. + + if (!piece_is_noncapturinggroup_contaning_capturinggroup && (piececharlen.atleast || piece_has_0widthchecker)) + { + const typename state_array::size_type piece_size = piece.size(); + state_type &lastatom = piece[piece_size - 1]; + + lastatom.next1 = 0 - static_cast(piece_size); + // Points to the one immediately before piece, which will be pushed last in this block. + + // atom.type has already been set. epsilon or check_counter. + atom.next1 = 1; + atom.next2 = static_cast(piece_size) + 1; + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + piece_with_quantifier.push_back(atom); + } + else + { + // atom.type has already been set. epsilon or check_counter. + atom.next1 = 1; + atom.next2 = static_cast(piece.size()) + 4; // To OutOfLoop. + // The reason for +3 than above is that push, pop, and check_0_width are added below. + if (!quantifier.is_greedy) + { + atom.next1 = atom.next2; + atom.next2 = 1; + } + piece_with_quantifier.push_back(atom); // *1 + + atom.number = this->number_of_repeats; + ++this->number_of_repeats; + + const state_size_type org1stpos = (atom.type == st_check_counter) ? 2 : 0; + + if (piece_is_noncapturinggroup_contaning_capturinggroup) + atom.quantifier = piece[org1stpos].quantifier; + else + atom.quantifier.set(1, 0); + + atom.type = st_repeat_in_pop; + atom.next1 = 0; + atom.next2 = 0; + piece.insert(org1stpos, atom); + + atom.type = st_repeat_in_push; + atom.next1 = 2; + atom.next2 = 1; + piece.insert(org1stpos, atom); + + atom.type = st_check_0_width_repeat; + atom.next1 = 0 - static_cast(piece.size()) - 1; // Points to *1. + atom.next2 = 1; + piece.push_back(atom); + // greedy: 1.epsilon(2|6), + // !greedy: 1.epsilon(6|2), + // 2.repeat_in_push(4|3), 3.repeat_in_pop(0|0), 4.piece, + // 5.check_0_width_repeat(1|6), 6.OutOfLoop. + // or + // greedy: 1.check_counter(2|8), + // !greedy: 1.check_counter(8|2), + // 2.increment_counter(4|3), 3.decrement_counter(0|0) + // 4.repeat_in_push(6|5), 5.repeat_in_pop(0|0), 6.piece, + // 7.check_0_width_repeat(1|8), 8.OutOfLoop. + } + piece_with_quantifier += piece; + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + bool parse_groupname(const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + const gname_string groupname = get_groupname(curpos, end, cstate); + + if (!this->namedcaptures.push_back(groupname, this->number_of_brackets)) + this->throw_error(regex_constants::error_backref); + + return true; + } +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + // '['. + + bool register_character_class(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, const re_compiler_state & /* cstate */) + { + range_pair code_range; + range_pairs ranges; + state_type classatom; + + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + atom.type = st_character_class; + + if (*curpos == meta_char::mc_caret) // '^' + { + atom.is_not = true; + ++curpos; + } + + for (;;) + { + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + if (*curpos == meta_char::mc_sbracl) // ']' + break; + + classatom.reset(); + + if (!get_character_in_class(classatom, curpos, end)) + return false; + + if (classatom.type == st_character_class) + { + add_predefclass_to_charclass(ranges, classatom); + continue; + } + + code_range.first = code_range.second = classatom.character; + + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + if (*curpos == meta_char::mc_minus) // '-' + { + ++curpos; + + if (curpos == end) + this->throw_error(regex_constants::error_brack); + + if (*curpos == meta_char::mc_sbracl) + { + PUSH_SEPARATELY: + ranges.join(code_range); + code_range.first = code_range.second = meta_char::mc_minus; + } + else + { + if (!get_character_in_class(classatom, curpos, end)) + return false; + + if (classatom.type == st_character_class) + { + add_predefclass_to_charclass(ranges, classatom); + goto PUSH_SEPARATELY; + } + + code_range.second = classatom.character; + + if (!code_range.is_range_valid()) + this->throw_error(regex_constants::error_range); + } + } + ranges.join(code_range); + } + + // *curpos == ']' + ++curpos; + if (this->is_icase()) + ranges.make_caseunfoldedcharset(); + + if (atom.is_not) + { + ranges.negation(); + atom.is_not = false; + } + +// atom.character = this->is_icase() ? ranges.template consists_of_one_character() : ranges.template consists_of_one_character(); + atom.character = ranges.consists_of_one_character(this->is_icase()); + + if (atom.character != constants::invalid_u32value) + { + atom.type = st_character; + return true; + } + + atom.number = this->character_class.register_newclass(ranges); + + return true; + } + + bool get_character_in_class(state_type &atom, const uchar32 *&curpos, const uchar32 *const end /* , const re_compiler_state &cstate */) + { + atom.character = *curpos++; + + return atom.character != meta_char::mc_escape // '\\' + || translate_escseq(atom, curpos, end); + } + + void add_predefclass_to_charclass(range_pairs &cls, const state_type &classatom) + { + range_pairs predefclass = this->character_class[classatom.number]; + + if (classatom.is_not) + predefclass.negation(); + + cls.merge(predefclass); + } + + // Escape characters which appear both in and out of [] pairs. + bool translate_escseq(state_type &atom, const uchar32 *&curpos, const uchar32 *const end) + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + atom.character = *curpos++; + + switch (atom.character) + { + // Predefined classes. + + case char_alnum::ch_D: // 'D': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_d: // 'd': + atom.number = static_cast(re_character_class::digit); // \d, \D. + atom.type = st_character_class; + break; + + case char_alnum::ch_S: // 'S': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_s: // 's': + atom.number = static_cast(re_character_class::space); // \s, \S. + atom.type = st_character_class; + break; + + case char_alnum::ch_W: // 'W': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_w: // 'w': + if (this->is_icase()) + { + this->character_class.setup_icase_word(); + atom.number = static_cast(re_character_class::icase_word); + } + else + atom.number = static_cast(re_character_class::word); // \w, \W. + atom.type = st_character_class; + break; + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + // Prepared for Unicode properties and script names. + case char_alnum::ch_P: // \P{...} + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_p: // \p{...} + atom.number = get_property_number(curpos, end); + atom.type = st_character_class; + break; +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + case char_alnum::ch_b: + atom.character = char_ctrl::cc_bs; // '\b' 0x08:BS + break; + + case char_alnum::ch_t: + atom.character = char_ctrl::cc_htab; // '\t' 0x09:HT + break; + + case char_alnum::ch_n: + atom.character = char_ctrl::cc_nl; // '\n' 0x0a:LF + break; + + case char_alnum::ch_v: + atom.character = char_ctrl::cc_vtab; // '\v' 0x0b:VT + break; + + case char_alnum::ch_f: + atom.character = char_ctrl::cc_ff; // '\f' 0x0c:FF + break; + + case char_alnum::ch_r: + atom.character = char_ctrl::cc_cr; // '\r' 0x0d:CR + break; + + case char_alnum::ch_c: // \cX + if (curpos != end) + { +// atom.character = static_cast(utf_traits().codepoint_inc(curpos, end) & 0x1f); // *curpos++ + atom.character = static_cast(*curpos | constants::asc_icase); + + if (atom.character >= char_alnum::ch_a && atom.character <= char_alnum::ch_z) + atom.character = static_cast(*curpos++ & 0x1f); + else + { + this->throw_error(regex_constants::error_escape); // Strict. +// atom.character = char_alnum::ch_c; // Loose. + } + } + break; + + case char_alnum::ch_0: + atom.character = char_ctrl::cc_nul; // '\0' 0x00:NUL + break; + + case char_alnum::ch_u: // \uhhhh, \u{h~hhhhhh} + atom.character = parse_escape_u(curpos, end); + break; + + case char_alnum::ch_x: // \xhh + atom.character = translate_numbers(curpos, end, 16, 2, 2, 0xff); + break; + + // SyntaxCharacter, '/', and '-'. + case meta_char::mc_caret: // '^' + case meta_char::mc_dollar: // '$' + case meta_char::mc_escape: // '\\' + case meta_char::mc_period: // '.' + case meta_char::mc_astrsk: // '*' + case meta_char::mc_plus: // '+' + case meta_char::mc_query: // '?' + case meta_char::mc_rbraop: // '(' + case meta_char::mc_rbracl: // ')' + case meta_char::mc_sbraop: // '[' + case meta_char::mc_sbracl: // ']' + case meta_char::mc_cbraop: // '{' + case meta_char::mc_cbracl: // '}' + case meta_char::mc_bar: // '|' + case char_other::co_slash: // '/' + case meta_char::mc_minus: // '-' allowed only in charclass. + break; + + default: + atom.character = constants::invalid_u32value; + } + + if (atom.character == constants::invalid_u32value) + this->throw_error(regex_constants::error_escape); + + return true; + } + + uchar32 parse_escape_u(const uchar32 *&curpos, const uchar32 *const end) const + { + uchar32 ucp; + + if (curpos == end) + return constants::invalid_u32value; + + if (*curpos == meta_char::mc_cbraop) + { +// ucp = translate_numbers(++curpos, end, 16, 1, 6, constants::unicode_max_codepoint, true); + ucp = translate_numbers(++curpos, end, 16, 1, 0, constants::unicode_max_codepoint); + + if (curpos == end || *curpos != meta_char::mc_cbracl) + return constants::invalid_u32value; + + ++curpos; + } + else + { + ucp = translate_numbers(curpos, end, 16, 4, 4, 0xffff); + + if (ucp >= 0xd800 && ucp <= 0xdbff) + { + const uchar32 * prefetch = curpos; + + if (prefetch != end && *prefetch == meta_char::mc_escape && ++prefetch != end && *prefetch == char_alnum::ch_u) + { + const uchar32 nextucp = translate_numbers(++prefetch, end, 16, 4, 4, 0xffff); + + if (nextucp >= 0xdc00 && nextucp <= 0xdfff) + { + curpos = prefetch; + ucp = (((ucp << 10) & 0xffc00) | (nextucp & 0x3ff)) + 0x10000; + } + } + } + } + return ucp; + } + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + uint_l32 get_property_number(const uchar32 *&curpos, const uchar32 *const end) + { + if (curpos == end || *curpos != meta_char::mc_cbraop) // '{' + this->throw_error(regex_constants::error_escape); + + pstring pname; + pstring pvalue(get_property_name_or_value(++curpos, end)); + + if (!pvalue.size()) + this->throw_error(regex_constants::error_escape); + + if (static_cast(pvalue[pvalue.size() - 1]) != char_other::co_sp) // ' ', not a value. + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + if (*curpos == meta_char::mc_eq) // '=' + { + pname = pvalue; + pvalue = get_property_name_or_value(++curpos, end); + if (!pvalue.size()) + this->throw_error(regex_constants::error_escape); + } + } + + if (curpos == end || *curpos != meta_char::mc_cbracl) // '}' + this->throw_error(regex_constants::error_escape); + + if (static_cast(pvalue[pvalue.size() - 1]) == char_other::co_sp) // ' ', value. + pvalue.resize(pvalue.size() - 1); + + ++curpos; + + const uint_l32 class_number = this->character_class.lookup_property(pname, pvalue, this->is_icase()); + + if (class_number == re_character_class::error_property) + this->throw_error(regex_constants::error_escape); + + return class_number; + } + + pstring get_property_name_or_value(const uchar32 *&curpos, const uchar32 *const end) const + { + pstring name_or_value; + bool number_found = false; + + for (;; ++curpos) + { + if (curpos == end) + break; + + const uchar32 curchar = *curpos; + + if (curchar >= char_alnum::ch_A && curchar <= char_alnum::ch_Z) + ; + else if (curchar >= char_alnum::ch_a && curchar <= char_alnum::ch_z) + ; + else if (curchar == char_other::co_ll) // '_' + ; + else if (curchar >= char_alnum::ch_0 && curchar <= char_alnum::ch_9) + number_found = true; + else + break; + + name_or_value.append(1, static_cast(curchar)); + } + if (number_found) + name_or_value.append(1, char_other::co_sp); // ' ' + + return name_or_value; + } +#endif // !defined(SRELL_NO_UNICODE_PROPERTY) + + // Escape characters which do not appear in [] pairs. + + bool translate_atom_escape(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, /* const */ re_compiler_state &cstate) + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + atom.character = *curpos; + + switch (atom.character) + { + case meta_char::mc_minus: // '-' + this->throw_error(regex_constants::error_escape); + //@fallthrough@ + + case char_alnum::ch_B: // 'B': + atom.is_not = true; + //@fallthrough@ + + case char_alnum::ch_b: // 'b': + atom.type = st_boundary; // \b, \B. + atom.quantifier.reset(0); +// atom.number = 0; + if (this->is_icase()) + { + this->character_class.setup_icase_word(); + atom.number = static_cast(re_character_class::icase_word); + } + else + atom.number = static_cast(re_character_class::word); // \w, \W. + break; + +// case char_alnum::ch_A: // 'A': +// atom.type = st_bol; // '\A' +// case char_alnum::ch_Z: // 'Z': +// atom.type = st_eol; // '\Z' +// case char_alnum::ch_z: // 'z': +// atom.type = st_eol; // '\z' + + // Backreferences. + +#if !defined(SRELL_NO_NAMEDCAPTURE) + // Prepared for named captures. + case char_alnum::ch_k: // 'k': + return parse_backreference_name(atom, curpos, end, cstate); // \k. +#endif + + default: + + if (atom.character >= char_alnum::ch_1 && atom.character <= char_alnum::ch_9) // \1, \9. + return parse_backreference_number(atom, curpos, end, cstate); + + translate_escseq(atom, curpos, end); + + if (atom.type == st_character_class) + { + range_pairs newclass = this->character_class[atom.number]; + + if (atom.is_not) + { + newclass.negation(); + atom.is_not = false; + } + + if (this->is_icase() && atom.number >= static_cast(re_character_class::number_of_predefcls)) + newclass.make_caseunfoldedcharset(); + + atom.number = this->character_class.register_newclass(newclass); + } + return true; + } + + ++curpos; + return true; + } + + bool parse_backreference_number(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, const re_compiler_state &cstate) + { + const uchar32 backrefno = translate_numbers(curpos, end, 10, 0, 0, 0xfffffffe); + // 22.2.1.1 Static Semantics: Early Errors: + // It is a Syntax Error if NcapturingParens >= 23^2 - 1. + + if (backrefno == constants::invalid_u32value) + this->throw_error(regex_constants::error_escape); + + atom.number = static_cast(backrefno); + atom.backrefnumber_unresolved = false; + + return backreference_postprocess(atom, cstate); + } + + bool backreference_postprocess(state_type &atom, const re_compiler_state & /* cstate */) const + { + atom.next2 = 1; + atom.type = st_backreference; + +// atom.quantifier.atleast = cstate.atleast_widths_of_brackets[atom.number - 1]; + // Moved to check_backreferences(). + + return true; + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + bool parse_backreference_name(state_type &atom, const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) + { + if (++curpos == end || *curpos != meta_char::mc_lt) + this->throw_error(regex_constants::error_escape); + + const gname_string groupname = get_groupname(++curpos, end, cstate); + + atom.number = this->namedcaptures[groupname]; + + if (atom.number != groupname_mapper::notfound) + atom.backrefnumber_unresolved = false; + else + { + atom.backrefnumber_unresolved = true; + atom.number = static_cast(cstate.unresolved_gnames.size()); + cstate.unresolved_gnames.push_back(groupname, atom.number); + } + + return backreference_postprocess(atom, cstate); + } + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + gname_string get_groupname(const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &cstate) +#else + gname_string get_groupname(const uchar32 *&curpos, const uchar32 *const end, re_compiler_state &) +#endif + { + charT mbstr[utf_traits::maxseqlen]; + gname_string groupname; + +#if !defined(SRELL_NO_UNICODE_PROPERTY) + cstate.idchecker.setup(); +#endif + for (;;) + { + if (curpos == end) + this->throw_error(regex_constants::error_escape); + + uchar32 curchar = *curpos++; + + if (curchar == meta_char::mc_gt) // '>' + break; + + if (curchar == meta_char::mc_escape && curpos != end && *curpos == char_alnum::ch_u) // '\\', 'u'. + curchar = parse_escape_u(++curpos, end); + +#if defined(SRELL_NO_UNICODE_PROPERTY) + if (curchar != meta_char::mc_escape) +#else + if (cstate.idchecker.is_identifier(curchar, groupname.size() != 0)) +#endif + ; // OK. + else + curchar = constants::invalid_u32value; + + if (curchar == constants::invalid_u32value) + this->throw_error(regex_constants::error_escape); + + const uchar32 seqlen = utf_traits::to_codeunits(mbstr, curchar); + for (uchar32 i = 0; i < seqlen; ++i) + groupname.append(1, mbstr[i]); + } + if (!groupname.size()) + this->throw_error(regex_constants::error_escape); + + return groupname; + } +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + bool get_quantifier(re_quantifier &quantifier, const uchar32 *&curpos, const uchar32 *const end) + { + switch (*curpos) + { + case meta_char::mc_astrsk: // '*': + --quantifier.atleast; + //@fallthrough@ + + case meta_char::mc_plus: // '+': + quantifier.set_infinity(); + break; + + case meta_char::mc_query: // '?': + --quantifier.atleast; + break; + + case meta_char::mc_cbraop: // '{': + get_brace_with_quantifier(quantifier, curpos, end); + break; + + default: + return true; + } + + if (++curpos != end && *curpos == meta_char::mc_query) // '?' + { + quantifier.is_greedy = false; + ++curpos; + } + return true; + } + + void get_brace_with_quantifier(re_quantifier &quantifier, const uchar32 *&curpos, const uchar32 *const end) + { + ++curpos; + + quantifier.atleast = static_cast(translate_numbers(curpos, end, 10, 1, 0, constants::max_u32value)); + + if (quantifier.atleast == static_cast(constants::invalid_u32value)) + goto THROW_ERROR_BRACE; + + if (curpos == end) + goto THROW_ERROR_BRACE; + + if (*curpos == meta_char::mc_comma) // ',' + { + ++curpos; + + quantifier.atmost = static_cast(translate_numbers(curpos, end, 10, 1, 0, constants::max_u32value)); + + if (quantifier.atmost == static_cast(constants::invalid_u32value)) + quantifier.set_infinity(); + + if (!quantifier.is_valid()) + this->throw_error(regex_constants::error_badbrace); + } + else + quantifier.atmost = quantifier.atleast; + + if (curpos == end || *curpos != meta_char::mc_cbracl) // '}' + { + THROW_ERROR_BRACE: + this->throw_error(regex_constants::error_brace); + } + // *curpos == '}' + } + + uchar32 translate_numbers(const uchar32 *&curpos, const uchar32 *const end, const int radix, const std::size_t minsize, const std::size_t maxsize, const uchar32 maxvalue) const + { + std::size_t count = 0; + uchar32 u32value = 0; + int num; + + for (; maxsize == 0 || count < maxsize; ++curpos, ++count) + { + + if (curpos == end || (num = tonumber(*curpos, radix)) == -1) + break; + + const uchar32 nextvalue = u32value * radix + num; + + if ((/* maxvalue != 0 && */ nextvalue > maxvalue) || nextvalue < u32value) + break; + + u32value = nextvalue; + } + + if (count >= minsize) + return u32value; + + return constants::invalid_u32value; + } + + int tonumber(const uchar32 ch, const int radix) const + { + if ((ch >= char_alnum::ch_0 && ch <= char_alnum::ch_7) || (radix >= 10 && (ch == char_alnum::ch_8 || ch == char_alnum::ch_9))) + return static_cast(ch - char_alnum::ch_0); + + if (radix == 16) + { + if (ch >= char_alnum::ch_a && ch <= char_alnum::ch_f) + return static_cast(ch - char_alnum::ch_a + 10); + + if (ch >= char_alnum::ch_A && ch <= char_alnum::ch_F) + return static_cast(ch - char_alnum::ch_A + 10); + } + return -1; + } + + bool check_backreferences(re_compiler_state &cstate) + { + for (typename state_array::size_type backrefpos = 0; backrefpos < this->NFA_states.size(); ++backrefpos) + { + state_type &brs = this->NFA_states[backrefpos]; + + if (brs.type == st_backreference) + { + const uint_l32 &backrefno = brs.number; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + if (brs.backrefnumber_unresolved) + { + if (backrefno >= cstate.unresolved_gnames.size()) + return false; // Internal error. + + brs.number = this->namedcaptures[cstate.unresolved_gnames[backrefno]]; + + if (backrefno == groupname_mapper::notfound) + return false; + + brs.backrefnumber_unresolved = false; + } +#endif + + for (typename state_array::size_type roundbracket_closepos = 0;; ++roundbracket_closepos) + { + if (roundbracket_closepos < this->NFA_states.size()) + { + const state_type &rbcs = this->NFA_states[roundbracket_closepos]; + + if (rbcs.type == st_roundbracket_close && rbcs.number == backrefno) + { + if (roundbracket_closepos < backrefpos) + { +// brs.quantifier.atleast = cstate.atleast_widths_of_brackets[backrefno - 1]; + // 20210429: It was reported that clang-tidy was dissatisfied with this code. + // 20211006: Replaced with the following code: + + const uint_l32 backrefnoindex = backrefno - 1; + + // This can never be true. Added only for satisfying clang-tidy. + if (backrefnoindex >= cstate.atleast_widths_of_brackets.size()) + return false; + + brs.quantifier.atleast = cstate.atleast_widths_of_brackets[backrefnoindex]; + + cstate.backref_used = true; + } + else + { + brs.type = st_epsilon; + brs.next2 = 0; + } + break; + } + } + else + return false; + } + } + } + return true; + } + +#if !defined(SRELLDBG_NO_1STCHRCLS) + + void create_firstchar_class() + { +#if !defined(SRELLDBG_NO_BITSET) + range_pairs fcc; +#else + range_pairs &fcc = this->firstchar_class; +#endif + + const bool canbe0length = gather_nextchars(fcc, static_cast(this->NFA_states[0].next1), 0u, false); + + if (canbe0length) + { + fcc.set_solerange(range_pair_helper(0, constants::unicode_max_codepoint)); + // Expressions would consist of assertions only, such as /^$/. + // We cannot but accept every codepoint. + } + +#if !defined(SRELLDBG_NO_BITSET) + this->NFA_states[0].quantifier.atleast = this->character_class.register_newclass(fcc); + + set_bitset_table(fcc); +#endif + } + +#if !defined(SRELLDBG_NO_BITSET) + void set_bitset_table(const range_pairs &fcc) + { + for (typename range_pairs::size_type i = 0; i < fcc.size(); ++i) + { + const range_pair &range = fcc[i]; + +#if 0 + uchar32 second = range.second <= constants::unicode_max_codepoint ? range.second : constants::unicode_max_codepoint; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (utf_traits::utftype == 16) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + if (second >= 0x10000 && range.first < 0x10000) + { + this->firstchar_class_bs.set_range(utf_traits::firstcodeunit(0x10000) & utf_traits::bitsetmask, utf_traits::firstcodeunit(second) & utf_traits::bitsetmask); + second = 0xffff; + } + } + this->firstchar_class_bs.set_range(utf_traits::firstcodeunit(range.first) & utf_traits::bitsetmask, utf_traits::firstcodeunit(second) & utf_traits::bitsetmask); + +#else + for (uchar32 ucp = range.first; ucp <= constants::unicode_max_codepoint; ++ucp) + { + this->firstchar_class_bs.set(utf_traits::firstcodeunit(ucp) & utf_traits::bitsetmask); + + if (ucp == range.second) + break; + } +#endif + } + } +#endif // !defined(SRELLDBG_NO_BITSET) +#endif // !defined(SRELLDBG_NO_1STCHRCLS) + + bool gather_nextchars(range_pairs &nextcharclass, typename state_array::size_type pos, simple_array &checked, const uint_l32 bracket_number, const bool subsequent) const + { + bool canbe0length = false; + + for (;;) + { + const state_type &state = this->NFA_states[pos]; + + if (checked[pos]) + break; + + checked[pos] = true; + + if (state.next2 + && (state.type != st_check_counter || !state.quantifier.is_greedy || state.quantifier.atleast == 0) + && (state.type != st_save_and_reset_counter) + && (state.type != st_roundbracket_open) + && (state.type != st_roundbracket_close || state.number != bracket_number) + && (state.type != st_repeat_in_push) + && (state.type != st_backreference || (state.quantifier.atleast == 0 && state.next1 != state.next2)) + && (state.type != st_lookaround_open)) + if (gather_nextchars(nextcharclass, pos + state.next2, checked, bracket_number, subsequent)) + canbe0length = true; + + switch (state.type) + { + case st_character: + nextcharclass.join(range_pair_helper(state.character)); + + if (this->is_ricase()) + nextcharclass.make_caseunfoldedcharset(); + + return canbe0length; + + case st_character_class: + nextcharclass.merge(this->character_class[state.number]); + return canbe0length; + + case st_backreference: + { + const typename state_array::size_type nextpos = find_next1_of_bracketopen(state.number); + + const bool length0 = gather_nextchars(nextcharclass, nextpos, state.number, subsequent); + + if (!length0) + return canbe0length; + } + break; + + case st_eol: + case st_bol: + if (!subsequent) + break; + + //@fallthrough@ + + case st_boundary: + if (subsequent) + nextcharclass.set_solerange(range_pair_helper(0, constants::unicode_max_codepoint)); + + break; + + case st_lookaround_open: +// if (!state.is_not && !state.reverse) + if (!state.is_not && state.quantifier.atleast == 0) + { + gather_nextchars(nextcharclass, pos + 1, checked, 0u, subsequent); + } + else if (subsequent) + nextcharclass.set_solerange(range_pair_helper(0, constants::unicode_max_codepoint)); + + break; + + case st_roundbracket_close: + if (/* bracket_number == 0 || */ state.number != bracket_number) + break; + //@fallthrough@ + + case st_success: // == st_lookaround_close. + return true; + + case st_check_counter: + if (!state.quantifier.is_greedy && state.quantifier.atleast >= 1) + return canbe0length; + //@fallthrough@ + + default:; + } + + if (state.next1) + pos += state.next1; + else + break; + } + return canbe0length; + } + + bool gather_nextchars(range_pairs &nextcharclass, const typename state_array::size_type pos, const uint_l32 bracket_number, const bool subsequent) const + { + simple_array checked; + + checked.resize(this->NFA_states.size(), false); + return gather_nextchars(nextcharclass, pos, checked, bracket_number, subsequent); + } + + typename state_array::size_type find_next1_of_bracketopen(const uint_l32 bracketno) const + { + for (typename state_array::size_type no = 0; no < this->NFA_states.size(); ++no) + { + const state_type &state = this->NFA_states[no]; + + if (state.type == st_roundbracket_open && state.number == bracketno) + return no + state.next1; + } + return 0; + } + + void relativejump_to_absolutejump() + { + for (typename state_array::size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + state_type &state = this->NFA_states[pos]; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (state.next1 || state.type == st_character || state.type == st_character_class) +#else + if (state.next1) +#endif + state.next_state1 = &this->NFA_states[pos + state.next1]; + else + state.next_state1 = NULL; + + if (state.next2) + state.next_state2 = &this->NFA_states[pos + state.next2]; + else + state.next_state2 = NULL; + } + } + + void optimise() + { +#if !defined(SRELLDBG_NO_BRANCH_OPT2) && !defined(SRELLDBG_NO_ASTERISK_OPT) + branch_optimisation2(); +#endif + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + asterisk_optimisation(); +#endif + +#if !defined(SRELLDBG_NO_BRANCH_OPT) && !defined(SRELLDBG_NO_ASTERISK_OPT) + branch_optimisation(); +#endif + +#if !defined(SRELLDBG_NO_1STCHRCLS) + create_firstchar_class(); +#endif + +#if !defined(SRELLDBG_NO_SKIP_EPSILON) + skip_epsilon(); +#endif + +#if !defined(SRELLDBG_NO_CCPOS) + set_charclass_posinfo(); +#endif + } + +#if !defined(SRELLDBG_NO_SKIP_EPSILON) + + void skip_epsilon() + { + for (typename state_array::size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + state_type &state = this->NFA_states[pos]; + + if (state.next1) + state.next1 = static_cast(skip_nonbranch_epsilon(pos + state.next1) - pos); + + if (state.next2) + state.next2 = static_cast(skip_nonbranch_epsilon(pos + state.next2) - pos); + } + } + + typename state_array::size_type skip_nonbranch_epsilon(typename state_array::size_type pos) const + { + for (;;) + { + const state_type &state = this->NFA_states[pos]; + + if (state.type == st_epsilon && state.next2 == 0) + { + pos += state.next1; + continue; + } + break; + } + return pos; + } + +#endif + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + + void asterisk_optimisation() + { + state_type *prevstate_is_astrskepsilon = NULL; + const state_type *prevcharstate = NULL; + state_size_type mnp_inspos = 0; + bool inspos_updatable = true; +#if !defined(SRELLDBG_NO_SPLITCC) + bool inserted = false; +#endif + + for (typename state_array::size_type cur = 1; cur < this->NFA_states.size(); ++cur) + { + state_type &curstate = this->NFA_states[cur]; + + switch (curstate.type) + { + case st_epsilon: + if (curstate.character == meta_char::mc_astrsk) + { + prevstate_is_astrskepsilon = &curstate; + } + else + { + prevstate_is_astrskepsilon = NULL; + inspos_updatable = false; + } + break; + + case st_character: + case st_character_class: + if (inspos_updatable) + { + if (prevcharstate) + { + if (prevcharstate->type != curstate.type || prevcharstate->number != curstate.number) + inspos_updatable = false; + } + if (inspos_updatable) + { + if (prevstate_is_astrskepsilon) + { + inspos_updatable = false; + if (prevstate_is_astrskepsilon->quantifier.is_asterisk_or_plus()) + { + mnp_inspos = cur + 1; + } + } + } + prevcharstate = &curstate; + } + if (prevstate_is_astrskepsilon) + { + const re_quantifier &eq = prevstate_is_astrskepsilon->quantifier; + const state_size_type epsilonno = cur - 1; + const state_size_type faroffset = eq.is_greedy ? prevstate_is_astrskepsilon->next2 : prevstate_is_astrskepsilon->next1; + const state_size_type nextno = epsilonno + faroffset; +#if !defined(SRELLDBG_NO_SPLITCC) + const state_size_type origlen = this->NFA_states.size(); +#endif + + if (is_exclusive_sequence(eq, cur, nextno)) + { + state_type &epsilonstate = this->NFA_states[epsilonno]; + state_type &curstate2 = this->NFA_states[cur]; + + epsilonstate.next1 = 1; + epsilonstate.next2 = 0; + epsilonstate.number = 0; +// curstate2.quantifier.is_greedy = true; + if (epsilonstate.quantifier.is_infinity()) + { + curstate2.next1 = 0; + curstate2.next2 = faroffset - 1; + } + else // ? or {0,1} + { + curstate2.next2 = faroffset - 1; + } + +#if !defined(SRELLDBG_NO_SPLITCC) + if (mnp_inspos == nextno && origlen != this->NFA_states.size()) + inserted = true; +#endif + } + prevstate_is_astrskepsilon = NULL; + } + break; + + default: + prevstate_is_astrskepsilon = NULL; + inspos_updatable = false; + } + } + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) + + if (mnp_inspos != 0) + { + state_size_type cur = mnp_inspos; + + if (this->NFA_states[cur].type != st_success) + { + const state_type &prevstate = this->NFA_states[cur - 1]; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) && !defined(SRELLDBG_NO_1STCHRCLS) && !defined(SRELLDBG_NO_BITSET) + +#if !defined(SRELLDBG_NO_SPLITCC) + if (!inserted && prevstate.next1 == 0) +#else + if (prevstate.next1 == 0) +#endif + { + range_pairs prevcc; + range_pairs nextcc; + +// gather_if_char_or_cc_strict(prevcc, prevstate); + if (prevstate.type == st_character) + { + prevcc.set_solerange(range_pair_helper(prevstate.character)); + } + else if (prevstate.type == st_character_class) + { + prevcc = this->character_class[prevstate.number]; + } + + gather_nextchars(nextcc, cur, 0u, true); + + const uint_l32 cpnum_prevcc = prevcc.total_codepoints(); + const uint_l32 cpnum_nextcc = nextcc.total_codepoints(); + + if (cpnum_nextcc != 0 && cpnum_nextcc < cpnum_prevcc) + { + state_array newNFAs; + state_type atom; + + atom.reset(); + atom.character = meta_char::mc_eq; // '=' + atom.type = st_lookaround_open; + atom.next1 = static_cast(cur - 1) * 2 + 2; + atom.next2 = 1; + atom.quantifier.atleast = 2; // Match point rewinder. + newNFAs.append(1, atom); + + newNFAs.append(this->NFA_states, 1, cur - 1); + + atom.type = st_lookaround_close; + atom.next1 = 0; + atom.next2 = 0; + newNFAs.append(1, atom); + + insert_at(1, newNFAs.size()); + this->NFA_states.replace(1, newNFAs.size(), newNFAs); + this->NFA_states[0].next2 = this->NFA_states[0].next1; + this->NFA_states[0].next1 = 1; + + return; + } + } +#endif // !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) && !defined(SRELLDBG_NO_1STCHRCLS) && !defined(SRELLDBG_NO_BITSET) + + insert_at(cur, 1); + state_type &mnpstate = this->NFA_states[cur]; + state_type &charstate = this->NFA_states[cur - 1]; + + mnpstate.type = st_move_nextpos; + +#if !defined(SRELLDBG_NO_SPLITCC) + + if (inserted) + { + charstate.next2 = 1; + } + else +#endif + if (charstate.next1 == 0) + { + mnpstate.next1 = charstate.next2 - 1; + charstate.next2 = 1; + } + else + { + mnpstate.next1 = -2; + charstate.next1 = 1; + } + } + } +#endif // !defined(SRELLDBG_NO_NEXTPOS_OPT) + } + + bool is_exclusive_sequence(const re_quantifier &eq, const state_size_type curno, const state_size_type nextno) // const + { + const state_type &curstate = this->NFA_states[curno]; + range_pairs curchar_class; + range_pairs nextchar_class; + + if (curstate.type == st_character) + { + curchar_class.join(range_pair_helper(curstate.character)); + } + else if (curstate.type == st_character_class) + { + curchar_class = this->character_class[curstate.number]; + if (curchar_class.size() == 0) // Means [], which always makes matching fail. + return true; // For preventing the automaton from pushing bt data. + } + else + { + return false; + } + + const bool canbe0length = gather_nextchars(nextchar_class, nextno, 0u, true); + + if (nextchar_class.size()) + { + if (!canbe0length || eq.is_greedy) + { +#if !defined(SRELLDBG_NO_SPLITCC) + + range_pairs kept; + range_pairs removed; + + curchar_class.split_ranges(kept, removed, nextchar_class); + + if (removed.size() == 0) // !curchar_class.is_overlap(nextchar_class) + return true; + + if (curstate.type == st_character_class && kept.size() && eq.is_infinity()) + { + { + state_type &curstate2 = this->NFA_states[curno]; + + curstate2.character = kept.consists_of_one_character(this->is_icase()); + if (curstate2.character != constants::invalid_u32value) + curstate2.type = st_character; + else + curstate2.number = this->character_class.register_newclass(kept); + } + const re_quantifier backupeq(eq); + + insert_at(nextno, 2); + state_type &n0 = this->NFA_states[nextno]; + state_type &n1 = this->NFA_states[nextno + 1]; + + n0.reset(); + n0.type = st_epsilon; + n0.character = meta_char::mc_astrsk; + n0.quantifier = backupeq; +// n0.next2 = 1; + n0.next2 = 2; + if (!n0.quantifier.is_greedy) + { + n0.next1 = n0.next2; + n0.next2 = 1; + } + + n1.reset(); + n1.type = st_character_class; + + n1.character = removed.consists_of_one_character(this->is_icase()); + if (n1.character != constants::invalid_u32value) + n1.type = st_character; + else + n1.number = this->character_class.register_newclass(removed); + + n1.next1 = -2; +// n1.next2 = 0; + return true; + } + +#else // defined(SRELLDBG_NO_SPLITCC) + + if (!curchar_class.is_overlap(nextchar_class)) + { + return true; + } + +#endif // !defined(SRELLDBG_NO_SPLITCC) + } + } + else if (/* nextchar_class.size() == 0 && */ (!canbe0length || only_success_left(nextno))) + { + // (size() == 0 && !canbe0length) means []. + return eq.is_greedy; + } + + return false; + } + + bool only_success_left(typename state_array::size_type pos) const + { + for (;;) + { + const state_type &state = this->NFA_states[pos]; + + switch (state.type) + { + case st_success: + return true; + + case st_roundbracket_close: + case st_backreference: + if (state.next2 != 0 && state.next1 != state.next2) + return false; + break; + + case st_epsilon: + if (state.next2 != 0 && !only_success_left(pos + state.next2)) + return false; + break; + + case st_roundbracket_open: + break; // /a*()/ + + default: + return false; + } + if (state.next1) + pos += state.next1; + else + return false; + } + } +#endif // !defined(SRELLDBG_NO_ASTERISK_OPT) + + void insert_at(const typename state_array::size_type pos, const std::ptrdiff_t len) + { + state_type newstate; + + for (typename state_array::size_type cur = 0; cur < pos; ++cur) + { + state_type &state = this->NFA_states[cur]; + + if (state.next1 && (cur + state.next1) >= pos) + state.next1 += len; + + if (state.next2 && (cur + state.next2) >= pos) + state.next2 += len; + } + + for (typename state_array::size_type cur = pos; cur < this->NFA_states.size(); ++cur) + { + state_type &state = this->NFA_states[cur]; + + if ((cur + state.next1) < pos) + state.next1 -= len; + + if ((cur + state.next2) < pos) + state.next2 -= len; + } + + newstate.reset(); + newstate.type = st_epsilon; + for (std::ptrdiff_t count = 0; count < len; ++count) + this->NFA_states.insert(pos, newstate); + } + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) +#endif // !defined(SRELLDBG_NO_NEXTPOS_OPT) + +#if !defined(SRELLDBG_NO_BRANCH_OPT) || defined(SRELLTEST_NEXTPOS_OPT2) + typename state_array::size_type gather_if_char_or_charclass(range_pairs &charclass, typename state_array::size_type pos) const + { + for (; pos < this->NFA_states.size();) + { + const state_type &curstate = this->NFA_states[pos]; + + if (curstate.type == st_character && curstate.next2 == 0) + { + charclass.set_solerange(range_pair_helper(curstate.character)); + return pos; + } + else if (curstate.type == st_character_class && curstate.next2 == 0) + { + charclass = this->character_class[curstate.number]; + return pos; + } + else if (curstate.type == st_epsilon && curstate.next2 == 0) + { + } + else + break; + + pos += curstate.next1; + } + return 0; + } +#endif // !defined(SRELLDBG_NO_BRANCH_OPT) || defined(SRELLTEST_NEXTPOS_OPT2) + +#if !defined(SRELLDBG_NO_BRANCH_OPT) + void branch_optimisation() + { + range_pairs nextcharclass1; + + for (typename state_array::size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + const state_type &state = this->NFA_states[pos]; + + if (state.is_branch()) + { + const typename state_array::size_type nextcharpos = gather_if_char_or_charclass(nextcharclass1, pos + state.next1); + + if (nextcharpos) + { + range_pairs nextcharclass2; + + const bool canbe0length = gather_nextchars(nextcharclass2, pos + state.next2, 0u /* bracket_number */, true); + + if (!canbe0length && !nextcharclass1.is_overlap(nextcharclass2)) + { + state_type &branch = this->NFA_states[pos]; + state_type &next1 = this->NFA_states[nextcharpos]; + + next1.next2 = pos + branch.next2 - nextcharpos; + branch.next2 = 0; + } + } + } + } + } +#endif // !defined(SRELLDBG_NO_BRANCH_OPT) + +#if !defined(SRELL_NO_ICASE) + bool check_if_really_needs_icase_search() + { + uchar32 u32chars[unicode_case_folding::rev_maxset]; + + for (typename state_array::size_type i = 0; i < this->NFA_states.size(); ++i) + { + const state_type &state = this->NFA_states[i]; + + if (state.type == st_character) + { + if (unicode_case_folding::casefoldedcharset(u32chars, state.character) > 1) + return true; + } + else if (state.type == st_backreference) + return true; + } +// this->soflags &= ~regex_constants::icase; + return false; + } +#endif // !defined(SRELL_NO_ICASE) + +#if !defined(SRELLDBG_NO_BMH) + void setup_bmhdata() + { + simple_array u32s; + + for (typename state_array::size_type i = 1; i < this->NFA_states.size(); ++i) + { + const state_type &state = this->NFA_states[i]; + + if (state.type == st_character) + u32s.push_back(state.character); + else + { + u32s.clear(); + break; + } + } + + if (u32s.size() > 1) +// if ((u32s.size() > 1 && !this->is_ricase()) || (u32s.size() > 2 && this->is_ricase())) + { + if (this->bmdata) + this->bmdata->clear(); + else + this->bmdata = new re_bmh; + + this->bmdata->setup(u32s, this->is_ricase()); + return /* false */; + } + + if (this->bmdata) + delete this->bmdata; + this->bmdata = NULL; +// return true; + } +#endif // !defined(SRELLDBG_NO_BMH) + +#if !defined(SRELLDBG_NO_CCPOS) + void set_charclass_posinfo() + { + this->character_class.finalise(); + for (typename state_array::size_type i = 1; i < this->NFA_states.size(); ++i) + { + state_type &state = this->NFA_states[i]; + + if (state.type == st_character_class) + { + const range_pair &posinfo = this->character_class.charclasspos(state.number); + state.quantifier.setccpos(posinfo.first, posinfo.second); + } + } + } +#endif // !defined(SRELLDBG_NO_CCPOS) + +#if !defined(SRELLDBG_NO_BRANCH_OPT2) + + bool gather_if_char_or_charclass_strict(range_pairs &out, const state_type &state) const + { + if (state.type == st_character /* && state.next2 == 0 */) + { + out.set_solerange(range_pair_helper(state.character)); + } + else if (state.type == st_character_class /* && state.next2 == 0 */) + { + out = this->character_class[state.number]; + } + else + return false; + + return true; + } + + void branch_optimisation2() + { + range_pairs basealt1stch; + range_pairs nextalt1stch; + + for (state_size_type pos = 0; pos < this->NFA_states.size(); ++pos) + { + const state_type &curstate = this->NFA_states[pos]; + + if (curstate.is_branch()) + { + const state_size_type next1pos = pos + curstate.next1; + state_size_type precharchainpos = pos; + + if (gather_if_char_or_charclass_strict(basealt1stch, this->NFA_states[next1pos])) + { + state_size_type next2pos = precharchainpos + curstate.next2; + state_size_type postcharchainpos = 0; + + for (;;) + { + state_size_type next2next1pos = next2pos; + state_type &nstate2 = this->NFA_states[next2pos]; + state_size_type next2next2pos = 0; + + if (nstate2.is_branch()) + { + next2next2pos = next2pos + nstate2.next2; + next2next1pos += nstate2.next1; + } + + if (gather_if_char_or_charclass_strict(nextalt1stch, this->NFA_states[next2next1pos])) + { + const int relation = basealt1stch.relationship(nextalt1stch); + + if (relation == 0) + { + if (next2next2pos) // if (nstate2.is_branch()) + { + nstate2.reset(); + nstate2.type = st_epsilon; + } + + if (postcharchainpos == 0) + { + postcharchainpos = next1pos + 1; + insert_at(postcharchainpos, 1); + this->NFA_states[next1pos].next1 = 1; + } + else + { + const state_size_type prevbranchpos = postcharchainpos; + + postcharchainpos = prevbranchpos + this->NFA_states[prevbranchpos].next2; + insert_at(postcharchainpos, 1); + this->NFA_states[prevbranchpos].next2 = postcharchainpos - prevbranchpos; + // Fix for bug210423. This line cannot be omitted, because + // NFA_states[prevbranchpos].next2 has been incremented in insert_at(). + } + +// if (next2next1pos >= postcharchainpos) + ++next2next1pos; + + if (precharchainpos >= postcharchainpos) + ++precharchainpos; + + state_type &prechainbranchpoint = this->NFA_states[precharchainpos]; + if (next2next2pos) + { +// if (next2next2pos >= postcharchainpos) + ++next2next2pos; + prechainbranchpoint.next2 = next2next2pos - precharchainpos; + } + else + { + prechainbranchpoint.next2 = 0; + } + + state_type &newbranchpoint = this->NFA_states[postcharchainpos]; + newbranchpoint.character = meta_char::mc_bar; +// newbranchpoint.next1 = 1; + newbranchpoint.next2 = next2next1pos + this->NFA_states[next2next1pos].next1 - postcharchainpos; + } + else if (relation == 1) + { + break; + } + else + precharchainpos = next2pos; + } + else + { + // Fix for bug210428. + // Original: /mm2|m|mm/ + // 1st step: /m(?:m2||m)/ <- No more optimisation can be performed. Must quit. + // 2nd step: /mm(?:2||)/ <- BUG. + break; + } + + if (next2next2pos == 0) + break; + + next2pos = next2next2pos; + } + } + } + } + } +#endif // !defined(SRELLDBG_NO_BRANCH_OPT2) + +public: // For debug. + + void print_NFA_states(const int) const; +}; +// re_compiler + + } // namespace regex_internal + +// ... "rei_compiler.hpp"] +// ["regex_sub_match.hpp" ... + +// 28.9, class template sub_match: +template +class sub_match : public std::pair +{ +public: + + typedef typename std::iterator_traits::value_type value_type; + typedef typename std::iterator_traits::difference_type difference_type; + typedef BidirectionalIterator iterator; + typedef std::basic_string string_type; + + bool matched; + +// constexpr sub_match(); // C++11. + + sub_match() : matched(false) + { + } + + difference_type length() const + { + return matched ? std::distance(this->first, this->second) : 0; + } + + operator string_type() const + { + return matched ? string_type(this->first, this->second) : string_type(); + } + + string_type str() const + { + return matched ? string_type(this->first, this->second) : string_type(); + } + + int compare(const sub_match &s) const + { + return str().compare(s.str()); + } + + int compare(const string_type &s) const + { + return str().compare(s); + } + + int compare(const value_type *const s) const + { + return str().compare(s); + } +}; + +// 28.9.2, sub_match non-member operators: +// [7.9.2] sub_match non-member operators + +// Compares sub_match & with sub_match &. +template +bool operator==(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) == 0; // 1 +} + +template +bool operator!=(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) != 0; // 2 +} + +template +bool operator<(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) < 0; // 3 +} + +template +bool operator<=(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) <= 0; // 4 +} + +template +bool operator>=(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) >= 0; // 5 +} + +template +bool operator>(const sub_match &lhs, const sub_match &rhs) +{ + return lhs.compare(rhs) > 0; // 6 +} + +// Compares basic_string & with sub_match &. +template +bool operator==( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs.c_str()) == 0; // 7 +} + +template +bool operator!=( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return !(lhs == rhs); // 8 +} + +template +bool operator<( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs.c_str()) > 0; // 9 +} + +template +bool operator>( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return rhs < lhs; // 10 +} + +template +bool operator>=( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return !(lhs < rhs); // 11 +} + +template +bool operator<=( + const std::basic_string::value_type, ST, SA> &lhs, + const sub_match &rhs +) +{ + return !(rhs < lhs); // 12 +} + +// Compares sub_match & with basic_string &. +template +bool operator==( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return lhs.compare(rhs.c_str()) == 0; // 13 +} + +template +bool operator!=( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return !(lhs == rhs); // 14 +} + +template +bool operator<( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return lhs.compare(rhs.c_str()) < 0; // 15 +} + +template +bool operator>( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return rhs < lhs; // 16 +} + +template +bool operator>=( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return !(lhs < rhs); // 17 +} + +template +bool operator<=( + const sub_match &lhs, + const std::basic_string::value_type, ST, SA> &rhs +) +{ + return !(rhs < lhs); // 18 +} + +// Compares iterator_traits::value_type * with sub_match &. +template +bool operator==( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs) == 0; // 19 +} + +template +bool operator!=( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return !(lhs == rhs); // 20 +} + +template +bool operator<( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return rhs.compare(lhs) > 0; // 21 +} + +template +bool operator>( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return rhs < lhs; // 22 +} + +template +bool operator>=( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return !(lhs < rhs); // 23 +} + +template +bool operator<=( + typename std::iterator_traits::value_type const *lhs, + const sub_match &rhs +) +{ + return !(rhs < lhs); // 24 +} + +// Compares sub_match & with iterator_traits::value_type *. +template +bool operator==( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return lhs.compare(rhs) == 0; // 25 +} + +template +bool operator!=( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return !(lhs == rhs); // 26 +} + +template +bool operator<( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return lhs.compare(rhs) < 0; // 27 +} + +template +bool operator>( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return rhs < lhs; // 28 +} + +template +bool operator>=( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return !(lhs < rhs); // 29 +} + +template +bool operator<=( + const sub_match &lhs, + typename std::iterator_traits::value_type const *rhs +) +{ + return !(rhs < lhs); // 30 +} + +// Compares iterator_traits::value_type & with sub_match &. +template +bool operator==( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return rhs.compare(typename sub_match::string_type(1, lhs)) == 0; // 31 +} + +template +bool operator!=( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return !(lhs == rhs); // 32 +} + +template +bool operator<( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return rhs.compare(typename sub_match::string_type(1, lhs)) > 0; // 33 +} + +template +bool operator>( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return rhs < lhs; // 34 +} + +template +bool operator>=( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return !(lhs < rhs); // 35 +} + +template +bool operator<=( + typename std::iterator_traits::value_type const &lhs, + const sub_match &rhs +) +{ + return !(rhs < lhs); // 36 +} + +// Compares sub_match & with iterator_traits::value_type &. +template +bool operator==( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return lhs.compare(typename sub_match::string_type(1, rhs)) == 0; // 37 +} + +template +bool operator!=( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return !(lhs == rhs); // 38 +} + +template +bool operator<( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return lhs.compare(typename sub_match::string_type(1, rhs)) < 0; // 39 +} + +template +bool operator>( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return rhs < lhs; // 40 +} + +template +bool operator>=( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return !(lhs < rhs); // 41 +} + +template +bool operator<=( + const sub_match &lhs, + typename std::iterator_traits::value_type const &rhs +) +{ + return !(rhs < lhs); // 42 +} + +template +std::basic_ostream &operator<<(std::basic_ostream &os, const sub_match &m) +{ + return (os << m.str()); +} + +typedef sub_match csub_match; +typedef sub_match wcsub_match; +typedef sub_match ssub_match; +typedef sub_match wssub_match; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef sub_match u16csub_match; + typedef sub_match u32csub_match; + typedef sub_match u16ssub_match; + typedef sub_match u32ssub_match; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef sub_match u8csub_match; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef sub_match u8ssub_match; +#endif + +typedef csub_match u8ccsub_match; +typedef ssub_match u8cssub_match; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccsub_match u8csub_match; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8cssub_match u8ssub_match; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcsub_match u32wcsub_match; + typedef wssub_match u32wssub_match; + typedef u32wcsub_match u1632wcsub_match; + typedef u32wssub_match u1632wssub_match; + #elif WCHAR_MAX >= 0xffff + typedef wcsub_match u16wcsub_match; + typedef wssub_match u16wssub_match; + typedef u16wcsub_match u1632wcsub_match; + typedef u16wssub_match u1632wssub_match; + #endif +#endif + +// ... "regex_sub_match.hpp"] +// ["regex_match_results.hpp" ... + +// 28.10, class template match_results: +template > > +class match_results +{ +public: + + typedef sub_match value_type; + typedef const value_type & const_reference; + typedef const_reference reference; +// typedef implementation defined const_iterator; + typedef typename std::vector::const_iterator const_iterator; + typedef const_iterator iterator; + typedef typename std::iterator_traits::difference_type difference_type; + +#if defined(__cplusplus) && __cplusplus >= 201103L + typedef typename std::allocator_traits::size_type size_type; +#else + typedef typename Allocator::size_type size_type; // TR1. +#endif + + typedef Allocator allocator_type; + typedef typename std::iterator_traits::value_type char_type; + typedef std::basic_string string_type; + +public: + + // 28.10.1, construct/copy/destroy: + // [7.10.1] construct/copy/destroy + explicit match_results(const Allocator &a = Allocator()) : ready_(false), sub_matches_(a) + { + } + + match_results(const match_results &m) + { + operator=(m); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + match_results(match_results &&m) SRELL_NOEXCEPT + { + operator=(std::move(m)); + } +#endif + + match_results &operator=(const match_results &m) + { + if (this != &m) + { +// this->sstate_ = m.sstate_; + this->ready_ = m.ready_; + this->sub_matches_ = m.sub_matches_; + this->prefix_ = m.prefix_; + this->suffix_ = m.suffix_; + this->base_ = m.base_; +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->gnames_ = m.gnames_; +#endif + } + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + match_results &operator=(match_results &&m) SRELL_NOEXCEPT + { + if (this != &m) + { +// this->sstate_ = std::move(m.sstate_); + this->ready_ = m.ready_; + this->sub_matches_ = std::move(m.sub_matches_); + this->prefix_ = std::move(m.prefix_); + this->suffix_ = std::move(m.suffix_); + this->base_ = m.base_; +#if !defined(SRELL_NO_NAMEDCAPTURE) + this->gnames_ = std::move(m.gnames_); +#endif + } + return *this; + } +#endif + +// ~match_results(); + + // 28.10.2, state: + bool ready() const + { + return ready_; + } + + // 28.10.3, size: + // [7.10.2] size + size_type size() const + { + return sub_matches_.size(); + } + + size_type max_size() const + { + return sub_matches_.max_size(); +// return static_cast(~0) / sizeof (value_type); + } + + bool empty() const + { + return size() == 0; + } + + // 28.10.4, element access: + // [7.10.3] element access + difference_type length(const size_type sub = 0) const + { + return (*this)[sub].length(); + } + + difference_type position(const size_type sub = 0) const + { + const_reference ref = (*this)[sub]; + + return std::distance(base_, ref.first); + } + + string_type str(const size_type sub = 0) const + { + return string_type((*this)[sub]); + } + + const_reference operator[](const size_type n) const + { +#if defined(SRELL_STRICT_IMPL) + return n < sub_matches_.size() ? sub_matches_[n] : unmatched_; +#else + return sub_matches_[n]; +#endif + } + +#if !defined(SRELL_NO_NAMEDCAPTURE) + + // Helpers for overload resolution of the integer literal 0 of signed types. + template + difference_type length(const IntegerType zero) const + { + return length(static_cast(zero)); + } + template + difference_type position(const IntegerType zero) const + { + return position(static_cast(zero)); + } + template + string_type str(const IntegerType zero) const + { + return str(static_cast(zero)); + } + template + const_reference operator[](const IntegerType zero) const + { + return operator[](static_cast(zero)); + } + + difference_type length(const string_type &sub) const + { + return (*this)[sub].length(); + } + + difference_type position(const string_type &sub) const + { + const_reference ref = (*this)[sub]; + + return std::distance(base_, ref.first); + } + + string_type str(const string_type &sub) const + { + return string_type((*this)[sub]); + } + + const_reference operator[](const string_type &sub) const + { + return sub_matches_[lookup_and_check_backref_number(sub.c_str(), sub.c_str() + sub.size())]; + } + + difference_type length(const char_type *sub) const + { + return (*this)[sub].length(); + } + + difference_type position(const char_type *sub) const + { + const_reference ref = (*this)[sub]; + + return std::distance(base_, ref.first); + } + + string_type str(const char_type *sub) const + { + return string_type((*this)[sub]); + } + + const_reference operator[](const char_type *sub) const + { + return sub_matches_[lookup_and_check_backref_number(sub, sub + std::char_traits::length(sub))]; + } + +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + + const_reference prefix() const + { + return prefix_; + } + + const_reference suffix() const + { + return suffix_; + } + + const_iterator begin() const + { + return sub_matches_.begin(); + } + + const_iterator end() const + { + return sub_matches_.end(); + } + + const_iterator cbegin() const + { + return sub_matches_.begin(); + } + + const_iterator cend() const + { + return sub_matches_.end(); + } + + // 28.10.5, format: + // [7.10.4] format + template + OutputIter format( + OutputIter out, + const char_type *fmt_first, + const char_type *const fmt_last, + regex_constants::match_flag_type /* flags */ = regex_constants::format_default + ) const + { + if (this->ready() && !this->empty()) + { +#if !defined(SRELL_NO_NAMEDCAPTURE) + const bool no_groupnames = gnames_.size() == 0; +#endif + const value_type &m0 = (*this)[0]; + + while (fmt_first != fmt_last) + { + if (*fmt_first != static_cast(regex_internal::meta_char::mc_dollar)) // '$' + { + *out++ = *fmt_first++; + } + else + { + ++fmt_first; + if (fmt_first == fmt_last) + { + *out++ = regex_internal::meta_char::mc_dollar; // '$'; + } + else if (*fmt_first == static_cast(regex_internal::char_other::co_amp)) // '&', $& + { + out = std::copy(m0.first, m0.second, out); + ++fmt_first; + } + else if (*fmt_first == static_cast(regex_internal::char_other::co_grav)) // '`', $`, prefix. + { + out = std::copy(this->prefix().first, this->prefix().second, out); + ++fmt_first; + } + else if (*fmt_first == static_cast(regex_internal::char_other::co_apos)) // '\'', $', suffix. + { + out = std::copy(this->suffix().first, this->suffix().second, out); + ++fmt_first; + } +#if !defined(SRELL_NO_NAMEDCAPTURE) + else if (*fmt_first == static_cast(regex_internal::meta_char::mc_lt) && !no_groupnames) // '<', $< + { + const char_type *const current_backup = fmt_first; + bool replaced = false; + + if (++fmt_first == fmt_last) + ; // Do nothing. + else + { + const char_type *const name_begin = fmt_first; + + for (;; ++fmt_first) + { + if (*fmt_first == static_cast(regex_internal::meta_char::mc_gt)) + { + const regex_internal::uint_l32 backref_number = lookup_backref_number(name_begin, fmt_first); + + if (backref_number != regex_internal::groupname_mapper::notfound) + { + const value_type &mn = (*this)[backref_number]; + + if (mn.matched) + out = std::copy(mn.first, mn.second, out); +// replaced = true; + } + replaced = true; + ++fmt_first; + break; + } + if (fmt_first == fmt_last) + break; + } + } + if (!replaced) + { + fmt_first = current_backup; + *out++ = regex_internal::meta_char::mc_dollar; // '$'; + } + } +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + else + { + const char_type *const backup_pos = fmt_first; + size_type backref_number = 0; + + if (fmt_first != fmt_last && *fmt_first >= static_cast(regex_internal::char_alnum::ch_0) && *fmt_first <= static_cast(regex_internal::char_alnum::ch_9)) // '0'-'9' + { + backref_number += *fmt_first - regex_internal::char_alnum::ch_0; // '0'; + + if (++fmt_first != fmt_last && *fmt_first >= static_cast(regex_internal::char_alnum::ch_0) && *fmt_first <= static_cast(regex_internal::char_alnum::ch_9)) // '0'-'9' + { + backref_number *= 10; + backref_number += *fmt_first - regex_internal::char_alnum::ch_0; // '0'; + ++fmt_first; + } + } + + if (backref_number && backref_number < this->size()) + { + const value_type &mn = (*this)[backref_number]; + + if (mn.matched) + out = std::copy(mn.first, mn.second, out); + } + else + { + *out++ = regex_internal::meta_char::mc_dollar; // '$'; + + fmt_first = backup_pos; + if (*fmt_first == static_cast(regex_internal::meta_char::mc_dollar)) + ++fmt_first; + } + } + } + } + } + return out; + } + + template + OutputIter format( + OutputIter out, + const std::basic_string &fmt, + regex_constants::match_flag_type flags = regex_constants::format_default + ) const + { + return format(out, fmt.data(), fmt.data() + fmt.size(), flags); + } + + template + std::basic_string format( + const string_type &fmt, + regex_constants::match_flag_type flags = regex_constants::format_default + ) const + { + std::basic_string result; + +// format(std::back_insert_iterator(result), fmt, flags); + format(std::back_inserter(result), fmt, flags); + return result; + } + + string_type format(const char_type *fmt, regex_constants::match_flag_type flags = regex_constants::format_default) const + { + string_type result; + + format(std::back_inserter(result), fmt, fmt + std::char_traits::length(fmt), flags); + return result; + } + + // 28.10.6, allocator: + // [7.10.5] allocator + allocator_type get_allocator() const + { + return allocator_type(); + } + + // 28.10.7, swap: + // [7.10.6] swap + void swap(match_results &that) + { + const match_results tmp(that); + that = *this; + *this = tmp; + } + +public: // For internal. + + typedef match_results match_results_type; + typedef typename match_results_type::size_type match_results_size_type; + typedef typename regex_internal::re_search_state search_state_type; + + search_state_type sstate_; + + void clear_() + { + ready_ = false; + sub_matches_.clear(); +// prefix_.matched = false; +// suffix_.matched = false; +#if !defined(SRELL_NO_NAMEDCAPTURE) + gnames_.clear(); +#endif + } + +// template +#if !defined(SRELL_NO_NAMEDCAPTURE) + bool set_match_results_(const regex_internal::groupname_mapper &gnames) +#else + bool set_match_results_() +#endif + { + sub_matches_.resize(sstate_.bracket.size()); +// value_type &m0 = sub_matches_[0]; + + sub_matches_[0].matched = true; + + for (regex_internal::uint_l32 i = 1; i < static_cast(sstate_.bracket.size()); ++i) + { + const typename search_state_type::submatch_type &br = sstate_.bracket[i]; + value_type &sm = sub_matches_[i]; + + sm.first = br.core.open_at; + sm.second = br.core.close_at; + sm.matched = br.counter != 0; + } + + base_ = sstate_.lblim; + prefix_.first = sstate_.srchbegin; + prefix_.second = sub_matches_[0].first = sstate_.bracket[0].core.open_at; + suffix_.first = sub_matches_[0].second = sstate_.nth.in_string; + suffix_.second = sstate_.srchend; + + prefix_.matched = prefix_.first != prefix_.second; // The spec says prefix().first != prefix().second + suffix_.matched = suffix_.first != suffix_.second; // The spec says suffix().first != suffix().second + +#if !defined(SRELL_NO_NAMEDCAPTURE) + gnames_ = gnames; +#endif + ready_ = true; + return true; + } + + bool set_match_results_bmh_() + { + sub_matches_.resize(1); +// value_type &m0 = sub_matches_[0]; + + sub_matches_[0].matched = true; + + base_ = sstate_.lblim; + prefix_.first = sstate_.srchbegin; + prefix_.second = sub_matches_[0].first = sstate_.nth.in_string; + suffix_.first = sub_matches_[0].second = sstate_.nextpos; + suffix_.second = sstate_.srchend; + + prefix_.matched = prefix_.first != prefix_.second; + suffix_.matched = suffix_.first != suffix_.second; + + ready_ = true; + return true; + } + + void set_prefix_first_(const BidirectionalIterator pf) + { + prefix_.first = pf; + } + + bool mark_as_failed_() + { + ready_ = true; // 30.11.2 and 3: Postconditions: m.ready() == true in all cases. + return false; + } + +private: + +#if !defined(SRELL_NO_NAMEDCAPTURE) + + regex_internal::uint_l32 lookup_backref_number(const char_type *begin, const char_type *const end) const + { + typename regex_internal::groupname_mapper::gname_string key(end - begin); + + for (std::size_t i = 0; begin != end; ++begin, ++i) + key[i] = *begin; + + return gnames_[key]; + } + + regex_internal::uint_l32 lookup_and_check_backref_number(const char_type *begin, const char_type *const end) const + { + const regex_internal::uint_l32 backrefno = lookup_backref_number(begin, end); + + if (backrefno == regex_internal::groupname_mapper::notfound) + throw regex_error(regex_constants::error_backref); + + return backrefno; + } + +#endif // !defined(SRELL_NO_NAMEDCAPTURE) + +public: // For debug. + + template + void print_sub_matches(const BasicRegexT &, const int) const; + void print_addresses(const value_type &, const char *const) const; + +private: + + typedef std::vector sub_match_array; + + bool ready_; + sub_match_array sub_matches_; + value_type prefix_; + value_type suffix_; + BidirectionalIterator base_; + +#if !defined(SRELL_NO_NAMEDCAPTURE) + regex_internal::groupname_mapper gnames_; +#endif +#if defined(SRELL_STRICT_IMPL) + value_type unmatched_; +#endif +}; + +// 28.10.7, match_results swap: +// [7.10.6] match_results swap +template +void swap( + match_results &m1, + match_results &m2 +) +{ + m1.swap(m2); +} + +// 28.10.8, match_results comparisons +template +bool operator==( + const match_results &m1, + const match_results &m2 +) +{ + if (!m1.ready() && !m2.ready()) + return true; + + if (m1.ready() && m2.ready()) + { + if (m1.empty() && m2.empty()) + return true; + + if (!m1.empty() && !m2.empty()) + { + return m1.prefix() == m2.prefix() && m1.size() == m2.size() && std::equal(m1.begin(), m1.end(), m2.begin()) && m1.suffix() == m2.suffix(); + } + } + return false; +} + +template +bool operator!=( + const match_results &m1, + const match_results &m2 +) +{ + return !(m1 == m2); +} + +typedef match_results cmatch; +typedef match_results wcmatch; +typedef match_results smatch; +typedef match_results wsmatch; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef match_results u16cmatch; + typedef match_results u32cmatch; + typedef match_results u16smatch; + typedef match_results u32smatch; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef match_results u8cmatch; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef match_results u8smatch; +#endif + +typedef cmatch u8ccmatch; +typedef smatch u8csmatch; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccmatch u8cmatch; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8csmatch u8smatch; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcmatch u32wcmatch; + typedef wsmatch u32wsmatch; + typedef u32wcmatch u1632wcmatch; + typedef u32wsmatch u1632wsmatch; + #elif WCHAR_MAX >= 0xffff + typedef wcmatch u16wcmatch; + typedef wsmatch u16wsmatch; + typedef u16wcmatch u1632wcmatch; + typedef u16wsmatch u1632wsmatch; + #endif +#endif + +// ... "regex_match_results.hpp"] +// ["rei_algorithm.hpp" ... + + namespace regex_internal + { + +template +class regex_object : public re_compiler +{ +public: + + template + bool search + ( + const BidirectionalIterator begin, + const BidirectionalIterator end, + const BidirectionalIterator lookbehind_limit, + match_results &results, + const regex_constants::match_flag_type flags /* = regex_constants::match_default */ + ) const + { + results.clear_(); + +// results.sstate_.template init(begin, end, lookbehind_limit, flags); + results.sstate_.init(begin, end, lookbehind_limit, flags); + + if (results.sstate_.match_continuous_flag()) + { + if (this->NFA_states.size()) + { + results.sstate_.set_entrypoint(this->NFA_states[0].next_state2); + goto DO_SEARCH; + } + } + else +#if !defined(SRELLDBG_NO_BMH) + if (this->bmdata) + { +#if !defined(SRELL_NO_ICASE) + if (!this->is_ricase() ? this->bmdata->do_casesensitivesearch(results.sstate_, typename std::iterator_traits::iterator_category()) : this->bmdata->do_icasesearch(results.sstate_, typename std::iterator_traits::iterator_category())) +#else + if (this->bmdata->do_casesensitivesearch(results.sstate_, typename std::iterator_traits::iterator_category())) +#endif + return results.set_match_results_bmh_(); + } + else +#endif + if (this->NFA_states.size()) + { + results.sstate_.set_entrypoint(this->NFA_states[0].next_state1); + + DO_SEARCH: + results.sstate_.init_for_automaton(this->number_of_brackets, this->number_of_counters, this->number_of_repeats); + +#if !defined(SRELL_NO_ICASE) + if (!this->is_ricase() ? do_search(results) : do_search(results)) +#else + if (do_search(results)) +#endif + { +#if !defined(SRELL_NO_NAMEDCAPTURE) + return results.set_match_results_(this->namedcaptures); +#else + return results.set_match_results_(); +#endif + } + } + return results.mark_as_failed_(); + } + +private: + + typedef typename traits::utf_traits utf_traits; + + template + bool do_search + ( + match_results &results + ) const + { + re_search_state &sstate = results.sstate_; + const BidirectionalIterator searchend = sstate.nth.in_string; + + for (;;) + { + const bool final = sstate.nextpos == searchend; + + sstate.nth.in_string = sstate.nextpos; + + if (!final) + { + +#ifdef SRELLDBG_NO_1STCHRCLS + utf_traits::codepoint_inc(sstate.nextpos, sstate.srchend); +#else + { + #if !defined(SRELLDBG_NO_BITSET) + if (!this->firstchar_class_bs.test((*sstate.nextpos++) & utf_traits::bitsetmask)) + #else + const uchar32 firstchar = utf_traits::codepoint_inc(sstate.nextpos, sstate.srchend); + + if (!this->firstchar_class.is_included(firstchar)) + #endif + continue; + } +#endif + } + // Even when final == true, we have to try for such expressions + // as "" =~ /^$/ or "..." =~ /$/. + +#if defined(SRELL_NO_LIMIT_COUNTER) + sstate.reset(/* first */); +#else + sstate.reset(/* first, */ this->limit_counter); +#endif + if (run_automaton(sstate /* , false */)) + return true; + + if (final) + break; + } + return false; + } + + template + struct casehelper + { + static T canonicalise(const T t) + { + return t; + } + }; + + template + struct casehelper + { + static T canonicalise(const T t) + { + return unicode_case_folding::do_casefolding(t); + } + }; + + template + bool run_automaton + ( +// match_results &results, + re_search_state &sstate +// , const bool is_recursive /* = false */ + ) const + { + typedef casehelper casehelper_type; + typedef typename re_object_core::state_type state_type; + typedef re_search_state ss_type; +// typedef typename ss_type::search_core_state scstate_type; + typedef typename ss_type::submatch_type submatch_type; + typedef typename ss_type::submatchcore_type submatchcore_type; + typedef typename ss_type::counter_type counter_type; + typedef typename ss_type::position_type position_type; + bool is_matched; + + goto START; + + JUDGE: + if (is_matched) + { + MATCHED: + sstate.nth.in_NFA_states = sstate.nth.in_NFA_states->next_state1; + } + else + { + NOT_MATCHED: + +#if !defined(SRELL_NO_LIMIT_COUNTER) + if (--sstate.failure_counter) + { +#endif + if (sstate.bt_stack.size() > sstate.btstack_size) + { + sstate.nth = sstate.bt_stack.back(); + sstate.bt_stack.pop_back(); + + sstate.nth.in_NFA_states = sstate.nth.in_NFA_states->next_state2; +// continue; + } + else + { + return false; + } +#if !defined(SRELL_NO_LIMIT_COUNTER) + } + else + throw regex_error(regex_constants::error_complexity); +#endif + } + +// START: + for (;;) + { + START: + const state_type ¤t_NFA = *sstate.nth.in_NFA_states; + + switch (current_NFA.type) + { + case st_character: + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + if (!sstate.is_at_srchend()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = casehelper_type::canonicalise(utf_traits::codepoint_inc(sstate.nth.in_string, sstate.srchend)); + RETRY_CF: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + + if (current_NFA2.character == uchar) + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + + if (sstate.nth.in_NFA_states->type == st_character) + goto RETRY_CF; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + else // reverse == true. + { + if (!sstate.is_at_lookbehindlimit()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = casehelper_type::canonicalise(utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim)); + RETRY_CB: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + + if (current_NFA2.character == uchar) + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + + if (sstate.nth.in_NFA_states->type == st_character) + goto RETRY_CB; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + goto NOT_MATCHED; + + case st_character_class: + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + if (!sstate.is_at_srchend()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = utf_traits::codepoint_inc(sstate.nth.in_string, sstate.srchend); +// RETRY_CCF: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + +#if !defined(SRELLDBG_NO_CCPOS) + if (this->character_class.is_included(current_NFA2.quantifier.offset, current_NFA2.quantifier.length, uchar)) +#else + if (this->character_class.is_included(current_NFA2.number, uchar)) +#endif + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + +// if (sstate.nth.in_NFA_states->type == st_character_class) +// goto RETRY_CCF; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + else // reverse == true. + { + if (!sstate.is_at_lookbehindlimit()) + { +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + const BidirectionalIterator prevpos = sstate.nth.in_string; +#endif + const uchar32 uchar = utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim); +// RETRY_CCB: + const state_type ¤t_NFA2 = *sstate.nth.in_NFA_states; + +#if !defined(SRELLDBG_NO_CCPOS) + if (this->character_class.is_included(current_NFA2.quantifier.offset, current_NFA2.quantifier.length, uchar)) +#else + if (this->character_class.is_included(current_NFA2.number, uchar)) +#endif + goto MATCHED; + +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + if (current_NFA2.next_state2) + { + sstate.nth.in_NFA_states = current_NFA2.next_state2; + +// if (sstate.nth.in_NFA_states->type == st_character_class) +// goto RETRY_CCB; + + sstate.nth.in_string = prevpos; + continue; + } +#endif + } +#if !defined(SRELLDBG_NO_ASTERISK_OPT) + else if (current_NFA.next_state2) + { + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } +#endif + } + goto NOT_MATCHED; + + case st_epsilon: + +#if defined(SRELLDBG_NO_SKIP_EPSILON) + if (current_NFA.next_state2) +#endif + { + sstate.bt_stack.push_back(sstate.nth); // sstate.push(); + } + + sstate.nth.in_NFA_states = current_NFA.next_state1; + continue; + + default: + switch (current_NFA.type) + { + + case st_check_counter: + { + const uint_l32 counter = sstate.counter[current_NFA.number]; + + if (counter < current_NFA.quantifier.atmost) + { + ++sstate.counter[current_NFA.number]; + + LOOP_WITHOUT_INCREMENT: + + if (counter >= current_NFA.quantifier.atleast) + { + sstate.bt_stack.push_back(sstate.nth); + sstate.nth.in_NFA_states = current_NFA.next_state1; + } + else + { + sstate.nth.in_NFA_states + = current_NFA.quantifier.is_greedy + ? current_NFA.next_state1 + : current_NFA.next_state2; + } + } + else + { + if (current_NFA.quantifier.is_infinity()) + goto LOOP_WITHOUT_INCREMENT; + + sstate.nth.in_NFA_states + = current_NFA.quantifier.is_greedy + ? current_NFA.next_state2 + : current_NFA.next_state1; + } + } + continue; + + case st_decrement_counter: + --sstate.counter[current_NFA.number]; + goto NOT_MATCHED; + + case st_save_and_reset_counter: + { + counter_type &c = sstate.counter[current_NFA.number]; + + sstate.counter_stack.push_back(c); + sstate.bt_stack.push_back(sstate.nth); + c = 0; + } + goto MATCHED; + + case st_restore_counter: + sstate.counter[current_NFA.number] = sstate.counter_stack.back(); + sstate.counter_stack.pop_back(); + goto NOT_MATCHED; + + case st_roundbracket_open: // '(': + { + submatch_type &bracket = sstate.bracket[current_NFA.number]; + + sstate.capture_stack.push_back(bracket.core); + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + bracket.core.open_at = sstate.nth.in_string; + } + else + bracket.core.close_at = sstate.nth.in_string; + + ++bracket.counter; + + for (uint_l32 brno = current_NFA.quantifier.atleast; brno <= current_NFA.quantifier.atmost; ++brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + sstate.capture_stack.push_back(inner_bracket.core); + sstate.counter_stack.push_back(inner_bracket.counter); + inner_bracket.core.open_at = inner_bracket.core.close_at = sstate.srchend; + inner_bracket.counter = 0; + // ECMAScript spec (3-5.1) 15.10.2.5, NOTE 3. + // ECMAScript 2018 (ES9) 21.2.2.5.1, Note 3. + } + + sstate.bt_stack.push_back(sstate.nth); + } + goto MATCHED; + + case st_roundbracket_pop: // '/': + { + for (uint_l32 brno = current_NFA.quantifier.atmost; brno >= current_NFA.quantifier.atleast; --brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + inner_bracket.counter = sstate.counter_stack.back(); + inner_bracket.core = sstate.capture_stack.back(); + sstate.counter_stack.pop_back(); + sstate.capture_stack.pop_back(); + } + + submatch_type &bracket = sstate.bracket[current_NFA.number]; + + bracket.core = sstate.capture_stack.back(); + sstate.capture_stack.pop_back(); + --bracket.counter; + } + goto NOT_MATCHED; + + case st_roundbracket_close: // ')': + { + submatch_type &bracket = sstate.bracket[current_NFA.number]; + submatchcore_type &brc = bracket.core; + + if ((!reverse ? brc.open_at : brc.close_at) != sstate.nth.in_string) + { + sstate.nth.in_NFA_states = current_NFA.next_state1; + } + else // 0 width match, breaks from the loop. + { + if (current_NFA.next_state1->type != st_check_counter) + { + if (bracket.counter > 1) + goto NOT_MATCHED; // ECMAScript spec 15.10.2.5, note 4. + + sstate.nth.in_NFA_states = current_NFA.next_state2; + // Accepts 0 width match and exits. + } + else + { + // A pair with check_counter. + const counter_type counter = sstate.counter[current_NFA.next_state1->number]; + + if (counter > current_NFA.next_state1->quantifier.atleast) + goto NOT_MATCHED; // Takes a captured string in the previous loop. + + sstate.nth.in_NFA_states = current_NFA.next_state1; + // Accepts 0 width match and continues. + } + } +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + brc.close_at = sstate.nth.in_string; + } + else // reverse == true. + { + brc.open_at = sstate.nth.in_string; + } + } + continue; + + case st_repeat_in_push: + { + position_type &r = sstate.repeat[current_NFA.number]; + + sstate.repeat_stack.push_back(r); + r = sstate.nth.in_string; + + for (uint_l32 brno = current_NFA.quantifier.atleast; brno <= current_NFA.quantifier.atmost; ++brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + sstate.capture_stack.push_back(inner_bracket.core); + sstate.counter_stack.push_back(inner_bracket.counter); + inner_bracket.core.open_at = inner_bracket.core.close_at = sstate.srchend; + inner_bracket.counter = 0; + // ECMAScript 2019 (ES10) 21.2.2.5.1, Note 3. + } + sstate.bt_stack.push_back(sstate.nth); + } + goto MATCHED; + + case st_repeat_in_pop: + for (uint_l32 brno = current_NFA.quantifier.atmost; brno >= current_NFA.quantifier.atleast; --brno) + { + submatch_type &inner_bracket = sstate.bracket[brno]; + + inner_bracket.counter = sstate.counter_stack.back(); + inner_bracket.core = sstate.capture_stack.back(); + sstate.counter_stack.pop_back(); + sstate.capture_stack.pop_back(); + } + + sstate.repeat[current_NFA.number] = sstate.repeat_stack.back(); + sstate.repeat_stack.pop_back(); + goto NOT_MATCHED; + + case st_check_0_width_repeat: + if (sstate.nth.in_string != sstate.repeat[current_NFA.number]) + goto MATCHED; + + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + + case st_backreference: // '\\': + { + const submatch_type &bracket = sstate.bracket[current_NFA.number]; + + if (!bracket.counter) // Undefined. + { + ESCAPE_FROM_ZERO_WIDTH_MATCH: + sstate.nth.in_NFA_states = current_NFA.next_state2; + continue; + } + else + { + const submatchcore_type &brc = bracket.core; + + if (brc.open_at == brc.close_at) + { + goto ESCAPE_FROM_ZERO_WIDTH_MATCH; + } + else + { +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(push) +#pragma warning(disable:4127) +#endif + if (!reverse) +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + { + for (BidirectionalIterator backrefpos = brc.open_at; backrefpos != brc.close_at;) + { + if (!sstate.is_at_srchend()) + { + const uchar32 uchartxt = utf_traits::codepoint_inc(sstate.nth.in_string, sstate.srchend); + const uchar32 ucharref = utf_traits::codepoint_inc(backrefpos, brc.close_at); + + if (casehelper_type::canonicalise(uchartxt) == casehelper_type::canonicalise(ucharref)) + continue; + } + goto NOT_MATCHED; + } + } + else // reverse == true. + { + for (BidirectionalIterator backrefpos = brc.close_at; backrefpos != brc.open_at;) + { + if (!sstate.is_at_lookbehindlimit()) + { + const uchar32 uchartxt = utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim); + const uchar32 ucharref = utf_traits::dec_codepoint(backrefpos, brc.open_at); + + if (casehelper_type::canonicalise(uchartxt) == casehelper_type::canonicalise(ucharref)) + continue; + } + goto NOT_MATCHED; + } + } + } + } + } + goto MATCHED; + + case st_lookaround_open: + { + for (uint_l32 i = 1; i < this->number_of_brackets; ++i) + { + const submatch_type &sm = sstate.bracket[i]; + sstate.capture_stack.push_back(sm.core); + sstate.counter_stack.push_back(sm.counter); + } + + for (uint_l32 i = 0; i < this->number_of_counters; ++i) + sstate.counter_stack.push_back(sstate.counter[i]); + + for (uint_l32 i = 0; i < this->number_of_repeats; ++i) + sstate.repeat_stack.push_back(sstate.repeat[i]); + + const typename ss_type::bottom_state backup_bottom(sstate.btstack_size, sstate.capture_stack.size(), sstate.counter_stack.size(), sstate.repeat_stack.size()); + const BidirectionalIterator orgpos = sstate.nth.in_string; + + sstate.btstack_size = sstate.bt_stack.size(); + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) + if (current_NFA.quantifier.atleast == 2) + { + sstate.repeat_stack.push_back(sstate.lblim); + sstate.lblim = sstate.srchbegin; + } +#endif + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) + +// if (current_NFA.reverse) + { + for (uint_l32 i = 0; i < current_NFA.quantifier.atleast; ++i) + { + if (!sstate.is_at_lookbehindlimit()) + { + utf_traits::dec_codepoint(sstate.nth.in_string, sstate.lblim); + continue; + } + is_matched = false; + goto AFTER_LOOKAROUND; + } + } +#endif + sstate.nth.in_NFA_states = current_NFA.next_state2; + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) + is_matched = current_NFA.quantifier.atleast == 0 ? run_automaton(sstate /* , true */) : run_automaton(sstate /* , true */); +#else + is_matched = run_automaton(sstate /* , true */); +#endif + +#if defined(SRELL_FIXEDWIDTHLOOKBEHIND) + AFTER_LOOKAROUND: +#endif + { + +#if !defined(SRELL_FIXEDWIDTHLOOKBEHIND) && !defined(SRELLDBG_NO_MPREWINDER) + if (current_NFA.quantifier.atleast == 2) + { + sstate.lblim = sstate.repeat_stack[backup_bottom.repeatstack_size]; + if (is_matched) + sstate.bracket[0].core.open_at = sstate.nth.in_string; + } +#endif + +#if defined(SRELL_ENABLE_GT) + if (current_NFA.character != meta_char::mc_gt) // '>' +#endif + { + sstate.nth.in_string = orgpos; + } + sstate.bt_stack.resize(sstate.btstack_size); + + sstate.btstack_size = backup_bottom.btstack_size; + sstate.capture_stack.resize(backup_bottom.capturestack_size); + sstate.counter_stack.resize(backup_bottom.counterstack_size); + sstate.repeat_stack.resize(backup_bottom.repeatstack_size); + + is_matched ^= current_NFA.is_not; + } + } + if (is_matched) + { + sstate.nth.in_NFA_states = current_NFA.next_state1; + continue; + } + +// case st_lookaround_pop: + for (uint_l32 i = this->number_of_repeats; i;) + { + sstate.repeat[--i] = sstate.repeat_stack.back(); + sstate.repeat_stack.pop_back(); + } + + for (uint_l32 i = this->number_of_counters; i;) + { + sstate.counter[--i] = sstate.counter_stack.back(); + sstate.counter_stack.pop_back(); + } + + for (uint_l32 i = this->number_of_brackets; i > 1;) + { + submatch_type &sm = sstate.bracket[--i]; + + sm.counter = sstate.counter_stack.back(); + sm.core = sstate.capture_stack.back(); + sstate.counter_stack.pop_back(); + sstate.capture_stack.pop_back(); + } + goto NOT_MATCHED; + + case st_bol: // '^': + if (sstate.is_at_lookbehindlimit() && !sstate.match_prev_avail_flag()) + { + if (!sstate.match_not_bol_flag()) + goto MATCHED; + } + // !sstate.is_at_lookbehindlimit() || sstate.match_prev_avail_flag() + else if (current_NFA.multiline) + { + const uchar32 prevchar = utf_traits::prevcodepoint(sstate.nth.in_string, sstate.lblim); + + if (this->character_class.is_included(re_character_class::newline, prevchar)) + goto MATCHED; + } + goto NOT_MATCHED; + + case st_eol: // '$': + if (sstate.is_at_srchend()) + { + if (!sstate.match_not_eol_flag()) + goto MATCHED; + } + else if (current_NFA.multiline) + { + const uchar32 nextchar = utf_traits::codepoint(sstate.nth.in_string, sstate.srchend); + + if (this->character_class.is_included(re_character_class::newline, nextchar)) + goto MATCHED; + } + goto NOT_MATCHED; + + case st_boundary: // '\b' '\B' + is_matched = current_NFA.is_not; +// is_matched = current_NFA.character == char_alnum::ch_B; + + // First, suppose the previous character is not \w but \W. + + if (sstate.is_at_srchend()) + { + if (sstate.match_not_eow_flag()) + is_matched = !is_matched; + } + else if (this->character_class.is_included(current_NFA.number, utf_traits::codepoint(sstate.nth.in_string, sstate.srchend))) + { + is_matched = !is_matched; + } + // \W/last \w + // \b false true + // \B true false + + // Second, if the actual previous character is \w, flip is_matched. + + if (sstate.is_at_lookbehindlimit() && !sstate.match_prev_avail_flag()) + { + if (sstate.match_not_bow_flag()) + is_matched = !is_matched; + } + // !sstate.is_at_lookbehindlimit() || sstate.match_prev_avail_flag() + else if (this->character_class.is_included(current_NFA.number, utf_traits::prevcodepoint(sstate.nth.in_string, sstate.lblim))) + { + is_matched = !is_matched; + } + // \b \B + // pre cur \W/last \w pre cur \W/last \w + // \W/base false true \W/base true false + // \w true false \w false true + + goto JUDGE; + + case st_success: // == lookaround_close. +// if (is_recursive) + if (sstate.btstack_size) + return true; + + if + ( + (!sstate.match_not_null_flag() || !sstate.is_null()) + && + (!sstate.match_match_flag() || sstate.is_at_srchend()) + ) + return true; + + goto NOT_MATCHED; + +#if !defined(SRELLDBG_NO_NEXTPOS_OPT) + case st_move_nextpos: +#if !defined(SRELLDBG_NO_1STCHRCLS) && !defined(SRELLDBG_NO_BITSET) + sstate.nextpos = sstate.nth.in_string; + if (!sstate.is_at_srchend()) + ++sstate.nextpos; +#else // defined(SRELLDBG_NO_1STCHRCLS) || defined(SRELLDBG_NO_BITSET) + if (sstate.nth.in_string != sstate.bracket[0].core.open_at) + { + sstate.nextpos = sstate.nth.in_string; + if (!sstate.is_at_srchend()) + utf_traits::codepoint_inc(sstate.nextpos, sstate.srchend); + } +#endif + goto MATCHED; +#endif + + default: + // Reaching here means that this->NFA_states is corrupted. + throw regex_error(regex_constants::error_internal); + + } + } + } + } +}; +// regex_object + + } // namespace regex_internal + +// ... "rei_algorithm.hpp"] +// ["basic_regex.hpp" ... + +// 28.8, class template basic_regex: +template > +class basic_regex : public regex_internal::regex_object +{ +public: + + // Types: + typedef charT value_type; + typedef traits traits_type; + typedef typename traits::string_type string_type; + typedef regex_constants::syntax_option_type flag_type; + typedef typename traits::locale_type locale_type; + + // 28.8.1, constants: + // [7.8.1] constants + static const regex_constants::syntax_option_type icase = regex_constants::icase; + static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs; + static const regex_constants::syntax_option_type optimize = regex_constants::optimize; + static const regex_constants::syntax_option_type collate = regex_constants::collate; + static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; + static const regex_constants::syntax_option_type basic = regex_constants::basic; + static const regex_constants::syntax_option_type extended = regex_constants::extended; + static const regex_constants::syntax_option_type awk = regex_constants::awk; + static const regex_constants::syntax_option_type grep = regex_constants::grep; + static const regex_constants::syntax_option_type egrep = regex_constants::egrep; + static const regex_constants::syntax_option_type multiline = regex_constants::multiline; + + static const regex_constants::syntax_option_type dotall = regex_constants::dotall; + + // 28.8.2, construct/copy/destroy: + // [7.8.2] construct/copy/destroy + basic_regex() + { + } + + explicit basic_regex(const charT *const p, const flag_type f = regex_constants::ECMAScript) + { + assign(p, p + std::char_traits::length(p), f); + } + + basic_regex(const charT *const p, const std::size_t len, const flag_type f = regex_constants::ECMAScript) + { + assign(p, p + len, f); + } + + basic_regex(const basic_regex &e) + { + assign(e); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + basic_regex(basic_regex &&e) SRELL_NOEXCEPT + { + assign(std::move(e)); + } +#endif + + template + explicit basic_regex(const std::basic_string &p, const flag_type f = regex_constants::ECMAScript) + { + assign(p, f); + } + + template + basic_regex(ForwardIterator first, ForwardIterator last, const flag_type f = regex_constants::ECMAScript) + { + assign(first, last, f); + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + basic_regex(std::initializer_list il, const flag_type f = regex_constants::ECMAScript) + { + assign(il, f); + } +#endif + +// ~basic_regex(); + + basic_regex &operator=(const basic_regex &right) + { + return assign(right); + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + basic_regex &operator=(basic_regex &&e) SRELL_NOEXCEPT + { + return assign(std::move(e)); + } +#endif + + basic_regex &operator=(const charT *const ptr) + { + return assign(ptr); + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + basic_regex &operator=(std::initializer_list il) + { + return assign(il.begin(), il.end()); + } +#endif + + template + basic_regex &operator=(const std::basic_string &p) + { + return assign(p); + } + + // 28.8.3, assign: + // [7.8.3] assign + basic_regex &assign(const basic_regex &right) + { + regex_internal::re_object_core::operator=(right); + return *this; + } + +#if defined(SRELL_CPP11_MOVE_ENABLED) + basic_regex &assign(basic_regex &&right) SRELL_NOEXCEPT + { + regex_internal::re_object_core::operator=(std::move(right)); + return *this; + } +#endif + + basic_regex &assign(const charT *const ptr, const flag_type f = regex_constants::ECMAScript) + { + return assign(ptr, ptr + std::char_traits::length(ptr), f); + } + + basic_regex &assign(const charT *const p, std::size_t len, const flag_type f = regex_constants::ECMAScript) + { + return assign(p, p + len, f); + } + + template + basic_regex &assign(const std::basic_string &s, const flag_type f = regex_constants::ECMAScript) + { + return assign(s.c_str(), s.c_str() + s.size(), f); + } + + template + basic_regex &assign(InputIterator first, InputIterator last, const flag_type f = regex_constants::ECMAScript) + { +#if defined(SRELL_STRICT_IMPL) + basic_regex tmp; + tmp.compile(first, last, f); + tmp.swap(*this); +#else + this->compile(first, last, f); +#endif + return *this; + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + basic_regex &assign(std::initializer_list il, const flag_type f = regex_constants::ECMAScript) + { + return assign(il.begin(), il.end(), f); + } +#endif + + // 28.8.4, const operations: + // [7.8.4] const operations + unsigned mark_count() const + { + return this->number_of_brackets - 1; + } + + flag_type flags() const + { + return this->soflags; + } + + // 28.8.5, locale: + // [7.8.5] locale + locale_type imbue(locale_type loc) + { + return this->traits_inst.imbue(loc); + } + + locale_type getloc() const + { + return this->traits_inst.getloc(); + } + + // 28.8.6, swap: + // [7.8.6] swap + void swap(basic_regex &e) + { + regex_internal::re_object_core::swap(e); + } +}; + +// 28.8.6, basic_regex swap: +template +void swap(basic_regex &lhs, basic_regex &rhs) +{ + lhs.swap(rhs); +} + +typedef basic_regex regex; +typedef basic_regex wregex; + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wregex u32wregex; + typedef u32wregex u1632wregex; + #elif WCHAR_MAX >= 0xffff + typedef basic_regex > u16wregex; + typedef u16wregex u1632wregex; + #endif +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef basic_regex u8regex; +#endif + +typedef basic_regex > u8cregex; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8cregex u8regex; +#endif + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef basic_regex u16regex; + typedef basic_regex u32regex; +#endif + +// ... "basic_regex.hpp"] +// ["regex_iterator.hpp" ... + +// 28.12.1, class template regex_iterator: +template ::value_type, class traits = regex_traits > +class regex_iterator +{ +public: + + typedef basic_regex regex_type; + typedef match_results value_type; + typedef std::ptrdiff_t difference_type; + typedef const value_type * pointer; + typedef const value_type & reference; + typedef std::forward_iterator_tag iterator_category; + + regex_iterator() + { + // 28.12.1.1: Constructs an end-of-sequence iterator. + } + + regex_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + const regex_constants::match_flag_type m = regex_constants::match_default) + : begin(a), end(b), pregex(&re), flags(m) + { + regex_search(begin, end, begin, match, *pregex, flags); + // 28.12.1.1: If this call returns false the constructor + // sets *this to the end-of-sequence iterator. + } + + regex_iterator(const regex_iterator &that) + { + operator=(that); + } + + regex_iterator &operator=(const regex_iterator &that) + { + if (this != &that) + { + this->begin = that.begin; + this->end = that.end; + this->pregex = that.pregex; + this->flags = that.flags; + this->match = that.match; + } + return *this; + } + + bool operator==(const regex_iterator &right) const + { + // It is probably safe to assume that match.size() == 0 means + // end-of-sequence, because it happens only when 1) never tried + // regex_search, or 2) regex_search returned false. + + if (this->match.size() == 0 || right.match.size() == 0) + return this->match.size() == right.match.size(); + + return + this->begin == right.begin + && + this->end == right.end + && + this->pregex == right.pregex + && + this->flags == right.flags + && + this->match[0] == right.match[0]; + } + + bool operator!=(const regex_iterator &right) const + { + return !(*this == right); + } + + const value_type &operator*() const + { + return match; + } + + const value_type *operator->() const + { + return &match; + } + + regex_iterator &operator++() + { + if (this->match.size()) + { + BidirectionalIterator start = match[0].second; + + if (match[0].first == start) // The iterator holds a 0-length match. + { + if (start == end) + { + match.clear_(); + // 28.12.1.4.2: If the iterator holds a zero-length match and + // start == end the operator sets *this to the end-ofsequence + // iterator and returns *this. + } + else + { + // 28.12.1.4.3: Otherwise, if the iterator holds a zero-length match + // the operator calls regex_search(start, end, match, *pregex, flags + // | regex_constants::match_not_null | regex_constants::match_continuous). + // If the call returns true the operator returns *this. [Cont...] + + if (!regex_search(start, end, begin, match, *pregex, flags | regex_constants::match_not_null | regex_constants::match_continuous)) + { + const BidirectionalIterator prevend = start; + + // [...Cont] Otherwise the operator increments start and continues + // as if the most recent match was not a zero-length match. +// ++start; + utf_traits::codepoint_inc(start, end); + + flags |= regex_constants::match_prev_avail; + + if (regex_search(start, end, begin, match, *pregex, flags)) + { + // 28.12.1.4.5-6: In all cases in which the call to regex_search + // returns true, match.prefix().first shall be equal to the previous + // value of match[0].second, ... match[i].position() shall return + // distance(begin, match[i].first). + // This means that match[i].position() gives the offset from the + // beginning of the target sequence, which is often not the same as + // the offset from the sequence passed in the call to regex_search. + // + // To satisfy this: + match.set_prefix_first_(prevend); + } + } + } + } + else + { + // 28.12.1.4.4: If the most recent match was not a zero-length match, + // the operator sets flags to flags | regex_constants::match_prev_avail + // and calls regex_search(start, end, match, *pregex, flags). [Cont...] + flags |= regex_constants::match_prev_avail; + + regex_search(start, end, begin, match, *pregex, flags); + // [...Cont] If the call returns false the iterator sets *this to + // the end-of-sequence iterator. The iterator then returns *this. + // + // 28.12.1.4.5-6: In all cases in which the call to regex_search + // returns true, match.prefix().first shall be equal to the previous + // value of match[0].second, ... match[i].position() shall return + // distance(begin, match[i].first). + // This means that match[i].position() gives the offset from the + // beginning of the target sequence, which is often not the same as + // the offset from the sequence passed in the call to regex_search. + // + // These should already be done in regex_search. + } + } + return *this; + } + + regex_iterator operator++(int) + { + const regex_iterator tmp = *this; + ++(*this); + return tmp; + } + +private: + + BidirectionalIterator begin; + BidirectionalIterator end; + const regex_type *pregex; + regex_constants::match_flag_type flags; + match_results match; + + typedef typename traits::utf_traits utf_traits; +}; + +typedef regex_iterator cregex_iterator; +typedef regex_iterator wcregex_iterator; +typedef regex_iterator sregex_iterator; +typedef regex_iterator wsregex_iterator; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef regex_iterator u16cregex_iterator; + typedef regex_iterator u32cregex_iterator; + typedef regex_iterator u16sregex_iterator; + typedef regex_iterator u32sregex_iterator; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef regex_iterator u8cregex_iterator; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef regex_iterator u8sregex_iterator; +#endif + +typedef regex_iterator::value_type, u8regex_traits::value_type> > u8ccregex_iterator; +typedef regex_iterator::value_type, u8regex_traits::value_type> > u8csregex_iterator; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccregex_iterator u8cregex_iterator; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8csregex_iterator u8sregex_iterator; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcregex_iterator u32wcregex_iterator; + typedef wsregex_iterator u32wsregex_iterator; + typedef u32wcregex_iterator u1632wcregex_iterator; + typedef u32wsregex_iterator u1632wsregex_iterator; + #elif WCHAR_MAX >= 0xffff + typedef regex_iterator::value_type, u16regex_traits::value_type> > u16wcregex_iterator; + typedef regex_iterator::value_type, u16regex_traits::value_type> > u16wsregex_iterator; + typedef u16wcregex_iterator u1632wcregex_iterator; + typedef u16wsregex_iterator u1632wsregex_iterator; + #endif +#endif + +// ... "regex_iterator.hpp"] +// ["regex_algorithm.hpp" ... + +// 28.11.2, function template regex_match: +// [7.11.2] Function template regex_match +template +bool regex_match( + const BidirectionalIterator first, + const BidirectionalIterator last, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return e.search(first, last, first, m, flags | regex_constants::match_continuous | regex_constants::match_match_); +} + +template +bool regex_match( + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ +// 4 Effects: Behaves "as if" by constructing an instance of +// match_results what, and then returning the +// result of regex_match(first, last, what, e, flags). + + match_results what; + + return regex_match(first, last, what, e, flags); +} + +template +bool regex_match( + const charT *const str, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(str, str + std::char_traits::length(str), m, e, flags); +} + +template +bool regex_match( + const std::basic_string &s, + match_results::const_iterator, Allocator> &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(s.begin(), s.end(), m, e, flags); +} + +template +bool regex_match( + const charT *const str, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(str, str + std::char_traits::length(str), e, flags); +} + +template +bool regex_match( + const std::basic_string &s, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_match(s.begin(), s.end(), e, flags); +} + +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + const BidirectionalIterator lookbehind_limit, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return e.search(first, last, lookbehind_limit, m, flags); +} + +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + const BidirectionalIterator lookbehind_limit, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ +// 6 Effects: Behaves "as if" by constructing an object what of type +// match_results and then returning the result of +// regex_search(first, last, what, e, flags). + + match_results what; + return regex_search(first, last, lookbehind_limit, what, e, flags); +} + +// 28.11.3, function template regex_search: +// 7.11.3 regex_search [tr.re.alg.search] +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return e.search(first, last, first, m, flags); +} + +template +bool regex_search( + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ +// 6 Effects: Behaves "as if" by constructing an object what of type +// match_results and then returning the result of +// regex_search(first, last, what, e, flags). + + match_results what; + return regex_search(first, last, what, e, flags); +} + +template +bool regex_search( + const charT *const str, + match_results &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(str, str + std::char_traits::length(str), m, e, flags); +} + +template +bool regex_search( + const charT *const str, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(str, str + std::char_traits::length(str), e, flags); +} + +template +bool regex_search( + const std::basic_string &s, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(s.begin(), s.end(), e, flags); +} + +template +bool regex_search( + const std::basic_string &s, + match_results::const_iterator, Allocator> &m, + const basic_regex &e, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + return regex_search(s.begin(), s.end(), m, e, flags); +} + +// 28.11.4, function template regex_replace: +// [7.11.4] Function template regex_replace +template +OutputIterator regex_replace( + OutputIterator out, + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const std::basic_string &fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + typedef regex_iterator iterator_type; + + const bool do_copy = !(flags & regex_constants::format_no_copy); + const iterator_type eos; + iterator_type i(first, last, e, flags); + typename iterator_type::value_type::value_type last_m_suffix; + + last_m_suffix.first = first; + last_m_suffix.second = last; + + for (; i != eos; ++i) + { + if (do_copy) + out = std::copy(i->prefix().first, i->prefix().second, out); + + out = i->format(out, fmt, flags); + last_m_suffix = i->suffix(); + + if (flags & regex_constants::format_first_only) + break; + } + + if (do_copy) + out = std::copy(last_m_suffix.first, last_m_suffix.second, out); + + return out; +} + +template +OutputIterator regex_replace( + OutputIterator out, + const BidirectionalIterator first, + const BidirectionalIterator last, + const basic_regex &e, + const charT *const fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + // Strictly speaking, this should be implemented as a version different + // from the above with changing the line i->format(out, fmt, flags) to + // i->format(out, fmt, fmt + char_traits::length(fmt), flags). + + const std::basic_string fs(fmt, fmt + std::char_traits::length(fmt)); + + return regex_replace(out, first, last, e, fs, flags); +} + +template +std::basic_string regex_replace( + const std::basic_string &s, + const basic_regex &e, + const std::basic_string &fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s.begin(), s.end(), e, fmt, flags); + return result; +} + +template +std::basic_string regex_replace( + const std::basic_string &s, + const basic_regex &e, + const charT *const fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s.begin(), s.end(), e, fmt, flags); + return result; +} + +template +std::basic_string regex_replace( + const charT *const s, + const basic_regex &e, + const std::basic_string &fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s, s + std::char_traits::length(s), e, fmt, flags); + return result; +} + +template +std::basic_string regex_replace( + const charT *const s, + const basic_regex &e, + const charT *const fmt, + const regex_constants::match_flag_type flags = regex_constants::match_default +) +{ + std::basic_string result; + + regex_replace(std::back_inserter(result), s, s + std::char_traits::length(s), e, fmt, flags); + return result; +} + +// ... "regex_algorithm.hpp"] +// ["regex_token_iterator.hpp" ... + +// 28.12.2, class template regex_token_iterator: +template ::value_type, class traits = regex_traits > +class regex_token_iterator +{ +public: + + typedef basic_regex regex_type; + typedef sub_match value_type; + typedef std::ptrdiff_t difference_type; + typedef const value_type * pointer; + typedef const value_type & reference; + typedef std::forward_iterator_tag iterator_category; + + regex_token_iterator() : result(NULL) + { + // Constructs the end-of-sequence iterator. + } + + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + int submatch = 0, + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(1, submatch) + { + post_constructor(a, b); + } + + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + const std::vector &submatches, + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(submatches) + { + post_constructor(a, b); + } + +#if defined(SRELL_CPP11_INITIALIZER_LIST_ENABLED) + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + std::initializer_list submatches, + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(submatches) + { + post_constructor(a, b); + } +#endif + + template // Was R in TR1. + regex_token_iterator( + const BidirectionalIterator a, + const BidirectionalIterator b, + const regex_type &re, + const int (&submatches)[N], + regex_constants::match_flag_type m = regex_constants::match_default + ) : position(a, b, re, m), result(NULL), subs(submatches, submatches + N) + { + post_constructor(a, b); + } + + regex_token_iterator(const regex_token_iterator &that) + { + operator=(that); + } + + regex_token_iterator &operator=(const regex_token_iterator &that) + { + if (this != &that) + { + this->position = that.position; + this->result = that.result; + this->suffix = that.suffix; + this->N = that.N; + this->subs = that.subs; + } + return *this; + } + + bool operator==(const regex_token_iterator &right) + { + if (this->result == NULL || right.result == NULL) + return this->result == right.result; + + if (this->result == &this->suffix || right.result == &right.suffix) + return this->suffix == right.suffix; + + return + this->position == right.position + && + this->N == right.N + && + this->subs == right.subs; + } + + bool operator!=(const regex_token_iterator &right) + { + return !(*this == right); + } + + const value_type &operator*() + { + return *result; + } + + const value_type *operator->() + { + return result; + } + + regex_token_iterator &operator++() + { + position_iterator prev(position); + position_iterator eos_iterator; + + if (result != NULL) + // To avoid inifinite loop. The specification does not require, though. + { + if (result == &suffix) + { + result = NULL; // end-of-sequence. + } + else + { + ++this->N; + for (;;) + { + if (this->N < subs.size()) + { + result = subs[this->N] != -1 ? &((*position)[subs[this->N]]) : &((*position).prefix()); + break; + } + + this->N = 0; + ++position; + + if (position == eos_iterator) + { + if (this->N < subs.size() && prev->suffix().length() && minus1_in_subs()) + { + suffix = prev->suffix(); + result = &suffix; + } + else + { + result = NULL; + } + break; + } + } + } + } + return *this; + } + + regex_token_iterator operator++(int) + { + const regex_token_iterator tmp(*this); + ++(*this); + return tmp; + } + +private: + + void post_constructor(const BidirectionalIterator a, const BidirectionalIterator b) + { + position_iterator eos_iterator; + + this->N = 0; + + if (position != eos_iterator && subs.size()) + { + result = subs[this->N] != -1 ? &((*position)[subs[this->N]]) : &((*position).prefix()); + } + else if (minus1_in_subs()) // end-of-sequence. + { + suffix.first = a; + suffix.second = b; + suffix.matched = a != b; + // 28.1.2.7: In a suffix iterator the member result holds a pointer + // to the data member suffix, the value of the member suffix.match is true, + + if (suffix.matched) + result = &suffix; + else + result = NULL; // Means end-of-sequence. + } + } + + bool minus1_in_subs() const + { + for (std::size_t i = 0; i < subs.size(); ++i) + if (subs[i] == -1) + return true; + + return false; + } + +private: + + typedef regex_iterator position_iterator; + position_iterator position; + const value_type *result; + value_type suffix; + std::size_t N; + std::vector subs; +}; + +typedef regex_token_iterator cregex_token_iterator; +typedef regex_token_iterator wcregex_token_iterator; +typedef regex_token_iterator sregex_token_iterator; +typedef regex_token_iterator wsregex_token_iterator; + +#if defined(SRELL_CPP11_CHAR1632_ENABLED) + typedef regex_token_iterator u16cregex_token_iterator; + typedef regex_token_iterator u32cregex_token_iterator; + typedef regex_token_iterator u16sregex_token_iterator; + typedef regex_token_iterator u32sregex_token_iterator; +#endif + +#if defined(SRELL_CPP20_CHAR8_ENABLED) + typedef regex_token_iterator u8cregex_token_iterator; +#endif +#if defined(SRELL_CPP20_CHAR8_ENABLED) && SRELL_CPP20_CHAR8_ENABLED >= 2 + typedef regex_token_iterator u8sregex_token_iterator; +#endif + +typedef regex_token_iterator::value_type, u8regex_traits::value_type> > u8ccregex_token_iterator; +typedef regex_token_iterator::value_type, u8regex_traits::value_type> > u8csregex_token_iterator; +#if !defined(SRELL_CPP20_CHAR8_ENABLED) + typedef u8ccregex_token_iterator u8cregex_token_iterator; +#endif +#if !defined(SRELL_CPP20_CHAR8_ENABLED) || SRELL_CPP20_CHAR8_ENABLED < 2 + typedef u8csregex_token_iterator u8sregex_token_iterator; +#endif + +#if defined(WCHAR_MAX) + #if WCHAR_MAX >= 0x10ffff + typedef wcregex_token_iterator u32wcregex_token_iterator; + typedef wsregex_token_iterator u32wsregex_token_iterator; + typedef u32wcregex_token_iterator u1632wcregex_token_iterator; + typedef u32wsregex_token_iterator u1632wsregex_token_iterator; + #elif WCHAR_MAX >= 0xffff + typedef regex_token_iterator::value_type, u16regex_traits::value_type> > u16wcregex_token_iterator; + typedef regex_token_iterator::value_type, u16regex_traits::value_type> > u16wsregex_token_iterator; + typedef u16wcregex_token_iterator u1632wcregex_token_iterator; + typedef u16wsregex_token_iterator u1632wsregex_token_iterator; + #endif +#endif + +// ... "regex_token_iterator.hpp"] + +} // namespace srell + +#ifdef SRELL_NOEXCEPT +#undef SRELL_NOEXCEPT +#endif + +#ifdef SRELL_CPP20_CHAR8_ENABLED +#undef SRELL_CPP20_CHAR8_ENABLED +#endif + +#ifdef SRELL_CPP11_CHAR1632_ENABLED +#undef SRELL_CPP11_CHAR1632_ENABLED +#endif + +#ifdef SRELL_CPP11_INITIALIZER_LIST_ENABLED +#undef SRELL_CPP11_INITIALIZER_LIST_ENABLED +#endif + +#ifdef SRELL_CPP11_MOVE_ENABLED +#undef SRELL_CPP11_MOVE_ENABLED +#endif + +#endif // SRELL_REGEX_TEMPLATE_LIBRARY diff --git a/lib/srell3_009/srell_ucfdata2.hpp b/lib/srell3_009/srell_ucfdata2.hpp new file mode 100644 index 000000000..1f079a5c5 --- /dev/null +++ b/lib/srell3_009/srell_ucfdata2.hpp @@ -0,0 +1,2491 @@ +// CaseFolding-14.0.0.txt +// Date: 2021-03-08, 19:35:41 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html + +template +struct unicode_casefolding +{ + static const T2 ucf_maxcodepoint = 0x1E921; + static const T3 ucf_deltatablesize = 0x1900; + static const T2 rev_maxcodepoint = 0x1E943; + static const T3 rev_indextablesize = 0x1B00; + static const T3 rev_charsettablesize = 4303; // 1 + 1424 * 2 + 1454 + static const T3 rev_maxset = 4; + static const T2 eos = 0; + + static const T2 ucf_deltatable[]; + static const T3 ucf_segmenttable[]; + static const T3 rev_indextable[]; + static const T3 rev_segmenttable[]; + static const T2 rev_charsettable[]; + + static const T2 *ucf_deltatable_ptr() + { + return ucf_deltatable; + } + static const T3 *ucf_segmenttable_ptr() + { + return ucf_segmenttable; + } + static const T3 *rev_indextable_ptr() + { + return rev_indextable; + } + static const T3 *rev_segmenttable_ptr() + { + return rev_segmenttable; + } + static const T2 *rev_charsettable_ptr() + { + return rev_charsettable; + } +}; + +template +const T2 unicode_casefolding::ucf_deltatable[] = +{ + // For common (0) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+00xx (256) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+01xx (512) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, static_cast(-121), 1, 0, 1, 0, 1, 0, static_cast(-268), + 0, 210, 1, 0, 1, 0, 206, 1, 0, 205, 205, 1, 0, 0, 79, 202, + 203, 1, 0, 205, 207, 0, 211, 209, 1, 0, 0, 0, 211, 213, 0, 214, + 1, 0, 1, 0, 1, 0, 218, 1, 0, 218, 0, 0, 1, 0, 218, 1, + 0, 217, 217, 1, 0, 1, 0, 219, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 2, 1, 0, 1, 0, static_cast(-97), static_cast(-56), 1, 0, 1, 0, 1, 0, 1, 0, + + // For u+02xx (768) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + static_cast(-130), 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10795, 1, 0, static_cast(-163), 10792, 0, + 0, 1, 0, static_cast(-195), 69, 71, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+03xx (1024) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 116, + 0, 0, 0, 0, 0, 0, 38, 0, 37, 37, 37, 0, 64, 0, 63, 63, + 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, + static_cast(-30), static_cast(-25), 0, 0, 0, static_cast(-15), static_cast(-22), 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + static_cast(-54), static_cast(-48), 0, 0, static_cast(-60), static_cast(-64), 0, 1, 0, static_cast(-7), 1, 0, 0, static_cast(-130), static_cast(-130), static_cast(-130), + + // For u+04xx (1280) + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 15, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + + // For u+05xx (1536) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10xx (1792) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, + 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264, + 7264, 7264, 7264, 7264, 7264, 7264, 0, 7264, 0, 0, 0, 0, 0, 7264, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+13xx (2048) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), 0, 0, + + // For u+1Cxx (2304) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + static_cast(-6222), static_cast(-6221), static_cast(-6212), static_cast(-6210), static_cast(-6210), static_cast(-6211), static_cast(-6204), static_cast(-6180), 35267, 0, 0, 0, 0, 0, 0, 0, + static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), + static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), + static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), static_cast(-3008), 0, 0, static_cast(-3008), static_cast(-3008), static_cast(-3008), + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Exx (2560) + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, static_cast(-58), 0, 0, static_cast(-7615), 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + + // For u+1Fxx (2816) + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), 0, static_cast(-8), 0, static_cast(-8), 0, static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), static_cast(-8), + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-74), static_cast(-74), static_cast(-9), 0, static_cast(-7173), 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-86), static_cast(-86), static_cast(-86), static_cast(-86), static_cast(-9), 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-100), static_cast(-100), 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-8), static_cast(-8), static_cast(-112), static_cast(-112), static_cast(-7), 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-128), static_cast(-128), static_cast(-126), static_cast(-126), static_cast(-9), 0, 0, 0, + + // For u+21xx (3072) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, static_cast(-7517), 0, 0, 0, static_cast(-8383), static_cast(-8262), 0, 0, 0, 0, + 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+24xx (3328) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+2Cxx (3584) + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, static_cast(-10743), static_cast(-3814), static_cast(-10727), 0, 0, 1, 0, 1, 0, 1, 0, static_cast(-10780), static_cast(-10749), static_cast(-10783), + static_cast(-10782), 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, static_cast(-10815), static_cast(-10815), + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+A6xx (3840) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+A7xx (4096) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, static_cast(-35332), 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, static_cast(-42280), 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, static_cast(-42308), static_cast(-42319), static_cast(-42315), static_cast(-42305), static_cast(-42308), 0, + static_cast(-42258), static_cast(-42282), static_cast(-42261), 928, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, static_cast(-48), static_cast(-42307), static_cast(-35384), 1, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+ABxx (4352) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), static_cast(-38864), + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+FFxx (4608) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+104xx (4864) + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+105xx (5120) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, 39, 39, 39, + 39, 39, 39, 0, 39, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10Cxx (5376) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+118xx (5632) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+16Exx (5888) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1E9xx (6144) + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +template +const T3 unicode_casefolding::ucf_segmenttable[] = +{ + 256, 512, 768, 1024, 1280, 1536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1792, 0, 0, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 2304, 0, 2560, 2816, + 0, 3072, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 3584, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3840, 4096, 0, 0, 0, 4352, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4608, + 0, 0, 0, 0, 4864, 5120, 0, 0, 0, 0, 0, 0, 5376, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5632, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5888, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6144 +}; + +template +const T3 unicode_casefolding::rev_indextable[] = +{ + // For common (0) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+00xx (256) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 35, 38, 41, 44, + 47, 50, 53, 56, 60, 63, 66, 69, 72, 75, 78, 0, 0, 0, 0, 0, + 0, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 35, 38, 41, 44, + 47, 50, 53, 56, 60, 63, 66, 69, 72, 75, 78, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 85, 88, 91, 94, 97, 100, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, + 134, 137, 140, 143, 146, 149, 152, 0, 155, 158, 161, 164, 167, 170, 173, 1924, + 85, 88, 91, 94, 97, 100, 104, 107, 110, 113, 116, 119, 122, 125, 128, 131, + 134, 137, 140, 143, 146, 149, 152, 0, 155, 158, 161, 164, 167, 170, 173, 350, + + // For u+21xx (512) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 785, 0, 0, 0, 31, 100, 0, 0, 0, 0, + 0, 0, 2359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2359, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2362, 2365, 2368, 2371, 2374, 2377, 2380, 2383, 2386, 2389, 2392, 2395, 2398, 2401, 2404, 2407, + 2362, 2365, 2368, 2371, 2374, 2377, 2380, 2383, 2386, 2389, 2392, 2395, 2398, 2401, 2404, 2407, + 0, 0, 0, 2410, 2410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+01xx (768) + 176, 176, 179, 179, 182, 182, 185, 185, 188, 188, 191, 191, 194, 194, 197, 197, + 200, 200, 203, 203, 206, 206, 209, 209, 212, 212, 215, 215, 218, 218, 221, 221, + 224, 224, 227, 227, 230, 230, 233, 233, 236, 236, 239, 239, 242, 242, 245, 245, + 0, 0, 248, 248, 251, 251, 254, 254, 0, 257, 257, 260, 260, 263, 263, 266, + 266, 269, 269, 272, 272, 275, 275, 278, 278, 0, 281, 281, 284, 284, 287, 287, + 290, 290, 293, 293, 296, 296, 299, 299, 302, 302, 305, 305, 308, 308, 311, 311, + 314, 314, 317, 317, 320, 320, 323, 323, 326, 326, 329, 329, 332, 332, 335, 335, + 338, 338, 341, 341, 344, 344, 347, 347, 350, 353, 353, 356, 356, 359, 359, 56, + 651, 362, 365, 365, 368, 368, 371, 374, 374, 377, 380, 383, 383, 0, 386, 389, + 392, 395, 395, 398, 401, 540, 404, 407, 410, 410, 642, 0, 413, 416, 606, 419, + 422, 422, 425, 425, 428, 428, 431, 434, 434, 437, 0, 0, 440, 440, 443, 446, + 446, 449, 452, 455, 455, 458, 458, 461, 464, 464, 0, 0, 467, 467, 0, 543, + 0, 0, 0, 0, 470, 470, 470, 474, 474, 474, 478, 478, 478, 482, 482, 485, + 485, 488, 488, 491, 491, 494, 494, 497, 497, 500, 500, 503, 503, 386, 506, 506, + 509, 509, 512, 512, 515, 515, 518, 518, 521, 521, 524, 524, 527, 527, 530, 530, + 0, 533, 533, 533, 537, 537, 540, 543, 546, 546, 549, 549, 552, 552, 555, 555, + + // For u+03xx (1024) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 680, 680, 683, 683, 0, 0, 686, 686, 0, 0, 0, 843, 846, 849, 0, 689, + 0, 0, 0, 0, 0, 0, 692, 0, 695, 698, 701, 0, 704, 0, 707, 710, + 0, 713, 716, 720, 723, 726, 730, 733, 736, 675, 741, 745, 81, 748, 751, 754, + 757, 761, 0, 765, 769, 772, 775, 779, 782, 785, 789, 792, 692, 695, 698, 701, + 0, 713, 716, 720, 723, 726, 730, 733, 736, 675, 741, 745, 81, 748, 751, 754, + 757, 761, 765, 765, 769, 772, 775, 779, 782, 785, 789, 792, 704, 707, 710, 795, + 716, 736, 0, 0, 0, 775, 757, 795, 798, 798, 801, 801, 804, 804, 807, 807, + 810, 810, 813, 813, 816, 816, 819, 819, 822, 822, 825, 825, 828, 828, 831, 831, + 741, 761, 837, 689, 736, 726, 0, 834, 834, 837, 840, 840, 0, 843, 846, 849, + + // For u+02xx (1280) + 558, 558, 561, 561, 564, 564, 567, 567, 570, 570, 573, 573, 576, 576, 579, 579, + 582, 582, 585, 585, 588, 588, 591, 591, 594, 594, 597, 597, 600, 600, 603, 603, + 606, 0, 609, 609, 612, 612, 615, 615, 618, 618, 621, 621, 624, 624, 627, 627, + 630, 630, 633, 633, 0, 0, 0, 0, 0, 0, 636, 639, 639, 642, 645, 2674, + 2677, 648, 648, 651, 654, 657, 660, 660, 663, 663, 666, 666, 669, 669, 672, 672, + 2662, 2656, 2665, 362, 371, 0, 377, 380, 0, 389, 0, 392, 3130, 0, 0, 0, + 398, 3133, 0, 401, 0, 3088, 3127, 0, 407, 404, 3139, 2638, 3136, 0, 0, 413, + 0, 2659, 416, 0, 0, 419, 0, 0, 0, 0, 0, 0, 0, 2644, 0, 0, + 431, 0, 3181, 437, 0, 0, 0, 3145, 443, 654, 449, 452, 657, 0, 0, 0, + 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3148, 3142, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+2Cxx (1536) + 2491, 2494, 2497, 2500, 2503, 2506, 2509, 2512, 2515, 2518, 2521, 2524, 2527, 2530, 2533, 2536, + 2539, 2542, 2545, 2548, 2551, 2554, 2557, 2560, 2563, 2566, 2569, 2572, 2575, 2578, 2581, 2584, + 2587, 2590, 2593, 2596, 2599, 2602, 2605, 2608, 2611, 2614, 2617, 2620, 2623, 2626, 2629, 2632, + 2491, 2494, 2497, 2500, 2503, 2506, 2509, 2512, 2515, 2518, 2521, 2524, 2527, 2530, 2533, 2536, + 2539, 2542, 2545, 2548, 2551, 2554, 2557, 2560, 2563, 2566, 2569, 2572, 2575, 2578, 2581, 2584, + 2587, 2590, 2593, 2596, 2599, 2602, 2605, 2608, 2611, 2614, 2617, 2620, 2623, 2626, 2629, 2632, + 2635, 2635, 2638, 2641, 2644, 636, 645, 2647, 2647, 2650, 2650, 2653, 2653, 2656, 2659, 2662, + 2665, 0, 2668, 2668, 0, 2671, 2671, 0, 0, 0, 0, 0, 0, 0, 2674, 2677, + 2680, 2680, 2683, 2683, 2686, 2686, 2689, 2689, 2692, 2692, 2695, 2695, 2698, 2698, 2701, 2701, + 2704, 2704, 2707, 2707, 2710, 2710, 2713, 2713, 2716, 2716, 2719, 2719, 2722, 2722, 2725, 2725, + 2728, 2728, 2731, 2731, 2734, 2734, 2737, 2737, 2740, 2740, 2743, 2743, 2746, 2746, 2749, 2749, + 2752, 2752, 2755, 2755, 2758, 2758, 2761, 2761, 2764, 2764, 2767, 2767, 2770, 2770, 2773, 2773, + 2776, 2776, 2779, 2779, 2782, 2782, 2785, 2785, 2788, 2788, 2791, 2791, 2794, 2794, 2797, 2797, + 2800, 2800, 2803, 2803, 2806, 2806, 2809, 2809, 2812, 2812, 2815, 2815, 2818, 2818, 2821, 2821, + 2824, 2824, 2827, 2827, 0, 0, 0, 0, 0, 0, 0, 2830, 2830, 2833, 2833, 0, + 0, 0, 2836, 2836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Fxx (1792) + 2071, 2074, 2077, 2080, 2083, 2086, 2089, 2092, 2071, 2074, 2077, 2080, 2083, 2086, 2089, 2092, + 2095, 2098, 2101, 2104, 2107, 2110, 0, 0, 2095, 2098, 2101, 2104, 2107, 2110, 0, 0, + 2113, 2116, 2119, 2122, 2125, 2128, 2131, 2134, 2113, 2116, 2119, 2122, 2125, 2128, 2131, 2134, + 2137, 2140, 2143, 2146, 2149, 2152, 2155, 2158, 2137, 2140, 2143, 2146, 2149, 2152, 2155, 2158, + 2161, 2164, 2167, 2170, 2173, 2176, 0, 0, 2161, 2164, 2167, 2170, 2173, 2176, 0, 0, + 0, 2179, 0, 2182, 0, 2185, 0, 2188, 0, 2179, 0, 2182, 0, 2185, 0, 2188, + 2191, 2194, 2197, 2200, 2203, 2206, 2209, 2212, 2191, 2194, 2197, 2200, 2203, 2206, 2209, 2212, + 2293, 2296, 2302, 2305, 2308, 2311, 2323, 2326, 2344, 2347, 2335, 2338, 2350, 2353, 0, 0, + 2215, 2218, 2221, 2224, 2227, 2230, 2233, 2236, 2215, 2218, 2221, 2224, 2227, 2230, 2233, 2236, + 2239, 2242, 2245, 2248, 2251, 2254, 2257, 2260, 2239, 2242, 2245, 2248, 2251, 2254, 2257, 2260, + 2263, 2266, 2269, 2272, 2275, 2278, 2281, 2284, 2263, 2266, 2269, 2272, 2275, 2278, 2281, 2284, + 2287, 2290, 0, 2299, 0, 0, 0, 0, 2287, 2290, 2293, 2296, 2299, 0, 675, 0, + 0, 0, 0, 2314, 0, 0, 0, 0, 2302, 2305, 2308, 2311, 2314, 0, 0, 0, + 2317, 2320, 0, 0, 0, 0, 0, 0, 2317, 2320, 2323, 2326, 0, 0, 0, 0, + 2329, 2332, 0, 0, 0, 2341, 0, 0, 2329, 2332, 2335, 2338, 2341, 0, 0, 0, + 0, 0, 0, 2356, 0, 0, 0, 0, 2344, 2347, 2350, 2353, 2356, 0, 0, 0, + + // For u+04xx (2048) + 852, 855, 858, 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, 897, + 900, 903, 906, 910, 913, 917, 920, 923, 926, 929, 932, 935, 938, 941, 944, 948, + 951, 954, 958, 963, 966, 969, 972, 975, 978, 981, 984, 988, 991, 994, 997, 1000, + 900, 903, 906, 910, 913, 917, 920, 923, 926, 929, 932, 935, 938, 941, 944, 948, + 951, 954, 958, 963, 966, 969, 972, 975, 978, 981, 984, 988, 991, 994, 997, 1000, + 852, 855, 858, 861, 864, 867, 870, 873, 876, 879, 882, 885, 888, 891, 894, 897, + 1003, 1003, 1006, 1006, 1010, 1010, 1013, 1013, 1016, 1016, 1019, 1019, 1022, 1022, 1025, 1025, + 1028, 1028, 1031, 1031, 1034, 1034, 1037, 1037, 1040, 1040, 1043, 1043, 1046, 1046, 1049, 1049, + 1052, 1052, 0, 0, 0, 0, 0, 0, 0, 0, 1055, 1055, 1058, 1058, 1061, 1061, + 1064, 1064, 1067, 1067, 1070, 1070, 1073, 1073, 1076, 1076, 1079, 1079, 1082, 1082, 1085, 1085, + 1088, 1088, 1091, 1091, 1094, 1094, 1097, 1097, 1100, 1100, 1103, 1103, 1106, 1106, 1109, 1109, + 1112, 1112, 1115, 1115, 1118, 1118, 1121, 1121, 1124, 1124, 1127, 1127, 1130, 1130, 1133, 1133, + 1136, 1139, 1139, 1142, 1142, 1145, 1145, 1148, 1148, 1151, 1151, 1154, 1154, 1157, 1157, 1136, + 1160, 1160, 1163, 1163, 1166, 1166, 1169, 1169, 1172, 1172, 1175, 1175, 1178, 1178, 1181, 1181, + 1184, 1184, 1187, 1187, 1190, 1190, 1193, 1193, 1196, 1196, 1199, 1199, 1202, 1202, 1205, 1205, + 1208, 1208, 1211, 1211, 1214, 1214, 1217, 1217, 1220, 1220, 1223, 1223, 1226, 1226, 1229, 1229, + + // For u+1Cxx (2304) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 906, 913, 944, 954, 958, 958, 984, 1006, 1556, 0, 0, 0, 0, 0, 0, 0, + 1560, 1563, 1566, 1569, 1572, 1575, 1578, 1581, 1584, 1587, 1590, 1593, 1596, 1599, 1602, 1605, + 1608, 1611, 1614, 1617, 1620, 1623, 1626, 1629, 1632, 1635, 1638, 1641, 1644, 1647, 1650, 1653, + 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, 1683, 1686, 0, 0, 1689, 1692, 1695, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+05xx (2560) + 1232, 1232, 1235, 1235, 1238, 1238, 1241, 1241, 1244, 1244, 1247, 1247, 1250, 1250, 1253, 1253, + 1256, 1256, 1259, 1259, 1262, 1262, 1265, 1265, 1268, 1268, 1271, 1271, 1274, 1274, 1277, 1277, + 1280, 1280, 1283, 1283, 1286, 1286, 1289, 1289, 1292, 1292, 1295, 1295, 1298, 1298, 1301, 1301, + 0, 1304, 1307, 1310, 1313, 1316, 1319, 1322, 1325, 1328, 1331, 1334, 1337, 1340, 1343, 1346, + 1349, 1352, 1355, 1358, 1361, 1364, 1367, 1370, 1373, 1376, 1379, 1382, 1385, 1388, 1391, 1394, + 1397, 1400, 1403, 1406, 1409, 1412, 1415, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1304, 1307, 1310, 1313, 1316, 1319, 1322, 1325, 1328, 1331, 1334, 1337, 1340, 1343, 1346, + 1349, 1352, 1355, 1358, 1361, 1364, 1367, 1370, 1373, 1376, 1379, 1382, 1385, 1388, 1391, 1394, + 1397, 1400, 1403, 1406, 1409, 1412, 1415, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+2Dxx (2816) + 1418, 1421, 1424, 1427, 1430, 1433, 1436, 1439, 1442, 1445, 1448, 1451, 1454, 1457, 1460, 1463, + 1466, 1469, 1472, 1475, 1478, 1481, 1484, 1487, 1490, 1493, 1496, 1499, 1502, 1505, 1508, 1511, + 1514, 1517, 1520, 1523, 1526, 1529, 0, 1532, 0, 0, 0, 0, 0, 1535, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10xx (3072) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1418, 1421, 1424, 1427, 1430, 1433, 1436, 1439, 1442, 1445, 1448, 1451, 1454, 1457, 1460, 1463, + 1466, 1469, 1472, 1475, 1478, 1481, 1484, 1487, 1490, 1493, 1496, 1499, 1502, 1505, 1508, 1511, + 1514, 1517, 1520, 1523, 1526, 1529, 0, 1532, 0, 0, 0, 0, 0, 1535, 0, 0, + 1560, 1563, 1566, 1569, 1572, 1575, 1578, 1581, 1584, 1587, 1590, 1593, 1596, 1599, 1602, 1605, + 1608, 1611, 1614, 1617, 1620, 1623, 1626, 1629, 1632, 1635, 1638, 1641, 1644, 1647, 1650, 1653, + 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, 1683, 1686, 0, 0, 1689, 1692, 1695, + + // For u+13xx (3328) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3205, 3208, 3211, 3214, 3217, 3220, 3223, 3226, 3229, 3232, 3235, 3238, 3241, 3244, 3247, 3250, + 3253, 3256, 3259, 3262, 3265, 3268, 3271, 3274, 3277, 3280, 3283, 3286, 3289, 3292, 3295, 3298, + 3301, 3304, 3307, 3310, 3313, 3316, 3319, 3322, 3325, 3328, 3331, 3334, 3337, 3340, 3343, 3346, + 3349, 3352, 3355, 3358, 3361, 3364, 3367, 3370, 3373, 3376, 3379, 3382, 3385, 3388, 3391, 3394, + 3397, 3400, 3403, 3406, 3409, 3412, 3415, 3418, 3421, 3424, 3427, 3430, 3433, 3436, 3439, 3442, + 1538, 1541, 1544, 1547, 1550, 1553, 0, 0, 1538, 1541, 1544, 1547, 1550, 1553, 0, 0, + + // For u+A6xx (3584) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2839, 2839, 2842, 2842, 2845, 2845, 2848, 2848, 2851, 2851, 1556, 1556, 2854, 2854, 2857, 2857, + 2860, 2860, 2863, 2863, 2866, 2866, 2869, 2869, 2872, 2872, 2875, 2875, 2878, 2878, 2881, 2881, + 2884, 2884, 2887, 2887, 2890, 2890, 2893, 2893, 2896, 2896, 2899, 2899, 2902, 2902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2905, 2905, 2908, 2908, 2911, 2911, 2914, 2914, 2917, 2917, 2920, 2920, 2923, 2923, 2926, 2926, + 2929, 2929, 2932, 2932, 2935, 2935, 2938, 2938, 2941, 2941, 2944, 2944, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Exx (3840) + 1698, 1698, 1701, 1701, 1704, 1704, 1707, 1707, 1710, 1710, 1713, 1713, 1716, 1716, 1719, 1719, + 1722, 1722, 1725, 1725, 1728, 1728, 1731, 1731, 1734, 1734, 1737, 1737, 1740, 1740, 1743, 1743, + 1746, 1746, 1749, 1749, 1752, 1752, 1755, 1755, 1758, 1758, 1761, 1761, 1764, 1764, 1767, 1767, + 1770, 1770, 1773, 1773, 1776, 1776, 1779, 1779, 1782, 1782, 1785, 1785, 1788, 1788, 1791, 1791, + 1794, 1794, 1797, 1797, 1800, 1800, 1803, 1803, 1806, 1806, 1809, 1809, 1812, 1812, 1815, 1815, + 1818, 1818, 1821, 1821, 1824, 1824, 1827, 1827, 1830, 1830, 1833, 1833, 1836, 1836, 1839, 1839, + 1842, 1842, 1846, 1846, 1849, 1849, 1852, 1852, 1855, 1855, 1858, 1858, 1861, 1861, 1864, 1864, + 1867, 1867, 1870, 1870, 1873, 1873, 1876, 1876, 1879, 1879, 1882, 1882, 1885, 1885, 1888, 1888, + 1891, 1891, 1894, 1894, 1897, 1897, 1900, 1900, 1903, 1903, 1906, 1906, 1909, 1909, 1912, 1912, + 1915, 1915, 1918, 1918, 1921, 1921, 0, 0, 0, 0, 0, 1842, 0, 0, 1924, 0, + 1927, 1927, 1930, 1930, 1933, 1933, 1936, 1936, 1939, 1939, 1942, 1942, 1945, 1945, 1948, 1948, + 1951, 1951, 1954, 1954, 1957, 1957, 1960, 1960, 1963, 1963, 1966, 1966, 1969, 1969, 1972, 1972, + 1975, 1975, 1978, 1978, 1981, 1981, 1984, 1984, 1987, 1987, 1990, 1990, 1993, 1993, 1996, 1996, + 1999, 1999, 2002, 2002, 2005, 2005, 2008, 2008, 2011, 2011, 2014, 2014, 2017, 2017, 2020, 2020, + 2023, 2023, 2026, 2026, 2029, 2029, 2032, 2032, 2035, 2035, 2038, 2038, 2041, 2041, 2044, 2044, + 2047, 2047, 2050, 2050, 2053, 2053, 2056, 2056, 2059, 2059, 2062, 2062, 2065, 2065, 2068, 2068, + + // For u+24xx (4096) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2413, 2416, 2419, 2422, 2425, 2428, 2431, 2434, 2437, 2440, + 2443, 2446, 2449, 2452, 2455, 2458, 2461, 2464, 2467, 2470, 2473, 2476, 2479, 2482, 2485, 2488, + 2413, 2416, 2419, 2422, 2425, 2428, 2431, 2434, 2437, 2440, 2443, 2446, 2449, 2452, 2455, 2458, + 2461, 2464, 2467, 2470, 2473, 2476, 2479, 2482, 2485, 2488, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1Dxx (4352) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3067, 0, 0, 0, 2641, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+A7xx (4608) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2947, 2947, 2950, 2950, 2953, 2953, 2956, 2956, 2959, 2959, 2962, 2962, 2965, 2965, + 0, 0, 2968, 2968, 2971, 2971, 2974, 2974, 2977, 2977, 2980, 2980, 2983, 2983, 2986, 2986, + 2989, 2989, 2992, 2992, 2995, 2995, 2998, 2998, 3001, 3001, 3004, 3004, 3007, 3007, 3010, 3010, + 3013, 3013, 3016, 3016, 3019, 3019, 3022, 3022, 3025, 3025, 3028, 3028, 3031, 3031, 3034, 3034, + 3037, 3037, 3040, 3040, 3043, 3043, 3046, 3046, 3049, 3049, 3052, 3052, 3055, 3055, 3058, 3058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3061, 3061, 3064, 3064, 3067, 3070, 3070, + 3073, 3073, 3076, 3076, 3079, 3079, 3082, 3082, 0, 0, 0, 3085, 3085, 3088, 0, 0, + 3091, 3091, 3094, 3094, 3178, 0, 3097, 3097, 3100, 3100, 3103, 3103, 3106, 3106, 3109, 3109, + 3112, 3112, 3115, 3115, 3118, 3118, 3121, 3121, 3124, 3124, 3127, 3130, 3133, 3136, 3139, 0, + 3142, 3145, 3148, 3151, 3154, 3154, 3157, 3157, 3160, 3160, 3163, 3163, 3166, 3166, 3169, 3169, + 3172, 3172, 3175, 3175, 3178, 3181, 3184, 3187, 3187, 3190, 3190, 0, 0, 0, 0, 0, + 3193, 3193, 0, 0, 0, 0, 3196, 3196, 3199, 3199, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3202, 3202, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+ABxx (4864) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3205, 3208, 3211, 3214, 3217, 3220, 3223, 3226, 3229, 3232, 3235, 3238, 3241, 3244, 3247, 3250, + 3253, 3256, 3259, 3262, 3265, 3268, 3271, 3274, 3277, 3280, 3283, 3286, 3289, 3292, 3295, 3298, + 3301, 3304, 3307, 3310, 3313, 3316, 3319, 3322, 3325, 3328, 3331, 3334, 3337, 3340, 3343, 3346, + 3349, 3352, 3355, 3358, 3361, 3364, 3367, 3370, 3373, 3376, 3379, 3382, 3385, 3388, 3391, 3394, + 3397, 3400, 3403, 3406, 3409, 3412, 3415, 3418, 3421, 3424, 3427, 3430, 3433, 3436, 3439, 3442, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+FFxx (5120) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3445, 3448, 3451, 3454, 3457, 3460, 3463, 3466, 3469, 3472, 3475, 3478, 3481, 3484, 3487, + 3490, 3493, 3496, 3499, 3502, 3505, 3508, 3511, 3514, 3517, 3520, 0, 0, 0, 0, 0, + 0, 3445, 3448, 3451, 3454, 3457, 3460, 3463, 3466, 3469, 3472, 3475, 3478, 3481, 3484, 3487, + 3490, 3493, 3496, 3499, 3502, 3505, 3508, 3511, 3514, 3517, 3520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+104xx (5376) + 3523, 3526, 3529, 3532, 3535, 3538, 3541, 3544, 3547, 3550, 3553, 3556, 3559, 3562, 3565, 3568, + 3571, 3574, 3577, 3580, 3583, 3586, 3589, 3592, 3595, 3598, 3601, 3604, 3607, 3610, 3613, 3616, + 3619, 3622, 3625, 3628, 3631, 3634, 3637, 3640, 3523, 3526, 3529, 3532, 3535, 3538, 3541, 3544, + 3547, 3550, 3553, 3556, 3559, 3562, 3565, 3568, 3571, 3574, 3577, 3580, 3583, 3586, 3589, 3592, + 3595, 3598, 3601, 3604, 3607, 3610, 3613, 3616, 3619, 3622, 3625, 3628, 3631, 3634, 3637, 3640, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3643, 3646, 3649, 3652, 3655, 3658, 3661, 3664, 3667, 3670, 3673, 3676, 3679, 3682, 3685, 3688, + 3691, 3694, 3697, 3700, 3703, 3706, 3709, 3712, 3715, 3718, 3721, 3724, 3727, 3730, 3733, 3736, + 3739, 3742, 3745, 3748, 0, 0, 0, 0, 3643, 3646, 3649, 3652, 3655, 3658, 3661, 3664, + 3667, 3670, 3673, 3676, 3679, 3682, 3685, 3688, 3691, 3694, 3697, 3700, 3703, 3706, 3709, 3712, + 3715, 3718, 3721, 3724, 3727, 3730, 3733, 3736, 3739, 3742, 3745, 3748, 0, 0, 0, 0, + + // For u+105xx (5632) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3751, 3754, 3757, 3760, 3763, 3766, 3769, 3772, 3775, 3778, 3781, 0, 3784, 3787, 3790, 3793, + 3796, 3799, 3802, 3805, 3808, 3811, 3814, 3817, 3820, 3823, 3826, 0, 3829, 3832, 3835, 3838, + 3841, 3844, 3847, 0, 3850, 3853, 0, 3751, 3754, 3757, 3760, 3763, 3766, 3769, 3772, 3775, + 3778, 3781, 0, 3784, 3787, 3790, 3793, 3796, 3799, 3802, 3805, 3808, 3811, 3814, 3817, 3820, + 3823, 3826, 0, 3829, 3832, 3835, 3838, 3841, 3844, 3847, 0, 3850, 3853, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+10Cxx (5888) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3856, 3859, 3862, 3865, 3868, 3871, 3874, 3877, 3880, 3883, 3886, 3889, 3892, 3895, 3898, 3901, + 3904, 3907, 3910, 3913, 3916, 3919, 3922, 3925, 3928, 3931, 3934, 3937, 3940, 3943, 3946, 3949, + 3952, 3955, 3958, 3961, 3964, 3967, 3970, 3973, 3976, 3979, 3982, 3985, 3988, 3991, 3994, 3997, + 4000, 4003, 4006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3856, 3859, 3862, 3865, 3868, 3871, 3874, 3877, 3880, 3883, 3886, 3889, 3892, 3895, 3898, 3901, + 3904, 3907, 3910, 3913, 3916, 3919, 3922, 3925, 3928, 3931, 3934, 3937, 3940, 3943, 3946, 3949, + 3952, 3955, 3958, 3961, 3964, 3967, 3970, 3973, 3976, 3979, 3982, 3985, 3988, 3991, 3994, 3997, + 4000, 4003, 4006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+118xx (6144) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4009, 4012, 4015, 4018, 4021, 4024, 4027, 4030, 4033, 4036, 4039, 4042, 4045, 4048, 4051, 4054, + 4057, 4060, 4063, 4066, 4069, 4072, 4075, 4078, 4081, 4084, 4087, 4090, 4093, 4096, 4099, 4102, + 4009, 4012, 4015, 4018, 4021, 4024, 4027, 4030, 4033, 4036, 4039, 4042, 4045, 4048, 4051, 4054, + 4057, 4060, 4063, 4066, 4069, 4072, 4075, 4078, 4081, 4084, 4087, 4090, 4093, 4096, 4099, 4102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+16Exx (6400) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4105, 4108, 4111, 4114, 4117, 4120, 4123, 4126, 4129, 4132, 4135, 4138, 4141, 4144, 4147, 4150, + 4153, 4156, 4159, 4162, 4165, 4168, 4171, 4174, 4177, 4180, 4183, 4186, 4189, 4192, 4195, 4198, + 4105, 4108, 4111, 4114, 4117, 4120, 4123, 4126, 4129, 4132, 4135, 4138, 4141, 4144, 4147, 4150, + 4153, 4156, 4159, 4162, 4165, 4168, 4171, 4174, 4177, 4180, 4183, 4186, 4189, 4192, 4195, 4198, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + // For u+1E9xx (6656) + 4201, 4204, 4207, 4210, 4213, 4216, 4219, 4222, 4225, 4228, 4231, 4234, 4237, 4240, 4243, 4246, + 4249, 4252, 4255, 4258, 4261, 4264, 4267, 4270, 4273, 4276, 4279, 4282, 4285, 4288, 4291, 4294, + 4297, 4300, 4201, 4204, 4207, 4210, 4213, 4216, 4219, 4222, 4225, 4228, 4231, 4234, 4237, 4240, + 4243, 4246, 4249, 4252, 4255, 4258, 4261, 4264, 4267, 4270, 4273, 4276, 4279, 4282, 4285, 4288, + 4291, 4294, 4297, 4300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +template +const T3 unicode_casefolding::rev_segmenttable[] = +{ + 256, 768, 1280, 1024, 2048, 2560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3072, 0, 0, 3328, 0, 0, 0, 0, 0, 0, 0, 0, 2304, 4352, 3840, 1792, + 0, 512, 0, 0, 4096, 0, 0, 0, 0, 0, 0, 0, 1536, 2816, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3584, 4608, 0, 0, 0, 4864, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5120, + 0, 0, 0, 0, 5376, 5632, 0, 0, 0, 0, 0, 0, 5888, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6144, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6400, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6656 +}; + +template +const T2 unicode_casefolding::rev_charsettable[] = +{ + eos, // 0 + 0x0061, 0x0041, eos, + 0x0062, 0x0042, eos, + 0x0063, 0x0043, eos, + 0x0064, 0x0044, eos, // 10 + 0x0065, 0x0045, eos, + 0x0066, 0x0046, eos, + 0x0067, 0x0047, eos, + 0x0068, 0x0048, eos, // 22 + 0x0069, 0x0049, eos, + 0x006A, 0x004A, eos, + 0x006B, 0x004B, 0x212A, eos, // 31 + 0x006C, 0x004C, eos, + 0x006D, 0x004D, eos, + 0x006E, 0x004E, eos, // 41 + 0x006F, 0x004F, eos, + 0x0070, 0x0050, eos, + 0x0071, 0x0051, eos, // 50 + 0x0072, 0x0052, eos, + 0x0073, 0x0053, 0x017F, eos, + 0x0074, 0x0054, eos, // 60 + 0x0075, 0x0055, eos, + 0x0076, 0x0056, eos, + 0x0077, 0x0057, eos, + 0x0078, 0x0058, eos, // 72 + 0x0079, 0x0059, eos, + 0x007A, 0x005A, eos, + 0x03BC, 0x00B5, 0x039C, eos, // 81 + 0x00E0, 0x00C0, eos, + 0x00E1, 0x00C1, eos, + 0x00E2, 0x00C2, eos, // 91 + 0x00E3, 0x00C3, eos, + 0x00E4, 0x00C4, eos, + 0x00E5, 0x00C5, 0x212B, eos, // 100 + 0x00E6, 0x00C6, eos, + 0x00E7, 0x00C7, eos, + 0x00E8, 0x00C8, eos, // 110 + 0x00E9, 0x00C9, eos, + 0x00EA, 0x00CA, eos, + 0x00EB, 0x00CB, eos, + 0x00EC, 0x00CC, eos, // 122 + 0x00ED, 0x00CD, eos, + 0x00EE, 0x00CE, eos, + 0x00EF, 0x00CF, eos, // 131 + 0x00F0, 0x00D0, eos, + 0x00F1, 0x00D1, eos, + 0x00F2, 0x00D2, eos, // 140 + 0x00F3, 0x00D3, eos, + 0x00F4, 0x00D4, eos, + 0x00F5, 0x00D5, eos, + 0x00F6, 0x00D6, eos, // 152 + 0x00F8, 0x00D8, eos, + 0x00F9, 0x00D9, eos, + 0x00FA, 0x00DA, eos, // 161 + 0x00FB, 0x00DB, eos, + 0x00FC, 0x00DC, eos, + 0x00FD, 0x00DD, eos, // 170 + 0x00FE, 0x00DE, eos, + 0x0101, 0x0100, eos, + 0x0103, 0x0102, eos, + 0x0105, 0x0104, eos, // 182 + 0x0107, 0x0106, eos, + 0x0109, 0x0108, eos, + 0x010B, 0x010A, eos, // 191 + 0x010D, 0x010C, eos, + 0x010F, 0x010E, eos, + 0x0111, 0x0110, eos, // 200 + 0x0113, 0x0112, eos, + 0x0115, 0x0114, eos, + 0x0117, 0x0116, eos, + 0x0119, 0x0118, eos, // 212 + 0x011B, 0x011A, eos, + 0x011D, 0x011C, eos, + 0x011F, 0x011E, eos, // 221 + 0x0121, 0x0120, eos, + 0x0123, 0x0122, eos, + 0x0125, 0x0124, eos, // 230 + 0x0127, 0x0126, eos, + 0x0129, 0x0128, eos, + 0x012B, 0x012A, eos, + 0x012D, 0x012C, eos, // 242 + 0x012F, 0x012E, eos, + 0x0133, 0x0132, eos, + 0x0135, 0x0134, eos, // 251 + 0x0137, 0x0136, eos, + 0x013A, 0x0139, eos, + 0x013C, 0x013B, eos, // 260 + 0x013E, 0x013D, eos, + 0x0140, 0x013F, eos, + 0x0142, 0x0141, eos, + 0x0144, 0x0143, eos, // 272 + 0x0146, 0x0145, eos, + 0x0148, 0x0147, eos, + 0x014B, 0x014A, eos, // 281 + 0x014D, 0x014C, eos, + 0x014F, 0x014E, eos, + 0x0151, 0x0150, eos, // 290 + 0x0153, 0x0152, eos, + 0x0155, 0x0154, eos, + 0x0157, 0x0156, eos, + 0x0159, 0x0158, eos, // 302 + 0x015B, 0x015A, eos, + 0x015D, 0x015C, eos, + 0x015F, 0x015E, eos, // 311 + 0x0161, 0x0160, eos, + 0x0163, 0x0162, eos, + 0x0165, 0x0164, eos, // 320 + 0x0167, 0x0166, eos, + 0x0169, 0x0168, eos, + 0x016B, 0x016A, eos, + 0x016D, 0x016C, eos, // 332 + 0x016F, 0x016E, eos, + 0x0171, 0x0170, eos, + 0x0173, 0x0172, eos, // 341 + 0x0175, 0x0174, eos, + 0x0177, 0x0176, eos, + 0x00FF, 0x0178, eos, // 350 + 0x017A, 0x0179, eos, + 0x017C, 0x017B, eos, + 0x017E, 0x017D, eos, + 0x0253, 0x0181, eos, // 362 + 0x0183, 0x0182, eos, + 0x0185, 0x0184, eos, + 0x0254, 0x0186, eos, // 371 + 0x0188, 0x0187, eos, + 0x0256, 0x0189, eos, + 0x0257, 0x018A, eos, // 380 + 0x018C, 0x018B, eos, + 0x01DD, 0x018E, eos, + 0x0259, 0x018F, eos, + 0x025B, 0x0190, eos, // 392 + 0x0192, 0x0191, eos, + 0x0260, 0x0193, eos, + 0x0263, 0x0194, eos, // 401 + 0x0269, 0x0196, eos, + 0x0268, 0x0197, eos, + 0x0199, 0x0198, eos, // 410 + 0x026F, 0x019C, eos, + 0x0272, 0x019D, eos, + 0x0275, 0x019F, eos, + 0x01A1, 0x01A0, eos, // 422 + 0x01A3, 0x01A2, eos, + 0x01A5, 0x01A4, eos, + 0x0280, 0x01A6, eos, // 431 + 0x01A8, 0x01A7, eos, + 0x0283, 0x01A9, eos, + 0x01AD, 0x01AC, eos, // 440 + 0x0288, 0x01AE, eos, + 0x01B0, 0x01AF, eos, + 0x028A, 0x01B1, eos, + 0x028B, 0x01B2, eos, // 452 + 0x01B4, 0x01B3, eos, + 0x01B6, 0x01B5, eos, + 0x0292, 0x01B7, eos, // 461 + 0x01B9, 0x01B8, eos, + 0x01BD, 0x01BC, eos, + 0x01C6, 0x01C4, 0x01C5, eos, // 470 + 0x01C9, 0x01C7, 0x01C8, eos, + 0x01CC, 0x01CA, 0x01CB, eos, + 0x01CE, 0x01CD, eos, // 482 + 0x01D0, 0x01CF, eos, + 0x01D2, 0x01D1, eos, + 0x01D4, 0x01D3, eos, // 491 + 0x01D6, 0x01D5, eos, + 0x01D8, 0x01D7, eos, + 0x01DA, 0x01D9, eos, // 500 + 0x01DC, 0x01DB, eos, + 0x01DF, 0x01DE, eos, + 0x01E1, 0x01E0, eos, + 0x01E3, 0x01E2, eos, // 512 + 0x01E5, 0x01E4, eos, + 0x01E7, 0x01E6, eos, + 0x01E9, 0x01E8, eos, // 521 + 0x01EB, 0x01EA, eos, + 0x01ED, 0x01EC, eos, + 0x01EF, 0x01EE, eos, // 530 + 0x01F3, 0x01F1, 0x01F2, eos, + 0x01F5, 0x01F4, eos, + 0x0195, 0x01F6, eos, // 540 + 0x01BF, 0x01F7, eos, + 0x01F9, 0x01F8, eos, + 0x01FB, 0x01FA, eos, + 0x01FD, 0x01FC, eos, // 552 + 0x01FF, 0x01FE, eos, + 0x0201, 0x0200, eos, + 0x0203, 0x0202, eos, // 561 + 0x0205, 0x0204, eos, + 0x0207, 0x0206, eos, + 0x0209, 0x0208, eos, // 570 + 0x020B, 0x020A, eos, + 0x020D, 0x020C, eos, + 0x020F, 0x020E, eos, + 0x0211, 0x0210, eos, // 582 + 0x0213, 0x0212, eos, + 0x0215, 0x0214, eos, + 0x0217, 0x0216, eos, // 591 + 0x0219, 0x0218, eos, + 0x021B, 0x021A, eos, + 0x021D, 0x021C, eos, // 600 + 0x021F, 0x021E, eos, + 0x019E, 0x0220, eos, + 0x0223, 0x0222, eos, + 0x0225, 0x0224, eos, // 612 + 0x0227, 0x0226, eos, + 0x0229, 0x0228, eos, + 0x022B, 0x022A, eos, // 621 + 0x022D, 0x022C, eos, + 0x022F, 0x022E, eos, + 0x0231, 0x0230, eos, // 630 + 0x0233, 0x0232, eos, + 0x2C65, 0x023A, eos, + 0x023C, 0x023B, eos, + 0x019A, 0x023D, eos, // 642 + 0x2C66, 0x023E, eos, + 0x0242, 0x0241, eos, + 0x0180, 0x0243, eos, // 651 + 0x0289, 0x0244, eos, + 0x028C, 0x0245, eos, + 0x0247, 0x0246, eos, // 660 + 0x0249, 0x0248, eos, + 0x024B, 0x024A, eos, + 0x024D, 0x024C, eos, + 0x024F, 0x024E, eos, // 672 + 0x03B9, 0x0345, 0x0399, 0x1FBE, eos, + 0x0371, 0x0370, eos, // 680 + 0x0373, 0x0372, eos, + 0x0377, 0x0376, eos, + 0x03F3, 0x037F, eos, + 0x03AC, 0x0386, eos, // 692 + 0x03AD, 0x0388, eos, + 0x03AE, 0x0389, eos, + 0x03AF, 0x038A, eos, // 701 + 0x03CC, 0x038C, eos, + 0x03CD, 0x038E, eos, + 0x03CE, 0x038F, eos, // 710 + 0x03B1, 0x0391, eos, + 0x03B2, 0x0392, 0x03D0, eos, + 0x03B3, 0x0393, eos, // 720 + 0x03B4, 0x0394, eos, + 0x03B5, 0x0395, 0x03F5, eos, + 0x03B6, 0x0396, eos, // 730 + 0x03B7, 0x0397, eos, + 0x03B8, 0x0398, 0x03D1, 0x03F4, eos, + 0x03BA, 0x039A, 0x03F0, eos, // 741 + 0x03BB, 0x039B, eos, + 0x03BD, 0x039D, eos, + 0x03BE, 0x039E, eos, // 751 + 0x03BF, 0x039F, eos, + 0x03C0, 0x03A0, 0x03D6, eos, + 0x03C1, 0x03A1, 0x03F1, eos, // 761 + 0x03C3, 0x03A3, 0x03C2, eos, + 0x03C4, 0x03A4, eos, + 0x03C5, 0x03A5, eos, // 772 + 0x03C6, 0x03A6, 0x03D5, eos, + 0x03C7, 0x03A7, eos, + 0x03C8, 0x03A8, eos, // 782 + 0x03C9, 0x03A9, 0x2126, eos, + 0x03CA, 0x03AA, eos, + 0x03CB, 0x03AB, eos, // 792 + 0x03D7, 0x03CF, eos, + 0x03D9, 0x03D8, eos, + 0x03DB, 0x03DA, eos, // 801 + 0x03DD, 0x03DC, eos, + 0x03DF, 0x03DE, eos, + 0x03E1, 0x03E0, eos, // 810 + 0x03E3, 0x03E2, eos, + 0x03E5, 0x03E4, eos, + 0x03E7, 0x03E6, eos, + 0x03E9, 0x03E8, eos, // 822 + 0x03EB, 0x03EA, eos, + 0x03ED, 0x03EC, eos, + 0x03EF, 0x03EE, eos, // 831 + 0x03F8, 0x03F7, eos, + 0x03F2, 0x03F9, eos, + 0x03FB, 0x03FA, eos, // 840 + 0x037B, 0x03FD, eos, + 0x037C, 0x03FE, eos, + 0x037D, 0x03FF, eos, + 0x0450, 0x0400, eos, // 852 + 0x0451, 0x0401, eos, + 0x0452, 0x0402, eos, + 0x0453, 0x0403, eos, // 861 + 0x0454, 0x0404, eos, + 0x0455, 0x0405, eos, + 0x0456, 0x0406, eos, // 870 + 0x0457, 0x0407, eos, + 0x0458, 0x0408, eos, + 0x0459, 0x0409, eos, + 0x045A, 0x040A, eos, // 882 + 0x045B, 0x040B, eos, + 0x045C, 0x040C, eos, + 0x045D, 0x040D, eos, // 891 + 0x045E, 0x040E, eos, + 0x045F, 0x040F, eos, + 0x0430, 0x0410, eos, // 900 + 0x0431, 0x0411, eos, + 0x0432, 0x0412, 0x1C80, eos, + 0x0433, 0x0413, eos, // 910 + 0x0434, 0x0414, 0x1C81, eos, + 0x0435, 0x0415, eos, + 0x0436, 0x0416, eos, // 920 + 0x0437, 0x0417, eos, + 0x0438, 0x0418, eos, + 0x0439, 0x0419, eos, + 0x043A, 0x041A, eos, // 932 + 0x043B, 0x041B, eos, + 0x043C, 0x041C, eos, + 0x043D, 0x041D, eos, // 941 + 0x043E, 0x041E, 0x1C82, eos, + 0x043F, 0x041F, eos, + 0x0440, 0x0420, eos, // 951 + 0x0441, 0x0421, 0x1C83, eos, + 0x0442, 0x0422, 0x1C84, 0x1C85, eos, + 0x0443, 0x0423, eos, // 963 + 0x0444, 0x0424, eos, + 0x0445, 0x0425, eos, + 0x0446, 0x0426, eos, // 972 + 0x0447, 0x0427, eos, + 0x0448, 0x0428, eos, + 0x0449, 0x0429, eos, // 981 + 0x044A, 0x042A, 0x1C86, eos, + 0x044B, 0x042B, eos, + 0x044C, 0x042C, eos, // 991 + 0x044D, 0x042D, eos, + 0x044E, 0x042E, eos, + 0x044F, 0x042F, eos, // 1000 + 0x0461, 0x0460, eos, + 0x0463, 0x0462, 0x1C87, eos, + 0x0465, 0x0464, eos, // 1010 + 0x0467, 0x0466, eos, + 0x0469, 0x0468, eos, + 0x046B, 0x046A, eos, + 0x046D, 0x046C, eos, // 1022 + 0x046F, 0x046E, eos, + 0x0471, 0x0470, eos, + 0x0473, 0x0472, eos, // 1031 + 0x0475, 0x0474, eos, + 0x0477, 0x0476, eos, + 0x0479, 0x0478, eos, // 1040 + 0x047B, 0x047A, eos, + 0x047D, 0x047C, eos, + 0x047F, 0x047E, eos, + 0x0481, 0x0480, eos, // 1052 + 0x048B, 0x048A, eos, + 0x048D, 0x048C, eos, + 0x048F, 0x048E, eos, // 1061 + 0x0491, 0x0490, eos, + 0x0493, 0x0492, eos, + 0x0495, 0x0494, eos, // 1070 + 0x0497, 0x0496, eos, + 0x0499, 0x0498, eos, + 0x049B, 0x049A, eos, + 0x049D, 0x049C, eos, // 1082 + 0x049F, 0x049E, eos, + 0x04A1, 0x04A0, eos, + 0x04A3, 0x04A2, eos, // 1091 + 0x04A5, 0x04A4, eos, + 0x04A7, 0x04A6, eos, + 0x04A9, 0x04A8, eos, // 1100 + 0x04AB, 0x04AA, eos, + 0x04AD, 0x04AC, eos, + 0x04AF, 0x04AE, eos, + 0x04B1, 0x04B0, eos, // 1112 + 0x04B3, 0x04B2, eos, + 0x04B5, 0x04B4, eos, + 0x04B7, 0x04B6, eos, // 1121 + 0x04B9, 0x04B8, eos, + 0x04BB, 0x04BA, eos, + 0x04BD, 0x04BC, eos, // 1130 + 0x04BF, 0x04BE, eos, + 0x04CF, 0x04C0, eos, + 0x04C2, 0x04C1, eos, + 0x04C4, 0x04C3, eos, // 1142 + 0x04C6, 0x04C5, eos, + 0x04C8, 0x04C7, eos, + 0x04CA, 0x04C9, eos, // 1151 + 0x04CC, 0x04CB, eos, + 0x04CE, 0x04CD, eos, + 0x04D1, 0x04D0, eos, // 1160 + 0x04D3, 0x04D2, eos, + 0x04D5, 0x04D4, eos, + 0x04D7, 0x04D6, eos, + 0x04D9, 0x04D8, eos, // 1172 + 0x04DB, 0x04DA, eos, + 0x04DD, 0x04DC, eos, + 0x04DF, 0x04DE, eos, // 1181 + 0x04E1, 0x04E0, eos, + 0x04E3, 0x04E2, eos, + 0x04E5, 0x04E4, eos, // 1190 + 0x04E7, 0x04E6, eos, + 0x04E9, 0x04E8, eos, + 0x04EB, 0x04EA, eos, + 0x04ED, 0x04EC, eos, // 1202 + 0x04EF, 0x04EE, eos, + 0x04F1, 0x04F0, eos, + 0x04F3, 0x04F2, eos, // 1211 + 0x04F5, 0x04F4, eos, + 0x04F7, 0x04F6, eos, + 0x04F9, 0x04F8, eos, // 1220 + 0x04FB, 0x04FA, eos, + 0x04FD, 0x04FC, eos, + 0x04FF, 0x04FE, eos, + 0x0501, 0x0500, eos, // 1232 + 0x0503, 0x0502, eos, + 0x0505, 0x0504, eos, + 0x0507, 0x0506, eos, // 1241 + 0x0509, 0x0508, eos, + 0x050B, 0x050A, eos, + 0x050D, 0x050C, eos, // 1250 + 0x050F, 0x050E, eos, + 0x0511, 0x0510, eos, + 0x0513, 0x0512, eos, + 0x0515, 0x0514, eos, // 1262 + 0x0517, 0x0516, eos, + 0x0519, 0x0518, eos, + 0x051B, 0x051A, eos, // 1271 + 0x051D, 0x051C, eos, + 0x051F, 0x051E, eos, + 0x0521, 0x0520, eos, // 1280 + 0x0523, 0x0522, eos, + 0x0525, 0x0524, eos, + 0x0527, 0x0526, eos, + 0x0529, 0x0528, eos, // 1292 + 0x052B, 0x052A, eos, + 0x052D, 0x052C, eos, + 0x052F, 0x052E, eos, // 1301 + 0x0561, 0x0531, eos, + 0x0562, 0x0532, eos, + 0x0563, 0x0533, eos, // 1310 + 0x0564, 0x0534, eos, + 0x0565, 0x0535, eos, + 0x0566, 0x0536, eos, + 0x0567, 0x0537, eos, // 1322 + 0x0568, 0x0538, eos, + 0x0569, 0x0539, eos, + 0x056A, 0x053A, eos, // 1331 + 0x056B, 0x053B, eos, + 0x056C, 0x053C, eos, + 0x056D, 0x053D, eos, // 1340 + 0x056E, 0x053E, eos, + 0x056F, 0x053F, eos, + 0x0570, 0x0540, eos, + 0x0571, 0x0541, eos, // 1352 + 0x0572, 0x0542, eos, + 0x0573, 0x0543, eos, + 0x0574, 0x0544, eos, // 1361 + 0x0575, 0x0545, eos, + 0x0576, 0x0546, eos, + 0x0577, 0x0547, eos, // 1370 + 0x0578, 0x0548, eos, + 0x0579, 0x0549, eos, + 0x057A, 0x054A, eos, + 0x057B, 0x054B, eos, // 1382 + 0x057C, 0x054C, eos, + 0x057D, 0x054D, eos, + 0x057E, 0x054E, eos, // 1391 + 0x057F, 0x054F, eos, + 0x0580, 0x0550, eos, + 0x0581, 0x0551, eos, // 1400 + 0x0582, 0x0552, eos, + 0x0583, 0x0553, eos, + 0x0584, 0x0554, eos, + 0x0585, 0x0555, eos, // 1412 + 0x0586, 0x0556, eos, + 0x2D00, 0x10A0, eos, + 0x2D01, 0x10A1, eos, // 1421 + 0x2D02, 0x10A2, eos, + 0x2D03, 0x10A3, eos, + 0x2D04, 0x10A4, eos, // 1430 + 0x2D05, 0x10A5, eos, + 0x2D06, 0x10A6, eos, + 0x2D07, 0x10A7, eos, + 0x2D08, 0x10A8, eos, // 1442 + 0x2D09, 0x10A9, eos, + 0x2D0A, 0x10AA, eos, + 0x2D0B, 0x10AB, eos, // 1451 + 0x2D0C, 0x10AC, eos, + 0x2D0D, 0x10AD, eos, + 0x2D0E, 0x10AE, eos, // 1460 + 0x2D0F, 0x10AF, eos, + 0x2D10, 0x10B0, eos, + 0x2D11, 0x10B1, eos, + 0x2D12, 0x10B2, eos, // 1472 + 0x2D13, 0x10B3, eos, + 0x2D14, 0x10B4, eos, + 0x2D15, 0x10B5, eos, // 1481 + 0x2D16, 0x10B6, eos, + 0x2D17, 0x10B7, eos, + 0x2D18, 0x10B8, eos, // 1490 + 0x2D19, 0x10B9, eos, + 0x2D1A, 0x10BA, eos, + 0x2D1B, 0x10BB, eos, + 0x2D1C, 0x10BC, eos, // 1502 + 0x2D1D, 0x10BD, eos, + 0x2D1E, 0x10BE, eos, + 0x2D1F, 0x10BF, eos, // 1511 + 0x2D20, 0x10C0, eos, + 0x2D21, 0x10C1, eos, + 0x2D22, 0x10C2, eos, // 1520 + 0x2D23, 0x10C3, eos, + 0x2D24, 0x10C4, eos, + 0x2D25, 0x10C5, eos, + 0x2D27, 0x10C7, eos, // 1532 + 0x2D2D, 0x10CD, eos, + 0x13F0, 0x13F8, eos, + 0x13F1, 0x13F9, eos, // 1541 + 0x13F2, 0x13FA, eos, + 0x13F3, 0x13FB, eos, + 0x13F4, 0x13FC, eos, // 1550 + 0x13F5, 0x13FD, eos, + 0xA64B, 0x1C88, 0xA64A, eos, + 0x10D0, 0x1C90, eos, // 1560 + 0x10D1, 0x1C91, eos, + 0x10D2, 0x1C92, eos, + 0x10D3, 0x1C93, eos, + 0x10D4, 0x1C94, eos, // 1572 + 0x10D5, 0x1C95, eos, + 0x10D6, 0x1C96, eos, + 0x10D7, 0x1C97, eos, // 1581 + 0x10D8, 0x1C98, eos, + 0x10D9, 0x1C99, eos, + 0x10DA, 0x1C9A, eos, // 1590 + 0x10DB, 0x1C9B, eos, + 0x10DC, 0x1C9C, eos, + 0x10DD, 0x1C9D, eos, + 0x10DE, 0x1C9E, eos, // 1602 + 0x10DF, 0x1C9F, eos, + 0x10E0, 0x1CA0, eos, + 0x10E1, 0x1CA1, eos, // 1611 + 0x10E2, 0x1CA2, eos, + 0x10E3, 0x1CA3, eos, + 0x10E4, 0x1CA4, eos, // 1620 + 0x10E5, 0x1CA5, eos, + 0x10E6, 0x1CA6, eos, + 0x10E7, 0x1CA7, eos, + 0x10E8, 0x1CA8, eos, // 1632 + 0x10E9, 0x1CA9, eos, + 0x10EA, 0x1CAA, eos, + 0x10EB, 0x1CAB, eos, // 1641 + 0x10EC, 0x1CAC, eos, + 0x10ED, 0x1CAD, eos, + 0x10EE, 0x1CAE, eos, // 1650 + 0x10EF, 0x1CAF, eos, + 0x10F0, 0x1CB0, eos, + 0x10F1, 0x1CB1, eos, + 0x10F2, 0x1CB2, eos, // 1662 + 0x10F3, 0x1CB3, eos, + 0x10F4, 0x1CB4, eos, + 0x10F5, 0x1CB5, eos, // 1671 + 0x10F6, 0x1CB6, eos, + 0x10F7, 0x1CB7, eos, + 0x10F8, 0x1CB8, eos, // 1680 + 0x10F9, 0x1CB9, eos, + 0x10FA, 0x1CBA, eos, + 0x10FD, 0x1CBD, eos, + 0x10FE, 0x1CBE, eos, // 1692 + 0x10FF, 0x1CBF, eos, + 0x1E01, 0x1E00, eos, + 0x1E03, 0x1E02, eos, // 1701 + 0x1E05, 0x1E04, eos, + 0x1E07, 0x1E06, eos, + 0x1E09, 0x1E08, eos, // 1710 + 0x1E0B, 0x1E0A, eos, + 0x1E0D, 0x1E0C, eos, + 0x1E0F, 0x1E0E, eos, + 0x1E11, 0x1E10, eos, // 1722 + 0x1E13, 0x1E12, eos, + 0x1E15, 0x1E14, eos, + 0x1E17, 0x1E16, eos, // 1731 + 0x1E19, 0x1E18, eos, + 0x1E1B, 0x1E1A, eos, + 0x1E1D, 0x1E1C, eos, // 1740 + 0x1E1F, 0x1E1E, eos, + 0x1E21, 0x1E20, eos, + 0x1E23, 0x1E22, eos, + 0x1E25, 0x1E24, eos, // 1752 + 0x1E27, 0x1E26, eos, + 0x1E29, 0x1E28, eos, + 0x1E2B, 0x1E2A, eos, // 1761 + 0x1E2D, 0x1E2C, eos, + 0x1E2F, 0x1E2E, eos, + 0x1E31, 0x1E30, eos, // 1770 + 0x1E33, 0x1E32, eos, + 0x1E35, 0x1E34, eos, + 0x1E37, 0x1E36, eos, + 0x1E39, 0x1E38, eos, // 1782 + 0x1E3B, 0x1E3A, eos, + 0x1E3D, 0x1E3C, eos, + 0x1E3F, 0x1E3E, eos, // 1791 + 0x1E41, 0x1E40, eos, + 0x1E43, 0x1E42, eos, + 0x1E45, 0x1E44, eos, // 1800 + 0x1E47, 0x1E46, eos, + 0x1E49, 0x1E48, eos, + 0x1E4B, 0x1E4A, eos, + 0x1E4D, 0x1E4C, eos, // 1812 + 0x1E4F, 0x1E4E, eos, + 0x1E51, 0x1E50, eos, + 0x1E53, 0x1E52, eos, // 1821 + 0x1E55, 0x1E54, eos, + 0x1E57, 0x1E56, eos, + 0x1E59, 0x1E58, eos, // 1830 + 0x1E5B, 0x1E5A, eos, + 0x1E5D, 0x1E5C, eos, + 0x1E5F, 0x1E5E, eos, + 0x1E61, 0x1E60, 0x1E9B, eos, // 1842 + 0x1E63, 0x1E62, eos, + 0x1E65, 0x1E64, eos, + 0x1E67, 0x1E66, eos, // 1852 + 0x1E69, 0x1E68, eos, + 0x1E6B, 0x1E6A, eos, + 0x1E6D, 0x1E6C, eos, // 1861 + 0x1E6F, 0x1E6E, eos, + 0x1E71, 0x1E70, eos, + 0x1E73, 0x1E72, eos, // 1870 + 0x1E75, 0x1E74, eos, + 0x1E77, 0x1E76, eos, + 0x1E79, 0x1E78, eos, + 0x1E7B, 0x1E7A, eos, // 1882 + 0x1E7D, 0x1E7C, eos, + 0x1E7F, 0x1E7E, eos, + 0x1E81, 0x1E80, eos, // 1891 + 0x1E83, 0x1E82, eos, + 0x1E85, 0x1E84, eos, + 0x1E87, 0x1E86, eos, // 1900 + 0x1E89, 0x1E88, eos, + 0x1E8B, 0x1E8A, eos, + 0x1E8D, 0x1E8C, eos, + 0x1E8F, 0x1E8E, eos, // 1912 + 0x1E91, 0x1E90, eos, + 0x1E93, 0x1E92, eos, + 0x1E95, 0x1E94, eos, // 1921 + 0x00DF, 0x1E9E, eos, + 0x1EA1, 0x1EA0, eos, + 0x1EA3, 0x1EA2, eos, // 1930 + 0x1EA5, 0x1EA4, eos, + 0x1EA7, 0x1EA6, eos, + 0x1EA9, 0x1EA8, eos, + 0x1EAB, 0x1EAA, eos, // 1942 + 0x1EAD, 0x1EAC, eos, + 0x1EAF, 0x1EAE, eos, + 0x1EB1, 0x1EB0, eos, // 1951 + 0x1EB3, 0x1EB2, eos, + 0x1EB5, 0x1EB4, eos, + 0x1EB7, 0x1EB6, eos, // 1960 + 0x1EB9, 0x1EB8, eos, + 0x1EBB, 0x1EBA, eos, + 0x1EBD, 0x1EBC, eos, + 0x1EBF, 0x1EBE, eos, // 1972 + 0x1EC1, 0x1EC0, eos, + 0x1EC3, 0x1EC2, eos, + 0x1EC5, 0x1EC4, eos, // 1981 + 0x1EC7, 0x1EC6, eos, + 0x1EC9, 0x1EC8, eos, + 0x1ECB, 0x1ECA, eos, // 1990 + 0x1ECD, 0x1ECC, eos, + 0x1ECF, 0x1ECE, eos, + 0x1ED1, 0x1ED0, eos, + 0x1ED3, 0x1ED2, eos, // 2002 + 0x1ED5, 0x1ED4, eos, + 0x1ED7, 0x1ED6, eos, + 0x1ED9, 0x1ED8, eos, // 2011 + 0x1EDB, 0x1EDA, eos, + 0x1EDD, 0x1EDC, eos, + 0x1EDF, 0x1EDE, eos, // 2020 + 0x1EE1, 0x1EE0, eos, + 0x1EE3, 0x1EE2, eos, + 0x1EE5, 0x1EE4, eos, + 0x1EE7, 0x1EE6, eos, // 2032 + 0x1EE9, 0x1EE8, eos, + 0x1EEB, 0x1EEA, eos, + 0x1EED, 0x1EEC, eos, // 2041 + 0x1EEF, 0x1EEE, eos, + 0x1EF1, 0x1EF0, eos, + 0x1EF3, 0x1EF2, eos, // 2050 + 0x1EF5, 0x1EF4, eos, + 0x1EF7, 0x1EF6, eos, + 0x1EF9, 0x1EF8, eos, + 0x1EFB, 0x1EFA, eos, // 2062 + 0x1EFD, 0x1EFC, eos, + 0x1EFF, 0x1EFE, eos, + 0x1F00, 0x1F08, eos, // 2071 + 0x1F01, 0x1F09, eos, + 0x1F02, 0x1F0A, eos, + 0x1F03, 0x1F0B, eos, // 2080 + 0x1F04, 0x1F0C, eos, + 0x1F05, 0x1F0D, eos, + 0x1F06, 0x1F0E, eos, + 0x1F07, 0x1F0F, eos, // 2092 + 0x1F10, 0x1F18, eos, + 0x1F11, 0x1F19, eos, + 0x1F12, 0x1F1A, eos, // 2101 + 0x1F13, 0x1F1B, eos, + 0x1F14, 0x1F1C, eos, + 0x1F15, 0x1F1D, eos, // 2110 + 0x1F20, 0x1F28, eos, + 0x1F21, 0x1F29, eos, + 0x1F22, 0x1F2A, eos, + 0x1F23, 0x1F2B, eos, // 2122 + 0x1F24, 0x1F2C, eos, + 0x1F25, 0x1F2D, eos, + 0x1F26, 0x1F2E, eos, // 2131 + 0x1F27, 0x1F2F, eos, + 0x1F30, 0x1F38, eos, + 0x1F31, 0x1F39, eos, // 2140 + 0x1F32, 0x1F3A, eos, + 0x1F33, 0x1F3B, eos, + 0x1F34, 0x1F3C, eos, + 0x1F35, 0x1F3D, eos, // 2152 + 0x1F36, 0x1F3E, eos, + 0x1F37, 0x1F3F, eos, + 0x1F40, 0x1F48, eos, // 2161 + 0x1F41, 0x1F49, eos, + 0x1F42, 0x1F4A, eos, + 0x1F43, 0x1F4B, eos, // 2170 + 0x1F44, 0x1F4C, eos, + 0x1F45, 0x1F4D, eos, + 0x1F51, 0x1F59, eos, + 0x1F53, 0x1F5B, eos, // 2182 + 0x1F55, 0x1F5D, eos, + 0x1F57, 0x1F5F, eos, + 0x1F60, 0x1F68, eos, // 2191 + 0x1F61, 0x1F69, eos, + 0x1F62, 0x1F6A, eos, + 0x1F63, 0x1F6B, eos, // 2200 + 0x1F64, 0x1F6C, eos, + 0x1F65, 0x1F6D, eos, + 0x1F66, 0x1F6E, eos, + 0x1F67, 0x1F6F, eos, // 2212 + 0x1F80, 0x1F88, eos, + 0x1F81, 0x1F89, eos, + 0x1F82, 0x1F8A, eos, // 2221 + 0x1F83, 0x1F8B, eos, + 0x1F84, 0x1F8C, eos, + 0x1F85, 0x1F8D, eos, // 2230 + 0x1F86, 0x1F8E, eos, + 0x1F87, 0x1F8F, eos, + 0x1F90, 0x1F98, eos, + 0x1F91, 0x1F99, eos, // 2242 + 0x1F92, 0x1F9A, eos, + 0x1F93, 0x1F9B, eos, + 0x1F94, 0x1F9C, eos, // 2251 + 0x1F95, 0x1F9D, eos, + 0x1F96, 0x1F9E, eos, + 0x1F97, 0x1F9F, eos, // 2260 + 0x1FA0, 0x1FA8, eos, + 0x1FA1, 0x1FA9, eos, + 0x1FA2, 0x1FAA, eos, + 0x1FA3, 0x1FAB, eos, // 2272 + 0x1FA4, 0x1FAC, eos, + 0x1FA5, 0x1FAD, eos, + 0x1FA6, 0x1FAE, eos, // 2281 + 0x1FA7, 0x1FAF, eos, + 0x1FB0, 0x1FB8, eos, + 0x1FB1, 0x1FB9, eos, // 2290 + 0x1F70, 0x1FBA, eos, + 0x1F71, 0x1FBB, eos, + 0x1FB3, 0x1FBC, eos, + 0x1F72, 0x1FC8, eos, // 2302 + 0x1F73, 0x1FC9, eos, + 0x1F74, 0x1FCA, eos, + 0x1F75, 0x1FCB, eos, // 2311 + 0x1FC3, 0x1FCC, eos, + 0x1FD0, 0x1FD8, eos, + 0x1FD1, 0x1FD9, eos, // 2320 + 0x1F76, 0x1FDA, eos, + 0x1F77, 0x1FDB, eos, + 0x1FE0, 0x1FE8, eos, + 0x1FE1, 0x1FE9, eos, // 2332 + 0x1F7A, 0x1FEA, eos, + 0x1F7B, 0x1FEB, eos, + 0x1FE5, 0x1FEC, eos, // 2341 + 0x1F78, 0x1FF8, eos, + 0x1F79, 0x1FF9, eos, + 0x1F7C, 0x1FFA, eos, // 2350 + 0x1F7D, 0x1FFB, eos, + 0x1FF3, 0x1FFC, eos, + 0x214E, 0x2132, eos, + 0x2170, 0x2160, eos, // 2362 + 0x2171, 0x2161, eos, + 0x2172, 0x2162, eos, + 0x2173, 0x2163, eos, // 2371 + 0x2174, 0x2164, eos, + 0x2175, 0x2165, eos, + 0x2176, 0x2166, eos, // 2380 + 0x2177, 0x2167, eos, + 0x2178, 0x2168, eos, + 0x2179, 0x2169, eos, + 0x217A, 0x216A, eos, // 2392 + 0x217B, 0x216B, eos, + 0x217C, 0x216C, eos, + 0x217D, 0x216D, eos, // 2401 + 0x217E, 0x216E, eos, + 0x217F, 0x216F, eos, + 0x2184, 0x2183, eos, // 2410 + 0x24D0, 0x24B6, eos, + 0x24D1, 0x24B7, eos, + 0x24D2, 0x24B8, eos, + 0x24D3, 0x24B9, eos, // 2422 + 0x24D4, 0x24BA, eos, + 0x24D5, 0x24BB, eos, + 0x24D6, 0x24BC, eos, // 2431 + 0x24D7, 0x24BD, eos, + 0x24D8, 0x24BE, eos, + 0x24D9, 0x24BF, eos, // 2440 + 0x24DA, 0x24C0, eos, + 0x24DB, 0x24C1, eos, + 0x24DC, 0x24C2, eos, + 0x24DD, 0x24C3, eos, // 2452 + 0x24DE, 0x24C4, eos, + 0x24DF, 0x24C5, eos, + 0x24E0, 0x24C6, eos, // 2461 + 0x24E1, 0x24C7, eos, + 0x24E2, 0x24C8, eos, + 0x24E3, 0x24C9, eos, // 2470 + 0x24E4, 0x24CA, eos, + 0x24E5, 0x24CB, eos, + 0x24E6, 0x24CC, eos, + 0x24E7, 0x24CD, eos, // 2482 + 0x24E8, 0x24CE, eos, + 0x24E9, 0x24CF, eos, + 0x2C30, 0x2C00, eos, // 2491 + 0x2C31, 0x2C01, eos, + 0x2C32, 0x2C02, eos, + 0x2C33, 0x2C03, eos, // 2500 + 0x2C34, 0x2C04, eos, + 0x2C35, 0x2C05, eos, + 0x2C36, 0x2C06, eos, + 0x2C37, 0x2C07, eos, // 2512 + 0x2C38, 0x2C08, eos, + 0x2C39, 0x2C09, eos, + 0x2C3A, 0x2C0A, eos, // 2521 + 0x2C3B, 0x2C0B, eos, + 0x2C3C, 0x2C0C, eos, + 0x2C3D, 0x2C0D, eos, // 2530 + 0x2C3E, 0x2C0E, eos, + 0x2C3F, 0x2C0F, eos, + 0x2C40, 0x2C10, eos, + 0x2C41, 0x2C11, eos, // 2542 + 0x2C42, 0x2C12, eos, + 0x2C43, 0x2C13, eos, + 0x2C44, 0x2C14, eos, // 2551 + 0x2C45, 0x2C15, eos, + 0x2C46, 0x2C16, eos, + 0x2C47, 0x2C17, eos, // 2560 + 0x2C48, 0x2C18, eos, + 0x2C49, 0x2C19, eos, + 0x2C4A, 0x2C1A, eos, + 0x2C4B, 0x2C1B, eos, // 2572 + 0x2C4C, 0x2C1C, eos, + 0x2C4D, 0x2C1D, eos, + 0x2C4E, 0x2C1E, eos, // 2581 + 0x2C4F, 0x2C1F, eos, + 0x2C50, 0x2C20, eos, + 0x2C51, 0x2C21, eos, // 2590 + 0x2C52, 0x2C22, eos, + 0x2C53, 0x2C23, eos, + 0x2C54, 0x2C24, eos, + 0x2C55, 0x2C25, eos, // 2602 + 0x2C56, 0x2C26, eos, + 0x2C57, 0x2C27, eos, + 0x2C58, 0x2C28, eos, // 2611 + 0x2C59, 0x2C29, eos, + 0x2C5A, 0x2C2A, eos, + 0x2C5B, 0x2C2B, eos, // 2620 + 0x2C5C, 0x2C2C, eos, + 0x2C5D, 0x2C2D, eos, + 0x2C5E, 0x2C2E, eos, + 0x2C5F, 0x2C2F, eos, // 2632 + 0x2C61, 0x2C60, eos, + 0x026B, 0x2C62, eos, + 0x1D7D, 0x2C63, eos, // 2641 + 0x027D, 0x2C64, eos, + 0x2C68, 0x2C67, eos, + 0x2C6A, 0x2C69, eos, // 2650 + 0x2C6C, 0x2C6B, eos, + 0x0251, 0x2C6D, eos, + 0x0271, 0x2C6E, eos, + 0x0250, 0x2C6F, eos, // 2662 + 0x0252, 0x2C70, eos, + 0x2C73, 0x2C72, eos, + 0x2C76, 0x2C75, eos, // 2671 + 0x023F, 0x2C7E, eos, + 0x0240, 0x2C7F, eos, + 0x2C81, 0x2C80, eos, // 2680 + 0x2C83, 0x2C82, eos, + 0x2C85, 0x2C84, eos, + 0x2C87, 0x2C86, eos, + 0x2C89, 0x2C88, eos, // 2692 + 0x2C8B, 0x2C8A, eos, + 0x2C8D, 0x2C8C, eos, + 0x2C8F, 0x2C8E, eos, // 2701 + 0x2C91, 0x2C90, eos, + 0x2C93, 0x2C92, eos, + 0x2C95, 0x2C94, eos, // 2710 + 0x2C97, 0x2C96, eos, + 0x2C99, 0x2C98, eos, + 0x2C9B, 0x2C9A, eos, + 0x2C9D, 0x2C9C, eos, // 2722 + 0x2C9F, 0x2C9E, eos, + 0x2CA1, 0x2CA0, eos, + 0x2CA3, 0x2CA2, eos, // 2731 + 0x2CA5, 0x2CA4, eos, + 0x2CA7, 0x2CA6, eos, + 0x2CA9, 0x2CA8, eos, // 2740 + 0x2CAB, 0x2CAA, eos, + 0x2CAD, 0x2CAC, eos, + 0x2CAF, 0x2CAE, eos, + 0x2CB1, 0x2CB0, eos, // 2752 + 0x2CB3, 0x2CB2, eos, + 0x2CB5, 0x2CB4, eos, + 0x2CB7, 0x2CB6, eos, // 2761 + 0x2CB9, 0x2CB8, eos, + 0x2CBB, 0x2CBA, eos, + 0x2CBD, 0x2CBC, eos, // 2770 + 0x2CBF, 0x2CBE, eos, + 0x2CC1, 0x2CC0, eos, + 0x2CC3, 0x2CC2, eos, + 0x2CC5, 0x2CC4, eos, // 2782 + 0x2CC7, 0x2CC6, eos, + 0x2CC9, 0x2CC8, eos, + 0x2CCB, 0x2CCA, eos, // 2791 + 0x2CCD, 0x2CCC, eos, + 0x2CCF, 0x2CCE, eos, + 0x2CD1, 0x2CD0, eos, // 2800 + 0x2CD3, 0x2CD2, eos, + 0x2CD5, 0x2CD4, eos, + 0x2CD7, 0x2CD6, eos, + 0x2CD9, 0x2CD8, eos, // 2812 + 0x2CDB, 0x2CDA, eos, + 0x2CDD, 0x2CDC, eos, + 0x2CDF, 0x2CDE, eos, // 2821 + 0x2CE1, 0x2CE0, eos, + 0x2CE3, 0x2CE2, eos, + 0x2CEC, 0x2CEB, eos, // 2830 + 0x2CEE, 0x2CED, eos, + 0x2CF3, 0x2CF2, eos, + 0xA641, 0xA640, eos, + 0xA643, 0xA642, eos, // 2842 + 0xA645, 0xA644, eos, + 0xA647, 0xA646, eos, + 0xA649, 0xA648, eos, // 2851 + 0xA64D, 0xA64C, eos, + 0xA64F, 0xA64E, eos, + 0xA651, 0xA650, eos, // 2860 + 0xA653, 0xA652, eos, + 0xA655, 0xA654, eos, + 0xA657, 0xA656, eos, + 0xA659, 0xA658, eos, // 2872 + 0xA65B, 0xA65A, eos, + 0xA65D, 0xA65C, eos, + 0xA65F, 0xA65E, eos, // 2881 + 0xA661, 0xA660, eos, + 0xA663, 0xA662, eos, + 0xA665, 0xA664, eos, // 2890 + 0xA667, 0xA666, eos, + 0xA669, 0xA668, eos, + 0xA66B, 0xA66A, eos, + 0xA66D, 0xA66C, eos, // 2902 + 0xA681, 0xA680, eos, + 0xA683, 0xA682, eos, + 0xA685, 0xA684, eos, // 2911 + 0xA687, 0xA686, eos, + 0xA689, 0xA688, eos, + 0xA68B, 0xA68A, eos, // 2920 + 0xA68D, 0xA68C, eos, + 0xA68F, 0xA68E, eos, + 0xA691, 0xA690, eos, + 0xA693, 0xA692, eos, // 2932 + 0xA695, 0xA694, eos, + 0xA697, 0xA696, eos, + 0xA699, 0xA698, eos, // 2941 + 0xA69B, 0xA69A, eos, + 0xA723, 0xA722, eos, + 0xA725, 0xA724, eos, // 2950 + 0xA727, 0xA726, eos, + 0xA729, 0xA728, eos, + 0xA72B, 0xA72A, eos, + 0xA72D, 0xA72C, eos, // 2962 + 0xA72F, 0xA72E, eos, + 0xA733, 0xA732, eos, + 0xA735, 0xA734, eos, // 2971 + 0xA737, 0xA736, eos, + 0xA739, 0xA738, eos, + 0xA73B, 0xA73A, eos, // 2980 + 0xA73D, 0xA73C, eos, + 0xA73F, 0xA73E, eos, + 0xA741, 0xA740, eos, + 0xA743, 0xA742, eos, // 2992 + 0xA745, 0xA744, eos, + 0xA747, 0xA746, eos, + 0xA749, 0xA748, eos, // 3001 + 0xA74B, 0xA74A, eos, + 0xA74D, 0xA74C, eos, + 0xA74F, 0xA74E, eos, // 3010 + 0xA751, 0xA750, eos, + 0xA753, 0xA752, eos, + 0xA755, 0xA754, eos, + 0xA757, 0xA756, eos, // 3022 + 0xA759, 0xA758, eos, + 0xA75B, 0xA75A, eos, + 0xA75D, 0xA75C, eos, // 3031 + 0xA75F, 0xA75E, eos, + 0xA761, 0xA760, eos, + 0xA763, 0xA762, eos, // 3040 + 0xA765, 0xA764, eos, + 0xA767, 0xA766, eos, + 0xA769, 0xA768, eos, + 0xA76B, 0xA76A, eos, // 3052 + 0xA76D, 0xA76C, eos, + 0xA76F, 0xA76E, eos, + 0xA77A, 0xA779, eos, // 3061 + 0xA77C, 0xA77B, eos, + 0x1D79, 0xA77D, eos, + 0xA77F, 0xA77E, eos, // 3070 + 0xA781, 0xA780, eos, + 0xA783, 0xA782, eos, + 0xA785, 0xA784, eos, + 0xA787, 0xA786, eos, // 3082 + 0xA78C, 0xA78B, eos, + 0x0265, 0xA78D, eos, + 0xA791, 0xA790, eos, // 3091 + 0xA793, 0xA792, eos, + 0xA797, 0xA796, eos, + 0xA799, 0xA798, eos, // 3100 + 0xA79B, 0xA79A, eos, + 0xA79D, 0xA79C, eos, + 0xA79F, 0xA79E, eos, + 0xA7A1, 0xA7A0, eos, // 3112 + 0xA7A3, 0xA7A2, eos, + 0xA7A5, 0xA7A4, eos, + 0xA7A7, 0xA7A6, eos, // 3121 + 0xA7A9, 0xA7A8, eos, + 0x0266, 0xA7AA, eos, + 0x025C, 0xA7AB, eos, // 3130 + 0x0261, 0xA7AC, eos, + 0x026C, 0xA7AD, eos, + 0x026A, 0xA7AE, eos, + 0x029E, 0xA7B0, eos, // 3142 + 0x0287, 0xA7B1, eos, + 0x029D, 0xA7B2, eos, + 0xAB53, 0xA7B3, eos, // 3151 + 0xA7B5, 0xA7B4, eos, + 0xA7B7, 0xA7B6, eos, + 0xA7B9, 0xA7B8, eos, // 3160 + 0xA7BB, 0xA7BA, eos, + 0xA7BD, 0xA7BC, eos, + 0xA7BF, 0xA7BE, eos, + 0xA7C1, 0xA7C0, eos, // 3172 + 0xA7C3, 0xA7C2, eos, + 0xA794, 0xA7C4, eos, + 0x0282, 0xA7C5, eos, // 3181 + 0x1D8E, 0xA7C6, eos, + 0xA7C8, 0xA7C7, eos, + 0xA7CA, 0xA7C9, eos, // 3190 + 0xA7D1, 0xA7D0, eos, + 0xA7D7, 0xA7D6, eos, + 0xA7D9, 0xA7D8, eos, + 0xA7F6, 0xA7F5, eos, // 3202 + 0x13A0, 0xAB70, eos, + 0x13A1, 0xAB71, eos, + 0x13A2, 0xAB72, eos, // 3211 + 0x13A3, 0xAB73, eos, + 0x13A4, 0xAB74, eos, + 0x13A5, 0xAB75, eos, // 3220 + 0x13A6, 0xAB76, eos, + 0x13A7, 0xAB77, eos, + 0x13A8, 0xAB78, eos, + 0x13A9, 0xAB79, eos, // 3232 + 0x13AA, 0xAB7A, eos, + 0x13AB, 0xAB7B, eos, + 0x13AC, 0xAB7C, eos, // 3241 + 0x13AD, 0xAB7D, eos, + 0x13AE, 0xAB7E, eos, + 0x13AF, 0xAB7F, eos, // 3250 + 0x13B0, 0xAB80, eos, + 0x13B1, 0xAB81, eos, + 0x13B2, 0xAB82, eos, + 0x13B3, 0xAB83, eos, // 3262 + 0x13B4, 0xAB84, eos, + 0x13B5, 0xAB85, eos, + 0x13B6, 0xAB86, eos, // 3271 + 0x13B7, 0xAB87, eos, + 0x13B8, 0xAB88, eos, + 0x13B9, 0xAB89, eos, // 3280 + 0x13BA, 0xAB8A, eos, + 0x13BB, 0xAB8B, eos, + 0x13BC, 0xAB8C, eos, + 0x13BD, 0xAB8D, eos, // 3292 + 0x13BE, 0xAB8E, eos, + 0x13BF, 0xAB8F, eos, + 0x13C0, 0xAB90, eos, // 3301 + 0x13C1, 0xAB91, eos, + 0x13C2, 0xAB92, eos, + 0x13C3, 0xAB93, eos, // 3310 + 0x13C4, 0xAB94, eos, + 0x13C5, 0xAB95, eos, + 0x13C6, 0xAB96, eos, + 0x13C7, 0xAB97, eos, // 3322 + 0x13C8, 0xAB98, eos, + 0x13C9, 0xAB99, eos, + 0x13CA, 0xAB9A, eos, // 3331 + 0x13CB, 0xAB9B, eos, + 0x13CC, 0xAB9C, eos, + 0x13CD, 0xAB9D, eos, // 3340 + 0x13CE, 0xAB9E, eos, + 0x13CF, 0xAB9F, eos, + 0x13D0, 0xABA0, eos, + 0x13D1, 0xABA1, eos, // 3352 + 0x13D2, 0xABA2, eos, + 0x13D3, 0xABA3, eos, + 0x13D4, 0xABA4, eos, // 3361 + 0x13D5, 0xABA5, eos, + 0x13D6, 0xABA6, eos, + 0x13D7, 0xABA7, eos, // 3370 + 0x13D8, 0xABA8, eos, + 0x13D9, 0xABA9, eos, + 0x13DA, 0xABAA, eos, + 0x13DB, 0xABAB, eos, // 3382 + 0x13DC, 0xABAC, eos, + 0x13DD, 0xABAD, eos, + 0x13DE, 0xABAE, eos, // 3391 + 0x13DF, 0xABAF, eos, + 0x13E0, 0xABB0, eos, + 0x13E1, 0xABB1, eos, // 3400 + 0x13E2, 0xABB2, eos, + 0x13E3, 0xABB3, eos, + 0x13E4, 0xABB4, eos, + 0x13E5, 0xABB5, eos, // 3412 + 0x13E6, 0xABB6, eos, + 0x13E7, 0xABB7, eos, + 0x13E8, 0xABB8, eos, // 3421 + 0x13E9, 0xABB9, eos, + 0x13EA, 0xABBA, eos, + 0x13EB, 0xABBB, eos, // 3430 + 0x13EC, 0xABBC, eos, + 0x13ED, 0xABBD, eos, + 0x13EE, 0xABBE, eos, + 0x13EF, 0xABBF, eos, // 3442 + 0xFF41, 0xFF21, eos, + 0xFF42, 0xFF22, eos, + 0xFF43, 0xFF23, eos, // 3451 + 0xFF44, 0xFF24, eos, + 0xFF45, 0xFF25, eos, + 0xFF46, 0xFF26, eos, // 3460 + 0xFF47, 0xFF27, eos, + 0xFF48, 0xFF28, eos, + 0xFF49, 0xFF29, eos, + 0xFF4A, 0xFF2A, eos, // 3472 + 0xFF4B, 0xFF2B, eos, + 0xFF4C, 0xFF2C, eos, + 0xFF4D, 0xFF2D, eos, // 3481 + 0xFF4E, 0xFF2E, eos, + 0xFF4F, 0xFF2F, eos, + 0xFF50, 0xFF30, eos, // 3490 + 0xFF51, 0xFF31, eos, + 0xFF52, 0xFF32, eos, + 0xFF53, 0xFF33, eos, + 0xFF54, 0xFF34, eos, // 3502 + 0xFF55, 0xFF35, eos, + 0xFF56, 0xFF36, eos, + 0xFF57, 0xFF37, eos, // 3511 + 0xFF58, 0xFF38, eos, + 0xFF59, 0xFF39, eos, + 0xFF5A, 0xFF3A, eos, // 3520 + 0x10428, 0x10400, eos, + 0x10429, 0x10401, eos, + 0x1042A, 0x10402, eos, + 0x1042B, 0x10403, eos, // 3532 + 0x1042C, 0x10404, eos, + 0x1042D, 0x10405, eos, + 0x1042E, 0x10406, eos, // 3541 + 0x1042F, 0x10407, eos, + 0x10430, 0x10408, eos, + 0x10431, 0x10409, eos, // 3550 + 0x10432, 0x1040A, eos, + 0x10433, 0x1040B, eos, + 0x10434, 0x1040C, eos, + 0x10435, 0x1040D, eos, // 3562 + 0x10436, 0x1040E, eos, + 0x10437, 0x1040F, eos, + 0x10438, 0x10410, eos, // 3571 + 0x10439, 0x10411, eos, + 0x1043A, 0x10412, eos, + 0x1043B, 0x10413, eos, // 3580 + 0x1043C, 0x10414, eos, + 0x1043D, 0x10415, eos, + 0x1043E, 0x10416, eos, + 0x1043F, 0x10417, eos, // 3592 + 0x10440, 0x10418, eos, + 0x10441, 0x10419, eos, + 0x10442, 0x1041A, eos, // 3601 + 0x10443, 0x1041B, eos, + 0x10444, 0x1041C, eos, + 0x10445, 0x1041D, eos, // 3610 + 0x10446, 0x1041E, eos, + 0x10447, 0x1041F, eos, + 0x10448, 0x10420, eos, + 0x10449, 0x10421, eos, // 3622 + 0x1044A, 0x10422, eos, + 0x1044B, 0x10423, eos, + 0x1044C, 0x10424, eos, // 3631 + 0x1044D, 0x10425, eos, + 0x1044E, 0x10426, eos, + 0x1044F, 0x10427, eos, // 3640 + 0x104D8, 0x104B0, eos, + 0x104D9, 0x104B1, eos, + 0x104DA, 0x104B2, eos, + 0x104DB, 0x104B3, eos, // 3652 + 0x104DC, 0x104B4, eos, + 0x104DD, 0x104B5, eos, + 0x104DE, 0x104B6, eos, // 3661 + 0x104DF, 0x104B7, eos, + 0x104E0, 0x104B8, eos, + 0x104E1, 0x104B9, eos, // 3670 + 0x104E2, 0x104BA, eos, + 0x104E3, 0x104BB, eos, + 0x104E4, 0x104BC, eos, + 0x104E5, 0x104BD, eos, // 3682 + 0x104E6, 0x104BE, eos, + 0x104E7, 0x104BF, eos, + 0x104E8, 0x104C0, eos, // 3691 + 0x104E9, 0x104C1, eos, + 0x104EA, 0x104C2, eos, + 0x104EB, 0x104C3, eos, // 3700 + 0x104EC, 0x104C4, eos, + 0x104ED, 0x104C5, eos, + 0x104EE, 0x104C6, eos, + 0x104EF, 0x104C7, eos, // 3712 + 0x104F0, 0x104C8, eos, + 0x104F1, 0x104C9, eos, + 0x104F2, 0x104CA, eos, // 3721 + 0x104F3, 0x104CB, eos, + 0x104F4, 0x104CC, eos, + 0x104F5, 0x104CD, eos, // 3730 + 0x104F6, 0x104CE, eos, + 0x104F7, 0x104CF, eos, + 0x104F8, 0x104D0, eos, + 0x104F9, 0x104D1, eos, // 3742 + 0x104FA, 0x104D2, eos, + 0x104FB, 0x104D3, eos, + 0x10597, 0x10570, eos, // 3751 + 0x10598, 0x10571, eos, + 0x10599, 0x10572, eos, + 0x1059A, 0x10573, eos, // 3760 + 0x1059B, 0x10574, eos, + 0x1059C, 0x10575, eos, + 0x1059D, 0x10576, eos, + 0x1059E, 0x10577, eos, // 3772 + 0x1059F, 0x10578, eos, + 0x105A0, 0x10579, eos, + 0x105A1, 0x1057A, eos, // 3781 + 0x105A3, 0x1057C, eos, + 0x105A4, 0x1057D, eos, + 0x105A5, 0x1057E, eos, // 3790 + 0x105A6, 0x1057F, eos, + 0x105A7, 0x10580, eos, + 0x105A8, 0x10581, eos, + 0x105A9, 0x10582, eos, // 3802 + 0x105AA, 0x10583, eos, + 0x105AB, 0x10584, eos, + 0x105AC, 0x10585, eos, // 3811 + 0x105AD, 0x10586, eos, + 0x105AE, 0x10587, eos, + 0x105AF, 0x10588, eos, // 3820 + 0x105B0, 0x10589, eos, + 0x105B1, 0x1058A, eos, + 0x105B3, 0x1058C, eos, + 0x105B4, 0x1058D, eos, // 3832 + 0x105B5, 0x1058E, eos, + 0x105B6, 0x1058F, eos, + 0x105B7, 0x10590, eos, // 3841 + 0x105B8, 0x10591, eos, + 0x105B9, 0x10592, eos, + 0x105BB, 0x10594, eos, // 3850 + 0x105BC, 0x10595, eos, + 0x10CC0, 0x10C80, eos, + 0x10CC1, 0x10C81, eos, + 0x10CC2, 0x10C82, eos, // 3862 + 0x10CC3, 0x10C83, eos, + 0x10CC4, 0x10C84, eos, + 0x10CC5, 0x10C85, eos, // 3871 + 0x10CC6, 0x10C86, eos, + 0x10CC7, 0x10C87, eos, + 0x10CC8, 0x10C88, eos, // 3880 + 0x10CC9, 0x10C89, eos, + 0x10CCA, 0x10C8A, eos, + 0x10CCB, 0x10C8B, eos, + 0x10CCC, 0x10C8C, eos, // 3892 + 0x10CCD, 0x10C8D, eos, + 0x10CCE, 0x10C8E, eos, + 0x10CCF, 0x10C8F, eos, // 3901 + 0x10CD0, 0x10C90, eos, + 0x10CD1, 0x10C91, eos, + 0x10CD2, 0x10C92, eos, // 3910 + 0x10CD3, 0x10C93, eos, + 0x10CD4, 0x10C94, eos, + 0x10CD5, 0x10C95, eos, + 0x10CD6, 0x10C96, eos, // 3922 + 0x10CD7, 0x10C97, eos, + 0x10CD8, 0x10C98, eos, + 0x10CD9, 0x10C99, eos, // 3931 + 0x10CDA, 0x10C9A, eos, + 0x10CDB, 0x10C9B, eos, + 0x10CDC, 0x10C9C, eos, // 3940 + 0x10CDD, 0x10C9D, eos, + 0x10CDE, 0x10C9E, eos, + 0x10CDF, 0x10C9F, eos, + 0x10CE0, 0x10CA0, eos, // 3952 + 0x10CE1, 0x10CA1, eos, + 0x10CE2, 0x10CA2, eos, + 0x10CE3, 0x10CA3, eos, // 3961 + 0x10CE4, 0x10CA4, eos, + 0x10CE5, 0x10CA5, eos, + 0x10CE6, 0x10CA6, eos, // 3970 + 0x10CE7, 0x10CA7, eos, + 0x10CE8, 0x10CA8, eos, + 0x10CE9, 0x10CA9, eos, + 0x10CEA, 0x10CAA, eos, // 3982 + 0x10CEB, 0x10CAB, eos, + 0x10CEC, 0x10CAC, eos, + 0x10CED, 0x10CAD, eos, // 3991 + 0x10CEE, 0x10CAE, eos, + 0x10CEF, 0x10CAF, eos, + 0x10CF0, 0x10CB0, eos, // 4000 + 0x10CF1, 0x10CB1, eos, + 0x10CF2, 0x10CB2, eos, + 0x118C0, 0x118A0, eos, + 0x118C1, 0x118A1, eos, // 4012 + 0x118C2, 0x118A2, eos, + 0x118C3, 0x118A3, eos, + 0x118C4, 0x118A4, eos, // 4021 + 0x118C5, 0x118A5, eos, + 0x118C6, 0x118A6, eos, + 0x118C7, 0x118A7, eos, // 4030 + 0x118C8, 0x118A8, eos, + 0x118C9, 0x118A9, eos, + 0x118CA, 0x118AA, eos, + 0x118CB, 0x118AB, eos, // 4042 + 0x118CC, 0x118AC, eos, + 0x118CD, 0x118AD, eos, + 0x118CE, 0x118AE, eos, // 4051 + 0x118CF, 0x118AF, eos, + 0x118D0, 0x118B0, eos, + 0x118D1, 0x118B1, eos, // 4060 + 0x118D2, 0x118B2, eos, + 0x118D3, 0x118B3, eos, + 0x118D4, 0x118B4, eos, + 0x118D5, 0x118B5, eos, // 4072 + 0x118D6, 0x118B6, eos, + 0x118D7, 0x118B7, eos, + 0x118D8, 0x118B8, eos, // 4081 + 0x118D9, 0x118B9, eos, + 0x118DA, 0x118BA, eos, + 0x118DB, 0x118BB, eos, // 4090 + 0x118DC, 0x118BC, eos, + 0x118DD, 0x118BD, eos, + 0x118DE, 0x118BE, eos, + 0x118DF, 0x118BF, eos, // 4102 + 0x16E60, 0x16E40, eos, + 0x16E61, 0x16E41, eos, + 0x16E62, 0x16E42, eos, // 4111 + 0x16E63, 0x16E43, eos, + 0x16E64, 0x16E44, eos, + 0x16E65, 0x16E45, eos, // 4120 + 0x16E66, 0x16E46, eos, + 0x16E67, 0x16E47, eos, + 0x16E68, 0x16E48, eos, + 0x16E69, 0x16E49, eos, // 4132 + 0x16E6A, 0x16E4A, eos, + 0x16E6B, 0x16E4B, eos, + 0x16E6C, 0x16E4C, eos, // 4141 + 0x16E6D, 0x16E4D, eos, + 0x16E6E, 0x16E4E, eos, + 0x16E6F, 0x16E4F, eos, // 4150 + 0x16E70, 0x16E50, eos, + 0x16E71, 0x16E51, eos, + 0x16E72, 0x16E52, eos, + 0x16E73, 0x16E53, eos, // 4162 + 0x16E74, 0x16E54, eos, + 0x16E75, 0x16E55, eos, + 0x16E76, 0x16E56, eos, // 4171 + 0x16E77, 0x16E57, eos, + 0x16E78, 0x16E58, eos, + 0x16E79, 0x16E59, eos, // 4180 + 0x16E7A, 0x16E5A, eos, + 0x16E7B, 0x16E5B, eos, + 0x16E7C, 0x16E5C, eos, + 0x16E7D, 0x16E5D, eos, // 4192 + 0x16E7E, 0x16E5E, eos, + 0x16E7F, 0x16E5F, eos, + 0x1E922, 0x1E900, eos, // 4201 + 0x1E923, 0x1E901, eos, + 0x1E924, 0x1E902, eos, + 0x1E925, 0x1E903, eos, // 4210 + 0x1E926, 0x1E904, eos, + 0x1E927, 0x1E905, eos, + 0x1E928, 0x1E906, eos, + 0x1E929, 0x1E907, eos, // 4222 + 0x1E92A, 0x1E908, eos, + 0x1E92B, 0x1E909, eos, + 0x1E92C, 0x1E90A, eos, // 4231 + 0x1E92D, 0x1E90B, eos, + 0x1E92E, 0x1E90C, eos, + 0x1E92F, 0x1E90D, eos, // 4240 + 0x1E930, 0x1E90E, eos, + 0x1E931, 0x1E90F, eos, + 0x1E932, 0x1E910, eos, + 0x1E933, 0x1E911, eos, // 4252 + 0x1E934, 0x1E912, eos, + 0x1E935, 0x1E913, eos, + 0x1E936, 0x1E914, eos, // 4261 + 0x1E937, 0x1E915, eos, + 0x1E938, 0x1E916, eos, + 0x1E939, 0x1E917, eos, // 4270 + 0x1E93A, 0x1E918, eos, + 0x1E93B, 0x1E919, eos, + 0x1E93C, 0x1E91A, eos, + 0x1E93D, 0x1E91B, eos, // 4282 + 0x1E93E, 0x1E91C, eos, + 0x1E93F, 0x1E91D, eos, + 0x1E940, 0x1E91E, eos, // 4291 + 0x1E941, 0x1E91F, eos, + 0x1E942, 0x1E920, eos, + 0x1E943, 0x1E921, eos // 4300 +}; +#define SRELL_UCFDATA_VERSION 200 diff --git a/lib/srell3_009/srell_updata.hpp b/lib/srell3_009/srell_updata.hpp new file mode 100644 index 000000000..dcbed7e1a --- /dev/null +++ b/lib/srell3_009/srell_updata.hpp @@ -0,0 +1,6000 @@ +// UnicodeData.txt +// +// PropList-14.0.0.txt +// Date: 2021-08-12, 23:13:05 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// DerivedCoreProperties-14.0.0.txt +// Date: 2021-08-12, 23:12:53 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// emoji-data-14.0.0.txt +// Date: 2021-08-26, 17:22:22 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// DerivedNormalizationProps-14.0.0.txt +// Date: 2021-06-04, 02:19:20 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// Scripts-14.0.0.txt +// Date: 2021-07-10, 00:35:31 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// +// ScriptExtensions-14.0.0.txt +// Date: 2021-06-04, 02:19:38 GMT +// © 2021 Unicode®, Inc. +// Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// For terms of use, see http://www.unicode.org/terms_of_use.html +// + +template +struct unicode_property_data +{ + static const T1 unknown = 0; + static const T1 gc_Other = 1; // #1 + static const T1 gc_Control = 2; // #2 + static const T1 gc_Format = 3; // #3 + static const T1 gc_Unassigned = 4; // #4 + static const T1 gc_Private_Use = 5; // #5 + static const T1 gc_Surrogate = 6; // #6 + static const T1 gc_Letter = 7; // #7 + static const T1 gc_Cased_Letter = 8; // #8 + static const T1 gc_Lowercase_Letter = 9; // #9 + static const T1 gc_Titlecase_Letter = 10; // #10 + static const T1 gc_Uppercase_Letter = 11; // #11 + static const T1 gc_Modifier_Letter = 12; // #12 + static const T1 gc_Other_Letter = 13; // #13 + static const T1 gc_Mark = 14; // #14 + static const T1 gc_Spacing_Mark = 15; // #15 + static const T1 gc_Enclosing_Mark = 16; // #16 + static const T1 gc_Nonspacing_Mark = 17; // #17 + static const T1 gc_Number = 18; // #18 + static const T1 gc_Decimal_Number = 19; // #19 + static const T1 gc_Letter_Number = 20; // #20 + static const T1 gc_Other_Number = 21; // #21 + static const T1 gc_Punctuation = 22; // #22 + static const T1 gc_Connector_Punctuation = 23; // #23 + static const T1 gc_Dash_Punctuation = 24; // #24 + static const T1 gc_Close_Punctuation = 25; // #25 + static const T1 gc_Final_Punctuation = 26; // #26 + static const T1 gc_Initial_Punctuation = 27; // #27 + static const T1 gc_Other_Punctuation = 28; // #28 + static const T1 gc_Open_Punctuation = 29; // #29 + static const T1 gc_Symbol = 30; // #30 + static const T1 gc_Currency_Symbol = 31; // #31 + static const T1 gc_Modifier_Symbol = 32; // #32 + static const T1 gc_Math_Symbol = 33; // #33 + static const T1 gc_Other_Symbol = 34; // #34 + static const T1 gc_Separator = 35; // #35 + static const T1 gc_Line_Separator = 36; // #36 + static const T1 gc_Paragraph_Separator = 37; // #37 + static const T1 gc_Space_Separator = 38; // #38 + static const T1 bp_ASCII = 39; // #39 + static const T1 bp_ASCII_Hex_Digit = 40; // #40 + static const T1 bp_Alphabetic = 41; // #41 + static const T1 bp_Any = 42; // #42 + static const T1 bp_Assigned = 43; // #43 + static const T1 bp_Bidi_Control = 44; // #44 + static const T1 bp_Bidi_Mirrored = 45; // #45 + static const T1 bp_Case_Ignorable = 46; // #46 + static const T1 bp_Cased = 47; // #47 + static const T1 bp_Changes_When_Casefolded = 48; // #48 + static const T1 bp_Changes_When_Casemapped = 49; // #49 + static const T1 bp_Changes_When_Lowercased = 50; // #50 + static const T1 bp_Changes_When_NFKC_Casefolded = 51; // #51 + static const T1 bp_Changes_When_Titlecased = 52; // #52 + static const T1 bp_Changes_When_Uppercased = 53; // #53 + static const T1 bp_Dash = 54; // #54 + static const T1 bp_Default_Ignorable_Code_Point = 55; // #55 + static const T1 bp_Deprecated = 56; // #56 + static const T1 bp_Diacritic = 57; // #57 + static const T1 bp_Emoji = 58; // #58 + static const T1 bp_Emoji_Component = 59; // #59 + static const T1 bp_Emoji_Modifier = 60; // #60 + static const T1 bp_Emoji_Modifier_Base = 61; // #61 + static const T1 bp_Emoji_Presentation = 62; // #62 + static const T1 bp_Extended_Pictographic = 63; // #63 + static const T1 bp_Extender = 64; // #64 + static const T1 bp_Grapheme_Base = 65; // #65 + static const T1 bp_Grapheme_Extend = 66; // #66 + static const T1 bp_Hex_Digit = 67; // #67 + static const T1 bp_IDS_Binary_Operator = 68; // #68 + static const T1 bp_IDS_Trinary_Operator = 69; // #69 + static const T1 bp_ID_Continue = 70; // #70 + static const T1 bp_ID_Start = 71; // #71 + static const T1 bp_Ideographic = 72; // #72 + static const T1 bp_Join_Control = 73; // #73 + static const T1 bp_Logical_Order_Exception = 74; // #74 + static const T1 bp_Lowercase = 75; // #75 + static const T1 bp_Math = 76; // #76 + static const T1 bp_Noncharacter_Code_Point = 77; // #77 + static const T1 bp_Pattern_Syntax = 78; // #78 + static const T1 bp_Pattern_White_Space = 79; // #79 + static const T1 bp_Quotation_Mark = 80; // #80 + static const T1 bp_Radical = 81; // #81 + static const T1 bp_Regional_Indicator = 82; // #82 + static const T1 bp_Sentence_Terminal = 83; // #83 + static const T1 bp_Soft_Dotted = 84; // #84 + static const T1 bp_Terminal_Punctuation = 85; // #85 + static const T1 bp_Unified_Ideograph = 86; // #86 + static const T1 bp_Uppercase = 87; // #87 + static const T1 bp_Variation_Selector = 88; // #88 + static const T1 bp_White_Space = 89; // #89 + static const T1 bp_XID_Continue = 90; // #90 + static const T1 bp_XID_Start = 91; // #91 + static const T1 sc_Adlam = 92; // #92 + static const T1 sc_Ahom = 93; // #93 + static const T1 sc_Anatolian_Hieroglyphs = 94; // #94 + static const T1 sc_Arabic = 95; // #95 + static const T1 sc_Armenian = 96; // #96 + static const T1 sc_Avestan = 97; // #97 + static const T1 sc_Balinese = 98; // #98 + static const T1 sc_Bamum = 99; // #99 + static const T1 sc_Bassa_Vah = 100; // #100 + static const T1 sc_Batak = 101; // #101 + static const T1 sc_Bengali = 102; // #102 + static const T1 sc_Bhaiksuki = 103; // #103 + static const T1 sc_Bopomofo = 104; // #104 + static const T1 sc_Brahmi = 105; // #105 + static const T1 sc_Braille = 106; // #106 + static const T1 sc_Buginese = 107; // #107 + static const T1 sc_Buhid = 108; // #108 + static const T1 sc_Canadian_Aboriginal = 109; // #109 + static const T1 sc_Carian = 110; // #110 + static const T1 sc_Caucasian_Albanian = 111; // #111 + static const T1 sc_Chakma = 112; // #112 + static const T1 sc_Cham = 113; // #113 + static const T1 sc_Cherokee = 114; // #114 + static const T1 sc_Chorasmian = 115; // #115 + static const T1 sc_Common = 116; // #116 + static const T1 sc_Coptic = 117; // #117 + static const T1 sc_Cypro_Minoan = 118; // #118 + static const T1 sc_Cuneiform = 119; // #119 + static const T1 sc_Cypriot = 120; // #120 + static const T1 sc_Cyrillic = 121; // #121 + static const T1 sc_Deseret = 122; // #122 + static const T1 sc_Devanagari = 123; // #123 + static const T1 sc_Dives_Akuru = 124; // #124 + static const T1 sc_Dogra = 125; // #125 + static const T1 sc_Duployan = 126; // #126 + static const T1 sc_Egyptian_Hieroglyphs = 127; // #127 + static const T1 sc_Elbasan = 128; // #128 + static const T1 sc_Elymaic = 129; // #129 + static const T1 sc_Ethiopic = 130; // #130 + static const T1 sc_Georgian = 131; // #131 + static const T1 sc_Glagolitic = 132; // #132 + static const T1 sc_Gothic = 133; // #133 + static const T1 sc_Grantha = 134; // #134 + static const T1 sc_Greek = 135; // #135 + static const T1 sc_Gujarati = 136; // #136 + static const T1 sc_Gunjala_Gondi = 137; // #137 + static const T1 sc_Gurmukhi = 138; // #138 + static const T1 sc_Han = 139; // #139 + static const T1 sc_Hangul = 140; // #140 + static const T1 sc_Hanifi_Rohingya = 141; // #141 + static const T1 sc_Hanunoo = 142; // #142 + static const T1 sc_Hatran = 143; // #143 + static const T1 sc_Hebrew = 144; // #144 + static const T1 sc_Hiragana = 145; // #145 + static const T1 sc_Imperial_Aramaic = 146; // #146 + static const T1 sc_Inherited = 147; // #147 + static const T1 sc_Inscriptional_Pahlavi = 148; // #148 + static const T1 sc_Inscriptional_Parthian = 149; // #149 + static const T1 sc_Javanese = 150; // #150 + static const T1 sc_Kaithi = 151; // #151 + static const T1 sc_Kannada = 152; // #152 + static const T1 sc_Katakana = 153; // #153 + static const T1 sc_Kayah_Li = 154; // #154 + static const T1 sc_Kharoshthi = 155; // #155 + static const T1 sc_Khitan_Small_Script = 156; // #156 + static const T1 sc_Khmer = 157; // #157 + static const T1 sc_Khojki = 158; // #158 + static const T1 sc_Khudawadi = 159; // #159 + static const T1 sc_Lao = 160; // #160 + static const T1 sc_Latin = 161; // #161 + static const T1 sc_Lepcha = 162; // #162 + static const T1 sc_Limbu = 163; // #163 + static const T1 sc_Linear_A = 164; // #164 + static const T1 sc_Linear_B = 165; // #165 + static const T1 sc_Lisu = 166; // #166 + static const T1 sc_Lycian = 167; // #167 + static const T1 sc_Lydian = 168; // #168 + static const T1 sc_Mahajani = 169; // #169 + static const T1 sc_Makasar = 170; // #170 + static const T1 sc_Malayalam = 171; // #171 + static const T1 sc_Mandaic = 172; // #172 + static const T1 sc_Manichaean = 173; // #173 + static const T1 sc_Marchen = 174; // #174 + static const T1 sc_Masaram_Gondi = 175; // #175 + static const T1 sc_Medefaidrin = 176; // #176 + static const T1 sc_Meetei_Mayek = 177; // #177 + static const T1 sc_Mende_Kikakui = 178; // #178 + static const T1 sc_Meroitic_Cursive = 179; // #179 + static const T1 sc_Meroitic_Hieroglyphs = 180; // #180 + static const T1 sc_Miao = 181; // #181 + static const T1 sc_Modi = 182; // #182 + static const T1 sc_Mongolian = 183; // #183 + static const T1 sc_Mro = 184; // #184 + static const T1 sc_Multani = 185; // #185 + static const T1 sc_Myanmar = 186; // #186 + static const T1 sc_Nabataean = 187; // #187 + static const T1 sc_Nandinagari = 188; // #188 + static const T1 sc_New_Tai_Lue = 189; // #189 + static const T1 sc_Newa = 190; // #190 + static const T1 sc_Nko = 191; // #191 + static const T1 sc_Nushu = 192; // #192 + static const T1 sc_Nyiakeng_Puachue_Hmong = 193; // #193 + static const T1 sc_Ogham = 194; // #194 + static const T1 sc_Ol_Chiki = 195; // #195 + static const T1 sc_Old_Hungarian = 196; // #196 + static const T1 sc_Old_Italic = 197; // #197 + static const T1 sc_Old_North_Arabian = 198; // #198 + static const T1 sc_Old_Permic = 199; // #199 + static const T1 sc_Old_Persian = 200; // #200 + static const T1 sc_Old_Sogdian = 201; // #201 + static const T1 sc_Old_South_Arabian = 202; // #202 + static const T1 sc_Old_Turkic = 203; // #203 + static const T1 sc_Old_Uyghur = 204; // #204 + static const T1 sc_Oriya = 205; // #205 + static const T1 sc_Osage = 206; // #206 + static const T1 sc_Osmanya = 207; // #207 + static const T1 sc_Pahawh_Hmong = 208; // #208 + static const T1 sc_Palmyrene = 209; // #209 + static const T1 sc_Pau_Cin_Hau = 210; // #210 + static const T1 sc_Phags_Pa = 211; // #211 + static const T1 sc_Phoenician = 212; // #212 + static const T1 sc_Psalter_Pahlavi = 213; // #213 + static const T1 sc_Rejang = 214; // #214 + static const T1 sc_Runic = 215; // #215 + static const T1 sc_Samaritan = 216; // #216 + static const T1 sc_Saurashtra = 217; // #217 + static const T1 sc_Sharada = 218; // #218 + static const T1 sc_Shavian = 219; // #219 + static const T1 sc_Siddham = 220; // #220 + static const T1 sc_SignWriting = 221; // #221 + static const T1 sc_Sinhala = 222; // #222 + static const T1 sc_Sogdian = 223; // #223 + static const T1 sc_Sora_Sompeng = 224; // #224 + static const T1 sc_Soyombo = 225; // #225 + static const T1 sc_Sundanese = 226; // #226 + static const T1 sc_Syloti_Nagri = 227; // #227 + static const T1 sc_Syriac = 228; // #228 + static const T1 sc_Tagalog = 229; // #229 + static const T1 sc_Tagbanwa = 230; // #230 + static const T1 sc_Tai_Le = 231; // #231 + static const T1 sc_Tai_Tham = 232; // #232 + static const T1 sc_Tai_Viet = 233; // #233 + static const T1 sc_Takri = 234; // #234 + static const T1 sc_Tamil = 235; // #235 + static const T1 sc_Tangsa = 236; // #236 + static const T1 sc_Tangut = 237; // #237 + static const T1 sc_Telugu = 238; // #238 + static const T1 sc_Thaana = 239; // #239 + static const T1 sc_Thai = 240; // #240 + static const T1 sc_Tibetan = 241; // #241 + static const T1 sc_Tifinagh = 242; // #242 + static const T1 sc_Tirhuta = 243; // #243 + static const T1 sc_Toto = 244; // #244 + static const T1 sc_Ugaritic = 245; // #245 + static const T1 sc_Vai = 246; // #246 + static const T1 sc_Vithkuqi = 247; // #247 + static const T1 sc_Wancho = 248; // #248 + static const T1 sc_Warang_Citi = 249; // #249 + static const T1 sc_Yezidi = 250; // #250 + static const T1 sc_Yi = 251; // #251 + static const T1 sc_Zanabazar_Square = 252; // #252 + static const T1 scx_Adlam = 253; // #253 + static const T1 scx_Ahom = 254; // #93 + static const T1 scx_Anatolian_Hieroglyphs = 255; // #94 + static const T1 scx_Arabic = 256; // #254 + static const T1 scx_Armenian = 257; // #96 + static const T1 scx_Avestan = 258; // #97 + static const T1 scx_Balinese = 259; // #98 + static const T1 scx_Bamum = 260; // #99 + static const T1 scx_Bassa_Vah = 261; // #100 + static const T1 scx_Batak = 262; // #101 + static const T1 scx_Bengali = 263; // #255 + static const T1 scx_Bhaiksuki = 264; // #103 + static const T1 scx_Bopomofo = 265; // #256 + static const T1 scx_Brahmi = 266; // #105 + static const T1 scx_Braille = 267; // #106 + static const T1 scx_Buginese = 268; // #257 + static const T1 scx_Buhid = 269; // #258 + static const T1 scx_Canadian_Aboriginal = 270; // #109 + static const T1 scx_Carian = 271; // #110 + static const T1 scx_Caucasian_Albanian = 272; // #111 + static const T1 scx_Chakma = 273; // #259 + static const T1 scx_Cham = 274; // #113 + static const T1 scx_Cherokee = 275; // #114 + static const T1 scx_Chorasmian = 276; // #115 + static const T1 scx_Common = 277; // #260 + static const T1 scx_Coptic = 278; // #261 + static const T1 scx_Cypro_Minoan = 279; // #262 + static const T1 scx_Cuneiform = 280; // #119 + static const T1 scx_Cypriot = 281; // #263 + static const T1 scx_Cyrillic = 282; // #264 + static const T1 scx_Deseret = 283; // #122 + static const T1 scx_Devanagari = 284; // #265 + static const T1 scx_Dives_Akuru = 285; // #124 + static const T1 scx_Dogra = 286; // #266 + static const T1 scx_Duployan = 287; // #267 + static const T1 scx_Egyptian_Hieroglyphs = 288; // #127 + static const T1 scx_Elbasan = 289; // #128 + static const T1 scx_Elymaic = 290; // #129 + static const T1 scx_Ethiopic = 291; // #130 + static const T1 scx_Georgian = 292; // #268 + static const T1 scx_Glagolitic = 293; // #269 + static const T1 scx_Gothic = 294; // #133 + static const T1 scx_Grantha = 295; // #270 + static const T1 scx_Greek = 296; // #271 + static const T1 scx_Gujarati = 297; // #272 + static const T1 scx_Gunjala_Gondi = 298; // #273 + static const T1 scx_Gurmukhi = 299; // #274 + static const T1 scx_Han = 300; // #275 + static const T1 scx_Hangul = 301; // #276 + static const T1 scx_Hanifi_Rohingya = 302; // #277 + static const T1 scx_Hanunoo = 303; // #278 + static const T1 scx_Hatran = 304; // #143 + static const T1 scx_Hebrew = 305; // #144 + static const T1 scx_Hiragana = 306; // #279 + static const T1 scx_Imperial_Aramaic = 307; // #146 + static const T1 scx_Inherited = 308; // #280 + static const T1 scx_Inscriptional_Pahlavi = 309; // #148 + static const T1 scx_Inscriptional_Parthian = 310; // #149 + static const T1 scx_Javanese = 311; // #281 + static const T1 scx_Kaithi = 312; // #282 + static const T1 scx_Kannada = 313; // #283 + static const T1 scx_Katakana = 314; // #284 + static const T1 scx_Kayah_Li = 315; // #285 + static const T1 scx_Kharoshthi = 316; // #155 + static const T1 scx_Khitan_Small_Script = 317; // #156 + static const T1 scx_Khmer = 318; // #157 + static const T1 scx_Khojki = 319; // #286 + static const T1 scx_Khudawadi = 320; // #287 + static const T1 scx_Lao = 321; // #160 + static const T1 scx_Latin = 322; // #288 + static const T1 scx_Lepcha = 323; // #162 + static const T1 scx_Limbu = 324; // #289 + static const T1 scx_Linear_A = 325; // #290 + static const T1 scx_Linear_B = 326; // #291 + static const T1 scx_Lisu = 327; // #166 + static const T1 scx_Lycian = 328; // #167 + static const T1 scx_Lydian = 329; // #168 + static const T1 scx_Mahajani = 330; // #292 + static const T1 scx_Makasar = 331; // #170 + static const T1 scx_Malayalam = 332; // #293 + static const T1 scx_Mandaic = 333; // #294 + static const T1 scx_Manichaean = 334; // #295 + static const T1 scx_Marchen = 335; // #174 + static const T1 scx_Masaram_Gondi = 336; // #296 + static const T1 scx_Medefaidrin = 337; // #176 + static const T1 scx_Meetei_Mayek = 338; // #177 + static const T1 scx_Mende_Kikakui = 339; // #178 + static const T1 scx_Meroitic_Cursive = 340; // #179 + static const T1 scx_Meroitic_Hieroglyphs = 341; // #180 + static const T1 scx_Miao = 342; // #181 + static const T1 scx_Modi = 343; // #297 + static const T1 scx_Mongolian = 344; // #298 + static const T1 scx_Mro = 345; // #184 + static const T1 scx_Multani = 346; // #299 + static const T1 scx_Myanmar = 347; // #300 + static const T1 scx_Nabataean = 348; // #187 + static const T1 scx_Nandinagari = 349; // #301 + static const T1 scx_New_Tai_Lue = 350; // #189 + static const T1 scx_Newa = 351; // #190 + static const T1 scx_Nko = 352; // #302 + static const T1 scx_Nushu = 353; // #192 + static const T1 scx_Nyiakeng_Puachue_Hmong = 354; // #193 + static const T1 scx_Ogham = 355; // #194 + static const T1 scx_Ol_Chiki = 356; // #195 + static const T1 scx_Old_Hungarian = 357; // #196 + static const T1 scx_Old_Italic = 358; // #197 + static const T1 scx_Old_North_Arabian = 359; // #198 + static const T1 scx_Old_Permic = 360; // #303 + static const T1 scx_Old_Persian = 361; // #200 + static const T1 scx_Old_Sogdian = 362; // #201 + static const T1 scx_Old_South_Arabian = 363; // #202 + static const T1 scx_Old_Turkic = 364; // #203 + static const T1 scx_Old_Uyghur = 365; // #304 + static const T1 scx_Oriya = 366; // #305 + static const T1 scx_Osage = 367; // #206 + static const T1 scx_Osmanya = 368; // #207 + static const T1 scx_Pahawh_Hmong = 369; // #208 + static const T1 scx_Palmyrene = 370; // #209 + static const T1 scx_Pau_Cin_Hau = 371; // #210 + static const T1 scx_Phags_Pa = 372; // #306 + static const T1 scx_Phoenician = 373; // #212 + static const T1 scx_Psalter_Pahlavi = 374; // #307 + static const T1 scx_Rejang = 375; // #214 + static const T1 scx_Runic = 376; // #215 + static const T1 scx_Samaritan = 377; // #216 + static const T1 scx_Saurashtra = 378; // #217 + static const T1 scx_Sharada = 379; // #308 + static const T1 scx_Shavian = 380; // #219 + static const T1 scx_Siddham = 381; // #220 + static const T1 scx_SignWriting = 382; // #221 + static const T1 scx_Sinhala = 383; // #309 + static const T1 scx_Sogdian = 384; // #310 + static const T1 scx_Sora_Sompeng = 385; // #224 + static const T1 scx_Soyombo = 386; // #225 + static const T1 scx_Sundanese = 387; // #226 + static const T1 scx_Syloti_Nagri = 388; // #311 + static const T1 scx_Syriac = 389; // #312 + static const T1 scx_Tagalog = 390; // #313 + static const T1 scx_Tagbanwa = 391; // #314 + static const T1 scx_Tai_Le = 392; // #315 + static const T1 scx_Tai_Tham = 393; // #232 + static const T1 scx_Tai_Viet = 394; // #233 + static const T1 scx_Takri = 395; // #316 + static const T1 scx_Tamil = 396; // #317 + static const T1 scx_Tangsa = 397; // #236 + static const T1 scx_Tangut = 398; // #237 + static const T1 scx_Telugu = 399; // #318 + static const T1 scx_Thaana = 400; // #319 + static const T1 scx_Thai = 401; // #240 + static const T1 scx_Tibetan = 402; // #241 + static const T1 scx_Tifinagh = 403; // #242 + static const T1 scx_Tirhuta = 404; // #320 + static const T1 scx_Toto = 405; // #244 + static const T1 scx_Ugaritic = 406; // #245 + static const T1 scx_Vai = 407; // #246 + static const T1 scx_Vithkuqi = 408; // #247 + static const T1 scx_Wancho = 409; // #248 + static const T1 scx_Warang_Citi = 410; // #249 + static const T1 scx_Yezidi = 411; // #321 + static const T1 scx_Yi = 412; // #322 + static const T1 scx_Zanabazar_Square = 413; // #252 + static const T1 last_property_number = 322; + struct ptype + { + static const T2 unknown = 0; + static const T2 binary = 1; + static const T2 general_category = 2; + static const T2 script = 3; + static const T2 script_extensions = 4; + }; + static const T3 propertynametable[]; + static const T4 rangetable[]; + static const T5 rangenumbertable[]; + static const T6 positiontable[]; + + static const T3 *propertyname_table() + { + return propertynametable; + } + static const T4 *ranges() + { + return rangetable; + } + static const T5 *rangenumber_table() + { + return rangenumbertable; + } + static const T6 *position_table() + { + return positiontable; + } +}; + +template +const T3 unicode_property_data::propertynametable[] = +{ + "*", // #0:unknown + "*", // #1:binary + "General_Category:gc", // #2 + "Script:sc", // #3 + "Script_Extensions:scx", // #4 + "" +}; + +template +const T4 unicode_property_data::rangetable[] = +{ + // #1 (0+725): gc=Other:C + // Cc:2 + Cf:21 + Cn:698 + Co:3 + Cs:1 + // #2 (0+2): gc=Control:Cc:cntrl + 0x0000, 0x001F, 0x007F, 0x009F, + // #3 (2+21): gc=Format:Cf + 0x00AD, 0x00AD, 0x0600, 0x0605, 0x061C, 0x061C, 0x06DD, 0x06DD, + 0x070F, 0x070F, 0x0890, 0x0891, 0x08E2, 0x08E2, 0x180E, 0x180E, + 0x200B, 0x200F, 0x202A, 0x202E, 0x2060, 0x2064, 0x2066, 0x206F, + 0xFEFF, 0xFEFF, 0xFFF9, 0xFFFB, 0x110BD, 0x110BD, 0x110CD, 0x110CD, + 0x13430, 0x13438, 0x1BCA0, 0x1BCA3, 0x1D173, 0x1D17A, 0xE0001, 0xE0001, + 0xE0020, 0xE007F, + // #4 (23+698): gc=Unassigned:Cn + 0x0378, 0x0379, 0x0380, 0x0383, 0x038B, 0x038B, 0x038D, 0x038D, + 0x03A2, 0x03A2, 0x0530, 0x0530, 0x0557, 0x0558, 0x058B, 0x058C, + 0x0590, 0x0590, 0x05C8, 0x05CF, 0x05EB, 0x05EE, 0x05F5, 0x05FF, + 0x070E, 0x070E, 0x074B, 0x074C, 0x07B2, 0x07BF, 0x07FB, 0x07FC, + 0x082E, 0x082F, 0x083F, 0x083F, 0x085C, 0x085D, 0x085F, 0x085F, + 0x086B, 0x086F, 0x088F, 0x088F, 0x0892, 0x0897, 0x0984, 0x0984, + 0x098D, 0x098E, 0x0991, 0x0992, 0x09A9, 0x09A9, 0x09B1, 0x09B1, + 0x09B3, 0x09B5, 0x09BA, 0x09BB, 0x09C5, 0x09C6, 0x09C9, 0x09CA, + 0x09CF, 0x09D6, 0x09D8, 0x09DB, 0x09DE, 0x09DE, 0x09E4, 0x09E5, + 0x09FF, 0x0A00, 0x0A04, 0x0A04, 0x0A0B, 0x0A0E, 0x0A11, 0x0A12, + 0x0A29, 0x0A29, 0x0A31, 0x0A31, 0x0A34, 0x0A34, 0x0A37, 0x0A37, + 0x0A3A, 0x0A3B, 0x0A3D, 0x0A3D, 0x0A43, 0x0A46, 0x0A49, 0x0A4A, + 0x0A4E, 0x0A50, 0x0A52, 0x0A58, 0x0A5D, 0x0A5D, 0x0A5F, 0x0A65, + 0x0A77, 0x0A80, 0x0A84, 0x0A84, 0x0A8E, 0x0A8E, 0x0A92, 0x0A92, + 0x0AA9, 0x0AA9, 0x0AB1, 0x0AB1, 0x0AB4, 0x0AB4, 0x0ABA, 0x0ABB, + 0x0AC6, 0x0AC6, 0x0ACA, 0x0ACA, 0x0ACE, 0x0ACF, 0x0AD1, 0x0ADF, + 0x0AE4, 0x0AE5, 0x0AF2, 0x0AF8, 0x0B00, 0x0B00, 0x0B04, 0x0B04, + 0x0B0D, 0x0B0E, 0x0B11, 0x0B12, 0x0B29, 0x0B29, 0x0B31, 0x0B31, + 0x0B34, 0x0B34, 0x0B3A, 0x0B3B, 0x0B45, 0x0B46, 0x0B49, 0x0B4A, + 0x0B4E, 0x0B54, 0x0B58, 0x0B5B, 0x0B5E, 0x0B5E, 0x0B64, 0x0B65, + 0x0B78, 0x0B81, 0x0B84, 0x0B84, 0x0B8B, 0x0B8D, 0x0B91, 0x0B91, + 0x0B96, 0x0B98, 0x0B9B, 0x0B9B, 0x0B9D, 0x0B9D, 0x0BA0, 0x0BA2, + 0x0BA5, 0x0BA7, 0x0BAB, 0x0BAD, 0x0BBA, 0x0BBD, 0x0BC3, 0x0BC5, + 0x0BC9, 0x0BC9, 0x0BCE, 0x0BCF, 0x0BD1, 0x0BD6, 0x0BD8, 0x0BE5, + 0x0BFB, 0x0BFF, 0x0C0D, 0x0C0D, 0x0C11, 0x0C11, 0x0C29, 0x0C29, + 0x0C3A, 0x0C3B, 0x0C45, 0x0C45, 0x0C49, 0x0C49, 0x0C4E, 0x0C54, + 0x0C57, 0x0C57, 0x0C5B, 0x0C5C, 0x0C5E, 0x0C5F, 0x0C64, 0x0C65, + 0x0C70, 0x0C76, 0x0C8D, 0x0C8D, 0x0C91, 0x0C91, 0x0CA9, 0x0CA9, + 0x0CB4, 0x0CB4, 0x0CBA, 0x0CBB, 0x0CC5, 0x0CC5, 0x0CC9, 0x0CC9, + 0x0CCE, 0x0CD4, 0x0CD7, 0x0CDC, 0x0CDF, 0x0CDF, 0x0CE4, 0x0CE5, + 0x0CF0, 0x0CF0, 0x0CF3, 0x0CFF, 0x0D0D, 0x0D0D, 0x0D11, 0x0D11, + 0x0D45, 0x0D45, 0x0D49, 0x0D49, 0x0D50, 0x0D53, 0x0D64, 0x0D65, + 0x0D80, 0x0D80, 0x0D84, 0x0D84, 0x0D97, 0x0D99, 0x0DB2, 0x0DB2, + 0x0DBC, 0x0DBC, 0x0DBE, 0x0DBF, 0x0DC7, 0x0DC9, 0x0DCB, 0x0DCE, + 0x0DD5, 0x0DD5, 0x0DD7, 0x0DD7, 0x0DE0, 0x0DE5, 0x0DF0, 0x0DF1, + 0x0DF5, 0x0E00, 0x0E3B, 0x0E3E, 0x0E5C, 0x0E80, 0x0E83, 0x0E83, + 0x0E85, 0x0E85, 0x0E8B, 0x0E8B, 0x0EA4, 0x0EA4, 0x0EA6, 0x0EA6, + 0x0EBE, 0x0EBF, 0x0EC5, 0x0EC5, 0x0EC7, 0x0EC7, 0x0ECE, 0x0ECF, + 0x0EDA, 0x0EDB, 0x0EE0, 0x0EFF, 0x0F48, 0x0F48, 0x0F6D, 0x0F70, + 0x0F98, 0x0F98, 0x0FBD, 0x0FBD, 0x0FCD, 0x0FCD, 0x0FDB, 0x0FFF, + 0x10C6, 0x10C6, 0x10C8, 0x10CC, 0x10CE, 0x10CF, 0x1249, 0x1249, + 0x124E, 0x124F, 0x1257, 0x1257, 0x1259, 0x1259, 0x125E, 0x125F, + 0x1289, 0x1289, 0x128E, 0x128F, 0x12B1, 0x12B1, 0x12B6, 0x12B7, + 0x12BF, 0x12BF, 0x12C1, 0x12C1, 0x12C6, 0x12C7, 0x12D7, 0x12D7, + 0x1311, 0x1311, 0x1316, 0x1317, 0x135B, 0x135C, 0x137D, 0x137F, + 0x139A, 0x139F, 0x13F6, 0x13F7, 0x13FE, 0x13FF, 0x169D, 0x169F, + 0x16F9, 0x16FF, 0x1716, 0x171E, 0x1737, 0x173F, 0x1754, 0x175F, + 0x176D, 0x176D, 0x1771, 0x1771, 0x1774, 0x177F, 0x17DE, 0x17DF, + 0x17EA, 0x17EF, 0x17FA, 0x17FF, 0x181A, 0x181F, 0x1879, 0x187F, + 0x18AB, 0x18AF, 0x18F6, 0x18FF, 0x191F, 0x191F, 0x192C, 0x192F, + 0x193C, 0x193F, 0x1941, 0x1943, 0x196E, 0x196F, 0x1975, 0x197F, + 0x19AC, 0x19AF, 0x19CA, 0x19CF, 0x19DB, 0x19DD, 0x1A1C, 0x1A1D, + 0x1A5F, 0x1A5F, 0x1A7D, 0x1A7E, 0x1A8A, 0x1A8F, 0x1A9A, 0x1A9F, + 0x1AAE, 0x1AAF, 0x1ACF, 0x1AFF, 0x1B4D, 0x1B4F, 0x1B7F, 0x1B7F, + 0x1BF4, 0x1BFB, 0x1C38, 0x1C3A, 0x1C4A, 0x1C4C, 0x1C89, 0x1C8F, + 0x1CBB, 0x1CBC, 0x1CC8, 0x1CCF, 0x1CFB, 0x1CFF, 0x1F16, 0x1F17, + 0x1F1E, 0x1F1F, 0x1F46, 0x1F47, 0x1F4E, 0x1F4F, 0x1F58, 0x1F58, + 0x1F5A, 0x1F5A, 0x1F5C, 0x1F5C, 0x1F5E, 0x1F5E, 0x1F7E, 0x1F7F, + 0x1FB5, 0x1FB5, 0x1FC5, 0x1FC5, 0x1FD4, 0x1FD5, 0x1FDC, 0x1FDC, + 0x1FF0, 0x1FF1, 0x1FF5, 0x1FF5, 0x1FFF, 0x1FFF, 0x2065, 0x2065, + 0x2072, 0x2073, 0x208F, 0x208F, 0x209D, 0x209F, 0x20C1, 0x20CF, + 0x20F1, 0x20FF, 0x218C, 0x218F, 0x2427, 0x243F, 0x244B, 0x245F, + 0x2B74, 0x2B75, 0x2B96, 0x2B96, 0x2CF4, 0x2CF8, 0x2D26, 0x2D26, + 0x2D28, 0x2D2C, 0x2D2E, 0x2D2F, 0x2D68, 0x2D6E, 0x2D71, 0x2D7E, + 0x2D97, 0x2D9F, 0x2DA7, 0x2DA7, 0x2DAF, 0x2DAF, 0x2DB7, 0x2DB7, + 0x2DBF, 0x2DBF, 0x2DC7, 0x2DC7, 0x2DCF, 0x2DCF, 0x2DD7, 0x2DD7, + 0x2DDF, 0x2DDF, 0x2E5E, 0x2E7F, 0x2E9A, 0x2E9A, 0x2EF4, 0x2EFF, + 0x2FD6, 0x2FEF, 0x2FFC, 0x2FFF, 0x3040, 0x3040, 0x3097, 0x3098, + 0x3100, 0x3104, 0x3130, 0x3130, 0x318F, 0x318F, 0x31E4, 0x31EF, + 0x321F, 0x321F, 0xA48D, 0xA48F, 0xA4C7, 0xA4CF, 0xA62C, 0xA63F, + 0xA6F8, 0xA6FF, 0xA7CB, 0xA7CF, 0xA7D2, 0xA7D2, 0xA7D4, 0xA7D4, + 0xA7DA, 0xA7F1, 0xA82D, 0xA82F, 0xA83A, 0xA83F, 0xA878, 0xA87F, + 0xA8C6, 0xA8CD, 0xA8DA, 0xA8DF, 0xA954, 0xA95E, 0xA97D, 0xA97F, + 0xA9CE, 0xA9CE, 0xA9DA, 0xA9DD, 0xA9FF, 0xA9FF, 0xAA37, 0xAA3F, + 0xAA4E, 0xAA4F, 0xAA5A, 0xAA5B, 0xAAC3, 0xAADA, 0xAAF7, 0xAB00, + 0xAB07, 0xAB08, 0xAB0F, 0xAB10, 0xAB17, 0xAB1F, 0xAB27, 0xAB27, + 0xAB2F, 0xAB2F, 0xAB6C, 0xAB6F, 0xABEE, 0xABEF, 0xABFA, 0xABFF, + 0xD7A4, 0xD7AF, 0xD7C7, 0xD7CA, 0xD7FC, 0xD7FF, 0xFA6E, 0xFA6F, + 0xFADA, 0xFAFF, 0xFB07, 0xFB12, 0xFB18, 0xFB1C, 0xFB37, 0xFB37, + 0xFB3D, 0xFB3D, 0xFB3F, 0xFB3F, 0xFB42, 0xFB42, 0xFB45, 0xFB45, + 0xFBC3, 0xFBD2, 0xFD90, 0xFD91, 0xFDC8, 0xFDCE, 0xFDD0, 0xFDEF, + 0xFE1A, 0xFE1F, 0xFE53, 0xFE53, 0xFE67, 0xFE67, 0xFE6C, 0xFE6F, + 0xFE75, 0xFE75, 0xFEFD, 0xFEFE, 0xFF00, 0xFF00, 0xFFBF, 0xFFC1, + 0xFFC8, 0xFFC9, 0xFFD0, 0xFFD1, 0xFFD8, 0xFFD9, 0xFFDD, 0xFFDF, + 0xFFE7, 0xFFE7, 0xFFEF, 0xFFF8, 0xFFFE, 0xFFFF, 0x1000C, 0x1000C, + 0x10027, 0x10027, 0x1003B, 0x1003B, 0x1003E, 0x1003E, 0x1004E, 0x1004F, + 0x1005E, 0x1007F, 0x100FB, 0x100FF, 0x10103, 0x10106, 0x10134, 0x10136, + 0x1018F, 0x1018F, 0x1019D, 0x1019F, 0x101A1, 0x101CF, 0x101FE, 0x1027F, + 0x1029D, 0x1029F, 0x102D1, 0x102DF, 0x102FC, 0x102FF, 0x10324, 0x1032C, + 0x1034B, 0x1034F, 0x1037B, 0x1037F, 0x1039E, 0x1039E, 0x103C4, 0x103C7, + 0x103D6, 0x103FF, 0x1049E, 0x1049F, 0x104AA, 0x104AF, 0x104D4, 0x104D7, + 0x104FC, 0x104FF, 0x10528, 0x1052F, 0x10564, 0x1056E, 0x1057B, 0x1057B, + 0x1058B, 0x1058B, 0x10593, 0x10593, 0x10596, 0x10596, 0x105A2, 0x105A2, + 0x105B2, 0x105B2, 0x105BA, 0x105BA, 0x105BD, 0x105FF, 0x10737, 0x1073F, + 0x10756, 0x1075F, 0x10768, 0x1077F, 0x10786, 0x10786, 0x107B1, 0x107B1, + 0x107BB, 0x107FF, 0x10806, 0x10807, 0x10809, 0x10809, 0x10836, 0x10836, + 0x10839, 0x1083B, 0x1083D, 0x1083E, 0x10856, 0x10856, 0x1089F, 0x108A6, + 0x108B0, 0x108DF, 0x108F3, 0x108F3, 0x108F6, 0x108FA, 0x1091C, 0x1091E, + 0x1093A, 0x1093E, 0x10940, 0x1097F, 0x109B8, 0x109BB, 0x109D0, 0x109D1, + 0x10A04, 0x10A04, 0x10A07, 0x10A0B, 0x10A14, 0x10A14, 0x10A18, 0x10A18, + 0x10A36, 0x10A37, 0x10A3B, 0x10A3E, 0x10A49, 0x10A4F, 0x10A59, 0x10A5F, + 0x10AA0, 0x10ABF, 0x10AE7, 0x10AEA, 0x10AF7, 0x10AFF, 0x10B36, 0x10B38, + 0x10B56, 0x10B57, 0x10B73, 0x10B77, 0x10B92, 0x10B98, 0x10B9D, 0x10BA8, + 0x10BB0, 0x10BFF, 0x10C49, 0x10C7F, 0x10CB3, 0x10CBF, 0x10CF3, 0x10CF9, + 0x10D28, 0x10D2F, 0x10D3A, 0x10E5F, 0x10E7F, 0x10E7F, 0x10EAA, 0x10EAA, + 0x10EAE, 0x10EAF, 0x10EB2, 0x10EFF, 0x10F28, 0x10F2F, 0x10F5A, 0x10F6F, + 0x10F8A, 0x10FAF, 0x10FCC, 0x10FDF, 0x10FF7, 0x10FFF, 0x1104E, 0x11051, + 0x11076, 0x1107E, 0x110C3, 0x110CC, 0x110CE, 0x110CF, 0x110E9, 0x110EF, + 0x110FA, 0x110FF, 0x11135, 0x11135, 0x11148, 0x1114F, 0x11177, 0x1117F, + 0x111E0, 0x111E0, 0x111F5, 0x111FF, 0x11212, 0x11212, 0x1123F, 0x1127F, + 0x11287, 0x11287, 0x11289, 0x11289, 0x1128E, 0x1128E, 0x1129E, 0x1129E, + 0x112AA, 0x112AF, 0x112EB, 0x112EF, 0x112FA, 0x112FF, 0x11304, 0x11304, + 0x1130D, 0x1130E, 0x11311, 0x11312, 0x11329, 0x11329, 0x11331, 0x11331, + 0x11334, 0x11334, 0x1133A, 0x1133A, 0x11345, 0x11346, 0x11349, 0x1134A, + 0x1134E, 0x1134F, 0x11351, 0x11356, 0x11358, 0x1135C, 0x11364, 0x11365, + 0x1136D, 0x1136F, 0x11375, 0x113FF, 0x1145C, 0x1145C, 0x11462, 0x1147F, + 0x114C8, 0x114CF, 0x114DA, 0x1157F, 0x115B6, 0x115B7, 0x115DE, 0x115FF, + 0x11645, 0x1164F, 0x1165A, 0x1165F, 0x1166D, 0x1167F, 0x116BA, 0x116BF, + 0x116CA, 0x116FF, 0x1171B, 0x1171C, 0x1172C, 0x1172F, 0x11747, 0x117FF, + 0x1183C, 0x1189F, 0x118F3, 0x118FE, 0x11907, 0x11908, 0x1190A, 0x1190B, + 0x11914, 0x11914, 0x11917, 0x11917, 0x11936, 0x11936, 0x11939, 0x1193A, + 0x11947, 0x1194F, 0x1195A, 0x1199F, 0x119A8, 0x119A9, 0x119D8, 0x119D9, + 0x119E5, 0x119FF, 0x11A48, 0x11A4F, 0x11AA3, 0x11AAF, 0x11AF9, 0x11BFF, + 0x11C09, 0x11C09, 0x11C37, 0x11C37, 0x11C46, 0x11C4F, 0x11C6D, 0x11C6F, + 0x11C90, 0x11C91, 0x11CA8, 0x11CA8, 0x11CB7, 0x11CFF, 0x11D07, 0x11D07, + 0x11D0A, 0x11D0A, 0x11D37, 0x11D39, 0x11D3B, 0x11D3B, 0x11D3E, 0x11D3E, + 0x11D48, 0x11D4F, 0x11D5A, 0x11D5F, 0x11D66, 0x11D66, 0x11D69, 0x11D69, + 0x11D8F, 0x11D8F, 0x11D92, 0x11D92, 0x11D99, 0x11D9F, 0x11DAA, 0x11EDF, + 0x11EF9, 0x11FAF, 0x11FB1, 0x11FBF, 0x11FF2, 0x11FFE, 0x1239A, 0x123FF, + 0x1246F, 0x1246F, 0x12475, 0x1247F, 0x12544, 0x12F8F, 0x12FF3, 0x12FFF, + 0x1342F, 0x1342F, 0x13439, 0x143FF, 0x14647, 0x167FF, 0x16A39, 0x16A3F, + 0x16A5F, 0x16A5F, 0x16A6A, 0x16A6D, 0x16ABF, 0x16ABF, 0x16ACA, 0x16ACF, + 0x16AEE, 0x16AEF, 0x16AF6, 0x16AFF, 0x16B46, 0x16B4F, 0x16B5A, 0x16B5A, + 0x16B62, 0x16B62, 0x16B78, 0x16B7C, 0x16B90, 0x16E3F, 0x16E9B, 0x16EFF, + 0x16F4B, 0x16F4E, 0x16F88, 0x16F8E, 0x16FA0, 0x16FDF, 0x16FE5, 0x16FEF, + 0x16FF2, 0x16FFF, 0x187F8, 0x187FF, 0x18CD6, 0x18CFF, 0x18D09, 0x1AFEF, + 0x1AFF4, 0x1AFF4, 0x1AFFC, 0x1AFFC, 0x1AFFF, 0x1AFFF, 0x1B123, 0x1B14F, + 0x1B153, 0x1B163, 0x1B168, 0x1B16F, 0x1B2FC, 0x1BBFF, 0x1BC6B, 0x1BC6F, + 0x1BC7D, 0x1BC7F, 0x1BC89, 0x1BC8F, 0x1BC9A, 0x1BC9B, 0x1BCA4, 0x1CEFF, + 0x1CF2E, 0x1CF2F, 0x1CF47, 0x1CF4F, 0x1CFC4, 0x1CFFF, 0x1D0F6, 0x1D0FF, + 0x1D127, 0x1D128, 0x1D1EB, 0x1D1FF, 0x1D246, 0x1D2DF, 0x1D2F4, 0x1D2FF, + 0x1D357, 0x1D35F, 0x1D379, 0x1D3FF, 0x1D455, 0x1D455, 0x1D49D, 0x1D49D, + 0x1D4A0, 0x1D4A1, 0x1D4A3, 0x1D4A4, 0x1D4A7, 0x1D4A8, 0x1D4AD, 0x1D4AD, + 0x1D4BA, 0x1D4BA, 0x1D4BC, 0x1D4BC, 0x1D4C4, 0x1D4C4, 0x1D506, 0x1D506, + 0x1D50B, 0x1D50C, 0x1D515, 0x1D515, 0x1D51D, 0x1D51D, 0x1D53A, 0x1D53A, + 0x1D53F, 0x1D53F, 0x1D545, 0x1D545, 0x1D547, 0x1D549, 0x1D551, 0x1D551, + 0x1D6A6, 0x1D6A7, 0x1D7CC, 0x1D7CD, 0x1DA8C, 0x1DA9A, 0x1DAA0, 0x1DAA0, + 0x1DAB0, 0x1DEFF, 0x1DF1F, 0x1DFFF, 0x1E007, 0x1E007, 0x1E019, 0x1E01A, + 0x1E022, 0x1E022, 0x1E025, 0x1E025, 0x1E02B, 0x1E0FF, 0x1E12D, 0x1E12F, + 0x1E13E, 0x1E13F, 0x1E14A, 0x1E14D, 0x1E150, 0x1E28F, 0x1E2AF, 0x1E2BF, + 0x1E2FA, 0x1E2FE, 0x1E300, 0x1E7DF, 0x1E7E7, 0x1E7E7, 0x1E7EC, 0x1E7EC, + 0x1E7EF, 0x1E7EF, 0x1E7FF, 0x1E7FF, 0x1E8C5, 0x1E8C6, 0x1E8D7, 0x1E8FF, + 0x1E94C, 0x1E94F, 0x1E95A, 0x1E95D, 0x1E960, 0x1EC70, 0x1ECB5, 0x1ED00, + 0x1ED3E, 0x1EDFF, 0x1EE04, 0x1EE04, 0x1EE20, 0x1EE20, 0x1EE23, 0x1EE23, + 0x1EE25, 0x1EE26, 0x1EE28, 0x1EE28, 0x1EE33, 0x1EE33, 0x1EE38, 0x1EE38, + 0x1EE3A, 0x1EE3A, 0x1EE3C, 0x1EE41, 0x1EE43, 0x1EE46, 0x1EE48, 0x1EE48, + 0x1EE4A, 0x1EE4A, 0x1EE4C, 0x1EE4C, 0x1EE50, 0x1EE50, 0x1EE53, 0x1EE53, + 0x1EE55, 0x1EE56, 0x1EE58, 0x1EE58, 0x1EE5A, 0x1EE5A, 0x1EE5C, 0x1EE5C, + 0x1EE5E, 0x1EE5E, 0x1EE60, 0x1EE60, 0x1EE63, 0x1EE63, 0x1EE65, 0x1EE66, + 0x1EE6B, 0x1EE6B, 0x1EE73, 0x1EE73, 0x1EE78, 0x1EE78, 0x1EE7D, 0x1EE7D, + 0x1EE7F, 0x1EE7F, 0x1EE8A, 0x1EE8A, 0x1EE9C, 0x1EEA0, 0x1EEA4, 0x1EEA4, + 0x1EEAA, 0x1EEAA, 0x1EEBC, 0x1EEEF, 0x1EEF2, 0x1EFFF, 0x1F02C, 0x1F02F, + 0x1F094, 0x1F09F, 0x1F0AF, 0x1F0B0, 0x1F0C0, 0x1F0C0, 0x1F0D0, 0x1F0D0, + 0x1F0F6, 0x1F0FF, 0x1F1AE, 0x1F1E5, 0x1F203, 0x1F20F, 0x1F23C, 0x1F23F, + 0x1F249, 0x1F24F, 0x1F252, 0x1F25F, 0x1F266, 0x1F2FF, 0x1F6D8, 0x1F6DC, + 0x1F6ED, 0x1F6EF, 0x1F6FD, 0x1F6FF, 0x1F774, 0x1F77F, 0x1F7D9, 0x1F7DF, + 0x1F7EC, 0x1F7EF, 0x1F7F1, 0x1F7FF, 0x1F80C, 0x1F80F, 0x1F848, 0x1F84F, + 0x1F85A, 0x1F85F, 0x1F888, 0x1F88F, 0x1F8AE, 0x1F8AF, 0x1F8B2, 0x1F8FF, + 0x1FA54, 0x1FA5F, 0x1FA6E, 0x1FA6F, 0x1FA75, 0x1FA77, 0x1FA7D, 0x1FA7F, + 0x1FA87, 0x1FA8F, 0x1FAAD, 0x1FAAF, 0x1FABB, 0x1FABF, 0x1FAC6, 0x1FACF, + 0x1FADA, 0x1FADF, 0x1FAE8, 0x1FAEF, 0x1FAF7, 0x1FAFF, 0x1FB93, 0x1FB93, + 0x1FBCB, 0x1FBEF, 0x1FBFA, 0x1FFFF, 0x2A6E0, 0x2A6FF, 0x2B739, 0x2B73F, + 0x2B81E, 0x2B81F, 0x2CEA2, 0x2CEAF, 0x2EBE1, 0x2F7FF, 0x2FA1E, 0x2FFFF, + 0x3134B, 0xE0000, 0xE0002, 0xE001F, 0xE0080, 0xE00FF, 0xE01F0, 0xEFFFF, + 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF, + // #5 (721+3): gc=Private_Use:Co + 0xE000, 0xF8FF, 0xF0000, 0xFFFFD, 0x100000, 0x10FFFD, + // #6 (724+1): gc=Surrogate:Cs + 0xD800, 0xDFFF, + // #7 (725+1883): gc=Letter:L + // Ll:657 + Lt:10 + Lu:646 + Lm:69 + Lo:501 + // #8 (725+1313): gc=Cased_Letter:LC + // Ll:657 + Lt:10 + Lu:646 + // #9 (725+657): gc=Lowercase_Letter:Ll + 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00DF, 0x00F6, 0x00F8, 0x00FF, + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010B, 0x010B, 0x010D, 0x010D, 0x010F, 0x010F, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011B, 0x011B, 0x011D, 0x011D, 0x011F, 0x011F, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012B, 0x012B, 0x012D, 0x012D, 0x012F, 0x012F, + 0x0131, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0138, + 0x013A, 0x013A, 0x013C, 0x013C, 0x013E, 0x013E, 0x0140, 0x0140, + 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, 0x0149, + 0x014B, 0x014B, 0x014D, 0x014D, 0x014F, 0x014F, 0x0151, 0x0151, + 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, 0x0159, 0x0159, + 0x015B, 0x015B, 0x015D, 0x015D, 0x015F, 0x015F, 0x0161, 0x0161, + 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, 0x0169, 0x0169, + 0x016B, 0x016B, 0x016D, 0x016D, 0x016F, 0x016F, 0x0171, 0x0171, + 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, 0x017A, 0x017A, + 0x017C, 0x017C, 0x017E, 0x0180, 0x0183, 0x0183, 0x0185, 0x0185, + 0x0188, 0x0188, 0x018C, 0x018D, 0x0192, 0x0192, 0x0195, 0x0195, + 0x0199, 0x019B, 0x019E, 0x019E, 0x01A1, 0x01A1, 0x01A3, 0x01A3, + 0x01A5, 0x01A5, 0x01A8, 0x01A8, 0x01AA, 0x01AB, 0x01AD, 0x01AD, + 0x01B0, 0x01B0, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x01B9, 0x01BA, + 0x01BD, 0x01BF, 0x01C6, 0x01C6, 0x01C9, 0x01C9, 0x01CC, 0x01CC, + 0x01CE, 0x01CE, 0x01D0, 0x01D0, 0x01D2, 0x01D2, 0x01D4, 0x01D4, + 0x01D6, 0x01D6, 0x01D8, 0x01D8, 0x01DA, 0x01DA, 0x01DC, 0x01DD, + 0x01DF, 0x01DF, 0x01E1, 0x01E1, 0x01E3, 0x01E3, 0x01E5, 0x01E5, + 0x01E7, 0x01E7, 0x01E9, 0x01E9, 0x01EB, 0x01EB, 0x01ED, 0x01ED, + 0x01EF, 0x01F0, 0x01F3, 0x01F3, 0x01F5, 0x01F5, 0x01F9, 0x01F9, + 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF, 0x0201, 0x0201, + 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, 0x0209, 0x0209, + 0x020B, 0x020B, 0x020D, 0x020D, 0x020F, 0x020F, 0x0211, 0x0211, + 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, 0x0219, 0x0219, + 0x021B, 0x021B, 0x021D, 0x021D, 0x021F, 0x021F, 0x0221, 0x0221, + 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, + 0x022B, 0x022B, 0x022D, 0x022D, 0x022F, 0x022F, 0x0231, 0x0231, + 0x0233, 0x0239, 0x023C, 0x023C, 0x023F, 0x0240, 0x0242, 0x0242, + 0x0247, 0x0247, 0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, + 0x024F, 0x0293, 0x0295, 0x02AF, 0x0371, 0x0371, 0x0373, 0x0373, + 0x0377, 0x0377, 0x037B, 0x037D, 0x0390, 0x0390, 0x03AC, 0x03CE, + 0x03D0, 0x03D1, 0x03D5, 0x03D7, 0x03D9, 0x03D9, 0x03DB, 0x03DB, + 0x03DD, 0x03DD, 0x03DF, 0x03DF, 0x03E1, 0x03E1, 0x03E3, 0x03E3, + 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, + 0x03ED, 0x03ED, 0x03EF, 0x03F3, 0x03F5, 0x03F5, 0x03F8, 0x03F8, + 0x03FB, 0x03FC, 0x0430, 0x045F, 0x0461, 0x0461, 0x0463, 0x0463, + 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, + 0x046D, 0x046D, 0x046F, 0x046F, 0x0471, 0x0471, 0x0473, 0x0473, + 0x0475, 0x0475, 0x0477, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, + 0x047D, 0x047D, 0x047F, 0x047F, 0x0481, 0x0481, 0x048B, 0x048B, + 0x048D, 0x048D, 0x048F, 0x048F, 0x0491, 0x0491, 0x0493, 0x0493, + 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, + 0x049D, 0x049D, 0x049F, 0x049F, 0x04A1, 0x04A1, 0x04A3, 0x04A3, + 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, + 0x04AD, 0x04AD, 0x04AF, 0x04AF, 0x04B1, 0x04B1, 0x04B3, 0x04B3, + 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, + 0x04BD, 0x04BD, 0x04BF, 0x04BF, 0x04C2, 0x04C2, 0x04C4, 0x04C4, + 0x04C6, 0x04C6, 0x04C8, 0x04C8, 0x04CA, 0x04CA, 0x04CC, 0x04CC, + 0x04CE, 0x04CF, 0x04D1, 0x04D1, 0x04D3, 0x04D3, 0x04D5, 0x04D5, + 0x04D7, 0x04D7, 0x04D9, 0x04D9, 0x04DB, 0x04DB, 0x04DD, 0x04DD, + 0x04DF, 0x04DF, 0x04E1, 0x04E1, 0x04E3, 0x04E3, 0x04E5, 0x04E5, + 0x04E7, 0x04E7, 0x04E9, 0x04E9, 0x04EB, 0x04EB, 0x04ED, 0x04ED, + 0x04EF, 0x04EF, 0x04F1, 0x04F1, 0x04F3, 0x04F3, 0x04F5, 0x04F5, + 0x04F7, 0x04F7, 0x04F9, 0x04F9, 0x04FB, 0x04FB, 0x04FD, 0x04FD, + 0x04FF, 0x04FF, 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, + 0x0507, 0x0507, 0x0509, 0x0509, 0x050B, 0x050B, 0x050D, 0x050D, + 0x050F, 0x050F, 0x0511, 0x0511, 0x0513, 0x0513, 0x0515, 0x0515, + 0x0517, 0x0517, 0x0519, 0x0519, 0x051B, 0x051B, 0x051D, 0x051D, + 0x051F, 0x051F, 0x0521, 0x0521, 0x0523, 0x0523, 0x0525, 0x0525, + 0x0527, 0x0527, 0x0529, 0x0529, 0x052B, 0x052B, 0x052D, 0x052D, + 0x052F, 0x052F, 0x0560, 0x0588, 0x10D0, 0x10FA, 0x10FD, 0x10FF, + 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1D00, 0x1D2B, 0x1D6B, 0x1D77, + 0x1D79, 0x1D9A, 0x1E01, 0x1E01, 0x1E03, 0x1E03, 0x1E05, 0x1E05, + 0x1E07, 0x1E07, 0x1E09, 0x1E09, 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, + 0x1E0F, 0x1E0F, 0x1E11, 0x1E11, 0x1E13, 0x1E13, 0x1E15, 0x1E15, + 0x1E17, 0x1E17, 0x1E19, 0x1E19, 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, + 0x1E1F, 0x1E1F, 0x1E21, 0x1E21, 0x1E23, 0x1E23, 0x1E25, 0x1E25, + 0x1E27, 0x1E27, 0x1E29, 0x1E29, 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, + 0x1E2F, 0x1E2F, 0x1E31, 0x1E31, 0x1E33, 0x1E33, 0x1E35, 0x1E35, + 0x1E37, 0x1E37, 0x1E39, 0x1E39, 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, + 0x1E3F, 0x1E3F, 0x1E41, 0x1E41, 0x1E43, 0x1E43, 0x1E45, 0x1E45, + 0x1E47, 0x1E47, 0x1E49, 0x1E49, 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, + 0x1E4F, 0x1E4F, 0x1E51, 0x1E51, 0x1E53, 0x1E53, 0x1E55, 0x1E55, + 0x1E57, 0x1E57, 0x1E59, 0x1E59, 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, + 0x1E5F, 0x1E5F, 0x1E61, 0x1E61, 0x1E63, 0x1E63, 0x1E65, 0x1E65, + 0x1E67, 0x1E67, 0x1E69, 0x1E69, 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, + 0x1E6F, 0x1E6F, 0x1E71, 0x1E71, 0x1E73, 0x1E73, 0x1E75, 0x1E75, + 0x1E77, 0x1E77, 0x1E79, 0x1E79, 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, + 0x1E7F, 0x1E7F, 0x1E81, 0x1E81, 0x1E83, 0x1E83, 0x1E85, 0x1E85, + 0x1E87, 0x1E87, 0x1E89, 0x1E89, 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, + 0x1E8F, 0x1E8F, 0x1E91, 0x1E91, 0x1E93, 0x1E93, 0x1E95, 0x1E9D, + 0x1E9F, 0x1E9F, 0x1EA1, 0x1EA1, 0x1EA3, 0x1EA3, 0x1EA5, 0x1EA5, + 0x1EA7, 0x1EA7, 0x1EA9, 0x1EA9, 0x1EAB, 0x1EAB, 0x1EAD, 0x1EAD, + 0x1EAF, 0x1EAF, 0x1EB1, 0x1EB1, 0x1EB3, 0x1EB3, 0x1EB5, 0x1EB5, + 0x1EB7, 0x1EB7, 0x1EB9, 0x1EB9, 0x1EBB, 0x1EBB, 0x1EBD, 0x1EBD, + 0x1EBF, 0x1EBF, 0x1EC1, 0x1EC1, 0x1EC3, 0x1EC3, 0x1EC5, 0x1EC5, + 0x1EC7, 0x1EC7, 0x1EC9, 0x1EC9, 0x1ECB, 0x1ECB, 0x1ECD, 0x1ECD, + 0x1ECF, 0x1ECF, 0x1ED1, 0x1ED1, 0x1ED3, 0x1ED3, 0x1ED5, 0x1ED5, + 0x1ED7, 0x1ED7, 0x1ED9, 0x1ED9, 0x1EDB, 0x1EDB, 0x1EDD, 0x1EDD, + 0x1EDF, 0x1EDF, 0x1EE1, 0x1EE1, 0x1EE3, 0x1EE3, 0x1EE5, 0x1EE5, + 0x1EE7, 0x1EE7, 0x1EE9, 0x1EE9, 0x1EEB, 0x1EEB, 0x1EED, 0x1EED, + 0x1EEF, 0x1EEF, 0x1EF1, 0x1EF1, 0x1EF3, 0x1EF3, 0x1EF5, 0x1EF5, + 0x1EF7, 0x1EF7, 0x1EF9, 0x1EF9, 0x1EFB, 0x1EFB, 0x1EFD, 0x1EFD, + 0x1EFF, 0x1F07, 0x1F10, 0x1F15, 0x1F20, 0x1F27, 0x1F30, 0x1F37, + 0x1F40, 0x1F45, 0x1F50, 0x1F57, 0x1F60, 0x1F67, 0x1F70, 0x1F7D, + 0x1F80, 0x1F87, 0x1F90, 0x1F97, 0x1FA0, 0x1FA7, 0x1FB0, 0x1FB4, + 0x1FB6, 0x1FB7, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FC7, + 0x1FD0, 0x1FD3, 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FF7, 0x210A, 0x210A, 0x210E, 0x210F, 0x2113, 0x2113, + 0x212F, 0x212F, 0x2134, 0x2134, 0x2139, 0x2139, 0x213C, 0x213D, + 0x2146, 0x2149, 0x214E, 0x214E, 0x2184, 0x2184, 0x2C30, 0x2C5F, + 0x2C61, 0x2C61, 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, + 0x2C6C, 0x2C6C, 0x2C71, 0x2C71, 0x2C73, 0x2C74, 0x2C76, 0x2C7B, + 0x2C81, 0x2C81, 0x2C83, 0x2C83, 0x2C85, 0x2C85, 0x2C87, 0x2C87, + 0x2C89, 0x2C89, 0x2C8B, 0x2C8B, 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, + 0x2C91, 0x2C91, 0x2C93, 0x2C93, 0x2C95, 0x2C95, 0x2C97, 0x2C97, + 0x2C99, 0x2C99, 0x2C9B, 0x2C9B, 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, + 0x2CA1, 0x2CA1, 0x2CA3, 0x2CA3, 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, + 0x2CA9, 0x2CA9, 0x2CAB, 0x2CAB, 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, + 0x2CB1, 0x2CB1, 0x2CB3, 0x2CB3, 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, + 0x2CB9, 0x2CB9, 0x2CBB, 0x2CBB, 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, + 0x2CC1, 0x2CC1, 0x2CC3, 0x2CC3, 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, + 0x2CC9, 0x2CC9, 0x2CCB, 0x2CCB, 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, + 0x2CD1, 0x2CD1, 0x2CD3, 0x2CD3, 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, + 0x2CD9, 0x2CD9, 0x2CDB, 0x2CDB, 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, + 0x2CE1, 0x2CE1, 0x2CE3, 0x2CE4, 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, + 0x2CF3, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + 0xA641, 0xA641, 0xA643, 0xA643, 0xA645, 0xA645, 0xA647, 0xA647, + 0xA649, 0xA649, 0xA64B, 0xA64B, 0xA64D, 0xA64D, 0xA64F, 0xA64F, + 0xA651, 0xA651, 0xA653, 0xA653, 0xA655, 0xA655, 0xA657, 0xA657, + 0xA659, 0xA659, 0xA65B, 0xA65B, 0xA65D, 0xA65D, 0xA65F, 0xA65F, + 0xA661, 0xA661, 0xA663, 0xA663, 0xA665, 0xA665, 0xA667, 0xA667, + 0xA669, 0xA669, 0xA66B, 0xA66B, 0xA66D, 0xA66D, 0xA681, 0xA681, + 0xA683, 0xA683, 0xA685, 0xA685, 0xA687, 0xA687, 0xA689, 0xA689, + 0xA68B, 0xA68B, 0xA68D, 0xA68D, 0xA68F, 0xA68F, 0xA691, 0xA691, + 0xA693, 0xA693, 0xA695, 0xA695, 0xA697, 0xA697, 0xA699, 0xA699, + 0xA69B, 0xA69B, 0xA723, 0xA723, 0xA725, 0xA725, 0xA727, 0xA727, + 0xA729, 0xA729, 0xA72B, 0xA72B, 0xA72D, 0xA72D, 0xA72F, 0xA731, + 0xA733, 0xA733, 0xA735, 0xA735, 0xA737, 0xA737, 0xA739, 0xA739, + 0xA73B, 0xA73B, 0xA73D, 0xA73D, 0xA73F, 0xA73F, 0xA741, 0xA741, + 0xA743, 0xA743, 0xA745, 0xA745, 0xA747, 0xA747, 0xA749, 0xA749, + 0xA74B, 0xA74B, 0xA74D, 0xA74D, 0xA74F, 0xA74F, 0xA751, 0xA751, + 0xA753, 0xA753, 0xA755, 0xA755, 0xA757, 0xA757, 0xA759, 0xA759, + 0xA75B, 0xA75B, 0xA75D, 0xA75D, 0xA75F, 0xA75F, 0xA761, 0xA761, + 0xA763, 0xA763, 0xA765, 0xA765, 0xA767, 0xA767, 0xA769, 0xA769, + 0xA76B, 0xA76B, 0xA76D, 0xA76D, 0xA76F, 0xA76F, 0xA771, 0xA778, + 0xA77A, 0xA77A, 0xA77C, 0xA77C, 0xA77F, 0xA77F, 0xA781, 0xA781, + 0xA783, 0xA783, 0xA785, 0xA785, 0xA787, 0xA787, 0xA78C, 0xA78C, + 0xA78E, 0xA78E, 0xA791, 0xA791, 0xA793, 0xA795, 0xA797, 0xA797, + 0xA799, 0xA799, 0xA79B, 0xA79B, 0xA79D, 0xA79D, 0xA79F, 0xA79F, + 0xA7A1, 0xA7A1, 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, 0xA7A7, 0xA7A7, + 0xA7A9, 0xA7A9, 0xA7AF, 0xA7AF, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, + 0xA7B9, 0xA7B9, 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, + 0xA7C1, 0xA7C1, 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, + 0xA7D1, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D5, 0xA7D7, 0xA7D7, + 0xA7D9, 0xA7D9, 0xA7F6, 0xA7F6, 0xA7FA, 0xA7FA, 0xAB30, 0xAB5A, + 0xAB60, 0xAB68, 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, + 0xFF41, 0xFF5A, 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10CC0, 0x10CF2, + 0x118C0, 0x118DF, 0x16E60, 0x16E7F, 0x1D41A, 0x1D433, 0x1D44E, 0x1D454, + 0x1D456, 0x1D467, 0x1D482, 0x1D49B, 0x1D4B6, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D4CF, 0x1D4EA, 0x1D503, 0x1D51E, 0x1D537, + 0x1D552, 0x1D56B, 0x1D586, 0x1D59F, 0x1D5BA, 0x1D5D3, 0x1D5EE, 0x1D607, + 0x1D622, 0x1D63B, 0x1D656, 0x1D66F, 0x1D68A, 0x1D6A5, 0x1D6C2, 0x1D6DA, + 0x1D6DC, 0x1D6E1, 0x1D6FC, 0x1D714, 0x1D716, 0x1D71B, 0x1D736, 0x1D74E, + 0x1D750, 0x1D755, 0x1D770, 0x1D788, 0x1D78A, 0x1D78F, 0x1D7AA, 0x1D7C2, + 0x1D7C4, 0x1D7C9, 0x1D7CB, 0x1D7CB, 0x1DF00, 0x1DF09, 0x1DF0B, 0x1DF1E, + 0x1E922, 0x1E943, + // #10 (1382+10): gc=Titlecase_Letter:Lt + 0x01C5, 0x01C5, 0x01C8, 0x01C8, 0x01CB, 0x01CB, 0x01F2, 0x01F2, + 0x1F88, 0x1F8F, 0x1F98, 0x1F9F, 0x1FA8, 0x1FAF, 0x1FBC, 0x1FBC, + 0x1FCC, 0x1FCC, 0x1FFC, 0x1FFC, + // #11 (1392+646): gc=Uppercase_Letter:Lu + 0x0041, 0x005A, 0x00C0, 0x00D6, 0x00D8, 0x00DE, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, + 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, 0x0141, 0x0141, + 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, 0x014A, 0x014A, + 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, 0x0152, 0x0152, + 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, 0x015A, 0x015A, + 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, 0x0162, 0x0162, + 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, 0x016A, 0x016A, + 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, 0x0172, 0x0172, + 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, 0x017B, 0x017B, + 0x017D, 0x017D, 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, + 0x0189, 0x018B, 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, + 0x019C, 0x019D, 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, + 0x01A6, 0x01A7, 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, + 0x01B1, 0x01B3, 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, + 0x01C4, 0x01C4, 0x01C7, 0x01C7, 0x01CA, 0x01CA, 0x01CD, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F1, 0x01F4, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, + 0x01FC, 0x01FC, 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, + 0x0204, 0x0204, 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, + 0x020C, 0x020C, 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, + 0x0214, 0x0214, 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, + 0x021C, 0x021C, 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, + 0x0224, 0x0224, 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, + 0x022C, 0x022C, 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, + 0x023A, 0x023B, 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, + 0x0248, 0x0248, 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, + 0x0370, 0x0370, 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, + 0x0391, 0x03A1, 0x03A3, 0x03AB, 0x03CF, 0x03CF, 0x03D2, 0x03D4, + 0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, + 0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, + 0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, + 0x03F4, 0x03F4, 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, + 0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, + 0x0468, 0x0468, 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, + 0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, + 0x0478, 0x0478, 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, + 0x0480, 0x0480, 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, + 0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, + 0x0498, 0x0498, 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, + 0x04A0, 0x04A0, 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, + 0x04A8, 0x04A8, 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, + 0x04B0, 0x04B0, 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, + 0x04B8, 0x04B8, 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, + 0x04C0, 0x04C1, 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, + 0x04C9, 0x04C9, 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, + 0x04D2, 0x04D2, 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, + 0x04DA, 0x04DA, 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, + 0x04E2, 0x04E2, 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, + 0x04EA, 0x04EA, 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, + 0x04F2, 0x04F2, 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, + 0x04FA, 0x04FA, 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, + 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, + 0x050A, 0x050A, 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, + 0x0512, 0x0512, 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, + 0x051A, 0x051A, 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, + 0x0522, 0x0522, 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, + 0x052A, 0x052A, 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x13A0, 0x13F5, + 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, + 0x1E04, 0x1E04, 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, + 0x1E0C, 0x1E0C, 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, + 0x1E14, 0x1E14, 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, + 0x1E1C, 0x1E1C, 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, + 0x1E24, 0x1E24, 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, + 0x1E2C, 0x1E2C, 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, + 0x1E34, 0x1E34, 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, + 0x1E3C, 0x1E3C, 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, + 0x1E44, 0x1E44, 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, + 0x1E4C, 0x1E4C, 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, + 0x1E54, 0x1E54, 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, + 0x1E5C, 0x1E5C, 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, + 0x1E64, 0x1E64, 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, + 0x1E6C, 0x1E6C, 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, + 0x1E74, 0x1E74, 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, + 0x1E7C, 0x1E7C, 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, + 0x1E84, 0x1E84, 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, + 0x1E8C, 0x1E8C, 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, + 0x1E94, 0x1E94, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, + 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, + 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, + 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, + 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, + 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, + 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, + 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, + 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, + 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, + 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, + 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, + 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, + 0x1FB8, 0x1FBB, 0x1FC8, 0x1FCB, 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, + 0x1FF8, 0x1FFB, 0x2102, 0x2102, 0x2107, 0x2107, 0x210B, 0x210D, + 0x2110, 0x2112, 0x2115, 0x2115, 0x2119, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, 0x2130, 0x2133, + 0x213E, 0x213F, 0x2145, 0x2145, 0x2183, 0x2183, 0x2C00, 0x2C2F, + 0x2C60, 0x2C60, 0x2C62, 0x2C64, 0x2C67, 0x2C67, 0x2C69, 0x2C69, + 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, 0x2C72, 0x2C72, 0x2C75, 0x2C75, + 0x2C7E, 0x2C80, 0x2C82, 0x2C82, 0x2C84, 0x2C84, 0x2C86, 0x2C86, + 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, + 0x2C90, 0x2C90, 0x2C92, 0x2C92, 0x2C94, 0x2C94, 0x2C96, 0x2C96, + 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, + 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, + 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, + 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, + 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, + 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, + 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, + 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, + 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, + 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, + 0x2CF2, 0x2CF2, 0xA640, 0xA640, 0xA642, 0xA642, 0xA644, 0xA644, + 0xA646, 0xA646, 0xA648, 0xA648, 0xA64A, 0xA64A, 0xA64C, 0xA64C, + 0xA64E, 0xA64E, 0xA650, 0xA650, 0xA652, 0xA652, 0xA654, 0xA654, + 0xA656, 0xA656, 0xA658, 0xA658, 0xA65A, 0xA65A, 0xA65C, 0xA65C, + 0xA65E, 0xA65E, 0xA660, 0xA660, 0xA662, 0xA662, 0xA664, 0xA664, + 0xA666, 0xA666, 0xA668, 0xA668, 0xA66A, 0xA66A, 0xA66C, 0xA66C, + 0xA680, 0xA680, 0xA682, 0xA682, 0xA684, 0xA684, 0xA686, 0xA686, + 0xA688, 0xA688, 0xA68A, 0xA68A, 0xA68C, 0xA68C, 0xA68E, 0xA68E, + 0xA690, 0xA690, 0xA692, 0xA692, 0xA694, 0xA694, 0xA696, 0xA696, + 0xA698, 0xA698, 0xA69A, 0xA69A, 0xA722, 0xA722, 0xA724, 0xA724, + 0xA726, 0xA726, 0xA728, 0xA728, 0xA72A, 0xA72A, 0xA72C, 0xA72C, + 0xA72E, 0xA72E, 0xA732, 0xA732, 0xA734, 0xA734, 0xA736, 0xA736, + 0xA738, 0xA738, 0xA73A, 0xA73A, 0xA73C, 0xA73C, 0xA73E, 0xA73E, + 0xA740, 0xA740, 0xA742, 0xA742, 0xA744, 0xA744, 0xA746, 0xA746, + 0xA748, 0xA748, 0xA74A, 0xA74A, 0xA74C, 0xA74C, 0xA74E, 0xA74E, + 0xA750, 0xA750, 0xA752, 0xA752, 0xA754, 0xA754, 0xA756, 0xA756, + 0xA758, 0xA758, 0xA75A, 0xA75A, 0xA75C, 0xA75C, 0xA75E, 0xA75E, + 0xA760, 0xA760, 0xA762, 0xA762, 0xA764, 0xA764, 0xA766, 0xA766, + 0xA768, 0xA768, 0xA76A, 0xA76A, 0xA76C, 0xA76C, 0xA76E, 0xA76E, + 0xA779, 0xA779, 0xA77B, 0xA77B, 0xA77D, 0xA77E, 0xA780, 0xA780, + 0xA782, 0xA782, 0xA784, 0xA784, 0xA786, 0xA786, 0xA78B, 0xA78B, + 0xA78D, 0xA78D, 0xA790, 0xA790, 0xA792, 0xA792, 0xA796, 0xA796, + 0xA798, 0xA798, 0xA79A, 0xA79A, 0xA79C, 0xA79C, 0xA79E, 0xA79E, + 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, + 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, + 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, + 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, + 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, + 0xFF21, 0xFF3A, 0x10400, 0x10427, 0x104B0, 0x104D3, 0x10570, 0x1057A, + 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, 0x10C80, 0x10CB2, + 0x118A0, 0x118BF, 0x16E40, 0x16E5F, 0x1D400, 0x1D419, 0x1D434, 0x1D44D, + 0x1D468, 0x1D481, 0x1D49C, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B5, 0x1D4D0, 0x1D4E9, + 0x1D504, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D538, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D56C, 0x1D585, 0x1D5A0, 0x1D5B9, 0x1D5D4, 0x1D5ED, + 0x1D608, 0x1D621, 0x1D63C, 0x1D655, 0x1D670, 0x1D689, 0x1D6A8, 0x1D6C0, + 0x1D6E2, 0x1D6FA, 0x1D71C, 0x1D734, 0x1D756, 0x1D76E, 0x1D790, 0x1D7A8, + 0x1D7CA, 0x1D7CA, 0x1E900, 0x1E921, + // #12 (2038+69): gc=Modifier_Letter:Lm + 0x02B0, 0x02C1, 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, + 0x02EE, 0x02EE, 0x0374, 0x0374, 0x037A, 0x037A, 0x0559, 0x0559, + 0x0640, 0x0640, 0x06E5, 0x06E6, 0x07F4, 0x07F5, 0x07FA, 0x07FA, + 0x081A, 0x081A, 0x0824, 0x0824, 0x0828, 0x0828, 0x08C9, 0x08C9, + 0x0971, 0x0971, 0x0E46, 0x0E46, 0x0EC6, 0x0EC6, 0x10FC, 0x10FC, + 0x17D7, 0x17D7, 0x1843, 0x1843, 0x1AA7, 0x1AA7, 0x1C78, 0x1C7D, + 0x1D2C, 0x1D6A, 0x1D78, 0x1D78, 0x1D9B, 0x1DBF, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x2C7C, 0x2C7D, 0x2D6F, 0x2D6F, + 0x2E2F, 0x2E2F, 0x3005, 0x3005, 0x3031, 0x3035, 0x303B, 0x303B, + 0x309D, 0x309E, 0x30FC, 0x30FE, 0xA015, 0xA015, 0xA4F8, 0xA4FD, + 0xA60C, 0xA60C, 0xA67F, 0xA67F, 0xA69C, 0xA69D, 0xA717, 0xA71F, + 0xA770, 0xA770, 0xA788, 0xA788, 0xA7F2, 0xA7F4, 0xA7F8, 0xA7F9, + 0xA9CF, 0xA9CF, 0xA9E6, 0xA9E6, 0xAA70, 0xAA70, 0xAADD, 0xAADD, + 0xAAF3, 0xAAF4, 0xAB5C, 0xAB5F, 0xAB69, 0xAB69, 0xFF70, 0xFF70, + 0xFF9E, 0xFF9F, 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, + 0x16B40, 0x16B43, 0x16F93, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1E137, 0x1E13D, + 0x1E94B, 0x1E94B, + // #13 (2107+501): gc=Other_Letter:Lo + 0x00AA, 0x00AA, 0x00BA, 0x00BA, 0x01BB, 0x01BB, 0x01C0, 0x01C3, + 0x0294, 0x0294, 0x05D0, 0x05EA, 0x05EF, 0x05F2, 0x0620, 0x063F, + 0x0641, 0x064A, 0x066E, 0x066F, 0x0671, 0x06D3, 0x06D5, 0x06D5, + 0x06EE, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x0710, + 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, 0x07CA, 0x07EA, + 0x0800, 0x0815, 0x0840, 0x0858, 0x0860, 0x086A, 0x0870, 0x0887, + 0x0889, 0x088E, 0x08A0, 0x08C8, 0x0904, 0x0939, 0x093D, 0x093D, + 0x0950, 0x0950, 0x0958, 0x0961, 0x0972, 0x0980, 0x0985, 0x098C, + 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, + 0x09B6, 0x09B9, 0x09BD, 0x09BD, 0x09CE, 0x09CE, 0x09DC, 0x09DD, + 0x09DF, 0x09E1, 0x09F0, 0x09F1, 0x09FC, 0x09FC, 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, + 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, + 0x0A72, 0x0A74, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABD, 0x0ABD, + 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, 0x0AF9, 0x0AF9, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, + 0x0B71, 0x0B71, 0x0B83, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BD0, 0x0BD0, + 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C39, + 0x0C3D, 0x0C3D, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, + 0x0C80, 0x0C80, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, + 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBD, 0x0CBD, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE1, 0x0CF1, 0x0CF2, 0x0D04, 0x0D0C, 0x0D0E, 0x0D10, + 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, 0x0D4E, 0x0D4E, 0x0D54, 0x0D56, + 0x0D5F, 0x0D61, 0x0D7A, 0x0D7F, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0E01, 0x0E30, + 0x0E32, 0x0E33, 0x0E40, 0x0E45, 0x0E81, 0x0E82, 0x0E84, 0x0E84, + 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB0, + 0x0EB2, 0x0EB3, 0x0EBD, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EDC, 0x0EDF, + 0x0F00, 0x0F00, 0x0F40, 0x0F47, 0x0F49, 0x0F6C, 0x0F88, 0x0F8C, + 0x1000, 0x102A, 0x103F, 0x103F, 0x1050, 0x1055, 0x105A, 0x105D, + 0x1061, 0x1061, 0x1065, 0x1066, 0x106E, 0x1070, 0x1075, 0x1081, + 0x108E, 0x108E, 0x1100, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, + 0x1258, 0x1258, 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, + 0x1290, 0x12B0, 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, + 0x12C2, 0x12C5, 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, + 0x1318, 0x135A, 0x1380, 0x138F, 0x1401, 0x166C, 0x166F, 0x167F, + 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16F1, 0x16F8, 0x1700, 0x1711, + 0x171F, 0x1731, 0x1740, 0x1751, 0x1760, 0x176C, 0x176E, 0x1770, + 0x1780, 0x17B3, 0x17DC, 0x17DC, 0x1820, 0x1842, 0x1844, 0x1878, + 0x1880, 0x1884, 0x1887, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, + 0x19B0, 0x19C9, 0x1A00, 0x1A16, 0x1A20, 0x1A54, 0x1B05, 0x1B33, + 0x1B45, 0x1B4C, 0x1B83, 0x1BA0, 0x1BAE, 0x1BAF, 0x1BBA, 0x1BE5, + 0x1C00, 0x1C23, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C77, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x2135, 0x2138, + 0x2D30, 0x2D67, 0x2D80, 0x2D96, 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, + 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, + 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, 0x3006, 0x3006, 0x303C, 0x303C, + 0x3041, 0x3096, 0x309F, 0x309F, 0x30A1, 0x30FA, 0x30FF, 0x30FF, + 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, + 0x3400, 0x4DBF, 0x4E00, 0xA014, 0xA016, 0xA48C, 0xA4D0, 0xA4F7, + 0xA500, 0xA60B, 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA66E, 0xA66E, + 0xA6A0, 0xA6E5, 0xA78F, 0xA78F, 0xA7F7, 0xA7F7, 0xA7FB, 0xA801, + 0xA803, 0xA805, 0xA807, 0xA80A, 0xA80C, 0xA822, 0xA840, 0xA873, + 0xA882, 0xA8B3, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, 0xA930, 0xA946, 0xA960, 0xA97C, 0xA984, 0xA9B2, + 0xA9E0, 0xA9E4, 0xA9E7, 0xA9EF, 0xA9FA, 0xA9FE, 0xAA00, 0xAA28, + 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA60, 0xAA6F, 0xAA71, 0xAA76, + 0xAA7A, 0xAA7A, 0xAA7E, 0xAAAF, 0xAAB1, 0xAAB1, 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADC, + 0xAAE0, 0xAAEA, 0xAAF2, 0xAAF2, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xABC0, 0xABE2, + 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB1D, 0xFB1D, 0xFB1F, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0xFF66, 0xFF6F, + 0xFF71, 0xFF9D, 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0x10000, 0x1000B, 0x1000D, 0x10026, + 0x10028, 0x1003A, 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, + 0x10080, 0x100FA, 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x10300, 0x1031F, + 0x1032D, 0x10340, 0x10342, 0x10349, 0x10350, 0x10375, 0x10380, 0x1039D, + 0x103A0, 0x103C3, 0x103C8, 0x103CF, 0x10450, 0x1049D, 0x10500, 0x10527, + 0x10530, 0x10563, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, + 0x1083C, 0x1083C, 0x1083F, 0x10855, 0x10860, 0x10876, 0x10880, 0x1089E, + 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x10900, 0x10915, 0x10920, 0x10939, + 0x10980, 0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A00, 0x10A10, 0x10A13, + 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A60, 0x10A7C, 0x10A80, 0x10A9C, + 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, 0x10B00, 0x10B35, 0x10B40, 0x10B55, + 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, 0x10D00, 0x10D23, + 0x10E80, 0x10EA9, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, + 0x10F30, 0x10F45, 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, + 0x11003, 0x11037, 0x11071, 0x11072, 0x11075, 0x11075, 0x11083, 0x110AF, + 0x110D0, 0x110E8, 0x11103, 0x11126, 0x11144, 0x11144, 0x11147, 0x11147, + 0x11150, 0x11172, 0x11176, 0x11176, 0x11183, 0x111B2, 0x111C1, 0x111C4, + 0x111DA, 0x111DA, 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x1122B, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A8, 0x112B0, 0x112DE, 0x11305, 0x1130C, 0x1130F, 0x11310, + 0x11313, 0x11328, 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, + 0x1133D, 0x1133D, 0x11350, 0x11350, 0x1135D, 0x11361, 0x11400, 0x11434, + 0x11447, 0x1144A, 0x1145F, 0x11461, 0x11480, 0x114AF, 0x114C4, 0x114C5, + 0x114C7, 0x114C7, 0x11580, 0x115AE, 0x115D8, 0x115DB, 0x11600, 0x1162F, + 0x11644, 0x11644, 0x11680, 0x116AA, 0x116B8, 0x116B8, 0x11700, 0x1171A, + 0x11740, 0x11746, 0x11800, 0x1182B, 0x118FF, 0x11906, 0x11909, 0x11909, + 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x1192F, 0x1193F, 0x1193F, + 0x11941, 0x11941, 0x119A0, 0x119A7, 0x119AA, 0x119D0, 0x119E1, 0x119E1, + 0x119E3, 0x119E3, 0x11A00, 0x11A00, 0x11A0B, 0x11A32, 0x11A3A, 0x11A3A, + 0x11A50, 0x11A50, 0x11A5C, 0x11A89, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, + 0x11C00, 0x11C08, 0x11C0A, 0x11C2E, 0x11C40, 0x11C40, 0x11C72, 0x11C8F, + 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D30, 0x11D46, 0x11D46, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D89, 0x11D98, 0x11D98, + 0x11EE0, 0x11EF2, 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12480, 0x12543, + 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, + 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, 0x16AD0, 0x16AED, 0x16B00, 0x16B2F, + 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16F00, 0x16F4A, 0x16F50, 0x16F50, + 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1B000, 0x1B122, + 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, 0x1DF0A, 0x1DF0A, + 0x1E100, 0x1E12C, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, + 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, + 0x1E800, 0x1E8C4, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, + 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + // #14 (2608+518): gc=Mark:M:Combining_Mark + // Mc:177 + Me:5 + Mn:336 + // #15 (2608+177): gc=Spacing_Mark:Mc + 0x0903, 0x0903, 0x093B, 0x093B, 0x093E, 0x0940, 0x0949, 0x094C, + 0x094E, 0x094F, 0x0982, 0x0983, 0x09BE, 0x09C0, 0x09C7, 0x09C8, + 0x09CB, 0x09CC, 0x09D7, 0x09D7, 0x0A03, 0x0A03, 0x0A3E, 0x0A40, + 0x0A83, 0x0A83, 0x0ABE, 0x0AC0, 0x0AC9, 0x0AC9, 0x0ACB, 0x0ACC, + 0x0B02, 0x0B03, 0x0B3E, 0x0B3E, 0x0B40, 0x0B40, 0x0B47, 0x0B48, + 0x0B4B, 0x0B4C, 0x0B57, 0x0B57, 0x0BBE, 0x0BBF, 0x0BC1, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCC, 0x0BD7, 0x0BD7, 0x0C01, 0x0C03, + 0x0C41, 0x0C44, 0x0C82, 0x0C83, 0x0CBE, 0x0CBE, 0x0CC0, 0x0CC4, + 0x0CC7, 0x0CC8, 0x0CCA, 0x0CCB, 0x0CD5, 0x0CD6, 0x0D02, 0x0D03, + 0x0D3E, 0x0D40, 0x0D46, 0x0D48, 0x0D4A, 0x0D4C, 0x0D57, 0x0D57, + 0x0D82, 0x0D83, 0x0DCF, 0x0DD1, 0x0DD8, 0x0DDF, 0x0DF2, 0x0DF3, + 0x0F3E, 0x0F3F, 0x0F7F, 0x0F7F, 0x102B, 0x102C, 0x1031, 0x1031, + 0x1038, 0x1038, 0x103B, 0x103C, 0x1056, 0x1057, 0x1062, 0x1064, + 0x1067, 0x106D, 0x1083, 0x1084, 0x1087, 0x108C, 0x108F, 0x108F, + 0x109A, 0x109C, 0x1715, 0x1715, 0x1734, 0x1734, 0x17B6, 0x17B6, + 0x17BE, 0x17C5, 0x17C7, 0x17C8, 0x1923, 0x1926, 0x1929, 0x192B, + 0x1930, 0x1931, 0x1933, 0x1938, 0x1A19, 0x1A1A, 0x1A55, 0x1A55, + 0x1A57, 0x1A57, 0x1A61, 0x1A61, 0x1A63, 0x1A64, 0x1A6D, 0x1A72, + 0x1B04, 0x1B04, 0x1B35, 0x1B35, 0x1B3B, 0x1B3B, 0x1B3D, 0x1B41, + 0x1B43, 0x1B44, 0x1B82, 0x1B82, 0x1BA1, 0x1BA1, 0x1BA6, 0x1BA7, + 0x1BAA, 0x1BAA, 0x1BE7, 0x1BE7, 0x1BEA, 0x1BEC, 0x1BEE, 0x1BEE, + 0x1BF2, 0x1BF3, 0x1C24, 0x1C2B, 0x1C34, 0x1C35, 0x1CE1, 0x1CE1, + 0x1CF7, 0x1CF7, 0x302E, 0x302F, 0xA823, 0xA824, 0xA827, 0xA827, + 0xA880, 0xA881, 0xA8B4, 0xA8C3, 0xA952, 0xA953, 0xA983, 0xA983, + 0xA9B4, 0xA9B5, 0xA9BA, 0xA9BB, 0xA9BE, 0xA9C0, 0xAA2F, 0xAA30, + 0xAA33, 0xAA34, 0xAA4D, 0xAA4D, 0xAA7B, 0xAA7B, 0xAA7D, 0xAA7D, + 0xAAEB, 0xAAEB, 0xAAEE, 0xAAEF, 0xAAF5, 0xAAF5, 0xABE3, 0xABE4, + 0xABE6, 0xABE7, 0xABE9, 0xABEA, 0xABEC, 0xABEC, 0x11000, 0x11000, + 0x11002, 0x11002, 0x11082, 0x11082, 0x110B0, 0x110B2, 0x110B7, 0x110B8, + 0x1112C, 0x1112C, 0x11145, 0x11146, 0x11182, 0x11182, 0x111B3, 0x111B5, + 0x111BF, 0x111C0, 0x111CE, 0x111CE, 0x1122C, 0x1122E, 0x11232, 0x11233, + 0x11235, 0x11235, 0x112E0, 0x112E2, 0x11302, 0x11303, 0x1133E, 0x1133F, + 0x11341, 0x11344, 0x11347, 0x11348, 0x1134B, 0x1134D, 0x11357, 0x11357, + 0x11362, 0x11363, 0x11435, 0x11437, 0x11440, 0x11441, 0x11445, 0x11445, + 0x114B0, 0x114B2, 0x114B9, 0x114B9, 0x114BB, 0x114BE, 0x114C1, 0x114C1, + 0x115AF, 0x115B1, 0x115B8, 0x115BB, 0x115BE, 0x115BE, 0x11630, 0x11632, + 0x1163B, 0x1163C, 0x1163E, 0x1163E, 0x116AC, 0x116AC, 0x116AE, 0x116AF, + 0x116B6, 0x116B6, 0x11720, 0x11721, 0x11726, 0x11726, 0x1182C, 0x1182E, + 0x11838, 0x11838, 0x11930, 0x11935, 0x11937, 0x11938, 0x1193D, 0x1193D, + 0x11940, 0x11940, 0x11942, 0x11942, 0x119D1, 0x119D3, 0x119DC, 0x119DF, + 0x119E4, 0x119E4, 0x11A39, 0x11A39, 0x11A57, 0x11A58, 0x11A97, 0x11A97, + 0x11C2F, 0x11C2F, 0x11C3E, 0x11C3E, 0x11CA9, 0x11CA9, 0x11CB1, 0x11CB1, + 0x11CB4, 0x11CB4, 0x11D8A, 0x11D8E, 0x11D93, 0x11D94, 0x11D96, 0x11D96, + 0x11EF5, 0x11EF6, 0x16F51, 0x16F87, 0x16FF0, 0x16FF1, 0x1D165, 0x1D166, + 0x1D16D, 0x1D172, + // #16 (2785+5): gc=Enclosing_Mark:Me + 0x0488, 0x0489, 0x1ABE, 0x1ABE, 0x20DD, 0x20E0, 0x20E2, 0x20E4, + 0xA670, 0xA672, + // #17 (2790+336): gc=Nonspacing_Mark:Mn + 0x0300, 0x036F, 0x0483, 0x0487, 0x0591, 0x05BD, 0x05BF, 0x05BF, + 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x0610, 0x061A, + 0x064B, 0x065F, 0x0670, 0x0670, 0x06D6, 0x06DC, 0x06DF, 0x06E4, + 0x06E7, 0x06E8, 0x06EA, 0x06ED, 0x0711, 0x0711, 0x0730, 0x074A, + 0x07A6, 0x07B0, 0x07EB, 0x07F3, 0x07FD, 0x07FD, 0x0816, 0x0819, + 0x081B, 0x0823, 0x0825, 0x0827, 0x0829, 0x082D, 0x0859, 0x085B, + 0x0898, 0x089F, 0x08CA, 0x08E1, 0x08E3, 0x0902, 0x093A, 0x093A, + 0x093C, 0x093C, 0x0941, 0x0948, 0x094D, 0x094D, 0x0951, 0x0957, + 0x0962, 0x0963, 0x0981, 0x0981, 0x09BC, 0x09BC, 0x09C1, 0x09C4, + 0x09CD, 0x09CD, 0x09E2, 0x09E3, 0x09FE, 0x09FE, 0x0A01, 0x0A02, + 0x0A3C, 0x0A3C, 0x0A41, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A70, 0x0A71, 0x0A75, 0x0A75, 0x0A81, 0x0A82, + 0x0ABC, 0x0ABC, 0x0AC1, 0x0AC5, 0x0AC7, 0x0AC8, 0x0ACD, 0x0ACD, + 0x0AE2, 0x0AE3, 0x0AFA, 0x0AFF, 0x0B01, 0x0B01, 0x0B3C, 0x0B3C, + 0x0B3F, 0x0B3F, 0x0B41, 0x0B44, 0x0B4D, 0x0B4D, 0x0B55, 0x0B56, + 0x0B62, 0x0B63, 0x0B82, 0x0B82, 0x0BC0, 0x0BC0, 0x0BCD, 0x0BCD, + 0x0C00, 0x0C00, 0x0C04, 0x0C04, 0x0C3C, 0x0C3C, 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, + 0x0C81, 0x0C81, 0x0CBC, 0x0CBC, 0x0CBF, 0x0CBF, 0x0CC6, 0x0CC6, + 0x0CCC, 0x0CCD, 0x0CE2, 0x0CE3, 0x0D00, 0x0D01, 0x0D3B, 0x0D3C, + 0x0D41, 0x0D44, 0x0D4D, 0x0D4D, 0x0D62, 0x0D63, 0x0D81, 0x0D81, + 0x0DCA, 0x0DCA, 0x0DD2, 0x0DD4, 0x0DD6, 0x0DD6, 0x0E31, 0x0E31, + 0x0E34, 0x0E3A, 0x0E47, 0x0E4E, 0x0EB1, 0x0EB1, 0x0EB4, 0x0EBC, + 0x0EC8, 0x0ECD, 0x0F18, 0x0F19, 0x0F35, 0x0F35, 0x0F37, 0x0F37, + 0x0F39, 0x0F39, 0x0F71, 0x0F7E, 0x0F80, 0x0F84, 0x0F86, 0x0F87, + 0x0F8D, 0x0F97, 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, 0x102D, 0x1030, + 0x1032, 0x1037, 0x1039, 0x103A, 0x103D, 0x103E, 0x1058, 0x1059, + 0x105E, 0x1060, 0x1071, 0x1074, 0x1082, 0x1082, 0x1085, 0x1086, + 0x108D, 0x108D, 0x109D, 0x109D, 0x135D, 0x135F, 0x1712, 0x1714, + 0x1732, 0x1733, 0x1752, 0x1753, 0x1772, 0x1773, 0x17B4, 0x17B5, + 0x17B7, 0x17BD, 0x17C6, 0x17C6, 0x17C9, 0x17D3, 0x17DD, 0x17DD, + 0x180B, 0x180D, 0x180F, 0x180F, 0x1885, 0x1886, 0x18A9, 0x18A9, + 0x1920, 0x1922, 0x1927, 0x1928, 0x1932, 0x1932, 0x1939, 0x193B, + 0x1A17, 0x1A18, 0x1A1B, 0x1A1B, 0x1A56, 0x1A56, 0x1A58, 0x1A5E, + 0x1A60, 0x1A60, 0x1A62, 0x1A62, 0x1A65, 0x1A6C, 0x1A73, 0x1A7C, + 0x1A7F, 0x1A7F, 0x1AB0, 0x1ABD, 0x1ABF, 0x1ACE, 0x1B00, 0x1B03, + 0x1B34, 0x1B34, 0x1B36, 0x1B3A, 0x1B3C, 0x1B3C, 0x1B42, 0x1B42, + 0x1B6B, 0x1B73, 0x1B80, 0x1B81, 0x1BA2, 0x1BA5, 0x1BA8, 0x1BA9, + 0x1BAB, 0x1BAD, 0x1BE6, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BED, + 0x1BEF, 0x1BF1, 0x1C2C, 0x1C33, 0x1C36, 0x1C37, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, + 0x1CF8, 0x1CF9, 0x1DC0, 0x1DFF, 0x20D0, 0x20DC, 0x20E1, 0x20E1, + 0x20E5, 0x20F0, 0x2CEF, 0x2CF1, 0x2D7F, 0x2D7F, 0x2DE0, 0x2DFF, + 0x302A, 0x302D, 0x3099, 0x309A, 0xA66F, 0xA66F, 0xA674, 0xA67D, + 0xA69E, 0xA69F, 0xA6F0, 0xA6F1, 0xA802, 0xA802, 0xA806, 0xA806, + 0xA80B, 0xA80B, 0xA825, 0xA826, 0xA82C, 0xA82C, 0xA8C4, 0xA8C5, + 0xA8E0, 0xA8F1, 0xA8FF, 0xA8FF, 0xA926, 0xA92D, 0xA947, 0xA951, + 0xA980, 0xA982, 0xA9B3, 0xA9B3, 0xA9B6, 0xA9B9, 0xA9BC, 0xA9BD, + 0xA9E5, 0xA9E5, 0xAA29, 0xAA2E, 0xAA31, 0xAA32, 0xAA35, 0xAA36, + 0xAA43, 0xAA43, 0xAA4C, 0xAA4C, 0xAA7C, 0xAA7C, 0xAAB0, 0xAAB0, + 0xAAB2, 0xAAB4, 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xAAC1, + 0xAAEC, 0xAAED, 0xAAF6, 0xAAF6, 0xABE5, 0xABE5, 0xABE8, 0xABE8, + 0xABED, 0xABED, 0xFB1E, 0xFB1E, 0xFE00, 0xFE0F, 0xFE20, 0xFE2F, + 0x101FD, 0x101FD, 0x102E0, 0x102E0, 0x10376, 0x1037A, 0x10A01, 0x10A03, + 0x10A05, 0x10A06, 0x10A0C, 0x10A0F, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, + 0x10AE5, 0x10AE6, 0x10D24, 0x10D27, 0x10EAB, 0x10EAC, 0x10F46, 0x10F50, + 0x10F82, 0x10F85, 0x11001, 0x11001, 0x11038, 0x11046, 0x11070, 0x11070, + 0x11073, 0x11074, 0x1107F, 0x11081, 0x110B3, 0x110B6, 0x110B9, 0x110BA, + 0x110C2, 0x110C2, 0x11100, 0x11102, 0x11127, 0x1112B, 0x1112D, 0x11134, + 0x11173, 0x11173, 0x11180, 0x11181, 0x111B6, 0x111BE, 0x111C9, 0x111CC, + 0x111CF, 0x111CF, 0x1122F, 0x11231, 0x11234, 0x11234, 0x11236, 0x11237, + 0x1123E, 0x1123E, 0x112DF, 0x112DF, 0x112E3, 0x112EA, 0x11300, 0x11301, + 0x1133B, 0x1133C, 0x11340, 0x11340, 0x11366, 0x1136C, 0x11370, 0x11374, + 0x11438, 0x1143F, 0x11442, 0x11444, 0x11446, 0x11446, 0x1145E, 0x1145E, + 0x114B3, 0x114B8, 0x114BA, 0x114BA, 0x114BF, 0x114C0, 0x114C2, 0x114C3, + 0x115B2, 0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, 0x115DC, 0x115DD, + 0x11633, 0x1163A, 0x1163D, 0x1163D, 0x1163F, 0x11640, 0x116AB, 0x116AB, + 0x116AD, 0x116AD, 0x116B0, 0x116B5, 0x116B7, 0x116B7, 0x1171D, 0x1171F, + 0x11722, 0x11725, 0x11727, 0x1172B, 0x1182F, 0x11837, 0x11839, 0x1183A, + 0x1193B, 0x1193C, 0x1193E, 0x1193E, 0x11943, 0x11943, 0x119D4, 0x119D7, + 0x119DA, 0x119DB, 0x119E0, 0x119E0, 0x11A01, 0x11A0A, 0x11A33, 0x11A38, + 0x11A3B, 0x11A3E, 0x11A47, 0x11A47, 0x11A51, 0x11A56, 0x11A59, 0x11A5B, + 0x11A8A, 0x11A96, 0x11A98, 0x11A99, 0x11C30, 0x11C36, 0x11C38, 0x11C3D, + 0x11C3F, 0x11C3F, 0x11C92, 0x11CA7, 0x11CAA, 0x11CB0, 0x11CB2, 0x11CB3, + 0x11CB5, 0x11CB6, 0x11D31, 0x11D36, 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, + 0x11D3F, 0x11D45, 0x11D47, 0x11D47, 0x11D90, 0x11D91, 0x11D95, 0x11D95, + 0x11D97, 0x11D97, 0x11EF3, 0x11EF4, 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, + 0x16F4F, 0x16F4F, 0x16F8F, 0x16F92, 0x16FE4, 0x16FE4, 0x1BC9D, 0x1BC9E, + 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E130, 0x1E136, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E94A, 0xE0100, 0xE01EF, + // #18 (3126+145): gc=Number:N + // Nd:62 + Nl:12 + No:71 + // #19 (3126+62): gc=Decimal_Number:Nd:digit + 0x0030, 0x0039, 0x0660, 0x0669, 0x06F0, 0x06F9, 0x07C0, 0x07C9, + 0x0966, 0x096F, 0x09E6, 0x09EF, 0x0A66, 0x0A6F, 0x0AE6, 0x0AEF, + 0x0B66, 0x0B6F, 0x0BE6, 0x0BEF, 0x0C66, 0x0C6F, 0x0CE6, 0x0CEF, + 0x0D66, 0x0D6F, 0x0DE6, 0x0DEF, 0x0E50, 0x0E59, 0x0ED0, 0x0ED9, + 0x0F20, 0x0F29, 0x1040, 0x1049, 0x1090, 0x1099, 0x17E0, 0x17E9, + 0x1810, 0x1819, 0x1946, 0x194F, 0x19D0, 0x19D9, 0x1A80, 0x1A89, + 0x1A90, 0x1A99, 0x1B50, 0x1B59, 0x1BB0, 0x1BB9, 0x1C40, 0x1C49, + 0x1C50, 0x1C59, 0xA620, 0xA629, 0xA8D0, 0xA8D9, 0xA900, 0xA909, + 0xA9D0, 0xA9D9, 0xA9F0, 0xA9F9, 0xAA50, 0xAA59, 0xABF0, 0xABF9, + 0xFF10, 0xFF19, 0x104A0, 0x104A9, 0x10D30, 0x10D39, 0x11066, 0x1106F, + 0x110F0, 0x110F9, 0x11136, 0x1113F, 0x111D0, 0x111D9, 0x112F0, 0x112F9, + 0x11450, 0x11459, 0x114D0, 0x114D9, 0x11650, 0x11659, 0x116C0, 0x116C9, + 0x11730, 0x11739, 0x118E0, 0x118E9, 0x11950, 0x11959, 0x11C50, 0x11C59, + 0x11D50, 0x11D59, 0x11DA0, 0x11DA9, 0x16A60, 0x16A69, 0x16AC0, 0x16AC9, + 0x16B50, 0x16B59, 0x1D7CE, 0x1D7FF, 0x1E140, 0x1E149, 0x1E2F0, 0x1E2F9, + 0x1E950, 0x1E959, 0x1FBF0, 0x1FBF9, + // #20 (3188+12): gc=Letter_Number:Nl + 0x16EE, 0x16F0, 0x2160, 0x2182, 0x2185, 0x2188, 0x3007, 0x3007, + 0x3021, 0x3029, 0x3038, 0x303A, 0xA6E6, 0xA6EF, 0x10140, 0x10174, + 0x10341, 0x10341, 0x1034A, 0x1034A, 0x103D1, 0x103D5, 0x12400, 0x1246E, + // #21 (3200+71): gc=Other_Number:No + 0x00B2, 0x00B3, 0x00B9, 0x00B9, 0x00BC, 0x00BE, 0x09F4, 0x09F9, + 0x0B72, 0x0B77, 0x0BF0, 0x0BF2, 0x0C78, 0x0C7E, 0x0D58, 0x0D5E, + 0x0D70, 0x0D78, 0x0F2A, 0x0F33, 0x1369, 0x137C, 0x17F0, 0x17F9, + 0x19DA, 0x19DA, 0x2070, 0x2070, 0x2074, 0x2079, 0x2080, 0x2089, + 0x2150, 0x215F, 0x2189, 0x2189, 0x2460, 0x249B, 0x24EA, 0x24FF, + 0x2776, 0x2793, 0x2CFD, 0x2CFD, 0x3192, 0x3195, 0x3220, 0x3229, + 0x3248, 0x324F, 0x3251, 0x325F, 0x3280, 0x3289, 0x32B1, 0x32BF, + 0xA830, 0xA835, 0x10107, 0x10133, 0x10175, 0x10178, 0x1018A, 0x1018B, + 0x102E1, 0x102FB, 0x10320, 0x10323, 0x10858, 0x1085F, 0x10879, 0x1087F, + 0x108A7, 0x108AF, 0x108FB, 0x108FF, 0x10916, 0x1091B, 0x109BC, 0x109BD, + 0x109C0, 0x109CF, 0x109D2, 0x109FF, 0x10A40, 0x10A48, 0x10A7D, 0x10A7E, + 0x10A9D, 0x10A9F, 0x10AEB, 0x10AEF, 0x10B58, 0x10B5F, 0x10B78, 0x10B7F, + 0x10BA9, 0x10BAF, 0x10CFA, 0x10CFF, 0x10E60, 0x10E7E, 0x10F1D, 0x10F26, + 0x10F51, 0x10F54, 0x10FC5, 0x10FCB, 0x11052, 0x11065, 0x111E1, 0x111F4, + 0x1173A, 0x1173B, 0x118EA, 0x118F2, 0x11C5A, 0x11C6C, 0x11FC0, 0x11FD4, + 0x16B5B, 0x16B61, 0x16E80, 0x16E96, 0x1D2E0, 0x1D2F3, 0x1D360, 0x1D378, + 0x1E8C7, 0x1E8CF, 0x1EC71, 0x1ECAB, 0x1ECAD, 0x1ECAF, 0x1ECB1, 0x1ECB4, + 0x1ED01, 0x1ED2D, 0x1ED2F, 0x1ED3D, 0x1F100, 0x1F10C, + // #22 (3271+386): gc=Punctuation:P:punct + // Pc:6 + Pd:19 + Pe:76 + Pf:10 + Pi:11 + Po:185 + Ps:79 + // #23 (3271+6): gc=Connector_Punctuation:Pc + 0x005F, 0x005F, 0x203F, 0x2040, 0x2054, 0x2054, 0xFE33, 0xFE34, + 0xFE4D, 0xFE4F, 0xFF3F, 0xFF3F, + // #24 (3277+19): gc=Dash_Punctuation:Pd + 0x002D, 0x002D, 0x058A, 0x058A, 0x05BE, 0x05BE, 0x1400, 0x1400, + 0x1806, 0x1806, 0x2010, 0x2015, 0x2E17, 0x2E17, 0x2E1A, 0x2E1A, + 0x2E3A, 0x2E3B, 0x2E40, 0x2E40, 0x2E5D, 0x2E5D, 0x301C, 0x301C, + 0x3030, 0x3030, 0x30A0, 0x30A0, 0xFE31, 0xFE32, 0xFE58, 0xFE58, + 0xFE63, 0xFE63, 0xFF0D, 0xFF0D, 0x10EAD, 0x10EAD, + // #25 (3296+76): gc=Close_Punctuation:Pe + 0x0029, 0x0029, 0x005D, 0x005D, 0x007D, 0x007D, 0x0F3B, 0x0F3B, + 0x0F3D, 0x0F3D, 0x169C, 0x169C, 0x2046, 0x2046, 0x207E, 0x207E, + 0x208E, 0x208E, 0x2309, 0x2309, 0x230B, 0x230B, 0x232A, 0x232A, + 0x2769, 0x2769, 0x276B, 0x276B, 0x276D, 0x276D, 0x276F, 0x276F, + 0x2771, 0x2771, 0x2773, 0x2773, 0x2775, 0x2775, 0x27C6, 0x27C6, + 0x27E7, 0x27E7, 0x27E9, 0x27E9, 0x27EB, 0x27EB, 0x27ED, 0x27ED, + 0x27EF, 0x27EF, 0x2984, 0x2984, 0x2986, 0x2986, 0x2988, 0x2988, + 0x298A, 0x298A, 0x298C, 0x298C, 0x298E, 0x298E, 0x2990, 0x2990, + 0x2992, 0x2992, 0x2994, 0x2994, 0x2996, 0x2996, 0x2998, 0x2998, + 0x29D9, 0x29D9, 0x29DB, 0x29DB, 0x29FD, 0x29FD, 0x2E23, 0x2E23, + 0x2E25, 0x2E25, 0x2E27, 0x2E27, 0x2E29, 0x2E29, 0x2E56, 0x2E56, + 0x2E58, 0x2E58, 0x2E5A, 0x2E5A, 0x2E5C, 0x2E5C, 0x3009, 0x3009, + 0x300B, 0x300B, 0x300D, 0x300D, 0x300F, 0x300F, 0x3011, 0x3011, + 0x3015, 0x3015, 0x3017, 0x3017, 0x3019, 0x3019, 0x301B, 0x301B, + 0x301E, 0x301F, 0xFD3E, 0xFD3E, 0xFE18, 0xFE18, 0xFE36, 0xFE36, + 0xFE38, 0xFE38, 0xFE3A, 0xFE3A, 0xFE3C, 0xFE3C, 0xFE3E, 0xFE3E, + 0xFE40, 0xFE40, 0xFE42, 0xFE42, 0xFE44, 0xFE44, 0xFE48, 0xFE48, + 0xFE5A, 0xFE5A, 0xFE5C, 0xFE5C, 0xFE5E, 0xFE5E, 0xFF09, 0xFF09, + 0xFF3D, 0xFF3D, 0xFF5D, 0xFF5D, 0xFF60, 0xFF60, 0xFF63, 0xFF63, + // #26 (3372+10): gc=Final_Punctuation:Pf + 0x00BB, 0x00BB, 0x2019, 0x2019, 0x201D, 0x201D, 0x203A, 0x203A, + 0x2E03, 0x2E03, 0x2E05, 0x2E05, 0x2E0A, 0x2E0A, 0x2E0D, 0x2E0D, + 0x2E1D, 0x2E1D, 0x2E21, 0x2E21, + // #27 (3382+11): gc=Initial_Punctuation:Pi + 0x00AB, 0x00AB, 0x2018, 0x2018, 0x201B, 0x201C, 0x201F, 0x201F, + 0x2039, 0x2039, 0x2E02, 0x2E02, 0x2E04, 0x2E04, 0x2E09, 0x2E09, + 0x2E0C, 0x2E0C, 0x2E1C, 0x2E1C, 0x2E20, 0x2E20, + // #28 (3393+185): gc=Other_Punctuation:Po + 0x0021, 0x0023, 0x0025, 0x0027, 0x002A, 0x002A, 0x002C, 0x002C, + 0x002E, 0x002F, 0x003A, 0x003B, 0x003F, 0x0040, 0x005C, 0x005C, + 0x00A1, 0x00A1, 0x00A7, 0x00A7, 0x00B6, 0x00B7, 0x00BF, 0x00BF, + 0x037E, 0x037E, 0x0387, 0x0387, 0x055A, 0x055F, 0x0589, 0x0589, + 0x05C0, 0x05C0, 0x05C3, 0x05C3, 0x05C6, 0x05C6, 0x05F3, 0x05F4, + 0x0609, 0x060A, 0x060C, 0x060D, 0x061B, 0x061B, 0x061D, 0x061F, + 0x066A, 0x066D, 0x06D4, 0x06D4, 0x0700, 0x070D, 0x07F7, 0x07F9, + 0x0830, 0x083E, 0x085E, 0x085E, 0x0964, 0x0965, 0x0970, 0x0970, + 0x09FD, 0x09FD, 0x0A76, 0x0A76, 0x0AF0, 0x0AF0, 0x0C77, 0x0C77, + 0x0C84, 0x0C84, 0x0DF4, 0x0DF4, 0x0E4F, 0x0E4F, 0x0E5A, 0x0E5B, + 0x0F04, 0x0F12, 0x0F14, 0x0F14, 0x0F85, 0x0F85, 0x0FD0, 0x0FD4, + 0x0FD9, 0x0FDA, 0x104A, 0x104F, 0x10FB, 0x10FB, 0x1360, 0x1368, + 0x166E, 0x166E, 0x16EB, 0x16ED, 0x1735, 0x1736, 0x17D4, 0x17D6, + 0x17D8, 0x17DA, 0x1800, 0x1805, 0x1807, 0x180A, 0x1944, 0x1945, + 0x1A1E, 0x1A1F, 0x1AA0, 0x1AA6, 0x1AA8, 0x1AAD, 0x1B5A, 0x1B60, + 0x1B7D, 0x1B7E, 0x1BFC, 0x1BFF, 0x1C3B, 0x1C3F, 0x1C7E, 0x1C7F, + 0x1CC0, 0x1CC7, 0x1CD3, 0x1CD3, 0x2016, 0x2017, 0x2020, 0x2027, + 0x2030, 0x2038, 0x203B, 0x203E, 0x2041, 0x2043, 0x2047, 0x2051, + 0x2053, 0x2053, 0x2055, 0x205E, 0x2CF9, 0x2CFC, 0x2CFE, 0x2CFF, + 0x2D70, 0x2D70, 0x2E00, 0x2E01, 0x2E06, 0x2E08, 0x2E0B, 0x2E0B, + 0x2E0E, 0x2E16, 0x2E18, 0x2E19, 0x2E1B, 0x2E1B, 0x2E1E, 0x2E1F, + 0x2E2A, 0x2E2E, 0x2E30, 0x2E39, 0x2E3C, 0x2E3F, 0x2E41, 0x2E41, + 0x2E43, 0x2E4F, 0x2E52, 0x2E54, 0x3001, 0x3003, 0x303D, 0x303D, + 0x30FB, 0x30FB, 0xA4FE, 0xA4FF, 0xA60D, 0xA60F, 0xA673, 0xA673, + 0xA67E, 0xA67E, 0xA6F2, 0xA6F7, 0xA874, 0xA877, 0xA8CE, 0xA8CF, + 0xA8F8, 0xA8FA, 0xA8FC, 0xA8FC, 0xA92E, 0xA92F, 0xA95F, 0xA95F, + 0xA9C1, 0xA9CD, 0xA9DE, 0xA9DF, 0xAA5C, 0xAA5F, 0xAADE, 0xAADF, + 0xAAF0, 0xAAF1, 0xABEB, 0xABEB, 0xFE10, 0xFE16, 0xFE19, 0xFE19, + 0xFE30, 0xFE30, 0xFE45, 0xFE46, 0xFE49, 0xFE4C, 0xFE50, 0xFE52, + 0xFE54, 0xFE57, 0xFE5F, 0xFE61, 0xFE68, 0xFE68, 0xFE6A, 0xFE6B, + 0xFF01, 0xFF03, 0xFF05, 0xFF07, 0xFF0A, 0xFF0A, 0xFF0C, 0xFF0C, + 0xFF0E, 0xFF0F, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF20, 0xFF3C, 0xFF3C, + 0xFF61, 0xFF61, 0xFF64, 0xFF65, 0x10100, 0x10102, 0x1039F, 0x1039F, + 0x103D0, 0x103D0, 0x1056F, 0x1056F, 0x10857, 0x10857, 0x1091F, 0x1091F, + 0x1093F, 0x1093F, 0x10A50, 0x10A58, 0x10A7F, 0x10A7F, 0x10AF0, 0x10AF6, + 0x10B39, 0x10B3F, 0x10B99, 0x10B9C, 0x10F55, 0x10F59, 0x10F86, 0x10F89, + 0x11047, 0x1104D, 0x110BB, 0x110BC, 0x110BE, 0x110C1, 0x11140, 0x11143, + 0x11174, 0x11175, 0x111C5, 0x111C8, 0x111CD, 0x111CD, 0x111DB, 0x111DB, + 0x111DD, 0x111DF, 0x11238, 0x1123D, 0x112A9, 0x112A9, 0x1144B, 0x1144F, + 0x1145A, 0x1145B, 0x1145D, 0x1145D, 0x114C6, 0x114C6, 0x115C1, 0x115D7, + 0x11641, 0x11643, 0x11660, 0x1166C, 0x116B9, 0x116B9, 0x1173C, 0x1173E, + 0x1183B, 0x1183B, 0x11944, 0x11946, 0x119E2, 0x119E2, 0x11A3F, 0x11A46, + 0x11A9A, 0x11A9C, 0x11A9E, 0x11AA2, 0x11C41, 0x11C45, 0x11C70, 0x11C71, + 0x11EF7, 0x11EF8, 0x11FFF, 0x11FFF, 0x12470, 0x12474, 0x12FF1, 0x12FF2, + 0x16A6E, 0x16A6F, 0x16AF5, 0x16AF5, 0x16B37, 0x16B3B, 0x16B44, 0x16B44, + 0x16E97, 0x16E9A, 0x16FE2, 0x16FE2, 0x1BC9F, 0x1BC9F, 0x1DA87, 0x1DA8B, + 0x1E95E, 0x1E95F, + // #29 (3578+79): gc=Open_Punctuation:Ps + 0x0028, 0x0028, 0x005B, 0x005B, 0x007B, 0x007B, 0x0F3A, 0x0F3A, + 0x0F3C, 0x0F3C, 0x169B, 0x169B, 0x201A, 0x201A, 0x201E, 0x201E, + 0x2045, 0x2045, 0x207D, 0x207D, 0x208D, 0x208D, 0x2308, 0x2308, + 0x230A, 0x230A, 0x2329, 0x2329, 0x2768, 0x2768, 0x276A, 0x276A, + 0x276C, 0x276C, 0x276E, 0x276E, 0x2770, 0x2770, 0x2772, 0x2772, + 0x2774, 0x2774, 0x27C5, 0x27C5, 0x27E6, 0x27E6, 0x27E8, 0x27E8, + 0x27EA, 0x27EA, 0x27EC, 0x27EC, 0x27EE, 0x27EE, 0x2983, 0x2983, + 0x2985, 0x2985, 0x2987, 0x2987, 0x2989, 0x2989, 0x298B, 0x298B, + 0x298D, 0x298D, 0x298F, 0x298F, 0x2991, 0x2991, 0x2993, 0x2993, + 0x2995, 0x2995, 0x2997, 0x2997, 0x29D8, 0x29D8, 0x29DA, 0x29DA, + 0x29FC, 0x29FC, 0x2E22, 0x2E22, 0x2E24, 0x2E24, 0x2E26, 0x2E26, + 0x2E28, 0x2E28, 0x2E42, 0x2E42, 0x2E55, 0x2E55, 0x2E57, 0x2E57, + 0x2E59, 0x2E59, 0x2E5B, 0x2E5B, 0x3008, 0x3008, 0x300A, 0x300A, + 0x300C, 0x300C, 0x300E, 0x300E, 0x3010, 0x3010, 0x3014, 0x3014, + 0x3016, 0x3016, 0x3018, 0x3018, 0x301A, 0x301A, 0x301D, 0x301D, + 0xFD3F, 0xFD3F, 0xFE17, 0xFE17, 0xFE35, 0xFE35, 0xFE37, 0xFE37, + 0xFE39, 0xFE39, 0xFE3B, 0xFE3B, 0xFE3D, 0xFE3D, 0xFE3F, 0xFE3F, + 0xFE41, 0xFE41, 0xFE43, 0xFE43, 0xFE47, 0xFE47, 0xFE59, 0xFE59, + 0xFE5B, 0xFE5B, 0xFE5D, 0xFE5D, 0xFF08, 0xFF08, 0xFF3B, 0xFF3B, + 0xFF5B, 0xFF5B, 0xFF5F, 0xFF5F, 0xFF62, 0xFF62, + // #30 (3657+302): gc=Symbol:S + // Sc:21 + Sk:31 + Sm:64 + So:186 + // #31 (3657+21): gc=Currency_Symbol:Sc + 0x0024, 0x0024, 0x00A2, 0x00A5, 0x058F, 0x058F, 0x060B, 0x060B, + 0x07FE, 0x07FF, 0x09F2, 0x09F3, 0x09FB, 0x09FB, 0x0AF1, 0x0AF1, + 0x0BF9, 0x0BF9, 0x0E3F, 0x0E3F, 0x17DB, 0x17DB, 0x20A0, 0x20C0, + 0xA838, 0xA838, 0xFDFC, 0xFDFC, 0xFE69, 0xFE69, 0xFF04, 0xFF04, + 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE6, 0x11FDD, 0x11FE0, 0x1E2FF, 0x1E2FF, + 0x1ECB0, 0x1ECB0, + // #32 (3678+31): gc=Modifier_Symbol:Sk + 0x005E, 0x005E, 0x0060, 0x0060, 0x00A8, 0x00A8, 0x00AF, 0x00AF, + 0x00B4, 0x00B4, 0x00B8, 0x00B8, 0x02C2, 0x02C5, 0x02D2, 0x02DF, + 0x02E5, 0x02EB, 0x02ED, 0x02ED, 0x02EF, 0x02FF, 0x0375, 0x0375, + 0x0384, 0x0385, 0x0888, 0x0888, 0x1FBD, 0x1FBD, 0x1FBF, 0x1FC1, + 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF, 0x1FED, 0x1FEF, 0x1FFD, 0x1FFE, + 0x309B, 0x309C, 0xA700, 0xA716, 0xA720, 0xA721, 0xA789, 0xA78A, + 0xAB5B, 0xAB5B, 0xAB6A, 0xAB6B, 0xFBB2, 0xFBC2, 0xFF3E, 0xFF3E, + 0xFF40, 0xFF40, 0xFFE3, 0xFFE3, 0x1F3FB, 0x1F3FF, + // #33 (3709+64): gc=Math_Symbol:Sm + 0x002B, 0x002B, 0x003C, 0x003E, 0x007C, 0x007C, 0x007E, 0x007E, + 0x00AC, 0x00AC, 0x00B1, 0x00B1, 0x00D7, 0x00D7, 0x00F7, 0x00F7, + 0x03F6, 0x03F6, 0x0606, 0x0608, 0x2044, 0x2044, 0x2052, 0x2052, + 0x207A, 0x207C, 0x208A, 0x208C, 0x2118, 0x2118, 0x2140, 0x2144, + 0x214B, 0x214B, 0x2190, 0x2194, 0x219A, 0x219B, 0x21A0, 0x21A0, + 0x21A3, 0x21A3, 0x21A6, 0x21A6, 0x21AE, 0x21AE, 0x21CE, 0x21CF, + 0x21D2, 0x21D2, 0x21D4, 0x21D4, 0x21F4, 0x22FF, 0x2320, 0x2321, + 0x237C, 0x237C, 0x239B, 0x23B3, 0x23DC, 0x23E1, 0x25B7, 0x25B7, + 0x25C1, 0x25C1, 0x25F8, 0x25FF, 0x266F, 0x266F, 0x27C0, 0x27C4, + 0x27C7, 0x27E5, 0x27F0, 0x27FF, 0x2900, 0x2982, 0x2999, 0x29D7, + 0x29DC, 0x29FB, 0x29FE, 0x2AFF, 0x2B30, 0x2B44, 0x2B47, 0x2B4C, + 0xFB29, 0xFB29, 0xFE62, 0xFE62, 0xFE64, 0xFE66, 0xFF0B, 0xFF0B, + 0xFF1C, 0xFF1E, 0xFF5C, 0xFF5C, 0xFF5E, 0xFF5E, 0xFFE2, 0xFFE2, + 0xFFE9, 0xFFEC, 0x1D6C1, 0x1D6C1, 0x1D6DB, 0x1D6DB, 0x1D6FB, 0x1D6FB, + 0x1D715, 0x1D715, 0x1D735, 0x1D735, 0x1D74F, 0x1D74F, 0x1D76F, 0x1D76F, + 0x1D789, 0x1D789, 0x1D7A9, 0x1D7A9, 0x1D7C3, 0x1D7C3, 0x1EEF0, 0x1EEF1, + // #34 (3773+186): gc=Other_Symbol:So + 0x00A6, 0x00A6, 0x00A9, 0x00A9, 0x00AE, 0x00AE, 0x00B0, 0x00B0, + 0x0482, 0x0482, 0x058D, 0x058E, 0x060E, 0x060F, 0x06DE, 0x06DE, + 0x06E9, 0x06E9, 0x06FD, 0x06FE, 0x07F6, 0x07F6, 0x09FA, 0x09FA, + 0x0B70, 0x0B70, 0x0BF3, 0x0BF8, 0x0BFA, 0x0BFA, 0x0C7F, 0x0C7F, + 0x0D4F, 0x0D4F, 0x0D79, 0x0D79, 0x0F01, 0x0F03, 0x0F13, 0x0F13, + 0x0F15, 0x0F17, 0x0F1A, 0x0F1F, 0x0F34, 0x0F34, 0x0F36, 0x0F36, + 0x0F38, 0x0F38, 0x0FBE, 0x0FC5, 0x0FC7, 0x0FCC, 0x0FCE, 0x0FCF, + 0x0FD5, 0x0FD8, 0x109E, 0x109F, 0x1390, 0x1399, 0x166D, 0x166D, + 0x1940, 0x1940, 0x19DE, 0x19FF, 0x1B61, 0x1B6A, 0x1B74, 0x1B7C, + 0x2100, 0x2101, 0x2103, 0x2106, 0x2108, 0x2109, 0x2114, 0x2114, + 0x2116, 0x2117, 0x211E, 0x2123, 0x2125, 0x2125, 0x2127, 0x2127, + 0x2129, 0x2129, 0x212E, 0x212E, 0x213A, 0x213B, 0x214A, 0x214A, + 0x214C, 0x214D, 0x214F, 0x214F, 0x218A, 0x218B, 0x2195, 0x2199, + 0x219C, 0x219F, 0x21A1, 0x21A2, 0x21A4, 0x21A5, 0x21A7, 0x21AD, + 0x21AF, 0x21CD, 0x21D0, 0x21D1, 0x21D3, 0x21D3, 0x21D5, 0x21F3, + 0x2300, 0x2307, 0x230C, 0x231F, 0x2322, 0x2328, 0x232B, 0x237B, + 0x237D, 0x239A, 0x23B4, 0x23DB, 0x23E2, 0x2426, 0x2440, 0x244A, + 0x249C, 0x24E9, 0x2500, 0x25B6, 0x25B8, 0x25C0, 0x25C2, 0x25F7, + 0x2600, 0x266E, 0x2670, 0x2767, 0x2794, 0x27BF, 0x2800, 0x28FF, + 0x2B00, 0x2B2F, 0x2B45, 0x2B46, 0x2B4D, 0x2B73, 0x2B76, 0x2B95, + 0x2B97, 0x2BFF, 0x2CE5, 0x2CEA, 0x2E50, 0x2E51, 0x2E80, 0x2E99, + 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, 0x2FF0, 0x2FFB, 0x3004, 0x3004, + 0x3012, 0x3013, 0x3020, 0x3020, 0x3036, 0x3037, 0x303E, 0x303F, + 0x3190, 0x3191, 0x3196, 0x319F, 0x31C0, 0x31E3, 0x3200, 0x321E, + 0x322A, 0x3247, 0x3250, 0x3250, 0x3260, 0x327F, 0x328A, 0x32B0, + 0x32C0, 0x33FF, 0x4DC0, 0x4DFF, 0xA490, 0xA4C6, 0xA828, 0xA82B, + 0xA836, 0xA837, 0xA839, 0xA839, 0xAA77, 0xAA79, 0xFD40, 0xFD4F, + 0xFDCF, 0xFDCF, 0xFDFD, 0xFDFF, 0xFFE4, 0xFFE4, 0xFFE8, 0xFFE8, + 0xFFED, 0xFFEE, 0xFFFC, 0xFFFD, 0x10137, 0x1013F, 0x10179, 0x10189, + 0x1018C, 0x1018E, 0x10190, 0x1019C, 0x101A0, 0x101A0, 0x101D0, 0x101FC, + 0x10877, 0x10878, 0x10AC8, 0x10AC8, 0x1173F, 0x1173F, 0x11FD5, 0x11FDC, + 0x11FE1, 0x11FF1, 0x16B3C, 0x16B3F, 0x16B45, 0x16B45, 0x1BC9C, 0x1BC9C, + 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, 0x1D100, 0x1D126, 0x1D129, 0x1D164, + 0x1D16A, 0x1D16C, 0x1D183, 0x1D184, 0x1D18C, 0x1D1A9, 0x1D1AE, 0x1D1EA, + 0x1D200, 0x1D241, 0x1D245, 0x1D245, 0x1D300, 0x1D356, 0x1D800, 0x1D9FF, + 0x1DA37, 0x1DA3A, 0x1DA6D, 0x1DA74, 0x1DA76, 0x1DA83, 0x1DA85, 0x1DA86, + 0x1E14F, 0x1E14F, 0x1ECAC, 0x1ECAC, 0x1ED2E, 0x1ED2E, 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, 0x1F10D, 0x1F1AD, 0x1F1E6, 0x1F202, 0x1F210, 0x1F23B, + 0x1F240, 0x1F248, 0x1F250, 0x1F251, 0x1F260, 0x1F265, 0x1F300, 0x1F3FA, + 0x1F400, 0x1F6D7, 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, 0x1F700, 0x1F773, + 0x1F780, 0x1F7D8, 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F800, 0x1F80B, + 0x1F810, 0x1F847, 0x1F850, 0x1F859, 0x1F860, 0x1F887, 0x1F890, 0x1F8AD, + 0x1F8B0, 0x1F8B1, 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, 0x1FA70, 0x1FA74, + 0x1FA78, 0x1FA7C, 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, + 0x1FAC0, 0x1FAC5, 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, + 0x1FB00, 0x1FB92, 0x1FB94, 0x1FBCA, + // #35 (3959+9): gc=Separator:Z + // Zl:1 + Zp:1 + Zs:7 + // #36 (3959+1): gc=Line_Separator:Zl + 0x2028, 0x2028, + // #37 (3960+1): gc=Paragraph_Separator:Zp + 0x2029, 0x2029, + // #38 (3961+7): gc=Space_Separator:Zs + 0x0020, 0x0020, 0x00A0, 0x00A0, 0x1680, 0x1680, 0x2000, 0x200A, + 0x202F, 0x202F, 0x205F, 0x205F, 0x3000, 0x3000, + // #39 (3968+1): bp=ASCII + 0x0000, 0x007F, + // #40 (3969+3): bp=ASCII_Hex_Digit:AHex + 0x0030, 0x0039, 0x0041, 0x0046, 0x0061, 0x0066, + // #41 (3972+722): bp=Alphabetic:Alpha + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, + 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, + 0x0345, 0x0345, 0x0370, 0x0374, 0x0376, 0x0377, 0x037A, 0x037D, + 0x037F, 0x037F, 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, + 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, 0x048A, 0x052F, + 0x0531, 0x0556, 0x0559, 0x0559, 0x0560, 0x0588, 0x05B0, 0x05BD, + 0x05BF, 0x05BF, 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, + 0x05D0, 0x05EA, 0x05EF, 0x05F2, 0x0610, 0x061A, 0x0620, 0x0657, + 0x0659, 0x065F, 0x066E, 0x06D3, 0x06D5, 0x06DC, 0x06E1, 0x06E8, + 0x06ED, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x073F, + 0x074D, 0x07B1, 0x07CA, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x07FA, + 0x0800, 0x0817, 0x081A, 0x082C, 0x0840, 0x0858, 0x0860, 0x086A, + 0x0870, 0x0887, 0x0889, 0x088E, 0x08A0, 0x08C9, 0x08D4, 0x08DF, + 0x08E3, 0x08E9, 0x08F0, 0x093B, 0x093D, 0x094C, 0x094E, 0x0950, + 0x0955, 0x0963, 0x0971, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, + 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, + 0x09BD, 0x09C4, 0x09C7, 0x09C8, 0x09CB, 0x09CC, 0x09CE, 0x09CE, + 0x09D7, 0x09D7, 0x09DC, 0x09DD, 0x09DF, 0x09E3, 0x09F0, 0x09F1, + 0x09FC, 0x09FC, 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, + 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, + 0x0A38, 0x0A39, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4C, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A70, 0x0A75, + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABD, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACC, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AF9, 0x0AFC, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, + 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, + 0x0B3D, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4C, 0x0B56, 0x0B57, + 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B71, 0x0B71, 0x0B82, 0x0B83, + 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, + 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCC, + 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, 0x0C00, 0x0C03, 0x0C05, 0x0C0C, + 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3D, 0x0C44, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4C, 0x0C55, 0x0C56, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, 0x0C80, 0x0C83, 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, + 0x0CBD, 0x0CC4, 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCC, 0x0CD5, 0x0CD6, + 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE3, 0x0CF1, 0x0CF2, 0x0D00, 0x0D0C, + 0x0D0E, 0x0D10, 0x0D12, 0x0D3A, 0x0D3D, 0x0D44, 0x0D46, 0x0D48, + 0x0D4A, 0x0D4C, 0x0D4E, 0x0D4E, 0x0D54, 0x0D57, 0x0D5F, 0x0D63, + 0x0D7A, 0x0D7F, 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DF2, 0x0DF3, 0x0E01, 0x0E3A, + 0x0E40, 0x0E46, 0x0E4D, 0x0E4D, 0x0E81, 0x0E82, 0x0E84, 0x0E84, + 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB9, + 0x0EBB, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0ECD, 0x0ECD, + 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, 0x0F40, 0x0F47, 0x0F49, 0x0F6C, + 0x0F71, 0x0F81, 0x0F88, 0x0F97, 0x0F99, 0x0FBC, 0x1000, 0x1036, + 0x1038, 0x1038, 0x103B, 0x103F, 0x1050, 0x108F, 0x109A, 0x109D, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x1380, 0x138F, 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1401, 0x166C, + 0x166F, 0x167F, 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16EE, 0x16F8, + 0x1700, 0x1713, 0x171F, 0x1733, 0x1740, 0x1753, 0x1760, 0x176C, + 0x176E, 0x1770, 0x1772, 0x1773, 0x1780, 0x17B3, 0x17B6, 0x17C8, + 0x17D7, 0x17D7, 0x17DC, 0x17DC, 0x1820, 0x1878, 0x1880, 0x18AA, + 0x18B0, 0x18F5, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x1938, + 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, 0x19B0, 0x19C9, + 0x1A00, 0x1A1B, 0x1A20, 0x1A5E, 0x1A61, 0x1A74, 0x1AA7, 0x1AA7, + 0x1ABF, 0x1AC0, 0x1ACC, 0x1ACE, 0x1B00, 0x1B33, 0x1B35, 0x1B43, + 0x1B45, 0x1B4C, 0x1B80, 0x1BA9, 0x1BAC, 0x1BAF, 0x1BBA, 0x1BE5, + 0x1BE7, 0x1BF1, 0x1C00, 0x1C36, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1DE7, 0x1DF4, 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, + 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, 0x2102, 0x2102, + 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, 0x2119, 0x211D, + 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, + 0x212F, 0x2139, 0x213C, 0x213F, 0x2145, 0x2149, 0x214E, 0x214E, + 0x2160, 0x2188, 0x24B6, 0x24E9, 0x2C00, 0x2CE4, 0x2CEB, 0x2CEE, + 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, 0x2D80, 0x2D96, 0x2DA0, 0x2DA6, + 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, + 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, 0x2DE0, 0x2DFF, + 0x2E2F, 0x2E2F, 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, + 0x3038, 0x303C, 0x3041, 0x3096, 0x309D, 0x309F, 0x30A1, 0x30FA, + 0x30FC, 0x30FF, 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, + 0x31F0, 0x31FF, 0x3400, 0x4DBF, 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, + 0xA500, 0xA60C, 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA640, 0xA66E, + 0xA674, 0xA67B, 0xA67F, 0xA6EF, 0xA717, 0xA71F, 0xA722, 0xA788, + 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, + 0xA7F2, 0xA805, 0xA807, 0xA827, 0xA840, 0xA873, 0xA880, 0xA8C3, + 0xA8C5, 0xA8C5, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FF, + 0xA90A, 0xA92A, 0xA930, 0xA952, 0xA960, 0xA97C, 0xA980, 0xA9B2, + 0xA9B4, 0xA9BF, 0xA9CF, 0xA9CF, 0xA9E0, 0xA9EF, 0xA9FA, 0xA9FE, + 0xAA00, 0xAA36, 0xAA40, 0xAA4D, 0xAA60, 0xAA76, 0xAA7A, 0xAABE, + 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADD, 0xAAE0, 0xAAEF, + 0xAAF2, 0xAAF5, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, 0xAB11, 0xAB16, + 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, 0xAB5C, 0xAB69, + 0xAB70, 0xABEA, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, + 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, + 0xFB1D, 0xFB28, 0xFB2A, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, + 0xFB40, 0xFB41, 0xFB43, 0xFB44, 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, + 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, 0xFDF0, 0xFDFB, 0xFE70, 0xFE74, + 0xFE76, 0xFEFC, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, + 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10140, 0x10174, + 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x10300, 0x1031F, 0x1032D, 0x1034A, + 0x10350, 0x1037A, 0x10380, 0x1039D, 0x103A0, 0x103C3, 0x103C8, 0x103CF, + 0x103D1, 0x103D5, 0x10400, 0x1049D, 0x104B0, 0x104D3, 0x104D8, 0x104FB, + 0x10500, 0x10527, 0x10530, 0x10563, 0x10570, 0x1057A, 0x1057C, 0x1058A, + 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10600, 0x10736, 0x10740, 0x10755, + 0x10760, 0x10767, 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, + 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, + 0x1083C, 0x1083C, 0x1083F, 0x10855, 0x10860, 0x10876, 0x10880, 0x1089E, + 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x10900, 0x10915, 0x10920, 0x10939, + 0x10980, 0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A03, 0x10A05, 0x10A06, + 0x10A0C, 0x10A13, 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, 0x10B00, 0x10B35, + 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D27, 0x10E80, 0x10EA9, + 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, + 0x10F30, 0x10F45, 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, + 0x11000, 0x11045, 0x11071, 0x11075, 0x11082, 0x110B8, 0x110C2, 0x110C2, + 0x110D0, 0x110E8, 0x11100, 0x11132, 0x11144, 0x11147, 0x11150, 0x11172, + 0x11176, 0x11176, 0x11180, 0x111BF, 0x111C1, 0x111C4, 0x111CE, 0x111CF, + 0x111DA, 0x111DA, 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x11234, + 0x11237, 0x11237, 0x1123E, 0x1123E, 0x11280, 0x11286, 0x11288, 0x11288, + 0x1128A, 0x1128D, 0x1128F, 0x1129D, 0x1129F, 0x112A8, 0x112B0, 0x112E8, + 0x11300, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133D, 0x11344, + 0x11347, 0x11348, 0x1134B, 0x1134C, 0x11350, 0x11350, 0x11357, 0x11357, + 0x1135D, 0x11363, 0x11400, 0x11441, 0x11443, 0x11445, 0x11447, 0x1144A, + 0x1145F, 0x11461, 0x11480, 0x114C1, 0x114C4, 0x114C5, 0x114C7, 0x114C7, + 0x11580, 0x115B5, 0x115B8, 0x115BE, 0x115D8, 0x115DD, 0x11600, 0x1163E, + 0x11640, 0x11640, 0x11644, 0x11644, 0x11680, 0x116B5, 0x116B8, 0x116B8, + 0x11700, 0x1171A, 0x1171D, 0x1172A, 0x11740, 0x11746, 0x11800, 0x11838, + 0x118A0, 0x118DF, 0x118FF, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, + 0x11915, 0x11916, 0x11918, 0x11935, 0x11937, 0x11938, 0x1193B, 0x1193C, + 0x1193F, 0x11942, 0x119A0, 0x119A7, 0x119AA, 0x119D7, 0x119DA, 0x119DF, + 0x119E1, 0x119E1, 0x119E3, 0x119E4, 0x11A00, 0x11A32, 0x11A35, 0x11A3E, + 0x11A50, 0x11A97, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, + 0x11C0A, 0x11C36, 0x11C38, 0x11C3E, 0x11C40, 0x11C40, 0x11C72, 0x11C8F, + 0x11C92, 0x11CA7, 0x11CA9, 0x11CB6, 0x11D00, 0x11D06, 0x11D08, 0x11D09, + 0x11D0B, 0x11D36, 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D41, + 0x11D43, 0x11D43, 0x11D46, 0x11D47, 0x11D60, 0x11D65, 0x11D67, 0x11D68, + 0x11D6A, 0x11D8E, 0x11D90, 0x11D91, 0x11D93, 0x11D96, 0x11D98, 0x11D98, + 0x11EE0, 0x11EF6, 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12400, 0x1246E, + 0x12480, 0x12543, 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, + 0x16800, 0x16A38, 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, 0x16AD0, 0x16AED, + 0x16B00, 0x16B2F, 0x16B40, 0x16B43, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, + 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, + 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x16FF0, 0x16FF1, 0x17000, 0x187F7, + 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, + 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, + 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, + 0x1BC90, 0x1BC99, 0x1BC9E, 0x1BC9E, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, + 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, + 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, + 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, + 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, + 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, + 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, + 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, + 0x1DF00, 0x1DF1E, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E100, 0x1E12C, 0x1E137, 0x1E13D, + 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, 0x1E7E0, 0x1E7E6, + 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, + 0x1E900, 0x1E943, 0x1E947, 0x1E947, 0x1E94B, 0x1E94B, 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, + 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, + 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, + 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, + 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, + 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, + 0x1F130, 0x1F149, 0x1F150, 0x1F169, 0x1F170, 0x1F189, 0x20000, 0x2A6DF, + 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, + 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #42 (4694+1): bp=Any + 0x0000, 0x10FFFF, + // #43 (4695+0): bp=Assigned + + // #44 (4695+4): bp=Bidi_Control:Bidi_C + 0x061C, 0x061C, 0x200E, 0x200F, 0x202A, 0x202E, 0x2066, 0x2069, + // #45 (4699+114): bp=Bidi_Mirrored:Bidi_M + 0x0028, 0x0029, 0x003C, 0x003C, 0x003E, 0x003E, 0x005B, 0x005B, + 0x005D, 0x005D, 0x007B, 0x007B, 0x007D, 0x007D, 0x00AB, 0x00AB, + 0x00BB, 0x00BB, 0x0F3A, 0x0F3D, 0x169B, 0x169C, 0x2039, 0x203A, + 0x2045, 0x2046, 0x207D, 0x207E, 0x208D, 0x208E, 0x2140, 0x2140, + 0x2201, 0x2204, 0x2208, 0x220D, 0x2211, 0x2211, 0x2215, 0x2216, + 0x221A, 0x221D, 0x221F, 0x2222, 0x2224, 0x2224, 0x2226, 0x2226, + 0x222B, 0x2233, 0x2239, 0x2239, 0x223B, 0x224C, 0x2252, 0x2255, + 0x225F, 0x2260, 0x2262, 0x2262, 0x2264, 0x226B, 0x226E, 0x228C, + 0x228F, 0x2292, 0x2298, 0x2298, 0x22A2, 0x22A3, 0x22A6, 0x22B8, + 0x22BE, 0x22BF, 0x22C9, 0x22CD, 0x22D0, 0x22D1, 0x22D6, 0x22ED, + 0x22F0, 0x22FF, 0x2308, 0x230B, 0x2320, 0x2321, 0x2329, 0x232A, + 0x2768, 0x2775, 0x27C0, 0x27C0, 0x27C3, 0x27C6, 0x27C8, 0x27C9, + 0x27CB, 0x27CD, 0x27D3, 0x27D6, 0x27DC, 0x27DE, 0x27E2, 0x27EF, + 0x2983, 0x2998, 0x299B, 0x29A0, 0x29A2, 0x29AF, 0x29B8, 0x29B8, + 0x29C0, 0x29C5, 0x29C9, 0x29C9, 0x29CE, 0x29D2, 0x29D4, 0x29D5, + 0x29D8, 0x29DC, 0x29E1, 0x29E1, 0x29E3, 0x29E5, 0x29E8, 0x29E9, + 0x29F4, 0x29F9, 0x29FC, 0x29FD, 0x2A0A, 0x2A1C, 0x2A1E, 0x2A21, + 0x2A24, 0x2A24, 0x2A26, 0x2A26, 0x2A29, 0x2A29, 0x2A2B, 0x2A2E, + 0x2A34, 0x2A35, 0x2A3C, 0x2A3E, 0x2A57, 0x2A58, 0x2A64, 0x2A65, + 0x2A6A, 0x2A6D, 0x2A6F, 0x2A70, 0x2A73, 0x2A74, 0x2A79, 0x2AA3, + 0x2AA6, 0x2AAD, 0x2AAF, 0x2AD6, 0x2ADC, 0x2ADC, 0x2ADE, 0x2ADE, + 0x2AE2, 0x2AE6, 0x2AEC, 0x2AEE, 0x2AF3, 0x2AF3, 0x2AF7, 0x2AFB, + 0x2AFD, 0x2AFD, 0x2BFE, 0x2BFE, 0x2E02, 0x2E05, 0x2E09, 0x2E0A, + 0x2E0C, 0x2E0D, 0x2E1C, 0x2E1D, 0x2E20, 0x2E29, 0x2E55, 0x2E5C, + 0x3008, 0x3011, 0x3014, 0x301B, 0xFE59, 0xFE5E, 0xFE64, 0xFE65, + 0xFF08, 0xFF09, 0xFF1C, 0xFF1C, 0xFF1E, 0xFF1E, 0xFF3B, 0xFF3B, + 0xFF3D, 0xFF3D, 0xFF5B, 0xFF5B, 0xFF5D, 0xFF5D, 0xFF5F, 0xFF60, + 0xFF62, 0xFF63, 0x1D6DB, 0x1D6DB, 0x1D715, 0x1D715, 0x1D74F, 0x1D74F, + 0x1D789, 0x1D789, 0x1D7C3, 0x1D7C3, + // #46 (4813+427): bp=Case_Ignorable:CI + 0x0027, 0x0027, 0x002E, 0x002E, 0x003A, 0x003A, 0x005E, 0x005E, + 0x0060, 0x0060, 0x00A8, 0x00A8, 0x00AD, 0x00AD, 0x00AF, 0x00AF, + 0x00B4, 0x00B4, 0x00B7, 0x00B8, 0x02B0, 0x036F, 0x0374, 0x0375, + 0x037A, 0x037A, 0x0384, 0x0385, 0x0387, 0x0387, 0x0483, 0x0489, + 0x0559, 0x0559, 0x055F, 0x055F, 0x0591, 0x05BD, 0x05BF, 0x05BF, + 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x05F4, 0x05F4, + 0x0600, 0x0605, 0x0610, 0x061A, 0x061C, 0x061C, 0x0640, 0x0640, + 0x064B, 0x065F, 0x0670, 0x0670, 0x06D6, 0x06DD, 0x06DF, 0x06E8, + 0x06EA, 0x06ED, 0x070F, 0x070F, 0x0711, 0x0711, 0x0730, 0x074A, + 0x07A6, 0x07B0, 0x07EB, 0x07F5, 0x07FA, 0x07FA, 0x07FD, 0x07FD, + 0x0816, 0x082D, 0x0859, 0x085B, 0x0888, 0x0888, 0x0890, 0x0891, + 0x0898, 0x089F, 0x08C9, 0x0902, 0x093A, 0x093A, 0x093C, 0x093C, + 0x0941, 0x0948, 0x094D, 0x094D, 0x0951, 0x0957, 0x0962, 0x0963, + 0x0971, 0x0971, 0x0981, 0x0981, 0x09BC, 0x09BC, 0x09C1, 0x09C4, + 0x09CD, 0x09CD, 0x09E2, 0x09E3, 0x09FE, 0x09FE, 0x0A01, 0x0A02, + 0x0A3C, 0x0A3C, 0x0A41, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A70, 0x0A71, 0x0A75, 0x0A75, 0x0A81, 0x0A82, + 0x0ABC, 0x0ABC, 0x0AC1, 0x0AC5, 0x0AC7, 0x0AC8, 0x0ACD, 0x0ACD, + 0x0AE2, 0x0AE3, 0x0AFA, 0x0AFF, 0x0B01, 0x0B01, 0x0B3C, 0x0B3C, + 0x0B3F, 0x0B3F, 0x0B41, 0x0B44, 0x0B4D, 0x0B4D, 0x0B55, 0x0B56, + 0x0B62, 0x0B63, 0x0B82, 0x0B82, 0x0BC0, 0x0BC0, 0x0BCD, 0x0BCD, + 0x0C00, 0x0C00, 0x0C04, 0x0C04, 0x0C3C, 0x0C3C, 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, + 0x0C81, 0x0C81, 0x0CBC, 0x0CBC, 0x0CBF, 0x0CBF, 0x0CC6, 0x0CC6, + 0x0CCC, 0x0CCD, 0x0CE2, 0x0CE3, 0x0D00, 0x0D01, 0x0D3B, 0x0D3C, + 0x0D41, 0x0D44, 0x0D4D, 0x0D4D, 0x0D62, 0x0D63, 0x0D81, 0x0D81, + 0x0DCA, 0x0DCA, 0x0DD2, 0x0DD4, 0x0DD6, 0x0DD6, 0x0E31, 0x0E31, + 0x0E34, 0x0E3A, 0x0E46, 0x0E4E, 0x0EB1, 0x0EB1, 0x0EB4, 0x0EBC, + 0x0EC6, 0x0EC6, 0x0EC8, 0x0ECD, 0x0F18, 0x0F19, 0x0F35, 0x0F35, + 0x0F37, 0x0F37, 0x0F39, 0x0F39, 0x0F71, 0x0F7E, 0x0F80, 0x0F84, + 0x0F86, 0x0F87, 0x0F8D, 0x0F97, 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, + 0x102D, 0x1030, 0x1032, 0x1037, 0x1039, 0x103A, 0x103D, 0x103E, + 0x1058, 0x1059, 0x105E, 0x1060, 0x1071, 0x1074, 0x1082, 0x1082, + 0x1085, 0x1086, 0x108D, 0x108D, 0x109D, 0x109D, 0x10FC, 0x10FC, + 0x135D, 0x135F, 0x1712, 0x1714, 0x1732, 0x1733, 0x1752, 0x1753, + 0x1772, 0x1773, 0x17B4, 0x17B5, 0x17B7, 0x17BD, 0x17C6, 0x17C6, + 0x17C9, 0x17D3, 0x17D7, 0x17D7, 0x17DD, 0x17DD, 0x180B, 0x180F, + 0x1843, 0x1843, 0x1885, 0x1886, 0x18A9, 0x18A9, 0x1920, 0x1922, + 0x1927, 0x1928, 0x1932, 0x1932, 0x1939, 0x193B, 0x1A17, 0x1A18, + 0x1A1B, 0x1A1B, 0x1A56, 0x1A56, 0x1A58, 0x1A5E, 0x1A60, 0x1A60, + 0x1A62, 0x1A62, 0x1A65, 0x1A6C, 0x1A73, 0x1A7C, 0x1A7F, 0x1A7F, + 0x1AA7, 0x1AA7, 0x1AB0, 0x1ACE, 0x1B00, 0x1B03, 0x1B34, 0x1B34, + 0x1B36, 0x1B3A, 0x1B3C, 0x1B3C, 0x1B42, 0x1B42, 0x1B6B, 0x1B73, + 0x1B80, 0x1B81, 0x1BA2, 0x1BA5, 0x1BA8, 0x1BA9, 0x1BAB, 0x1BAD, + 0x1BE6, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BED, 0x1BEF, 0x1BF1, + 0x1C2C, 0x1C33, 0x1C36, 0x1C37, 0x1C78, 0x1C7D, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, + 0x1CF8, 0x1CF9, 0x1D2C, 0x1D6A, 0x1D78, 0x1D78, 0x1D9B, 0x1DFF, + 0x1FBD, 0x1FBD, 0x1FBF, 0x1FC1, 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF, + 0x1FED, 0x1FEF, 0x1FFD, 0x1FFE, 0x200B, 0x200F, 0x2018, 0x2019, + 0x2024, 0x2024, 0x2027, 0x2027, 0x202A, 0x202E, 0x2060, 0x2064, + 0x2066, 0x206F, 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, + 0x20D0, 0x20F0, 0x2C7C, 0x2C7D, 0x2CEF, 0x2CF1, 0x2D6F, 0x2D6F, + 0x2D7F, 0x2D7F, 0x2DE0, 0x2DFF, 0x2E2F, 0x2E2F, 0x3005, 0x3005, + 0x302A, 0x302D, 0x3031, 0x3035, 0x303B, 0x303B, 0x3099, 0x309E, + 0x30FC, 0x30FE, 0xA015, 0xA015, 0xA4F8, 0xA4FD, 0xA60C, 0xA60C, + 0xA66F, 0xA672, 0xA674, 0xA67D, 0xA67F, 0xA67F, 0xA69C, 0xA69F, + 0xA6F0, 0xA6F1, 0xA700, 0xA721, 0xA770, 0xA770, 0xA788, 0xA78A, + 0xA7F2, 0xA7F4, 0xA7F8, 0xA7F9, 0xA802, 0xA802, 0xA806, 0xA806, + 0xA80B, 0xA80B, 0xA825, 0xA826, 0xA82C, 0xA82C, 0xA8C4, 0xA8C5, + 0xA8E0, 0xA8F1, 0xA8FF, 0xA8FF, 0xA926, 0xA92D, 0xA947, 0xA951, + 0xA980, 0xA982, 0xA9B3, 0xA9B3, 0xA9B6, 0xA9B9, 0xA9BC, 0xA9BD, + 0xA9CF, 0xA9CF, 0xA9E5, 0xA9E6, 0xAA29, 0xAA2E, 0xAA31, 0xAA32, + 0xAA35, 0xAA36, 0xAA43, 0xAA43, 0xAA4C, 0xAA4C, 0xAA70, 0xAA70, + 0xAA7C, 0xAA7C, 0xAAB0, 0xAAB0, 0xAAB2, 0xAAB4, 0xAAB7, 0xAAB8, + 0xAABE, 0xAABF, 0xAAC1, 0xAAC1, 0xAADD, 0xAADD, 0xAAEC, 0xAAED, + 0xAAF3, 0xAAF4, 0xAAF6, 0xAAF6, 0xAB5B, 0xAB5F, 0xAB69, 0xAB6B, + 0xABE5, 0xABE5, 0xABE8, 0xABE8, 0xABED, 0xABED, 0xFB1E, 0xFB1E, + 0xFBB2, 0xFBC2, 0xFE00, 0xFE0F, 0xFE13, 0xFE13, 0xFE20, 0xFE2F, + 0xFE52, 0xFE52, 0xFE55, 0xFE55, 0xFEFF, 0xFEFF, 0xFF07, 0xFF07, + 0xFF0E, 0xFF0E, 0xFF1A, 0xFF1A, 0xFF3E, 0xFF3E, 0xFF40, 0xFF40, + 0xFF70, 0xFF70, 0xFF9E, 0xFF9F, 0xFFE3, 0xFFE3, 0xFFF9, 0xFFFB, + 0x101FD, 0x101FD, 0x102E0, 0x102E0, 0x10376, 0x1037A, 0x10780, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10A01, 0x10A03, 0x10A05, 0x10A06, + 0x10A0C, 0x10A0F, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, 0x10AE5, 0x10AE6, + 0x10D24, 0x10D27, 0x10EAB, 0x10EAC, 0x10F46, 0x10F50, 0x10F82, 0x10F85, + 0x11001, 0x11001, 0x11038, 0x11046, 0x11070, 0x11070, 0x11073, 0x11074, + 0x1107F, 0x11081, 0x110B3, 0x110B6, 0x110B9, 0x110BA, 0x110BD, 0x110BD, + 0x110C2, 0x110C2, 0x110CD, 0x110CD, 0x11100, 0x11102, 0x11127, 0x1112B, + 0x1112D, 0x11134, 0x11173, 0x11173, 0x11180, 0x11181, 0x111B6, 0x111BE, + 0x111C9, 0x111CC, 0x111CF, 0x111CF, 0x1122F, 0x11231, 0x11234, 0x11234, + 0x11236, 0x11237, 0x1123E, 0x1123E, 0x112DF, 0x112DF, 0x112E3, 0x112EA, + 0x11300, 0x11301, 0x1133B, 0x1133C, 0x11340, 0x11340, 0x11366, 0x1136C, + 0x11370, 0x11374, 0x11438, 0x1143F, 0x11442, 0x11444, 0x11446, 0x11446, + 0x1145E, 0x1145E, 0x114B3, 0x114B8, 0x114BA, 0x114BA, 0x114BF, 0x114C0, + 0x114C2, 0x114C3, 0x115B2, 0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, + 0x115DC, 0x115DD, 0x11633, 0x1163A, 0x1163D, 0x1163D, 0x1163F, 0x11640, + 0x116AB, 0x116AB, 0x116AD, 0x116AD, 0x116B0, 0x116B5, 0x116B7, 0x116B7, + 0x1171D, 0x1171F, 0x11722, 0x11725, 0x11727, 0x1172B, 0x1182F, 0x11837, + 0x11839, 0x1183A, 0x1193B, 0x1193C, 0x1193E, 0x1193E, 0x11943, 0x11943, + 0x119D4, 0x119D7, 0x119DA, 0x119DB, 0x119E0, 0x119E0, 0x11A01, 0x11A0A, + 0x11A33, 0x11A38, 0x11A3B, 0x11A3E, 0x11A47, 0x11A47, 0x11A51, 0x11A56, + 0x11A59, 0x11A5B, 0x11A8A, 0x11A96, 0x11A98, 0x11A99, 0x11C30, 0x11C36, + 0x11C38, 0x11C3D, 0x11C3F, 0x11C3F, 0x11C92, 0x11CA7, 0x11CAA, 0x11CB0, + 0x11CB2, 0x11CB3, 0x11CB5, 0x11CB6, 0x11D31, 0x11D36, 0x11D3A, 0x11D3A, + 0x11D3C, 0x11D3D, 0x11D3F, 0x11D45, 0x11D47, 0x11D47, 0x11D90, 0x11D91, + 0x11D95, 0x11D95, 0x11D97, 0x11D97, 0x11EF3, 0x11EF4, 0x13430, 0x13438, + 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, 0x16B40, 0x16B43, 0x16F4F, 0x16F4F, + 0x16F8F, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE4, 0x1AFF0, 0x1AFF3, + 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1BC9D, 0x1BC9E, 0x1BCA0, 0x1BCA3, + 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, 0x1D173, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E130, 0x1E13D, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E94B, 0x1F3FB, 0x1F3FF, + 0xE0001, 0xE0001, 0xE0020, 0xE007F, 0xE0100, 0xE01EF, + // #47 (5240+155): bp=Cased + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x01BA, + 0x01BC, 0x01BF, 0x01C4, 0x0293, 0x0295, 0x02B8, 0x02C0, 0x02C1, + 0x02E0, 0x02E4, 0x0345, 0x0345, 0x0370, 0x0373, 0x0376, 0x0377, + 0x037A, 0x037D, 0x037F, 0x037F, 0x0386, 0x0386, 0x0388, 0x038A, + 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, + 0x048A, 0x052F, 0x0531, 0x0556, 0x0560, 0x0588, 0x10A0, 0x10C5, + 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, 0x10FD, 0x10FF, + 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1D00, 0x1DBF, 0x1E00, 0x1F15, 0x1F18, 0x1F1D, + 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, + 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, + 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FFC, 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, + 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, + 0x2119, 0x211D, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, + 0x212A, 0x212D, 0x212F, 0x2134, 0x2139, 0x2139, 0x213C, 0x213F, + 0x2145, 0x2149, 0x214E, 0x214E, 0x2160, 0x217F, 0x2183, 0x2184, + 0x24B6, 0x24E9, 0x2C00, 0x2CE4, 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, + 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0xA640, 0xA66D, + 0xA680, 0xA69D, 0xA722, 0xA787, 0xA78B, 0xA78E, 0xA790, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F5, 0xA7F6, + 0xA7F8, 0xA7FA, 0xAB30, 0xAB5A, 0xAB5C, 0xAB68, 0xAB70, 0xABBF, + 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, + 0x10400, 0x1044F, 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10570, 0x1057A, + 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10780, 0x10780, + 0x10783, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10C80, 0x10CB2, + 0x10CC0, 0x10CF2, 0x118A0, 0x118DF, 0x16E40, 0x16E7F, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, + 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, 0x1D736, 0x1D74E, + 0x1D750, 0x1D76E, 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, + 0x1D7C4, 0x1D7CB, 0x1DF00, 0x1DF09, 0x1DF0B, 0x1DF1E, 0x1E900, 0x1E943, + 0x1F130, 0x1F149, 0x1F150, 0x1F169, 0x1F170, 0x1F189, + // #48 (5395+622): bp=Changes_When_Casefolded:CWCF + 0x0041, 0x005A, 0x00B5, 0x00B5, 0x00C0, 0x00D6, 0x00D8, 0x00DF, + 0x0100, 0x0100, 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, + 0x0108, 0x0108, 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, + 0x0110, 0x0110, 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, + 0x0118, 0x0118, 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, + 0x0120, 0x0120, 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, + 0x0128, 0x0128, 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, + 0x0130, 0x0130, 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, + 0x0139, 0x0139, 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, + 0x0141, 0x0141, 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, + 0x0149, 0x014A, 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, + 0x0152, 0x0152, 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, + 0x015A, 0x015A, 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, + 0x0162, 0x0162, 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, + 0x016A, 0x016A, 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, + 0x0172, 0x0172, 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, + 0x017B, 0x017B, 0x017D, 0x017D, 0x017F, 0x017F, 0x0181, 0x0182, + 0x0184, 0x0184, 0x0186, 0x0187, 0x0189, 0x018B, 0x018E, 0x0191, + 0x0193, 0x0194, 0x0196, 0x0198, 0x019C, 0x019D, 0x019F, 0x01A0, + 0x01A2, 0x01A2, 0x01A4, 0x01A4, 0x01A6, 0x01A7, 0x01A9, 0x01A9, + 0x01AC, 0x01AC, 0x01AE, 0x01AF, 0x01B1, 0x01B3, 0x01B5, 0x01B5, + 0x01B7, 0x01B8, 0x01BC, 0x01BC, 0x01C4, 0x01C5, 0x01C7, 0x01C8, + 0x01CA, 0x01CB, 0x01CD, 0x01CD, 0x01CF, 0x01CF, 0x01D1, 0x01D1, + 0x01D3, 0x01D3, 0x01D5, 0x01D5, 0x01D7, 0x01D7, 0x01D9, 0x01D9, + 0x01DB, 0x01DB, 0x01DE, 0x01DE, 0x01E0, 0x01E0, 0x01E2, 0x01E2, + 0x01E4, 0x01E4, 0x01E6, 0x01E6, 0x01E8, 0x01E8, 0x01EA, 0x01EA, + 0x01EC, 0x01EC, 0x01EE, 0x01EE, 0x01F1, 0x01F2, 0x01F4, 0x01F4, + 0x01F6, 0x01F8, 0x01FA, 0x01FA, 0x01FC, 0x01FC, 0x01FE, 0x01FE, + 0x0200, 0x0200, 0x0202, 0x0202, 0x0204, 0x0204, 0x0206, 0x0206, + 0x0208, 0x0208, 0x020A, 0x020A, 0x020C, 0x020C, 0x020E, 0x020E, + 0x0210, 0x0210, 0x0212, 0x0212, 0x0214, 0x0214, 0x0216, 0x0216, + 0x0218, 0x0218, 0x021A, 0x021A, 0x021C, 0x021C, 0x021E, 0x021E, + 0x0220, 0x0220, 0x0222, 0x0222, 0x0224, 0x0224, 0x0226, 0x0226, + 0x0228, 0x0228, 0x022A, 0x022A, 0x022C, 0x022C, 0x022E, 0x022E, + 0x0230, 0x0230, 0x0232, 0x0232, 0x023A, 0x023B, 0x023D, 0x023E, + 0x0241, 0x0241, 0x0243, 0x0246, 0x0248, 0x0248, 0x024A, 0x024A, + 0x024C, 0x024C, 0x024E, 0x024E, 0x0345, 0x0345, 0x0370, 0x0370, + 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, 0x0386, 0x0386, + 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, 0x0391, 0x03A1, + 0x03A3, 0x03AB, 0x03C2, 0x03C2, 0x03CF, 0x03D1, 0x03D5, 0x03D6, + 0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, + 0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, + 0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, + 0x03F0, 0x03F1, 0x03F4, 0x03F5, 0x03F7, 0x03F7, 0x03F9, 0x03FA, + 0x03FD, 0x042F, 0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, + 0x0466, 0x0466, 0x0468, 0x0468, 0x046A, 0x046A, 0x046C, 0x046C, + 0x046E, 0x046E, 0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, + 0x0476, 0x0476, 0x0478, 0x0478, 0x047A, 0x047A, 0x047C, 0x047C, + 0x047E, 0x047E, 0x0480, 0x0480, 0x048A, 0x048A, 0x048C, 0x048C, + 0x048E, 0x048E, 0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, + 0x0496, 0x0496, 0x0498, 0x0498, 0x049A, 0x049A, 0x049C, 0x049C, + 0x049E, 0x049E, 0x04A0, 0x04A0, 0x04A2, 0x04A2, 0x04A4, 0x04A4, + 0x04A6, 0x04A6, 0x04A8, 0x04A8, 0x04AA, 0x04AA, 0x04AC, 0x04AC, + 0x04AE, 0x04AE, 0x04B0, 0x04B0, 0x04B2, 0x04B2, 0x04B4, 0x04B4, + 0x04B6, 0x04B6, 0x04B8, 0x04B8, 0x04BA, 0x04BA, 0x04BC, 0x04BC, + 0x04BE, 0x04BE, 0x04C0, 0x04C1, 0x04C3, 0x04C3, 0x04C5, 0x04C5, + 0x04C7, 0x04C7, 0x04C9, 0x04C9, 0x04CB, 0x04CB, 0x04CD, 0x04CD, + 0x04D0, 0x04D0, 0x04D2, 0x04D2, 0x04D4, 0x04D4, 0x04D6, 0x04D6, + 0x04D8, 0x04D8, 0x04DA, 0x04DA, 0x04DC, 0x04DC, 0x04DE, 0x04DE, + 0x04E0, 0x04E0, 0x04E2, 0x04E2, 0x04E4, 0x04E4, 0x04E6, 0x04E6, + 0x04E8, 0x04E8, 0x04EA, 0x04EA, 0x04EC, 0x04EC, 0x04EE, 0x04EE, + 0x04F0, 0x04F0, 0x04F2, 0x04F2, 0x04F4, 0x04F4, 0x04F6, 0x04F6, + 0x04F8, 0x04F8, 0x04FA, 0x04FA, 0x04FC, 0x04FC, 0x04FE, 0x04FE, + 0x0500, 0x0500, 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506, + 0x0508, 0x0508, 0x050A, 0x050A, 0x050C, 0x050C, 0x050E, 0x050E, + 0x0510, 0x0510, 0x0512, 0x0512, 0x0514, 0x0514, 0x0516, 0x0516, + 0x0518, 0x0518, 0x051A, 0x051A, 0x051C, 0x051C, 0x051E, 0x051E, + 0x0520, 0x0520, 0x0522, 0x0522, 0x0524, 0x0524, 0x0526, 0x0526, + 0x0528, 0x0528, 0x052A, 0x052A, 0x052C, 0x052C, 0x052E, 0x052E, + 0x0531, 0x0556, 0x0587, 0x0587, 0x10A0, 0x10C5, 0x10C7, 0x10C7, + 0x10CD, 0x10CD, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, 0x1E04, 0x1E04, + 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, 0x1E0C, 0x1E0C, + 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, 0x1E14, 0x1E14, + 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, 0x1E1C, 0x1E1C, + 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, 0x1E24, 0x1E24, + 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, 0x1E2C, 0x1E2C, + 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, 0x1E34, 0x1E34, + 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, 0x1E3C, 0x1E3C, + 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, 0x1E44, 0x1E44, + 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, 0x1E4C, 0x1E4C, + 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, 0x1E54, 0x1E54, + 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, 0x1E5C, 0x1E5C, + 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, 0x1E64, 0x1E64, + 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, 0x1E6C, 0x1E6C, + 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, 0x1E74, 0x1E74, + 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, 0x1E7C, 0x1E7C, + 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, 0x1E84, 0x1E84, + 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, 0x1E8C, 0x1E8C, + 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, 0x1E94, 0x1E94, + 0x1E9A, 0x1E9B, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, + 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, + 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, + 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, + 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, + 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, + 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, + 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, + 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, + 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, + 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, + 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, + 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, + 0x1F80, 0x1FAF, 0x1FB2, 0x1FB4, 0x1FB7, 0x1FBC, 0x1FC2, 0x1FC4, + 0x1FC7, 0x1FCC, 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, 0x1FF2, 0x1FF4, + 0x1FF7, 0x1FFC, 0x2126, 0x2126, 0x212A, 0x212B, 0x2132, 0x2132, + 0x2160, 0x216F, 0x2183, 0x2183, 0x24B6, 0x24CF, 0x2C00, 0x2C2F, + 0x2C60, 0x2C60, 0x2C62, 0x2C64, 0x2C67, 0x2C67, 0x2C69, 0x2C69, + 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, 0x2C72, 0x2C72, 0x2C75, 0x2C75, + 0x2C7E, 0x2C80, 0x2C82, 0x2C82, 0x2C84, 0x2C84, 0x2C86, 0x2C86, + 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, + 0x2C90, 0x2C90, 0x2C92, 0x2C92, 0x2C94, 0x2C94, 0x2C96, 0x2C96, + 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, + 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, + 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, + 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, + 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, + 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, + 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, + 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, + 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, + 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, + 0x2CF2, 0x2CF2, 0xA640, 0xA640, 0xA642, 0xA642, 0xA644, 0xA644, + 0xA646, 0xA646, 0xA648, 0xA648, 0xA64A, 0xA64A, 0xA64C, 0xA64C, + 0xA64E, 0xA64E, 0xA650, 0xA650, 0xA652, 0xA652, 0xA654, 0xA654, + 0xA656, 0xA656, 0xA658, 0xA658, 0xA65A, 0xA65A, 0xA65C, 0xA65C, + 0xA65E, 0xA65E, 0xA660, 0xA660, 0xA662, 0xA662, 0xA664, 0xA664, + 0xA666, 0xA666, 0xA668, 0xA668, 0xA66A, 0xA66A, 0xA66C, 0xA66C, + 0xA680, 0xA680, 0xA682, 0xA682, 0xA684, 0xA684, 0xA686, 0xA686, + 0xA688, 0xA688, 0xA68A, 0xA68A, 0xA68C, 0xA68C, 0xA68E, 0xA68E, + 0xA690, 0xA690, 0xA692, 0xA692, 0xA694, 0xA694, 0xA696, 0xA696, + 0xA698, 0xA698, 0xA69A, 0xA69A, 0xA722, 0xA722, 0xA724, 0xA724, + 0xA726, 0xA726, 0xA728, 0xA728, 0xA72A, 0xA72A, 0xA72C, 0xA72C, + 0xA72E, 0xA72E, 0xA732, 0xA732, 0xA734, 0xA734, 0xA736, 0xA736, + 0xA738, 0xA738, 0xA73A, 0xA73A, 0xA73C, 0xA73C, 0xA73E, 0xA73E, + 0xA740, 0xA740, 0xA742, 0xA742, 0xA744, 0xA744, 0xA746, 0xA746, + 0xA748, 0xA748, 0xA74A, 0xA74A, 0xA74C, 0xA74C, 0xA74E, 0xA74E, + 0xA750, 0xA750, 0xA752, 0xA752, 0xA754, 0xA754, 0xA756, 0xA756, + 0xA758, 0xA758, 0xA75A, 0xA75A, 0xA75C, 0xA75C, 0xA75E, 0xA75E, + 0xA760, 0xA760, 0xA762, 0xA762, 0xA764, 0xA764, 0xA766, 0xA766, + 0xA768, 0xA768, 0xA76A, 0xA76A, 0xA76C, 0xA76C, 0xA76E, 0xA76E, + 0xA779, 0xA779, 0xA77B, 0xA77B, 0xA77D, 0xA77E, 0xA780, 0xA780, + 0xA782, 0xA782, 0xA784, 0xA784, 0xA786, 0xA786, 0xA78B, 0xA78B, + 0xA78D, 0xA78D, 0xA790, 0xA790, 0xA792, 0xA792, 0xA796, 0xA796, + 0xA798, 0xA798, 0xA79A, 0xA79A, 0xA79C, 0xA79C, 0xA79E, 0xA79E, + 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, + 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, + 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, + 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, + 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, + 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF21, 0xFF3A, + 0x10400, 0x10427, 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, + 0x1058C, 0x10592, 0x10594, 0x10595, 0x10C80, 0x10CB2, 0x118A0, 0x118BF, + 0x16E40, 0x16E5F, 0x1E900, 0x1E921, + // #49 (6017+131): bp=Changes_When_Casemapped:CWCM + 0x0041, 0x005A, 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00C0, 0x00D6, + 0x00D8, 0x00F6, 0x00F8, 0x0137, 0x0139, 0x018C, 0x018E, 0x019A, + 0x019C, 0x01A9, 0x01AC, 0x01B9, 0x01BC, 0x01BD, 0x01BF, 0x01BF, + 0x01C4, 0x0220, 0x0222, 0x0233, 0x023A, 0x0254, 0x0256, 0x0257, + 0x0259, 0x0259, 0x025B, 0x025C, 0x0260, 0x0261, 0x0263, 0x0263, + 0x0265, 0x0266, 0x0268, 0x026C, 0x026F, 0x026F, 0x0271, 0x0272, + 0x0275, 0x0275, 0x027D, 0x027D, 0x0280, 0x0280, 0x0282, 0x0283, + 0x0287, 0x028C, 0x0292, 0x0292, 0x029D, 0x029E, 0x0345, 0x0345, + 0x0370, 0x0373, 0x0376, 0x0377, 0x037B, 0x037D, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x03D1, 0x03D5, 0x03F5, 0x03F7, 0x03FB, 0x03FD, 0x0481, + 0x048A, 0x052F, 0x0531, 0x0556, 0x0561, 0x0587, 0x10A0, 0x10C5, + 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, 0x10FD, 0x10FF, + 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1D79, 0x1D79, 0x1D7D, 0x1D7D, 0x1D8E, 0x1D8E, + 0x1E00, 0x1E9B, 0x1E9E, 0x1E9E, 0x1EA0, 0x1F15, 0x1F18, 0x1F1D, + 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, + 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, + 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FFC, 0x2126, 0x2126, 0x212A, 0x212B, 0x2132, 0x2132, + 0x214E, 0x214E, 0x2160, 0x217F, 0x2183, 0x2184, 0x24B6, 0x24E9, + 0x2C00, 0x2C70, 0x2C72, 0x2C73, 0x2C75, 0x2C76, 0x2C7E, 0x2CE3, + 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0xA640, 0xA66D, 0xA680, 0xA69B, 0xA722, 0xA72F, + 0xA732, 0xA76F, 0xA779, 0xA787, 0xA78B, 0xA78D, 0xA790, 0xA794, + 0xA796, 0xA7AE, 0xA7B0, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D6, 0xA7D9, + 0xA7F5, 0xA7F6, 0xAB53, 0xAB53, 0xAB70, 0xABBF, 0xFB00, 0xFB06, + 0xFB13, 0xFB17, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0x10400, 0x1044F, + 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10570, 0x1057A, 0x1057C, 0x1058A, + 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, + 0x118A0, 0x118DF, 0x16E40, 0x16E7F, 0x1E900, 0x1E943, + // #50 (6148+609): bp=Changes_When_Lowercased:CWL + 0x0041, 0x005A, 0x00C0, 0x00D6, 0x00D8, 0x00DE, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, + 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, 0x0141, 0x0141, + 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, 0x014A, 0x014A, + 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, 0x0152, 0x0152, + 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, 0x015A, 0x015A, + 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, 0x0162, 0x0162, + 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, 0x016A, 0x016A, + 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, 0x0172, 0x0172, + 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, 0x017B, 0x017B, + 0x017D, 0x017D, 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, + 0x0189, 0x018B, 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, + 0x019C, 0x019D, 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, + 0x01A6, 0x01A7, 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, + 0x01B1, 0x01B3, 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, + 0x01C4, 0x01C5, 0x01C7, 0x01C8, 0x01CA, 0x01CB, 0x01CD, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F2, 0x01F4, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, + 0x01FC, 0x01FC, 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, + 0x0204, 0x0204, 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, + 0x020C, 0x020C, 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, + 0x0214, 0x0214, 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, + 0x021C, 0x021C, 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, + 0x0224, 0x0224, 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, + 0x022C, 0x022C, 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, + 0x023A, 0x023B, 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, + 0x0248, 0x0248, 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, + 0x0370, 0x0370, 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, + 0x0391, 0x03A1, 0x03A3, 0x03AB, 0x03CF, 0x03CF, 0x03D8, 0x03D8, + 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, 0x03E0, 0x03E0, + 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, 0x03E8, 0x03E8, + 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, 0x03F4, 0x03F4, + 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, 0x0460, 0x0460, + 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, 0x0468, 0x0468, + 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, 0x0470, 0x0470, + 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, 0x0478, 0x0478, + 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, 0x0480, 0x0480, + 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, 0x0490, 0x0490, + 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, 0x0498, 0x0498, + 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, 0x04A0, 0x04A0, + 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, 0x04A8, 0x04A8, + 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, 0x04B0, 0x04B0, + 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, 0x04B8, 0x04B8, + 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, 0x04C0, 0x04C1, + 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, 0x04C9, 0x04C9, + 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, 0x04D2, 0x04D2, + 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, 0x04DA, 0x04DA, + 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, 0x04E2, 0x04E2, + 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, 0x04EA, 0x04EA, + 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, 0x04F2, 0x04F2, + 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, 0x04FA, 0x04FA, + 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, 0x0502, 0x0502, + 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, 0x050A, 0x050A, + 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, 0x0512, 0x0512, + 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, 0x051A, 0x051A, + 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, 0x0522, 0x0522, + 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, 0x052A, 0x052A, + 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, 0x10A0, 0x10C5, + 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x13A0, 0x13F5, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, 0x1E04, 0x1E04, + 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, 0x1E0C, 0x1E0C, + 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, 0x1E14, 0x1E14, + 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, 0x1E1C, 0x1E1C, + 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, 0x1E24, 0x1E24, + 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, 0x1E2C, 0x1E2C, + 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, 0x1E34, 0x1E34, + 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, 0x1E3C, 0x1E3C, + 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, 0x1E44, 0x1E44, + 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, 0x1E4C, 0x1E4C, + 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, 0x1E54, 0x1E54, + 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, 0x1E5C, 0x1E5C, + 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, 0x1E64, 0x1E64, + 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, 0x1E6C, 0x1E6C, + 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, 0x1E74, 0x1E74, + 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, 0x1E7C, 0x1E7C, + 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, 0x1E84, 0x1E84, + 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, 0x1E8C, 0x1E8C, + 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, 0x1E94, 0x1E94, + 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, 0x1EA4, 0x1EA4, + 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, 0x1EAC, 0x1EAC, + 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, 0x1EB4, 0x1EB4, + 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, 0x1EBC, 0x1EBC, + 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, 0x1EC4, 0x1EC4, + 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, 0x1ECC, 0x1ECC, + 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, 0x1ED4, 0x1ED4, + 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, 0x1EDC, 0x1EDC, + 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, 0x1EE4, 0x1EE4, + 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, 0x1EEC, 0x1EEC, + 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, 0x1EF4, 0x1EF4, + 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, 0x1EFC, 0x1EFC, + 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, 0x1F28, 0x1F2F, + 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, 0x1F88, 0x1F8F, + 0x1F98, 0x1F9F, 0x1FA8, 0x1FAF, 0x1FB8, 0x1FBC, 0x1FC8, 0x1FCC, + 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, 0x1FF8, 0x1FFC, 0x2126, 0x2126, + 0x212A, 0x212B, 0x2132, 0x2132, 0x2160, 0x216F, 0x2183, 0x2183, + 0x24B6, 0x24CF, 0x2C00, 0x2C2F, 0x2C60, 0x2C60, 0x2C62, 0x2C64, + 0x2C67, 0x2C67, 0x2C69, 0x2C69, 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, + 0x2C72, 0x2C72, 0x2C75, 0x2C75, 0x2C7E, 0x2C80, 0x2C82, 0x2C82, + 0x2C84, 0x2C84, 0x2C86, 0x2C86, 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, + 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, 0x2C90, 0x2C90, 0x2C92, 0x2C92, + 0x2C94, 0x2C94, 0x2C96, 0x2C96, 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, + 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, + 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, + 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, + 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, + 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, + 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, + 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, + 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, + 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, + 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, 0x2CF2, 0x2CF2, 0xA640, 0xA640, + 0xA642, 0xA642, 0xA644, 0xA644, 0xA646, 0xA646, 0xA648, 0xA648, + 0xA64A, 0xA64A, 0xA64C, 0xA64C, 0xA64E, 0xA64E, 0xA650, 0xA650, + 0xA652, 0xA652, 0xA654, 0xA654, 0xA656, 0xA656, 0xA658, 0xA658, + 0xA65A, 0xA65A, 0xA65C, 0xA65C, 0xA65E, 0xA65E, 0xA660, 0xA660, + 0xA662, 0xA662, 0xA664, 0xA664, 0xA666, 0xA666, 0xA668, 0xA668, + 0xA66A, 0xA66A, 0xA66C, 0xA66C, 0xA680, 0xA680, 0xA682, 0xA682, + 0xA684, 0xA684, 0xA686, 0xA686, 0xA688, 0xA688, 0xA68A, 0xA68A, + 0xA68C, 0xA68C, 0xA68E, 0xA68E, 0xA690, 0xA690, 0xA692, 0xA692, + 0xA694, 0xA694, 0xA696, 0xA696, 0xA698, 0xA698, 0xA69A, 0xA69A, + 0xA722, 0xA722, 0xA724, 0xA724, 0xA726, 0xA726, 0xA728, 0xA728, + 0xA72A, 0xA72A, 0xA72C, 0xA72C, 0xA72E, 0xA72E, 0xA732, 0xA732, + 0xA734, 0xA734, 0xA736, 0xA736, 0xA738, 0xA738, 0xA73A, 0xA73A, + 0xA73C, 0xA73C, 0xA73E, 0xA73E, 0xA740, 0xA740, 0xA742, 0xA742, + 0xA744, 0xA744, 0xA746, 0xA746, 0xA748, 0xA748, 0xA74A, 0xA74A, + 0xA74C, 0xA74C, 0xA74E, 0xA74E, 0xA750, 0xA750, 0xA752, 0xA752, + 0xA754, 0xA754, 0xA756, 0xA756, 0xA758, 0xA758, 0xA75A, 0xA75A, + 0xA75C, 0xA75C, 0xA75E, 0xA75E, 0xA760, 0xA760, 0xA762, 0xA762, + 0xA764, 0xA764, 0xA766, 0xA766, 0xA768, 0xA768, 0xA76A, 0xA76A, + 0xA76C, 0xA76C, 0xA76E, 0xA76E, 0xA779, 0xA779, 0xA77B, 0xA77B, + 0xA77D, 0xA77E, 0xA780, 0xA780, 0xA782, 0xA782, 0xA784, 0xA784, + 0xA786, 0xA786, 0xA78B, 0xA78B, 0xA78D, 0xA78D, 0xA790, 0xA790, + 0xA792, 0xA792, 0xA796, 0xA796, 0xA798, 0xA798, 0xA79A, 0xA79A, + 0xA79C, 0xA79C, 0xA79E, 0xA79E, 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, + 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, + 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, + 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, + 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, + 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, 0xFF21, 0xFF3A, 0x10400, 0x10427, + 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10C80, 0x10CB2, 0x118A0, 0x118BF, 0x16E40, 0x16E5F, + 0x1E900, 0x1E921, + // #51 (6757+838): bp=Changes_When_NFKC_Casefolded:CWKCF + 0x0041, 0x005A, 0x00A0, 0x00A0, 0x00A8, 0x00A8, 0x00AA, 0x00AA, + 0x00AD, 0x00AD, 0x00AF, 0x00AF, 0x00B2, 0x00B5, 0x00B8, 0x00BA, + 0x00BC, 0x00BE, 0x00C0, 0x00D6, 0x00D8, 0x00DF, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, 0x013B, 0x013B, + 0x013D, 0x013D, 0x013F, 0x0141, 0x0143, 0x0143, 0x0145, 0x0145, + 0x0147, 0x0147, 0x0149, 0x014A, 0x014C, 0x014C, 0x014E, 0x014E, + 0x0150, 0x0150, 0x0152, 0x0152, 0x0154, 0x0154, 0x0156, 0x0156, + 0x0158, 0x0158, 0x015A, 0x015A, 0x015C, 0x015C, 0x015E, 0x015E, + 0x0160, 0x0160, 0x0162, 0x0162, 0x0164, 0x0164, 0x0166, 0x0166, + 0x0168, 0x0168, 0x016A, 0x016A, 0x016C, 0x016C, 0x016E, 0x016E, + 0x0170, 0x0170, 0x0172, 0x0172, 0x0174, 0x0174, 0x0176, 0x0176, + 0x0178, 0x0179, 0x017B, 0x017B, 0x017D, 0x017D, 0x017F, 0x017F, + 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, 0x0189, 0x018B, + 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, 0x019C, 0x019D, + 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, 0x01A6, 0x01A7, + 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, 0x01B1, 0x01B3, + 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, 0x01C4, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, 0x01FC, 0x01FC, + 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, 0x0204, 0x0204, + 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, 0x020C, 0x020C, + 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, 0x0214, 0x0214, + 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, 0x021C, 0x021C, + 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, 0x0224, 0x0224, + 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, 0x022C, 0x022C, + 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, 0x023A, 0x023B, + 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, 0x0248, 0x0248, + 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, 0x02B0, 0x02B8, + 0x02D8, 0x02DD, 0x02E0, 0x02E4, 0x0340, 0x0341, 0x0343, 0x0345, + 0x034F, 0x034F, 0x0370, 0x0370, 0x0372, 0x0372, 0x0374, 0x0374, + 0x0376, 0x0376, 0x037A, 0x037A, 0x037E, 0x037F, 0x0384, 0x038A, + 0x038C, 0x038C, 0x038E, 0x038F, 0x0391, 0x03A1, 0x03A3, 0x03AB, + 0x03C2, 0x03C2, 0x03CF, 0x03D6, 0x03D8, 0x03D8, 0x03DA, 0x03DA, + 0x03DC, 0x03DC, 0x03DE, 0x03DE, 0x03E0, 0x03E0, 0x03E2, 0x03E2, + 0x03E4, 0x03E4, 0x03E6, 0x03E6, 0x03E8, 0x03E8, 0x03EA, 0x03EA, + 0x03EC, 0x03EC, 0x03EE, 0x03EE, 0x03F0, 0x03F2, 0x03F4, 0x03F5, + 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, 0x0460, 0x0460, + 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, 0x0468, 0x0468, + 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, 0x0470, 0x0470, + 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, 0x0478, 0x0478, + 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, 0x0480, 0x0480, + 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, 0x0490, 0x0490, + 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, 0x0498, 0x0498, + 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, 0x04A0, 0x04A0, + 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, 0x04A8, 0x04A8, + 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, 0x04B0, 0x04B0, + 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, 0x04B8, 0x04B8, + 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, 0x04C0, 0x04C1, + 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, 0x04C9, 0x04C9, + 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, 0x04D2, 0x04D2, + 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, 0x04DA, 0x04DA, + 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, 0x04E2, 0x04E2, + 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, 0x04EA, 0x04EA, + 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, 0x04F2, 0x04F2, + 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, 0x04FA, 0x04FA, + 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, 0x0502, 0x0502, + 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, 0x050A, 0x050A, + 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, 0x0512, 0x0512, + 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, 0x051A, 0x051A, + 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, 0x0522, 0x0522, + 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, 0x052A, 0x052A, + 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, 0x0587, 0x0587, + 0x061C, 0x061C, 0x0675, 0x0678, 0x0958, 0x095F, 0x09DC, 0x09DD, + 0x09DF, 0x09DF, 0x0A33, 0x0A33, 0x0A36, 0x0A36, 0x0A59, 0x0A5B, + 0x0A5E, 0x0A5E, 0x0B5C, 0x0B5D, 0x0E33, 0x0E33, 0x0EB3, 0x0EB3, + 0x0EDC, 0x0EDD, 0x0F0C, 0x0F0C, 0x0F43, 0x0F43, 0x0F4D, 0x0F4D, + 0x0F52, 0x0F52, 0x0F57, 0x0F57, 0x0F5C, 0x0F5C, 0x0F69, 0x0F69, + 0x0F73, 0x0F73, 0x0F75, 0x0F79, 0x0F81, 0x0F81, 0x0F93, 0x0F93, + 0x0F9D, 0x0F9D, 0x0FA2, 0x0FA2, 0x0FA7, 0x0FA7, 0x0FAC, 0x0FAC, + 0x0FB9, 0x0FB9, 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, + 0x10FC, 0x10FC, 0x115F, 0x1160, 0x13F8, 0x13FD, 0x17B4, 0x17B5, + 0x180B, 0x180F, 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, + 0x1D2C, 0x1D2E, 0x1D30, 0x1D3A, 0x1D3C, 0x1D4D, 0x1D4F, 0x1D6A, + 0x1D78, 0x1D78, 0x1D9B, 0x1DBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, + 0x1E04, 0x1E04, 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, + 0x1E0C, 0x1E0C, 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, + 0x1E14, 0x1E14, 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, + 0x1E1C, 0x1E1C, 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, + 0x1E24, 0x1E24, 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, + 0x1E2C, 0x1E2C, 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, + 0x1E34, 0x1E34, 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, + 0x1E3C, 0x1E3C, 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, + 0x1E44, 0x1E44, 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, + 0x1E4C, 0x1E4C, 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, + 0x1E54, 0x1E54, 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, + 0x1E5C, 0x1E5C, 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, + 0x1E64, 0x1E64, 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, + 0x1E6C, 0x1E6C, 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, + 0x1E74, 0x1E74, 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, + 0x1E7C, 0x1E7C, 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, + 0x1E84, 0x1E84, 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, + 0x1E8C, 0x1E8C, 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, + 0x1E94, 0x1E94, 0x1E9A, 0x1E9B, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, + 0x1EA2, 0x1EA2, 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, + 0x1EAA, 0x1EAA, 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, + 0x1EB2, 0x1EB2, 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, + 0x1EBA, 0x1EBA, 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, + 0x1EC2, 0x1EC2, 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, + 0x1ECA, 0x1ECA, 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, + 0x1ED2, 0x1ED2, 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, + 0x1EDA, 0x1EDA, 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, + 0x1EE2, 0x1EE2, 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, + 0x1EEA, 0x1EEA, 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, + 0x1EF2, 0x1EF2, 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, + 0x1EFA, 0x1EFA, 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, + 0x1F18, 0x1F1D, 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, + 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, + 0x1F68, 0x1F6F, 0x1F71, 0x1F71, 0x1F73, 0x1F73, 0x1F75, 0x1F75, + 0x1F77, 0x1F77, 0x1F79, 0x1F79, 0x1F7B, 0x1F7B, 0x1F7D, 0x1F7D, + 0x1F80, 0x1FAF, 0x1FB2, 0x1FB4, 0x1FB7, 0x1FC4, 0x1FC7, 0x1FCF, + 0x1FD3, 0x1FD3, 0x1FD8, 0x1FDB, 0x1FDD, 0x1FDF, 0x1FE3, 0x1FE3, + 0x1FE8, 0x1FEF, 0x1FF2, 0x1FF4, 0x1FF7, 0x1FFE, 0x2000, 0x200F, + 0x2011, 0x2011, 0x2017, 0x2017, 0x2024, 0x2026, 0x202A, 0x202F, + 0x2033, 0x2034, 0x2036, 0x2037, 0x203C, 0x203C, 0x203E, 0x203E, + 0x2047, 0x2049, 0x2057, 0x2057, 0x205F, 0x2071, 0x2074, 0x208E, + 0x2090, 0x209C, 0x20A8, 0x20A8, 0x2100, 0x2103, 0x2105, 0x2107, + 0x2109, 0x2113, 0x2115, 0x2116, 0x2119, 0x211D, 0x2120, 0x2122, + 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, + 0x212F, 0x2139, 0x213B, 0x2140, 0x2145, 0x2149, 0x2150, 0x217F, + 0x2183, 0x2183, 0x2189, 0x2189, 0x222C, 0x222D, 0x222F, 0x2230, + 0x2329, 0x232A, 0x2460, 0x24EA, 0x2A0C, 0x2A0C, 0x2A74, 0x2A76, + 0x2ADC, 0x2ADC, 0x2C00, 0x2C2F, 0x2C60, 0x2C60, 0x2C62, 0x2C64, + 0x2C67, 0x2C67, 0x2C69, 0x2C69, 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, + 0x2C72, 0x2C72, 0x2C75, 0x2C75, 0x2C7C, 0x2C80, 0x2C82, 0x2C82, + 0x2C84, 0x2C84, 0x2C86, 0x2C86, 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, + 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, 0x2C90, 0x2C90, 0x2C92, 0x2C92, + 0x2C94, 0x2C94, 0x2C96, 0x2C96, 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, + 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, + 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, + 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, + 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, + 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, + 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, + 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, + 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, + 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, + 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, 0x2CF2, 0x2CF2, 0x2D6F, 0x2D6F, + 0x2E9F, 0x2E9F, 0x2EF3, 0x2EF3, 0x2F00, 0x2FD5, 0x3000, 0x3000, + 0x3036, 0x3036, 0x3038, 0x303A, 0x309B, 0x309C, 0x309F, 0x309F, + 0x30FF, 0x30FF, 0x3131, 0x318E, 0x3192, 0x319F, 0x3200, 0x321E, + 0x3220, 0x3247, 0x3250, 0x327E, 0x3280, 0x33FF, 0xA640, 0xA640, + 0xA642, 0xA642, 0xA644, 0xA644, 0xA646, 0xA646, 0xA648, 0xA648, + 0xA64A, 0xA64A, 0xA64C, 0xA64C, 0xA64E, 0xA64E, 0xA650, 0xA650, + 0xA652, 0xA652, 0xA654, 0xA654, 0xA656, 0xA656, 0xA658, 0xA658, + 0xA65A, 0xA65A, 0xA65C, 0xA65C, 0xA65E, 0xA65E, 0xA660, 0xA660, + 0xA662, 0xA662, 0xA664, 0xA664, 0xA666, 0xA666, 0xA668, 0xA668, + 0xA66A, 0xA66A, 0xA66C, 0xA66C, 0xA680, 0xA680, 0xA682, 0xA682, + 0xA684, 0xA684, 0xA686, 0xA686, 0xA688, 0xA688, 0xA68A, 0xA68A, + 0xA68C, 0xA68C, 0xA68E, 0xA68E, 0xA690, 0xA690, 0xA692, 0xA692, + 0xA694, 0xA694, 0xA696, 0xA696, 0xA698, 0xA698, 0xA69A, 0xA69A, + 0xA69C, 0xA69D, 0xA722, 0xA722, 0xA724, 0xA724, 0xA726, 0xA726, + 0xA728, 0xA728, 0xA72A, 0xA72A, 0xA72C, 0xA72C, 0xA72E, 0xA72E, + 0xA732, 0xA732, 0xA734, 0xA734, 0xA736, 0xA736, 0xA738, 0xA738, + 0xA73A, 0xA73A, 0xA73C, 0xA73C, 0xA73E, 0xA73E, 0xA740, 0xA740, + 0xA742, 0xA742, 0xA744, 0xA744, 0xA746, 0xA746, 0xA748, 0xA748, + 0xA74A, 0xA74A, 0xA74C, 0xA74C, 0xA74E, 0xA74E, 0xA750, 0xA750, + 0xA752, 0xA752, 0xA754, 0xA754, 0xA756, 0xA756, 0xA758, 0xA758, + 0xA75A, 0xA75A, 0xA75C, 0xA75C, 0xA75E, 0xA75E, 0xA760, 0xA760, + 0xA762, 0xA762, 0xA764, 0xA764, 0xA766, 0xA766, 0xA768, 0xA768, + 0xA76A, 0xA76A, 0xA76C, 0xA76C, 0xA76E, 0xA76E, 0xA770, 0xA770, + 0xA779, 0xA779, 0xA77B, 0xA77B, 0xA77D, 0xA77E, 0xA780, 0xA780, + 0xA782, 0xA782, 0xA784, 0xA784, 0xA786, 0xA786, 0xA78B, 0xA78B, + 0xA78D, 0xA78D, 0xA790, 0xA790, 0xA792, 0xA792, 0xA796, 0xA796, + 0xA798, 0xA798, 0xA79A, 0xA79A, 0xA79C, 0xA79C, 0xA79E, 0xA79E, + 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, + 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, + 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, + 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, + 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, 0xA7D8, 0xA7D8, 0xA7F2, 0xA7F5, + 0xA7F8, 0xA7F9, 0xAB5C, 0xAB5F, 0xAB69, 0xAB69, 0xAB70, 0xABBF, + 0xF900, 0xFA0D, 0xFA10, 0xFA10, 0xFA12, 0xFA12, 0xFA15, 0xFA1E, + 0xFA20, 0xFA20, 0xFA22, 0xFA22, 0xFA25, 0xFA26, 0xFA2A, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, + 0xFB1F, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, + 0xFB43, 0xFB44, 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, + 0xFD92, 0xFDC7, 0xFDF0, 0xFDFC, 0xFE00, 0xFE19, 0xFE30, 0xFE44, + 0xFE47, 0xFE52, 0xFE54, 0xFE66, 0xFE68, 0xFE6B, 0xFE70, 0xFE72, + 0xFE74, 0xFE74, 0xFE76, 0xFEFC, 0xFEFF, 0xFEFF, 0xFF01, 0xFFBE, + 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, 0xFFF0, 0xFFF8, 0x10400, 0x10427, + 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10781, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, + 0x10C80, 0x10CB2, 0x118A0, 0x118BF, 0x16E40, 0x16E5F, 0x1BCA0, 0x1BCA3, + 0x1D15E, 0x1D164, 0x1D173, 0x1D17A, 0x1D1BB, 0x1D1C0, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D7FF, + 0x1E900, 0x1E921, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1F100, 0x1F10A, 0x1F110, 0x1F12E, + 0x1F130, 0x1F14F, 0x1F16A, 0x1F16C, 0x1F190, 0x1F190, 0x1F200, 0x1F202, + 0x1F210, 0x1F23B, 0x1F240, 0x1F248, 0x1F250, 0x1F251, 0x1FBF0, 0x1FBF9, + 0x2F800, 0x2FA1D, 0xE0000, 0xE0FFF, + // #52 (7595+626): bp=Changes_When_Titlecased:CWT + 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00DF, 0x00F6, 0x00F8, 0x00FF, + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010B, 0x010B, 0x010D, 0x010D, 0x010F, 0x010F, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011B, 0x011B, 0x011D, 0x011D, 0x011F, 0x011F, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012B, 0x012B, 0x012D, 0x012D, 0x012F, 0x012F, + 0x0131, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, + 0x013A, 0x013A, 0x013C, 0x013C, 0x013E, 0x013E, 0x0140, 0x0140, + 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, 0x0149, + 0x014B, 0x014B, 0x014D, 0x014D, 0x014F, 0x014F, 0x0151, 0x0151, + 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, 0x0159, 0x0159, + 0x015B, 0x015B, 0x015D, 0x015D, 0x015F, 0x015F, 0x0161, 0x0161, + 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, 0x0169, 0x0169, + 0x016B, 0x016B, 0x016D, 0x016D, 0x016F, 0x016F, 0x0171, 0x0171, + 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, 0x017A, 0x017A, + 0x017C, 0x017C, 0x017E, 0x0180, 0x0183, 0x0183, 0x0185, 0x0185, + 0x0188, 0x0188, 0x018C, 0x018C, 0x0192, 0x0192, 0x0195, 0x0195, + 0x0199, 0x019A, 0x019E, 0x019E, 0x01A1, 0x01A1, 0x01A3, 0x01A3, + 0x01A5, 0x01A5, 0x01A8, 0x01A8, 0x01AD, 0x01AD, 0x01B0, 0x01B0, + 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x01B9, 0x01B9, 0x01BD, 0x01BD, + 0x01BF, 0x01BF, 0x01C4, 0x01C4, 0x01C6, 0x01C7, 0x01C9, 0x01CA, + 0x01CC, 0x01CC, 0x01CE, 0x01CE, 0x01D0, 0x01D0, 0x01D2, 0x01D2, + 0x01D4, 0x01D4, 0x01D6, 0x01D6, 0x01D8, 0x01D8, 0x01DA, 0x01DA, + 0x01DC, 0x01DD, 0x01DF, 0x01DF, 0x01E1, 0x01E1, 0x01E3, 0x01E3, + 0x01E5, 0x01E5, 0x01E7, 0x01E7, 0x01E9, 0x01E9, 0x01EB, 0x01EB, + 0x01ED, 0x01ED, 0x01EF, 0x01F1, 0x01F3, 0x01F3, 0x01F5, 0x01F5, + 0x01F9, 0x01F9, 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF, + 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, + 0x0209, 0x0209, 0x020B, 0x020B, 0x020D, 0x020D, 0x020F, 0x020F, + 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, + 0x0219, 0x0219, 0x021B, 0x021B, 0x021D, 0x021D, 0x021F, 0x021F, + 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, + 0x022B, 0x022B, 0x022D, 0x022D, 0x022F, 0x022F, 0x0231, 0x0231, + 0x0233, 0x0233, 0x023C, 0x023C, 0x023F, 0x0240, 0x0242, 0x0242, + 0x0247, 0x0247, 0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, + 0x024F, 0x0254, 0x0256, 0x0257, 0x0259, 0x0259, 0x025B, 0x025C, + 0x0260, 0x0261, 0x0263, 0x0263, 0x0265, 0x0266, 0x0268, 0x026C, + 0x026F, 0x026F, 0x0271, 0x0272, 0x0275, 0x0275, 0x027D, 0x027D, + 0x0280, 0x0280, 0x0282, 0x0283, 0x0287, 0x028C, 0x0292, 0x0292, + 0x029D, 0x029E, 0x0345, 0x0345, 0x0371, 0x0371, 0x0373, 0x0373, + 0x0377, 0x0377, 0x037B, 0x037D, 0x0390, 0x0390, 0x03AC, 0x03CE, + 0x03D0, 0x03D1, 0x03D5, 0x03D7, 0x03D9, 0x03D9, 0x03DB, 0x03DB, + 0x03DD, 0x03DD, 0x03DF, 0x03DF, 0x03E1, 0x03E1, 0x03E3, 0x03E3, + 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, + 0x03ED, 0x03ED, 0x03EF, 0x03F3, 0x03F5, 0x03F5, 0x03F8, 0x03F8, + 0x03FB, 0x03FB, 0x0430, 0x045F, 0x0461, 0x0461, 0x0463, 0x0463, + 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, + 0x046D, 0x046D, 0x046F, 0x046F, 0x0471, 0x0471, 0x0473, 0x0473, + 0x0475, 0x0475, 0x0477, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, + 0x047D, 0x047D, 0x047F, 0x047F, 0x0481, 0x0481, 0x048B, 0x048B, + 0x048D, 0x048D, 0x048F, 0x048F, 0x0491, 0x0491, 0x0493, 0x0493, + 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, + 0x049D, 0x049D, 0x049F, 0x049F, 0x04A1, 0x04A1, 0x04A3, 0x04A3, + 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, + 0x04AD, 0x04AD, 0x04AF, 0x04AF, 0x04B1, 0x04B1, 0x04B3, 0x04B3, + 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, + 0x04BD, 0x04BD, 0x04BF, 0x04BF, 0x04C2, 0x04C2, 0x04C4, 0x04C4, + 0x04C6, 0x04C6, 0x04C8, 0x04C8, 0x04CA, 0x04CA, 0x04CC, 0x04CC, + 0x04CE, 0x04CF, 0x04D1, 0x04D1, 0x04D3, 0x04D3, 0x04D5, 0x04D5, + 0x04D7, 0x04D7, 0x04D9, 0x04D9, 0x04DB, 0x04DB, 0x04DD, 0x04DD, + 0x04DF, 0x04DF, 0x04E1, 0x04E1, 0x04E3, 0x04E3, 0x04E5, 0x04E5, + 0x04E7, 0x04E7, 0x04E9, 0x04E9, 0x04EB, 0x04EB, 0x04ED, 0x04ED, + 0x04EF, 0x04EF, 0x04F1, 0x04F1, 0x04F3, 0x04F3, 0x04F5, 0x04F5, + 0x04F7, 0x04F7, 0x04F9, 0x04F9, 0x04FB, 0x04FB, 0x04FD, 0x04FD, + 0x04FF, 0x04FF, 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, + 0x0507, 0x0507, 0x0509, 0x0509, 0x050B, 0x050B, 0x050D, 0x050D, + 0x050F, 0x050F, 0x0511, 0x0511, 0x0513, 0x0513, 0x0515, 0x0515, + 0x0517, 0x0517, 0x0519, 0x0519, 0x051B, 0x051B, 0x051D, 0x051D, + 0x051F, 0x051F, 0x0521, 0x0521, 0x0523, 0x0523, 0x0525, 0x0525, + 0x0527, 0x0527, 0x0529, 0x0529, 0x052B, 0x052B, 0x052D, 0x052D, + 0x052F, 0x052F, 0x0561, 0x0587, 0x13F8, 0x13FD, 0x1C80, 0x1C88, + 0x1D79, 0x1D79, 0x1D7D, 0x1D7D, 0x1D8E, 0x1D8E, 0x1E01, 0x1E01, + 0x1E03, 0x1E03, 0x1E05, 0x1E05, 0x1E07, 0x1E07, 0x1E09, 0x1E09, + 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, 0x1E0F, 0x1E0F, 0x1E11, 0x1E11, + 0x1E13, 0x1E13, 0x1E15, 0x1E15, 0x1E17, 0x1E17, 0x1E19, 0x1E19, + 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, 0x1E1F, 0x1E1F, 0x1E21, 0x1E21, + 0x1E23, 0x1E23, 0x1E25, 0x1E25, 0x1E27, 0x1E27, 0x1E29, 0x1E29, + 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, 0x1E2F, 0x1E2F, 0x1E31, 0x1E31, + 0x1E33, 0x1E33, 0x1E35, 0x1E35, 0x1E37, 0x1E37, 0x1E39, 0x1E39, + 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, 0x1E3F, 0x1E3F, 0x1E41, 0x1E41, + 0x1E43, 0x1E43, 0x1E45, 0x1E45, 0x1E47, 0x1E47, 0x1E49, 0x1E49, + 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, 0x1E4F, 0x1E4F, 0x1E51, 0x1E51, + 0x1E53, 0x1E53, 0x1E55, 0x1E55, 0x1E57, 0x1E57, 0x1E59, 0x1E59, + 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, 0x1E5F, 0x1E5F, 0x1E61, 0x1E61, + 0x1E63, 0x1E63, 0x1E65, 0x1E65, 0x1E67, 0x1E67, 0x1E69, 0x1E69, + 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, 0x1E6F, 0x1E6F, 0x1E71, 0x1E71, + 0x1E73, 0x1E73, 0x1E75, 0x1E75, 0x1E77, 0x1E77, 0x1E79, 0x1E79, + 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, 0x1E7F, 0x1E7F, 0x1E81, 0x1E81, + 0x1E83, 0x1E83, 0x1E85, 0x1E85, 0x1E87, 0x1E87, 0x1E89, 0x1E89, + 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, 0x1E8F, 0x1E8F, 0x1E91, 0x1E91, + 0x1E93, 0x1E93, 0x1E95, 0x1E9B, 0x1EA1, 0x1EA1, 0x1EA3, 0x1EA3, + 0x1EA5, 0x1EA5, 0x1EA7, 0x1EA7, 0x1EA9, 0x1EA9, 0x1EAB, 0x1EAB, + 0x1EAD, 0x1EAD, 0x1EAF, 0x1EAF, 0x1EB1, 0x1EB1, 0x1EB3, 0x1EB3, + 0x1EB5, 0x1EB5, 0x1EB7, 0x1EB7, 0x1EB9, 0x1EB9, 0x1EBB, 0x1EBB, + 0x1EBD, 0x1EBD, 0x1EBF, 0x1EBF, 0x1EC1, 0x1EC1, 0x1EC3, 0x1EC3, + 0x1EC5, 0x1EC5, 0x1EC7, 0x1EC7, 0x1EC9, 0x1EC9, 0x1ECB, 0x1ECB, + 0x1ECD, 0x1ECD, 0x1ECF, 0x1ECF, 0x1ED1, 0x1ED1, 0x1ED3, 0x1ED3, + 0x1ED5, 0x1ED5, 0x1ED7, 0x1ED7, 0x1ED9, 0x1ED9, 0x1EDB, 0x1EDB, + 0x1EDD, 0x1EDD, 0x1EDF, 0x1EDF, 0x1EE1, 0x1EE1, 0x1EE3, 0x1EE3, + 0x1EE5, 0x1EE5, 0x1EE7, 0x1EE7, 0x1EE9, 0x1EE9, 0x1EEB, 0x1EEB, + 0x1EED, 0x1EED, 0x1EEF, 0x1EEF, 0x1EF1, 0x1EF1, 0x1EF3, 0x1EF3, + 0x1EF5, 0x1EF5, 0x1EF7, 0x1EF7, 0x1EF9, 0x1EF9, 0x1EFB, 0x1EFB, + 0x1EFD, 0x1EFD, 0x1EFF, 0x1F07, 0x1F10, 0x1F15, 0x1F20, 0x1F27, + 0x1F30, 0x1F37, 0x1F40, 0x1F45, 0x1F50, 0x1F57, 0x1F60, 0x1F67, + 0x1F70, 0x1F7D, 0x1F80, 0x1F87, 0x1F90, 0x1F97, 0x1FA0, 0x1FA7, + 0x1FB0, 0x1FB4, 0x1FB6, 0x1FB7, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, + 0x1FC6, 0x1FC7, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, + 0x1FF2, 0x1FF4, 0x1FF6, 0x1FF7, 0x214E, 0x214E, 0x2170, 0x217F, + 0x2184, 0x2184, 0x24D0, 0x24E9, 0x2C30, 0x2C5F, 0x2C61, 0x2C61, + 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, 0x2C6C, 0x2C6C, + 0x2C73, 0x2C73, 0x2C76, 0x2C76, 0x2C81, 0x2C81, 0x2C83, 0x2C83, + 0x2C85, 0x2C85, 0x2C87, 0x2C87, 0x2C89, 0x2C89, 0x2C8B, 0x2C8B, + 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, 0x2C91, 0x2C91, 0x2C93, 0x2C93, + 0x2C95, 0x2C95, 0x2C97, 0x2C97, 0x2C99, 0x2C99, 0x2C9B, 0x2C9B, + 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, 0x2CA1, 0x2CA1, 0x2CA3, 0x2CA3, + 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, 0x2CA9, 0x2CA9, 0x2CAB, 0x2CAB, + 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, 0x2CB1, 0x2CB1, 0x2CB3, 0x2CB3, + 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, 0x2CB9, 0x2CB9, 0x2CBB, 0x2CBB, + 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, 0x2CC1, 0x2CC1, 0x2CC3, 0x2CC3, + 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, 0x2CC9, 0x2CC9, 0x2CCB, 0x2CCB, + 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, 0x2CD1, 0x2CD1, 0x2CD3, 0x2CD3, + 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, 0x2CD9, 0x2CD9, 0x2CDB, 0x2CDB, + 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, 0x2CE1, 0x2CE1, 0x2CE3, 0x2CE3, + 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, 0x2CF3, 0x2CF3, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0xA641, 0xA641, 0xA643, 0xA643, + 0xA645, 0xA645, 0xA647, 0xA647, 0xA649, 0xA649, 0xA64B, 0xA64B, + 0xA64D, 0xA64D, 0xA64F, 0xA64F, 0xA651, 0xA651, 0xA653, 0xA653, + 0xA655, 0xA655, 0xA657, 0xA657, 0xA659, 0xA659, 0xA65B, 0xA65B, + 0xA65D, 0xA65D, 0xA65F, 0xA65F, 0xA661, 0xA661, 0xA663, 0xA663, + 0xA665, 0xA665, 0xA667, 0xA667, 0xA669, 0xA669, 0xA66B, 0xA66B, + 0xA66D, 0xA66D, 0xA681, 0xA681, 0xA683, 0xA683, 0xA685, 0xA685, + 0xA687, 0xA687, 0xA689, 0xA689, 0xA68B, 0xA68B, 0xA68D, 0xA68D, + 0xA68F, 0xA68F, 0xA691, 0xA691, 0xA693, 0xA693, 0xA695, 0xA695, + 0xA697, 0xA697, 0xA699, 0xA699, 0xA69B, 0xA69B, 0xA723, 0xA723, + 0xA725, 0xA725, 0xA727, 0xA727, 0xA729, 0xA729, 0xA72B, 0xA72B, + 0xA72D, 0xA72D, 0xA72F, 0xA72F, 0xA733, 0xA733, 0xA735, 0xA735, + 0xA737, 0xA737, 0xA739, 0xA739, 0xA73B, 0xA73B, 0xA73D, 0xA73D, + 0xA73F, 0xA73F, 0xA741, 0xA741, 0xA743, 0xA743, 0xA745, 0xA745, + 0xA747, 0xA747, 0xA749, 0xA749, 0xA74B, 0xA74B, 0xA74D, 0xA74D, + 0xA74F, 0xA74F, 0xA751, 0xA751, 0xA753, 0xA753, 0xA755, 0xA755, + 0xA757, 0xA757, 0xA759, 0xA759, 0xA75B, 0xA75B, 0xA75D, 0xA75D, + 0xA75F, 0xA75F, 0xA761, 0xA761, 0xA763, 0xA763, 0xA765, 0xA765, + 0xA767, 0xA767, 0xA769, 0xA769, 0xA76B, 0xA76B, 0xA76D, 0xA76D, + 0xA76F, 0xA76F, 0xA77A, 0xA77A, 0xA77C, 0xA77C, 0xA77F, 0xA77F, + 0xA781, 0xA781, 0xA783, 0xA783, 0xA785, 0xA785, 0xA787, 0xA787, + 0xA78C, 0xA78C, 0xA791, 0xA791, 0xA793, 0xA794, 0xA797, 0xA797, + 0xA799, 0xA799, 0xA79B, 0xA79B, 0xA79D, 0xA79D, 0xA79F, 0xA79F, + 0xA7A1, 0xA7A1, 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, 0xA7A7, 0xA7A7, + 0xA7A9, 0xA7A9, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, 0xA7B9, 0xA7B9, + 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, 0xA7C1, 0xA7C1, + 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, 0xA7D1, 0xA7D1, + 0xA7D7, 0xA7D7, 0xA7D9, 0xA7D9, 0xA7F6, 0xA7F6, 0xAB53, 0xAB53, + 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF41, 0xFF5A, + 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10CC0, 0x10CF2, 0x118C0, 0x118DF, + 0x16E60, 0x16E7F, 0x1E922, 0x1E943, + // #53 (8221+627): bp=Changes_When_Uppercased:CWU + 0x0061, 0x007A, 0x00B5, 0x00B5, 0x00DF, 0x00F6, 0x00F8, 0x00FF, + 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, + 0x0109, 0x0109, 0x010B, 0x010B, 0x010D, 0x010D, 0x010F, 0x010F, + 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, + 0x0119, 0x0119, 0x011B, 0x011B, 0x011D, 0x011D, 0x011F, 0x011F, + 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, + 0x0129, 0x0129, 0x012B, 0x012B, 0x012D, 0x012D, 0x012F, 0x012F, + 0x0131, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, + 0x013A, 0x013A, 0x013C, 0x013C, 0x013E, 0x013E, 0x0140, 0x0140, + 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, 0x0149, + 0x014B, 0x014B, 0x014D, 0x014D, 0x014F, 0x014F, 0x0151, 0x0151, + 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, 0x0159, 0x0159, + 0x015B, 0x015B, 0x015D, 0x015D, 0x015F, 0x015F, 0x0161, 0x0161, + 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, 0x0169, 0x0169, + 0x016B, 0x016B, 0x016D, 0x016D, 0x016F, 0x016F, 0x0171, 0x0171, + 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, 0x017A, 0x017A, + 0x017C, 0x017C, 0x017E, 0x0180, 0x0183, 0x0183, 0x0185, 0x0185, + 0x0188, 0x0188, 0x018C, 0x018C, 0x0192, 0x0192, 0x0195, 0x0195, + 0x0199, 0x019A, 0x019E, 0x019E, 0x01A1, 0x01A1, 0x01A3, 0x01A3, + 0x01A5, 0x01A5, 0x01A8, 0x01A8, 0x01AD, 0x01AD, 0x01B0, 0x01B0, + 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x01B9, 0x01B9, 0x01BD, 0x01BD, + 0x01BF, 0x01BF, 0x01C5, 0x01C6, 0x01C8, 0x01C9, 0x01CB, 0x01CC, + 0x01CE, 0x01CE, 0x01D0, 0x01D0, 0x01D2, 0x01D2, 0x01D4, 0x01D4, + 0x01D6, 0x01D6, 0x01D8, 0x01D8, 0x01DA, 0x01DA, 0x01DC, 0x01DD, + 0x01DF, 0x01DF, 0x01E1, 0x01E1, 0x01E3, 0x01E3, 0x01E5, 0x01E5, + 0x01E7, 0x01E7, 0x01E9, 0x01E9, 0x01EB, 0x01EB, 0x01ED, 0x01ED, + 0x01EF, 0x01F0, 0x01F2, 0x01F3, 0x01F5, 0x01F5, 0x01F9, 0x01F9, + 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF, 0x0201, 0x0201, + 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, 0x0209, 0x0209, + 0x020B, 0x020B, 0x020D, 0x020D, 0x020F, 0x020F, 0x0211, 0x0211, + 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, 0x0219, 0x0219, + 0x021B, 0x021B, 0x021D, 0x021D, 0x021F, 0x021F, 0x0223, 0x0223, + 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, 0x022B, 0x022B, + 0x022D, 0x022D, 0x022F, 0x022F, 0x0231, 0x0231, 0x0233, 0x0233, + 0x023C, 0x023C, 0x023F, 0x0240, 0x0242, 0x0242, 0x0247, 0x0247, + 0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, 0x024F, 0x0254, + 0x0256, 0x0257, 0x0259, 0x0259, 0x025B, 0x025C, 0x0260, 0x0261, + 0x0263, 0x0263, 0x0265, 0x0266, 0x0268, 0x026C, 0x026F, 0x026F, + 0x0271, 0x0272, 0x0275, 0x0275, 0x027D, 0x027D, 0x0280, 0x0280, + 0x0282, 0x0283, 0x0287, 0x028C, 0x0292, 0x0292, 0x029D, 0x029E, + 0x0345, 0x0345, 0x0371, 0x0371, 0x0373, 0x0373, 0x0377, 0x0377, + 0x037B, 0x037D, 0x0390, 0x0390, 0x03AC, 0x03CE, 0x03D0, 0x03D1, + 0x03D5, 0x03D7, 0x03D9, 0x03D9, 0x03DB, 0x03DB, 0x03DD, 0x03DD, + 0x03DF, 0x03DF, 0x03E1, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, + 0x03E7, 0x03E7, 0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, + 0x03EF, 0x03F3, 0x03F5, 0x03F5, 0x03F8, 0x03F8, 0x03FB, 0x03FB, + 0x0430, 0x045F, 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, + 0x0467, 0x0467, 0x0469, 0x0469, 0x046B, 0x046B, 0x046D, 0x046D, + 0x046F, 0x046F, 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, + 0x0477, 0x0477, 0x0479, 0x0479, 0x047B, 0x047B, 0x047D, 0x047D, + 0x047F, 0x047F, 0x0481, 0x0481, 0x048B, 0x048B, 0x048D, 0x048D, + 0x048F, 0x048F, 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, + 0x0497, 0x0497, 0x0499, 0x0499, 0x049B, 0x049B, 0x049D, 0x049D, + 0x049F, 0x049F, 0x04A1, 0x04A1, 0x04A3, 0x04A3, 0x04A5, 0x04A5, + 0x04A7, 0x04A7, 0x04A9, 0x04A9, 0x04AB, 0x04AB, 0x04AD, 0x04AD, + 0x04AF, 0x04AF, 0x04B1, 0x04B1, 0x04B3, 0x04B3, 0x04B5, 0x04B5, + 0x04B7, 0x04B7, 0x04B9, 0x04B9, 0x04BB, 0x04BB, 0x04BD, 0x04BD, + 0x04BF, 0x04BF, 0x04C2, 0x04C2, 0x04C4, 0x04C4, 0x04C6, 0x04C6, + 0x04C8, 0x04C8, 0x04CA, 0x04CA, 0x04CC, 0x04CC, 0x04CE, 0x04CF, + 0x04D1, 0x04D1, 0x04D3, 0x04D3, 0x04D5, 0x04D5, 0x04D7, 0x04D7, + 0x04D9, 0x04D9, 0x04DB, 0x04DB, 0x04DD, 0x04DD, 0x04DF, 0x04DF, + 0x04E1, 0x04E1, 0x04E3, 0x04E3, 0x04E5, 0x04E5, 0x04E7, 0x04E7, + 0x04E9, 0x04E9, 0x04EB, 0x04EB, 0x04ED, 0x04ED, 0x04EF, 0x04EF, + 0x04F1, 0x04F1, 0x04F3, 0x04F3, 0x04F5, 0x04F5, 0x04F7, 0x04F7, + 0x04F9, 0x04F9, 0x04FB, 0x04FB, 0x04FD, 0x04FD, 0x04FF, 0x04FF, + 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, 0x0507, 0x0507, + 0x0509, 0x0509, 0x050B, 0x050B, 0x050D, 0x050D, 0x050F, 0x050F, + 0x0511, 0x0511, 0x0513, 0x0513, 0x0515, 0x0515, 0x0517, 0x0517, + 0x0519, 0x0519, 0x051B, 0x051B, 0x051D, 0x051D, 0x051F, 0x051F, + 0x0521, 0x0521, 0x0523, 0x0523, 0x0525, 0x0525, 0x0527, 0x0527, + 0x0529, 0x0529, 0x052B, 0x052B, 0x052D, 0x052D, 0x052F, 0x052F, + 0x0561, 0x0587, 0x10D0, 0x10FA, 0x10FD, 0x10FF, 0x13F8, 0x13FD, + 0x1C80, 0x1C88, 0x1D79, 0x1D79, 0x1D7D, 0x1D7D, 0x1D8E, 0x1D8E, + 0x1E01, 0x1E01, 0x1E03, 0x1E03, 0x1E05, 0x1E05, 0x1E07, 0x1E07, + 0x1E09, 0x1E09, 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, 0x1E0F, 0x1E0F, + 0x1E11, 0x1E11, 0x1E13, 0x1E13, 0x1E15, 0x1E15, 0x1E17, 0x1E17, + 0x1E19, 0x1E19, 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, 0x1E1F, 0x1E1F, + 0x1E21, 0x1E21, 0x1E23, 0x1E23, 0x1E25, 0x1E25, 0x1E27, 0x1E27, + 0x1E29, 0x1E29, 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, 0x1E2F, 0x1E2F, + 0x1E31, 0x1E31, 0x1E33, 0x1E33, 0x1E35, 0x1E35, 0x1E37, 0x1E37, + 0x1E39, 0x1E39, 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, 0x1E3F, 0x1E3F, + 0x1E41, 0x1E41, 0x1E43, 0x1E43, 0x1E45, 0x1E45, 0x1E47, 0x1E47, + 0x1E49, 0x1E49, 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, 0x1E4F, 0x1E4F, + 0x1E51, 0x1E51, 0x1E53, 0x1E53, 0x1E55, 0x1E55, 0x1E57, 0x1E57, + 0x1E59, 0x1E59, 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, 0x1E5F, 0x1E5F, + 0x1E61, 0x1E61, 0x1E63, 0x1E63, 0x1E65, 0x1E65, 0x1E67, 0x1E67, + 0x1E69, 0x1E69, 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, 0x1E6F, 0x1E6F, + 0x1E71, 0x1E71, 0x1E73, 0x1E73, 0x1E75, 0x1E75, 0x1E77, 0x1E77, + 0x1E79, 0x1E79, 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, 0x1E7F, 0x1E7F, + 0x1E81, 0x1E81, 0x1E83, 0x1E83, 0x1E85, 0x1E85, 0x1E87, 0x1E87, + 0x1E89, 0x1E89, 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, 0x1E8F, 0x1E8F, + 0x1E91, 0x1E91, 0x1E93, 0x1E93, 0x1E95, 0x1E9B, 0x1EA1, 0x1EA1, + 0x1EA3, 0x1EA3, 0x1EA5, 0x1EA5, 0x1EA7, 0x1EA7, 0x1EA9, 0x1EA9, + 0x1EAB, 0x1EAB, 0x1EAD, 0x1EAD, 0x1EAF, 0x1EAF, 0x1EB1, 0x1EB1, + 0x1EB3, 0x1EB3, 0x1EB5, 0x1EB5, 0x1EB7, 0x1EB7, 0x1EB9, 0x1EB9, + 0x1EBB, 0x1EBB, 0x1EBD, 0x1EBD, 0x1EBF, 0x1EBF, 0x1EC1, 0x1EC1, + 0x1EC3, 0x1EC3, 0x1EC5, 0x1EC5, 0x1EC7, 0x1EC7, 0x1EC9, 0x1EC9, + 0x1ECB, 0x1ECB, 0x1ECD, 0x1ECD, 0x1ECF, 0x1ECF, 0x1ED1, 0x1ED1, + 0x1ED3, 0x1ED3, 0x1ED5, 0x1ED5, 0x1ED7, 0x1ED7, 0x1ED9, 0x1ED9, + 0x1EDB, 0x1EDB, 0x1EDD, 0x1EDD, 0x1EDF, 0x1EDF, 0x1EE1, 0x1EE1, + 0x1EE3, 0x1EE3, 0x1EE5, 0x1EE5, 0x1EE7, 0x1EE7, 0x1EE9, 0x1EE9, + 0x1EEB, 0x1EEB, 0x1EED, 0x1EED, 0x1EEF, 0x1EEF, 0x1EF1, 0x1EF1, + 0x1EF3, 0x1EF3, 0x1EF5, 0x1EF5, 0x1EF7, 0x1EF7, 0x1EF9, 0x1EF9, + 0x1EFB, 0x1EFB, 0x1EFD, 0x1EFD, 0x1EFF, 0x1F07, 0x1F10, 0x1F15, + 0x1F20, 0x1F27, 0x1F30, 0x1F37, 0x1F40, 0x1F45, 0x1F50, 0x1F57, + 0x1F60, 0x1F67, 0x1F70, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FB7, + 0x1FBC, 0x1FBC, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FC7, + 0x1FCC, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, + 0x1FF2, 0x1FF4, 0x1FF6, 0x1FF7, 0x1FFC, 0x1FFC, 0x214E, 0x214E, + 0x2170, 0x217F, 0x2184, 0x2184, 0x24D0, 0x24E9, 0x2C30, 0x2C5F, + 0x2C61, 0x2C61, 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, + 0x2C6C, 0x2C6C, 0x2C73, 0x2C73, 0x2C76, 0x2C76, 0x2C81, 0x2C81, + 0x2C83, 0x2C83, 0x2C85, 0x2C85, 0x2C87, 0x2C87, 0x2C89, 0x2C89, + 0x2C8B, 0x2C8B, 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, 0x2C91, 0x2C91, + 0x2C93, 0x2C93, 0x2C95, 0x2C95, 0x2C97, 0x2C97, 0x2C99, 0x2C99, + 0x2C9B, 0x2C9B, 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, 0x2CA1, 0x2CA1, + 0x2CA3, 0x2CA3, 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, 0x2CA9, 0x2CA9, + 0x2CAB, 0x2CAB, 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, 0x2CB1, 0x2CB1, + 0x2CB3, 0x2CB3, 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, 0x2CB9, 0x2CB9, + 0x2CBB, 0x2CBB, 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, 0x2CC1, 0x2CC1, + 0x2CC3, 0x2CC3, 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, 0x2CC9, 0x2CC9, + 0x2CCB, 0x2CCB, 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, 0x2CD1, 0x2CD1, + 0x2CD3, 0x2CD3, 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, 0x2CD9, 0x2CD9, + 0x2CDB, 0x2CDB, 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, 0x2CE1, 0x2CE1, + 0x2CE3, 0x2CE3, 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, 0x2CF3, 0x2CF3, + 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0xA641, 0xA641, + 0xA643, 0xA643, 0xA645, 0xA645, 0xA647, 0xA647, 0xA649, 0xA649, + 0xA64B, 0xA64B, 0xA64D, 0xA64D, 0xA64F, 0xA64F, 0xA651, 0xA651, + 0xA653, 0xA653, 0xA655, 0xA655, 0xA657, 0xA657, 0xA659, 0xA659, + 0xA65B, 0xA65B, 0xA65D, 0xA65D, 0xA65F, 0xA65F, 0xA661, 0xA661, + 0xA663, 0xA663, 0xA665, 0xA665, 0xA667, 0xA667, 0xA669, 0xA669, + 0xA66B, 0xA66B, 0xA66D, 0xA66D, 0xA681, 0xA681, 0xA683, 0xA683, + 0xA685, 0xA685, 0xA687, 0xA687, 0xA689, 0xA689, 0xA68B, 0xA68B, + 0xA68D, 0xA68D, 0xA68F, 0xA68F, 0xA691, 0xA691, 0xA693, 0xA693, + 0xA695, 0xA695, 0xA697, 0xA697, 0xA699, 0xA699, 0xA69B, 0xA69B, + 0xA723, 0xA723, 0xA725, 0xA725, 0xA727, 0xA727, 0xA729, 0xA729, + 0xA72B, 0xA72B, 0xA72D, 0xA72D, 0xA72F, 0xA72F, 0xA733, 0xA733, + 0xA735, 0xA735, 0xA737, 0xA737, 0xA739, 0xA739, 0xA73B, 0xA73B, + 0xA73D, 0xA73D, 0xA73F, 0xA73F, 0xA741, 0xA741, 0xA743, 0xA743, + 0xA745, 0xA745, 0xA747, 0xA747, 0xA749, 0xA749, 0xA74B, 0xA74B, + 0xA74D, 0xA74D, 0xA74F, 0xA74F, 0xA751, 0xA751, 0xA753, 0xA753, + 0xA755, 0xA755, 0xA757, 0xA757, 0xA759, 0xA759, 0xA75B, 0xA75B, + 0xA75D, 0xA75D, 0xA75F, 0xA75F, 0xA761, 0xA761, 0xA763, 0xA763, + 0xA765, 0xA765, 0xA767, 0xA767, 0xA769, 0xA769, 0xA76B, 0xA76B, + 0xA76D, 0xA76D, 0xA76F, 0xA76F, 0xA77A, 0xA77A, 0xA77C, 0xA77C, + 0xA77F, 0xA77F, 0xA781, 0xA781, 0xA783, 0xA783, 0xA785, 0xA785, + 0xA787, 0xA787, 0xA78C, 0xA78C, 0xA791, 0xA791, 0xA793, 0xA794, + 0xA797, 0xA797, 0xA799, 0xA799, 0xA79B, 0xA79B, 0xA79D, 0xA79D, + 0xA79F, 0xA79F, 0xA7A1, 0xA7A1, 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, + 0xA7A7, 0xA7A7, 0xA7A9, 0xA7A9, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, + 0xA7B9, 0xA7B9, 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, + 0xA7C1, 0xA7C1, 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, + 0xA7D1, 0xA7D1, 0xA7D7, 0xA7D7, 0xA7D9, 0xA7D9, 0xA7F6, 0xA7F6, + 0xAB53, 0xAB53, 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, + 0xFF41, 0xFF5A, 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10CC0, 0x10CF2, + 0x118C0, 0x118DF, 0x16E60, 0x16E7F, 0x1E922, 0x1E943, + // #54 (8848+23): bp=Dash + 0x002D, 0x002D, 0x058A, 0x058A, 0x05BE, 0x05BE, 0x1400, 0x1400, + 0x1806, 0x1806, 0x2010, 0x2015, 0x2053, 0x2053, 0x207B, 0x207B, + 0x208B, 0x208B, 0x2212, 0x2212, 0x2E17, 0x2E17, 0x2E1A, 0x2E1A, + 0x2E3A, 0x2E3B, 0x2E40, 0x2E40, 0x2E5D, 0x2E5D, 0x301C, 0x301C, + 0x3030, 0x3030, 0x30A0, 0x30A0, 0xFE31, 0xFE32, 0xFE58, 0xFE58, + 0xFE63, 0xFE63, 0xFF0D, 0xFF0D, 0x10EAD, 0x10EAD, + // #55 (8871+17): bp=Default_Ignorable_Code_Point:DI + 0x00AD, 0x00AD, 0x034F, 0x034F, 0x061C, 0x061C, 0x115F, 0x1160, + 0x17B4, 0x17B5, 0x180B, 0x180F, 0x200B, 0x200F, 0x202A, 0x202E, + 0x2060, 0x206F, 0x3164, 0x3164, 0xFE00, 0xFE0F, 0xFEFF, 0xFEFF, + 0xFFA0, 0xFFA0, 0xFFF0, 0xFFF8, 0x1BCA0, 0x1BCA3, 0x1D173, 0x1D17A, + 0xE0000, 0xE0FFF, + // #56 (8888+8): bp=Deprecated:Dep + 0x0149, 0x0149, 0x0673, 0x0673, 0x0F77, 0x0F77, 0x0F79, 0x0F79, + 0x17A3, 0x17A4, 0x206A, 0x206F, 0x2329, 0x232A, 0xE0001, 0xE0001, + // #57 (8896+192): bp=Diacritic:Dia + 0x005E, 0x005E, 0x0060, 0x0060, 0x00A8, 0x00A8, 0x00AF, 0x00AF, + 0x00B4, 0x00B4, 0x00B7, 0x00B8, 0x02B0, 0x034E, 0x0350, 0x0357, + 0x035D, 0x0362, 0x0374, 0x0375, 0x037A, 0x037A, 0x0384, 0x0385, + 0x0483, 0x0487, 0x0559, 0x0559, 0x0591, 0x05A1, 0x05A3, 0x05BD, + 0x05BF, 0x05BF, 0x05C1, 0x05C2, 0x05C4, 0x05C4, 0x064B, 0x0652, + 0x0657, 0x0658, 0x06DF, 0x06E0, 0x06E5, 0x06E6, 0x06EA, 0x06EC, + 0x0730, 0x074A, 0x07A6, 0x07B0, 0x07EB, 0x07F5, 0x0818, 0x0819, + 0x0898, 0x089F, 0x08C9, 0x08D2, 0x08E3, 0x08FE, 0x093C, 0x093C, + 0x094D, 0x094D, 0x0951, 0x0954, 0x0971, 0x0971, 0x09BC, 0x09BC, + 0x09CD, 0x09CD, 0x0A3C, 0x0A3C, 0x0A4D, 0x0A4D, 0x0ABC, 0x0ABC, + 0x0ACD, 0x0ACD, 0x0AFD, 0x0AFF, 0x0B3C, 0x0B3C, 0x0B4D, 0x0B4D, + 0x0B55, 0x0B55, 0x0BCD, 0x0BCD, 0x0C3C, 0x0C3C, 0x0C4D, 0x0C4D, + 0x0CBC, 0x0CBC, 0x0CCD, 0x0CCD, 0x0D3B, 0x0D3C, 0x0D4D, 0x0D4D, + 0x0DCA, 0x0DCA, 0x0E47, 0x0E4C, 0x0E4E, 0x0E4E, 0x0EBA, 0x0EBA, + 0x0EC8, 0x0ECC, 0x0F18, 0x0F19, 0x0F35, 0x0F35, 0x0F37, 0x0F37, + 0x0F39, 0x0F39, 0x0F3E, 0x0F3F, 0x0F82, 0x0F84, 0x0F86, 0x0F87, + 0x0FC6, 0x0FC6, 0x1037, 0x1037, 0x1039, 0x103A, 0x1063, 0x1064, + 0x1069, 0x106D, 0x1087, 0x108D, 0x108F, 0x108F, 0x109A, 0x109B, + 0x135D, 0x135F, 0x1714, 0x1715, 0x17C9, 0x17D3, 0x17DD, 0x17DD, + 0x1939, 0x193B, 0x1A75, 0x1A7C, 0x1A7F, 0x1A7F, 0x1AB0, 0x1ABE, + 0x1AC1, 0x1ACB, 0x1B34, 0x1B34, 0x1B44, 0x1B44, 0x1B6B, 0x1B73, + 0x1BAA, 0x1BAB, 0x1C36, 0x1C37, 0x1C78, 0x1C7D, 0x1CD0, 0x1CE8, + 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, 0x1CF7, 0x1CF9, 0x1D2C, 0x1D6A, + 0x1DC4, 0x1DCF, 0x1DF5, 0x1DFF, 0x1FBD, 0x1FBD, 0x1FBF, 0x1FC1, + 0x1FCD, 0x1FCF, 0x1FDD, 0x1FDF, 0x1FED, 0x1FEF, 0x1FFD, 0x1FFE, + 0x2CEF, 0x2CF1, 0x2E2F, 0x2E2F, 0x302A, 0x302F, 0x3099, 0x309C, + 0x30FC, 0x30FC, 0xA66F, 0xA66F, 0xA67C, 0xA67D, 0xA67F, 0xA67F, + 0xA69C, 0xA69D, 0xA6F0, 0xA6F1, 0xA700, 0xA721, 0xA788, 0xA78A, + 0xA7F8, 0xA7F9, 0xA8C4, 0xA8C4, 0xA8E0, 0xA8F1, 0xA92B, 0xA92E, + 0xA953, 0xA953, 0xA9B3, 0xA9B3, 0xA9C0, 0xA9C0, 0xA9E5, 0xA9E5, + 0xAA7B, 0xAA7D, 0xAABF, 0xAAC2, 0xAAF6, 0xAAF6, 0xAB5B, 0xAB5F, + 0xAB69, 0xAB6B, 0xABEC, 0xABED, 0xFB1E, 0xFB1E, 0xFE20, 0xFE2F, + 0xFF3E, 0xFF3E, 0xFF40, 0xFF40, 0xFF70, 0xFF70, 0xFF9E, 0xFF9F, + 0xFFE3, 0xFFE3, 0x102E0, 0x102E0, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x10AE5, 0x10AE6, 0x10D22, 0x10D27, 0x10F46, 0x10F50, + 0x10F82, 0x10F85, 0x11046, 0x11046, 0x11070, 0x11070, 0x110B9, 0x110BA, + 0x11133, 0x11134, 0x11173, 0x11173, 0x111C0, 0x111C0, 0x111CA, 0x111CC, + 0x11235, 0x11236, 0x112E9, 0x112EA, 0x1133C, 0x1133C, 0x1134D, 0x1134D, + 0x11366, 0x1136C, 0x11370, 0x11374, 0x11442, 0x11442, 0x11446, 0x11446, + 0x114C2, 0x114C3, 0x115BF, 0x115C0, 0x1163F, 0x1163F, 0x116B6, 0x116B7, + 0x1172B, 0x1172B, 0x11839, 0x1183A, 0x1193D, 0x1193E, 0x11943, 0x11943, + 0x119E0, 0x119E0, 0x11A34, 0x11A34, 0x11A47, 0x11A47, 0x11A99, 0x11A99, + 0x11C3F, 0x11C3F, 0x11D42, 0x11D42, 0x11D44, 0x11D45, 0x11D97, 0x11D97, + 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, 0x16F8F, 0x16F9F, 0x16FF0, 0x16FF1, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1CF00, 0x1CF2D, + 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, 0x1D16D, 0x1D172, 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1E130, 0x1E136, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E946, 0x1E948, 0x1E94A, + // #58 (9088+153): bp=Emoji + 0x0023, 0x0023, 0x002A, 0x002A, 0x0030, 0x0039, 0x00A9, 0x00A9, + 0x00AE, 0x00AE, 0x203C, 0x203C, 0x2049, 0x2049, 0x2122, 0x2122, + 0x2139, 0x2139, 0x2194, 0x2199, 0x21A9, 0x21AA, 0x231A, 0x231B, + 0x2328, 0x2328, 0x23CF, 0x23CF, 0x23E9, 0x23F3, 0x23F8, 0x23FA, + 0x24C2, 0x24C2, 0x25AA, 0x25AB, 0x25B6, 0x25B6, 0x25C0, 0x25C0, + 0x25FB, 0x25FE, 0x2600, 0x2604, 0x260E, 0x260E, 0x2611, 0x2611, + 0x2614, 0x2615, 0x2618, 0x2618, 0x261D, 0x261D, 0x2620, 0x2620, + 0x2622, 0x2623, 0x2626, 0x2626, 0x262A, 0x262A, 0x262E, 0x262F, + 0x2638, 0x263A, 0x2640, 0x2640, 0x2642, 0x2642, 0x2648, 0x2653, + 0x265F, 0x2660, 0x2663, 0x2663, 0x2665, 0x2666, 0x2668, 0x2668, + 0x267B, 0x267B, 0x267E, 0x267F, 0x2692, 0x2697, 0x2699, 0x2699, + 0x269B, 0x269C, 0x26A0, 0x26A1, 0x26A7, 0x26A7, 0x26AA, 0x26AB, + 0x26B0, 0x26B1, 0x26BD, 0x26BE, 0x26C4, 0x26C5, 0x26C8, 0x26C8, + 0x26CE, 0x26CF, 0x26D1, 0x26D1, 0x26D3, 0x26D4, 0x26E9, 0x26EA, + 0x26F0, 0x26F5, 0x26F7, 0x26FA, 0x26FD, 0x26FD, 0x2702, 0x2702, + 0x2705, 0x2705, 0x2708, 0x270D, 0x270F, 0x270F, 0x2712, 0x2712, + 0x2714, 0x2714, 0x2716, 0x2716, 0x271D, 0x271D, 0x2721, 0x2721, + 0x2728, 0x2728, 0x2733, 0x2734, 0x2744, 0x2744, 0x2747, 0x2747, + 0x274C, 0x274C, 0x274E, 0x274E, 0x2753, 0x2755, 0x2757, 0x2757, + 0x2763, 0x2764, 0x2795, 0x2797, 0x27A1, 0x27A1, 0x27B0, 0x27B0, + 0x27BF, 0x27BF, 0x2934, 0x2935, 0x2B05, 0x2B07, 0x2B1B, 0x2B1C, + 0x2B50, 0x2B50, 0x2B55, 0x2B55, 0x3030, 0x3030, 0x303D, 0x303D, + 0x3297, 0x3297, 0x3299, 0x3299, 0x1F004, 0x1F004, 0x1F0CF, 0x1F0CF, + 0x1F170, 0x1F171, 0x1F17E, 0x1F17F, 0x1F18E, 0x1F18E, 0x1F191, 0x1F19A, + 0x1F1E6, 0x1F1FF, 0x1F201, 0x1F202, 0x1F21A, 0x1F21A, 0x1F22F, 0x1F22F, + 0x1F232, 0x1F23A, 0x1F250, 0x1F251, 0x1F300, 0x1F321, 0x1F324, 0x1F393, + 0x1F396, 0x1F397, 0x1F399, 0x1F39B, 0x1F39E, 0x1F3F0, 0x1F3F3, 0x1F3F5, + 0x1F3F7, 0x1F4FD, 0x1F4FF, 0x1F53D, 0x1F549, 0x1F54E, 0x1F550, 0x1F567, + 0x1F56F, 0x1F570, 0x1F573, 0x1F57A, 0x1F587, 0x1F587, 0x1F58A, 0x1F58D, + 0x1F590, 0x1F590, 0x1F595, 0x1F596, 0x1F5A4, 0x1F5A5, 0x1F5A8, 0x1F5A8, + 0x1F5B1, 0x1F5B2, 0x1F5BC, 0x1F5BC, 0x1F5C2, 0x1F5C4, 0x1F5D1, 0x1F5D3, + 0x1F5DC, 0x1F5DE, 0x1F5E1, 0x1F5E1, 0x1F5E3, 0x1F5E3, 0x1F5E8, 0x1F5E8, + 0x1F5EF, 0x1F5EF, 0x1F5F3, 0x1F5F3, 0x1F5FA, 0x1F64F, 0x1F680, 0x1F6C5, + 0x1F6CB, 0x1F6D2, 0x1F6D5, 0x1F6D7, 0x1F6DD, 0x1F6E5, 0x1F6E9, 0x1F6E9, + 0x1F6EB, 0x1F6EC, 0x1F6F0, 0x1F6F0, 0x1F6F3, 0x1F6FC, 0x1F7E0, 0x1F7EB, + 0x1F7F0, 0x1F7F0, 0x1F90C, 0x1F93A, 0x1F93C, 0x1F945, 0x1F947, 0x1F9FF, + 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, + 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, + 0x1FAF0, 0x1FAF6, + // #59 (9241+10): bp=Emoji_Component:EComp + 0x0023, 0x0023, 0x002A, 0x002A, 0x0030, 0x0039, 0x200D, 0x200D, + 0x20E3, 0x20E3, 0xFE0F, 0xFE0F, 0x1F1E6, 0x1F1FF, 0x1F3FB, 0x1F3FF, + 0x1F9B0, 0x1F9B3, 0xE0020, 0xE007F, + // #60 (9251+1): bp=Emoji_Modifier:EMod + 0x1F3FB, 0x1F3FF, + // #61 (9252+40): bp=Emoji_Modifier_Base:EBase + 0x261D, 0x261D, 0x26F9, 0x26F9, 0x270A, 0x270D, 0x1F385, 0x1F385, + 0x1F3C2, 0x1F3C4, 0x1F3C7, 0x1F3C7, 0x1F3CA, 0x1F3CC, 0x1F442, 0x1F443, + 0x1F446, 0x1F450, 0x1F466, 0x1F478, 0x1F47C, 0x1F47C, 0x1F481, 0x1F483, + 0x1F485, 0x1F487, 0x1F48F, 0x1F48F, 0x1F491, 0x1F491, 0x1F4AA, 0x1F4AA, + 0x1F574, 0x1F575, 0x1F57A, 0x1F57A, 0x1F590, 0x1F590, 0x1F595, 0x1F596, + 0x1F645, 0x1F647, 0x1F64B, 0x1F64F, 0x1F6A3, 0x1F6A3, 0x1F6B4, 0x1F6B6, + 0x1F6C0, 0x1F6C0, 0x1F6CC, 0x1F6CC, 0x1F90C, 0x1F90C, 0x1F90F, 0x1F90F, + 0x1F918, 0x1F91F, 0x1F926, 0x1F926, 0x1F930, 0x1F939, 0x1F93C, 0x1F93E, + 0x1F977, 0x1F977, 0x1F9B5, 0x1F9B6, 0x1F9B8, 0x1F9B9, 0x1F9BB, 0x1F9BB, + 0x1F9CD, 0x1F9CF, 0x1F9D1, 0x1F9DD, 0x1FAC3, 0x1FAC5, 0x1FAF0, 0x1FAF6, + // #62 (9292+83): bp=Emoji_Presentation:EPres + 0x231A, 0x231B, 0x23E9, 0x23EC, 0x23F0, 0x23F0, 0x23F3, 0x23F3, + 0x25FD, 0x25FE, 0x2614, 0x2615, 0x2648, 0x2653, 0x267F, 0x267F, + 0x2693, 0x2693, 0x26A1, 0x26A1, 0x26AA, 0x26AB, 0x26BD, 0x26BE, + 0x26C4, 0x26C5, 0x26CE, 0x26CE, 0x26D4, 0x26D4, 0x26EA, 0x26EA, + 0x26F2, 0x26F3, 0x26F5, 0x26F5, 0x26FA, 0x26FA, 0x26FD, 0x26FD, + 0x2705, 0x2705, 0x270A, 0x270B, 0x2728, 0x2728, 0x274C, 0x274C, + 0x274E, 0x274E, 0x2753, 0x2755, 0x2757, 0x2757, 0x2795, 0x2797, + 0x27B0, 0x27B0, 0x27BF, 0x27BF, 0x2B1B, 0x2B1C, 0x2B50, 0x2B50, + 0x2B55, 0x2B55, 0x1F004, 0x1F004, 0x1F0CF, 0x1F0CF, 0x1F18E, 0x1F18E, + 0x1F191, 0x1F19A, 0x1F1E6, 0x1F1FF, 0x1F201, 0x1F201, 0x1F21A, 0x1F21A, + 0x1F22F, 0x1F22F, 0x1F232, 0x1F236, 0x1F238, 0x1F23A, 0x1F250, 0x1F251, + 0x1F300, 0x1F320, 0x1F32D, 0x1F335, 0x1F337, 0x1F37C, 0x1F37E, 0x1F393, + 0x1F3A0, 0x1F3CA, 0x1F3CF, 0x1F3D3, 0x1F3E0, 0x1F3F0, 0x1F3F4, 0x1F3F4, + 0x1F3F8, 0x1F43E, 0x1F440, 0x1F440, 0x1F442, 0x1F4FC, 0x1F4FF, 0x1F53D, + 0x1F54B, 0x1F54E, 0x1F550, 0x1F567, 0x1F57A, 0x1F57A, 0x1F595, 0x1F596, + 0x1F5A4, 0x1F5A4, 0x1F5FB, 0x1F64F, 0x1F680, 0x1F6C5, 0x1F6CC, 0x1F6CC, + 0x1F6D0, 0x1F6D2, 0x1F6D5, 0x1F6D7, 0x1F6DD, 0x1F6DF, 0x1F6EB, 0x1F6EC, + 0x1F6F4, 0x1F6FC, 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F90C, 0x1F93A, + 0x1F93C, 0x1F945, 0x1F947, 0x1F9FF, 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, + 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, + 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, + // #63 (9375+78): bp=Extended_Pictographic:ExtPict + 0x00A9, 0x00A9, 0x00AE, 0x00AE, 0x203C, 0x203C, 0x2049, 0x2049, + 0x2122, 0x2122, 0x2139, 0x2139, 0x2194, 0x2199, 0x21A9, 0x21AA, + 0x231A, 0x231B, 0x2328, 0x2328, 0x2388, 0x2388, 0x23CF, 0x23CF, + 0x23E9, 0x23F3, 0x23F8, 0x23FA, 0x24C2, 0x24C2, 0x25AA, 0x25AB, + 0x25B6, 0x25B6, 0x25C0, 0x25C0, 0x25FB, 0x25FE, 0x2600, 0x2605, + 0x2607, 0x2612, 0x2614, 0x2685, 0x2690, 0x2705, 0x2708, 0x2712, + 0x2714, 0x2714, 0x2716, 0x2716, 0x271D, 0x271D, 0x2721, 0x2721, + 0x2728, 0x2728, 0x2733, 0x2734, 0x2744, 0x2744, 0x2747, 0x2747, + 0x274C, 0x274C, 0x274E, 0x274E, 0x2753, 0x2755, 0x2757, 0x2757, + 0x2763, 0x2767, 0x2795, 0x2797, 0x27A1, 0x27A1, 0x27B0, 0x27B0, + 0x27BF, 0x27BF, 0x2934, 0x2935, 0x2B05, 0x2B07, 0x2B1B, 0x2B1C, + 0x2B50, 0x2B50, 0x2B55, 0x2B55, 0x3030, 0x3030, 0x303D, 0x303D, + 0x3297, 0x3297, 0x3299, 0x3299, 0x1F000, 0x1F0FF, 0x1F10D, 0x1F10F, + 0x1F12F, 0x1F12F, 0x1F16C, 0x1F171, 0x1F17E, 0x1F17F, 0x1F18E, 0x1F18E, + 0x1F191, 0x1F19A, 0x1F1AD, 0x1F1E5, 0x1F201, 0x1F20F, 0x1F21A, 0x1F21A, + 0x1F22F, 0x1F22F, 0x1F232, 0x1F23A, 0x1F23C, 0x1F23F, 0x1F249, 0x1F3FA, + 0x1F400, 0x1F53D, 0x1F546, 0x1F64F, 0x1F680, 0x1F6FF, 0x1F774, 0x1F77F, + 0x1F7D5, 0x1F7FF, 0x1F80C, 0x1F80F, 0x1F848, 0x1F84F, 0x1F85A, 0x1F85F, + 0x1F888, 0x1F88F, 0x1F8AE, 0x1F8FF, 0x1F90C, 0x1F93A, 0x1F93C, 0x1F945, + 0x1F947, 0x1FAFF, 0x1FC00, 0x1FFFD, + // #64 (9453+33): bp=Extender:Ext + 0x00B7, 0x00B7, 0x02D0, 0x02D1, 0x0640, 0x0640, 0x07FA, 0x07FA, + 0x0B55, 0x0B55, 0x0E46, 0x0E46, 0x0EC6, 0x0EC6, 0x180A, 0x180A, + 0x1843, 0x1843, 0x1AA7, 0x1AA7, 0x1C36, 0x1C36, 0x1C7B, 0x1C7B, + 0x3005, 0x3005, 0x3031, 0x3035, 0x309D, 0x309E, 0x30FC, 0x30FE, + 0xA015, 0xA015, 0xA60C, 0xA60C, 0xA9CF, 0xA9CF, 0xA9E6, 0xA9E6, + 0xAA70, 0xAA70, 0xAADD, 0xAADD, 0xAAF3, 0xAAF4, 0xFF70, 0xFF70, + 0x10781, 0x10782, 0x1135D, 0x1135D, 0x115C6, 0x115C8, 0x11A98, 0x11A98, + 0x16B42, 0x16B43, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x1E13C, 0x1E13D, + 0x1E944, 0x1E946, + // #65 (9486+861): bp=Grapheme_Base:Gr_Base + 0x0020, 0x007E, 0x00A0, 0x00AC, 0x00AE, 0x02FF, 0x0370, 0x0377, + 0x037A, 0x037F, 0x0384, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x0482, 0x048A, 0x052F, 0x0531, 0x0556, 0x0559, 0x058A, + 0x058D, 0x058F, 0x05BE, 0x05BE, 0x05C0, 0x05C0, 0x05C3, 0x05C3, + 0x05C6, 0x05C6, 0x05D0, 0x05EA, 0x05EF, 0x05F4, 0x0606, 0x060F, + 0x061B, 0x061B, 0x061D, 0x064A, 0x0660, 0x066F, 0x0671, 0x06D5, + 0x06DE, 0x06DE, 0x06E5, 0x06E6, 0x06E9, 0x06E9, 0x06EE, 0x070D, + 0x0710, 0x0710, 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, + 0x07C0, 0x07EA, 0x07F4, 0x07FA, 0x07FE, 0x0815, 0x081A, 0x081A, + 0x0824, 0x0824, 0x0828, 0x0828, 0x0830, 0x083E, 0x0840, 0x0858, + 0x085E, 0x085E, 0x0860, 0x086A, 0x0870, 0x088E, 0x08A0, 0x08C9, + 0x0903, 0x0939, 0x093B, 0x093B, 0x093D, 0x0940, 0x0949, 0x094C, + 0x094E, 0x0950, 0x0958, 0x0961, 0x0964, 0x0980, 0x0982, 0x0983, + 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, + 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BD, 0x09BD, 0x09BF, 0x09C0, + 0x09C7, 0x09C8, 0x09CB, 0x09CC, 0x09CE, 0x09CE, 0x09DC, 0x09DD, + 0x09DF, 0x09E1, 0x09E6, 0x09FD, 0x0A03, 0x0A03, 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, + 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A3E, 0x0A40, 0x0A59, 0x0A5C, + 0x0A5E, 0x0A5E, 0x0A66, 0x0A6F, 0x0A72, 0x0A74, 0x0A76, 0x0A76, + 0x0A83, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABD, 0x0AC0, + 0x0AC9, 0x0AC9, 0x0ACB, 0x0ACC, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, + 0x0AE6, 0x0AF1, 0x0AF9, 0x0AF9, 0x0B02, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, 0x0B40, 0x0B40, 0x0B47, 0x0B48, + 0x0B4B, 0x0B4C, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B66, 0x0B77, + 0x0B83, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, + 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, + 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBF, 0x0BBF, 0x0BC1, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCC, 0x0BD0, 0x0BD0, 0x0BE6, 0x0BFA, + 0x0C01, 0x0C03, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, 0x0C3D, 0x0C3D, 0x0C41, 0x0C44, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, 0x0C66, 0x0C6F, 0x0C77, 0x0C80, + 0x0C82, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, + 0x0CB5, 0x0CB9, 0x0CBD, 0x0CBE, 0x0CC0, 0x0CC1, 0x0CC3, 0x0CC4, + 0x0CC7, 0x0CC8, 0x0CCA, 0x0CCB, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE1, + 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x0D02, 0x0D0C, 0x0D0E, 0x0D10, + 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, 0x0D3F, 0x0D40, 0x0D46, 0x0D48, + 0x0D4A, 0x0D4C, 0x0D4E, 0x0D4F, 0x0D54, 0x0D56, 0x0D58, 0x0D61, + 0x0D66, 0x0D7F, 0x0D82, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DD0, 0x0DD1, + 0x0DD8, 0x0DDE, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF4, 0x0E01, 0x0E30, + 0x0E32, 0x0E33, 0x0E3F, 0x0E46, 0x0E4F, 0x0E5B, 0x0E81, 0x0E82, + 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, + 0x0EA7, 0x0EB0, 0x0EB2, 0x0EB3, 0x0EBD, 0x0EBD, 0x0EC0, 0x0EC4, + 0x0EC6, 0x0EC6, 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, 0x0F00, 0x0F17, + 0x0F1A, 0x0F34, 0x0F36, 0x0F36, 0x0F38, 0x0F38, 0x0F3A, 0x0F47, + 0x0F49, 0x0F6C, 0x0F7F, 0x0F7F, 0x0F85, 0x0F85, 0x0F88, 0x0F8C, + 0x0FBE, 0x0FC5, 0x0FC7, 0x0FCC, 0x0FCE, 0x0FDA, 0x1000, 0x102C, + 0x1031, 0x1031, 0x1038, 0x1038, 0x103B, 0x103C, 0x103F, 0x1057, + 0x105A, 0x105D, 0x1061, 0x1070, 0x1075, 0x1081, 0x1083, 0x1084, + 0x1087, 0x108C, 0x108E, 0x109C, 0x109E, 0x10C5, 0x10C7, 0x10C7, + 0x10CD, 0x10CD, 0x10D0, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, + 0x1258, 0x1258, 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, + 0x1290, 0x12B0, 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, + 0x12C2, 0x12C5, 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, + 0x1318, 0x135A, 0x1360, 0x137C, 0x1380, 0x1399, 0x13A0, 0x13F5, + 0x13F8, 0x13FD, 0x1400, 0x169C, 0x16A0, 0x16F8, 0x1700, 0x1711, + 0x1715, 0x1715, 0x171F, 0x1731, 0x1734, 0x1736, 0x1740, 0x1751, + 0x1760, 0x176C, 0x176E, 0x1770, 0x1780, 0x17B3, 0x17B6, 0x17B6, + 0x17BE, 0x17C5, 0x17C7, 0x17C8, 0x17D4, 0x17DC, 0x17E0, 0x17E9, + 0x17F0, 0x17F9, 0x1800, 0x180A, 0x1810, 0x1819, 0x1820, 0x1878, + 0x1880, 0x1884, 0x1887, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1923, 0x1926, 0x1929, 0x192B, 0x1930, 0x1931, + 0x1933, 0x1938, 0x1940, 0x1940, 0x1944, 0x196D, 0x1970, 0x1974, + 0x1980, 0x19AB, 0x19B0, 0x19C9, 0x19D0, 0x19DA, 0x19DE, 0x1A16, + 0x1A19, 0x1A1A, 0x1A1E, 0x1A55, 0x1A57, 0x1A57, 0x1A61, 0x1A61, + 0x1A63, 0x1A64, 0x1A6D, 0x1A72, 0x1A80, 0x1A89, 0x1A90, 0x1A99, + 0x1AA0, 0x1AAD, 0x1B04, 0x1B33, 0x1B3B, 0x1B3B, 0x1B3D, 0x1B41, + 0x1B43, 0x1B4C, 0x1B50, 0x1B6A, 0x1B74, 0x1B7E, 0x1B82, 0x1BA1, + 0x1BA6, 0x1BA7, 0x1BAA, 0x1BAA, 0x1BAE, 0x1BE5, 0x1BE7, 0x1BE7, + 0x1BEA, 0x1BEC, 0x1BEE, 0x1BEE, 0x1BF2, 0x1BF3, 0x1BFC, 0x1C2B, + 0x1C34, 0x1C35, 0x1C3B, 0x1C49, 0x1C4D, 0x1C88, 0x1C90, 0x1CBA, + 0x1CBD, 0x1CC7, 0x1CD3, 0x1CD3, 0x1CE1, 0x1CE1, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF7, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, + 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, + 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FC4, 0x1FC6, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FDD, 0x1FEF, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFE, + 0x2000, 0x200A, 0x2010, 0x2027, 0x202F, 0x205F, 0x2070, 0x2071, + 0x2074, 0x208E, 0x2090, 0x209C, 0x20A0, 0x20C0, 0x2100, 0x218B, + 0x2190, 0x2426, 0x2440, 0x244A, 0x2460, 0x2B73, 0x2B76, 0x2B95, + 0x2B97, 0x2CEE, 0x2CF2, 0x2CF3, 0x2CF9, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D70, 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, + 0x2E00, 0x2E5D, 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, + 0x2FF0, 0x2FFB, 0x3000, 0x3029, 0x3030, 0x303F, 0x3041, 0x3096, + 0x309B, 0x30FF, 0x3105, 0x312F, 0x3131, 0x318E, 0x3190, 0x31E3, + 0x31F0, 0x321E, 0x3220, 0xA48C, 0xA490, 0xA4C6, 0xA4D0, 0xA62B, + 0xA640, 0xA66E, 0xA673, 0xA673, 0xA67E, 0xA69D, 0xA6A0, 0xA6EF, + 0xA6F2, 0xA6F7, 0xA700, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, + 0xA7D5, 0xA7D9, 0xA7F2, 0xA801, 0xA803, 0xA805, 0xA807, 0xA80A, + 0xA80C, 0xA824, 0xA827, 0xA82B, 0xA830, 0xA839, 0xA840, 0xA877, + 0xA880, 0xA8C3, 0xA8CE, 0xA8D9, 0xA8F2, 0xA8FE, 0xA900, 0xA925, + 0xA92E, 0xA946, 0xA952, 0xA953, 0xA95F, 0xA97C, 0xA983, 0xA9B2, + 0xA9B4, 0xA9B5, 0xA9BA, 0xA9BB, 0xA9BE, 0xA9CD, 0xA9CF, 0xA9D9, + 0xA9DE, 0xA9E4, 0xA9E6, 0xA9FE, 0xAA00, 0xAA28, 0xAA2F, 0xAA30, + 0xAA33, 0xAA34, 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA4D, 0xAA4D, + 0xAA50, 0xAA59, 0xAA5C, 0xAA7B, 0xAA7D, 0xAAAF, 0xAAB1, 0xAAB1, + 0xAAB5, 0xAAB6, 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, + 0xAADB, 0xAAEB, 0xAAEE, 0xAAF5, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB6B, + 0xAB70, 0xABE4, 0xABE6, 0xABE7, 0xABE9, 0xABEC, 0xABF0, 0xABF9, + 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, + 0xFB1F, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, + 0xFB43, 0xFB44, 0xFB46, 0xFBC2, 0xFBD3, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDCF, 0xFDCF, 0xFDF0, 0xFDFF, 0xFE10, 0xFE19, 0xFE30, 0xFE52, + 0xFE54, 0xFE66, 0xFE68, 0xFE6B, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, + 0xFF01, 0xFF9D, 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, + 0xFFFC, 0xFFFD, 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, + 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, + 0x10100, 0x10102, 0x10107, 0x10133, 0x10137, 0x1018E, 0x10190, 0x1019C, + 0x101A0, 0x101A0, 0x101D0, 0x101FC, 0x10280, 0x1029C, 0x102A0, 0x102D0, + 0x102E1, 0x102FB, 0x10300, 0x10323, 0x1032D, 0x1034A, 0x10350, 0x10375, + 0x10380, 0x1039D, 0x1039F, 0x103C3, 0x103C8, 0x103D5, 0x10400, 0x1049D, + 0x104A0, 0x104A9, 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, + 0x10530, 0x10563, 0x1056F, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, + 0x105BB, 0x105BC, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, + 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, + 0x1083F, 0x10855, 0x10857, 0x1089E, 0x108A7, 0x108AF, 0x108E0, 0x108F2, + 0x108F4, 0x108F5, 0x108FB, 0x1091B, 0x1091F, 0x10939, 0x1093F, 0x1093F, + 0x10980, 0x109B7, 0x109BC, 0x109CF, 0x109D2, 0x10A00, 0x10A10, 0x10A13, + 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A40, 0x10A48, 0x10A50, 0x10A58, + 0x10A60, 0x10A9F, 0x10AC0, 0x10AE4, 0x10AEB, 0x10AF6, 0x10B00, 0x10B35, + 0x10B39, 0x10B55, 0x10B58, 0x10B72, 0x10B78, 0x10B91, 0x10B99, 0x10B9C, + 0x10BA9, 0x10BAF, 0x10C00, 0x10C48, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, + 0x10CFA, 0x10D23, 0x10D30, 0x10D39, 0x10E60, 0x10E7E, 0x10E80, 0x10EA9, + 0x10EAD, 0x10EAD, 0x10EB0, 0x10EB1, 0x10F00, 0x10F27, 0x10F30, 0x10F45, + 0x10F51, 0x10F59, 0x10F70, 0x10F81, 0x10F86, 0x10F89, 0x10FB0, 0x10FCB, + 0x10FE0, 0x10FF6, 0x11000, 0x11000, 0x11002, 0x11037, 0x11047, 0x1104D, + 0x11052, 0x1106F, 0x11071, 0x11072, 0x11075, 0x11075, 0x11082, 0x110B2, + 0x110B7, 0x110B8, 0x110BB, 0x110BC, 0x110BE, 0x110C1, 0x110D0, 0x110E8, + 0x110F0, 0x110F9, 0x11103, 0x11126, 0x1112C, 0x1112C, 0x11136, 0x11147, + 0x11150, 0x11172, 0x11174, 0x11176, 0x11182, 0x111B5, 0x111BF, 0x111C8, + 0x111CD, 0x111CE, 0x111D0, 0x111DF, 0x111E1, 0x111F4, 0x11200, 0x11211, + 0x11213, 0x1122E, 0x11232, 0x11233, 0x11235, 0x11235, 0x11238, 0x1123D, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A9, 0x112B0, 0x112DE, 0x112E0, 0x112E2, 0x112F0, 0x112F9, + 0x11302, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133D, 0x1133D, + 0x1133F, 0x1133F, 0x11341, 0x11344, 0x11347, 0x11348, 0x1134B, 0x1134D, + 0x11350, 0x11350, 0x1135D, 0x11363, 0x11400, 0x11437, 0x11440, 0x11441, + 0x11445, 0x11445, 0x11447, 0x1145B, 0x1145D, 0x1145D, 0x1145F, 0x11461, + 0x11480, 0x114AF, 0x114B1, 0x114B2, 0x114B9, 0x114B9, 0x114BB, 0x114BC, + 0x114BE, 0x114BE, 0x114C1, 0x114C1, 0x114C4, 0x114C7, 0x114D0, 0x114D9, + 0x11580, 0x115AE, 0x115B0, 0x115B1, 0x115B8, 0x115BB, 0x115BE, 0x115BE, + 0x115C1, 0x115DB, 0x11600, 0x11632, 0x1163B, 0x1163C, 0x1163E, 0x1163E, + 0x11641, 0x11644, 0x11650, 0x11659, 0x11660, 0x1166C, 0x11680, 0x116AA, + 0x116AC, 0x116AC, 0x116AE, 0x116AF, 0x116B6, 0x116B6, 0x116B8, 0x116B9, + 0x116C0, 0x116C9, 0x11700, 0x1171A, 0x11720, 0x11721, 0x11726, 0x11726, + 0x11730, 0x11746, 0x11800, 0x1182E, 0x11838, 0x11838, 0x1183B, 0x1183B, + 0x118A0, 0x118F2, 0x118FF, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, + 0x11915, 0x11916, 0x11918, 0x1192F, 0x11931, 0x11935, 0x11937, 0x11938, + 0x1193D, 0x1193D, 0x1193F, 0x11942, 0x11944, 0x11946, 0x11950, 0x11959, + 0x119A0, 0x119A7, 0x119AA, 0x119D3, 0x119DC, 0x119DF, 0x119E1, 0x119E4, + 0x11A00, 0x11A00, 0x11A0B, 0x11A32, 0x11A39, 0x11A3A, 0x11A3F, 0x11A46, + 0x11A50, 0x11A50, 0x11A57, 0x11A58, 0x11A5C, 0x11A89, 0x11A97, 0x11A97, + 0x11A9A, 0x11AA2, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, 0x11C0A, 0x11C2F, + 0x11C3E, 0x11C3E, 0x11C40, 0x11C45, 0x11C50, 0x11C6C, 0x11C70, 0x11C8F, + 0x11CA9, 0x11CA9, 0x11CB1, 0x11CB1, 0x11CB4, 0x11CB4, 0x11D00, 0x11D06, + 0x11D08, 0x11D09, 0x11D0B, 0x11D30, 0x11D46, 0x11D46, 0x11D50, 0x11D59, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, 0x11D93, 0x11D94, + 0x11D96, 0x11D96, 0x11D98, 0x11D98, 0x11DA0, 0x11DA9, 0x11EE0, 0x11EF2, + 0x11EF5, 0x11EF8, 0x11FB0, 0x11FB0, 0x11FC0, 0x11FF1, 0x11FFF, 0x12399, + 0x12400, 0x1246E, 0x12470, 0x12474, 0x12480, 0x12543, 0x12F90, 0x12FF2, + 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, 0x16A40, 0x16A5E, + 0x16A60, 0x16A69, 0x16A6E, 0x16ABE, 0x16AC0, 0x16AC9, 0x16AD0, 0x16AED, + 0x16AF5, 0x16AF5, 0x16B00, 0x16B2F, 0x16B37, 0x16B45, 0x16B50, 0x16B59, + 0x16B5B, 0x16B61, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16E40, 0x16E9A, + 0x16F00, 0x16F4A, 0x16F50, 0x16F87, 0x16F93, 0x16F9F, 0x16FE0, 0x16FE3, + 0x16FF0, 0x16FF1, 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, + 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, 0x1BC9C, 0x1BC9C, + 0x1BC9F, 0x1BC9F, 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, 0x1D100, 0x1D126, + 0x1D129, 0x1D164, 0x1D166, 0x1D166, 0x1D16A, 0x1D16D, 0x1D183, 0x1D184, + 0x1D18C, 0x1D1A9, 0x1D1AE, 0x1D1EA, 0x1D200, 0x1D241, 0x1D245, 0x1D245, + 0x1D2E0, 0x1D2F3, 0x1D300, 0x1D356, 0x1D360, 0x1D378, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D9FF, + 0x1DA37, 0x1DA3A, 0x1DA6D, 0x1DA74, 0x1DA76, 0x1DA83, 0x1DA85, 0x1DA8B, + 0x1DF00, 0x1DF1E, 0x1E100, 0x1E12C, 0x1E137, 0x1E13D, 0x1E140, 0x1E149, + 0x1E14E, 0x1E14F, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, 0x1E2F0, 0x1E2F9, + 0x1E2FF, 0x1E2FF, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E8C7, 0x1E8CF, 0x1E900, 0x1E943, + 0x1E94B, 0x1E94B, 0x1E950, 0x1E959, 0x1E95E, 0x1E95F, 0x1EC71, 0x1ECB4, + 0x1ED01, 0x1ED3D, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, 0x1F100, 0x1F1AD, 0x1F1E6, 0x1F202, 0x1F210, 0x1F23B, + 0x1F240, 0x1F248, 0x1F250, 0x1F251, 0x1F260, 0x1F265, 0x1F300, 0x1F6D7, + 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, 0x1F700, 0x1F773, 0x1F780, 0x1F7D8, + 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F800, 0x1F80B, 0x1F810, 0x1F847, + 0x1F850, 0x1F859, 0x1F860, 0x1F887, 0x1F890, 0x1F8AD, 0x1F8B0, 0x1F8B1, + 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, + 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, + 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, 0x1FB00, 0x1FB92, + 0x1FB94, 0x1FBCA, 0x1FBF0, 0x1FBF9, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, + 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + // #66 (10347+353): bp=Grapheme_Extend:Gr_Ext + 0x0300, 0x036F, 0x0483, 0x0489, 0x0591, 0x05BD, 0x05BF, 0x05BF, + 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x0610, 0x061A, + 0x064B, 0x065F, 0x0670, 0x0670, 0x06D6, 0x06DC, 0x06DF, 0x06E4, + 0x06E7, 0x06E8, 0x06EA, 0x06ED, 0x0711, 0x0711, 0x0730, 0x074A, + 0x07A6, 0x07B0, 0x07EB, 0x07F3, 0x07FD, 0x07FD, 0x0816, 0x0819, + 0x081B, 0x0823, 0x0825, 0x0827, 0x0829, 0x082D, 0x0859, 0x085B, + 0x0898, 0x089F, 0x08CA, 0x08E1, 0x08E3, 0x0902, 0x093A, 0x093A, + 0x093C, 0x093C, 0x0941, 0x0948, 0x094D, 0x094D, 0x0951, 0x0957, + 0x0962, 0x0963, 0x0981, 0x0981, 0x09BC, 0x09BC, 0x09BE, 0x09BE, + 0x09C1, 0x09C4, 0x09CD, 0x09CD, 0x09D7, 0x09D7, 0x09E2, 0x09E3, + 0x09FE, 0x09FE, 0x0A01, 0x0A02, 0x0A3C, 0x0A3C, 0x0A41, 0x0A42, + 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, 0x0A51, 0x0A51, 0x0A70, 0x0A71, + 0x0A75, 0x0A75, 0x0A81, 0x0A82, 0x0ABC, 0x0ABC, 0x0AC1, 0x0AC5, + 0x0AC7, 0x0AC8, 0x0ACD, 0x0ACD, 0x0AE2, 0x0AE3, 0x0AFA, 0x0AFF, + 0x0B01, 0x0B01, 0x0B3C, 0x0B3C, 0x0B3E, 0x0B3F, 0x0B41, 0x0B44, + 0x0B4D, 0x0B4D, 0x0B55, 0x0B57, 0x0B62, 0x0B63, 0x0B82, 0x0B82, + 0x0BBE, 0x0BBE, 0x0BC0, 0x0BC0, 0x0BCD, 0x0BCD, 0x0BD7, 0x0BD7, + 0x0C00, 0x0C00, 0x0C04, 0x0C04, 0x0C3C, 0x0C3C, 0x0C3E, 0x0C40, + 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, + 0x0C81, 0x0C81, 0x0CBC, 0x0CBC, 0x0CBF, 0x0CBF, 0x0CC2, 0x0CC2, + 0x0CC6, 0x0CC6, 0x0CCC, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CE2, 0x0CE3, + 0x0D00, 0x0D01, 0x0D3B, 0x0D3C, 0x0D3E, 0x0D3E, 0x0D41, 0x0D44, + 0x0D4D, 0x0D4D, 0x0D57, 0x0D57, 0x0D62, 0x0D63, 0x0D81, 0x0D81, + 0x0DCA, 0x0DCA, 0x0DCF, 0x0DCF, 0x0DD2, 0x0DD4, 0x0DD6, 0x0DD6, + 0x0DDF, 0x0DDF, 0x0E31, 0x0E31, 0x0E34, 0x0E3A, 0x0E47, 0x0E4E, + 0x0EB1, 0x0EB1, 0x0EB4, 0x0EBC, 0x0EC8, 0x0ECD, 0x0F18, 0x0F19, + 0x0F35, 0x0F35, 0x0F37, 0x0F37, 0x0F39, 0x0F39, 0x0F71, 0x0F7E, + 0x0F80, 0x0F84, 0x0F86, 0x0F87, 0x0F8D, 0x0F97, 0x0F99, 0x0FBC, + 0x0FC6, 0x0FC6, 0x102D, 0x1030, 0x1032, 0x1037, 0x1039, 0x103A, + 0x103D, 0x103E, 0x1058, 0x1059, 0x105E, 0x1060, 0x1071, 0x1074, + 0x1082, 0x1082, 0x1085, 0x1086, 0x108D, 0x108D, 0x109D, 0x109D, + 0x135D, 0x135F, 0x1712, 0x1714, 0x1732, 0x1733, 0x1752, 0x1753, + 0x1772, 0x1773, 0x17B4, 0x17B5, 0x17B7, 0x17BD, 0x17C6, 0x17C6, + 0x17C9, 0x17D3, 0x17DD, 0x17DD, 0x180B, 0x180D, 0x180F, 0x180F, + 0x1885, 0x1886, 0x18A9, 0x18A9, 0x1920, 0x1922, 0x1927, 0x1928, + 0x1932, 0x1932, 0x1939, 0x193B, 0x1A17, 0x1A18, 0x1A1B, 0x1A1B, + 0x1A56, 0x1A56, 0x1A58, 0x1A5E, 0x1A60, 0x1A60, 0x1A62, 0x1A62, + 0x1A65, 0x1A6C, 0x1A73, 0x1A7C, 0x1A7F, 0x1A7F, 0x1AB0, 0x1ACE, + 0x1B00, 0x1B03, 0x1B34, 0x1B3A, 0x1B3C, 0x1B3C, 0x1B42, 0x1B42, + 0x1B6B, 0x1B73, 0x1B80, 0x1B81, 0x1BA2, 0x1BA5, 0x1BA8, 0x1BA9, + 0x1BAB, 0x1BAD, 0x1BE6, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BED, + 0x1BEF, 0x1BF1, 0x1C2C, 0x1C33, 0x1C36, 0x1C37, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CE0, 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, + 0x1CF8, 0x1CF9, 0x1DC0, 0x1DFF, 0x200C, 0x200C, 0x20D0, 0x20F0, + 0x2CEF, 0x2CF1, 0x2D7F, 0x2D7F, 0x2DE0, 0x2DFF, 0x302A, 0x302F, + 0x3099, 0x309A, 0xA66F, 0xA672, 0xA674, 0xA67D, 0xA69E, 0xA69F, + 0xA6F0, 0xA6F1, 0xA802, 0xA802, 0xA806, 0xA806, 0xA80B, 0xA80B, + 0xA825, 0xA826, 0xA82C, 0xA82C, 0xA8C4, 0xA8C5, 0xA8E0, 0xA8F1, + 0xA8FF, 0xA8FF, 0xA926, 0xA92D, 0xA947, 0xA951, 0xA980, 0xA982, + 0xA9B3, 0xA9B3, 0xA9B6, 0xA9B9, 0xA9BC, 0xA9BD, 0xA9E5, 0xA9E5, + 0xAA29, 0xAA2E, 0xAA31, 0xAA32, 0xAA35, 0xAA36, 0xAA43, 0xAA43, + 0xAA4C, 0xAA4C, 0xAA7C, 0xAA7C, 0xAAB0, 0xAAB0, 0xAAB2, 0xAAB4, + 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xAAC1, 0xAAEC, 0xAAED, + 0xAAF6, 0xAAF6, 0xABE5, 0xABE5, 0xABE8, 0xABE8, 0xABED, 0xABED, + 0xFB1E, 0xFB1E, 0xFE00, 0xFE0F, 0xFE20, 0xFE2F, 0xFF9E, 0xFF9F, + 0x101FD, 0x101FD, 0x102E0, 0x102E0, 0x10376, 0x1037A, 0x10A01, 0x10A03, + 0x10A05, 0x10A06, 0x10A0C, 0x10A0F, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, + 0x10AE5, 0x10AE6, 0x10D24, 0x10D27, 0x10EAB, 0x10EAC, 0x10F46, 0x10F50, + 0x10F82, 0x10F85, 0x11001, 0x11001, 0x11038, 0x11046, 0x11070, 0x11070, + 0x11073, 0x11074, 0x1107F, 0x11081, 0x110B3, 0x110B6, 0x110B9, 0x110BA, + 0x110C2, 0x110C2, 0x11100, 0x11102, 0x11127, 0x1112B, 0x1112D, 0x11134, + 0x11173, 0x11173, 0x11180, 0x11181, 0x111B6, 0x111BE, 0x111C9, 0x111CC, + 0x111CF, 0x111CF, 0x1122F, 0x11231, 0x11234, 0x11234, 0x11236, 0x11237, + 0x1123E, 0x1123E, 0x112DF, 0x112DF, 0x112E3, 0x112EA, 0x11300, 0x11301, + 0x1133B, 0x1133C, 0x1133E, 0x1133E, 0x11340, 0x11340, 0x11357, 0x11357, + 0x11366, 0x1136C, 0x11370, 0x11374, 0x11438, 0x1143F, 0x11442, 0x11444, + 0x11446, 0x11446, 0x1145E, 0x1145E, 0x114B0, 0x114B0, 0x114B3, 0x114B8, + 0x114BA, 0x114BA, 0x114BD, 0x114BD, 0x114BF, 0x114C0, 0x114C2, 0x114C3, + 0x115AF, 0x115AF, 0x115B2, 0x115B5, 0x115BC, 0x115BD, 0x115BF, 0x115C0, + 0x115DC, 0x115DD, 0x11633, 0x1163A, 0x1163D, 0x1163D, 0x1163F, 0x11640, + 0x116AB, 0x116AB, 0x116AD, 0x116AD, 0x116B0, 0x116B5, 0x116B7, 0x116B7, + 0x1171D, 0x1171F, 0x11722, 0x11725, 0x11727, 0x1172B, 0x1182F, 0x11837, + 0x11839, 0x1183A, 0x11930, 0x11930, 0x1193B, 0x1193C, 0x1193E, 0x1193E, + 0x11943, 0x11943, 0x119D4, 0x119D7, 0x119DA, 0x119DB, 0x119E0, 0x119E0, + 0x11A01, 0x11A0A, 0x11A33, 0x11A38, 0x11A3B, 0x11A3E, 0x11A47, 0x11A47, + 0x11A51, 0x11A56, 0x11A59, 0x11A5B, 0x11A8A, 0x11A96, 0x11A98, 0x11A99, + 0x11C30, 0x11C36, 0x11C38, 0x11C3D, 0x11C3F, 0x11C3F, 0x11C92, 0x11CA7, + 0x11CAA, 0x11CB0, 0x11CB2, 0x11CB3, 0x11CB5, 0x11CB6, 0x11D31, 0x11D36, + 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D45, 0x11D47, 0x11D47, + 0x11D90, 0x11D91, 0x11D95, 0x11D95, 0x11D97, 0x11D97, 0x11EF3, 0x11EF4, + 0x16AF0, 0x16AF4, 0x16B30, 0x16B36, 0x16F4F, 0x16F4F, 0x16F8F, 0x16F92, + 0x16FE4, 0x16FE4, 0x1BC9D, 0x1BC9E, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, + 0x1D165, 0x1D165, 0x1D167, 0x1D169, 0x1D16E, 0x1D172, 0x1D17B, 0x1D182, + 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E130, 0x1E136, 0x1E2AE, 0x1E2AE, + 0x1E2EC, 0x1E2EF, 0x1E8D0, 0x1E8D6, 0x1E944, 0x1E94A, 0xE0020, 0xE007F, + 0xE0100, 0xE01EF, + // #67 (10700+6): bp=Hex_Digit:Hex + 0x0030, 0x0039, 0x0041, 0x0046, 0x0061, 0x0066, 0xFF10, 0xFF19, + 0xFF21, 0xFF26, 0xFF41, 0xFF46, + // #68 (10706+2): bp=IDS_Binary_Operator:IDSB + 0x2FF0, 0x2FF1, 0x2FF4, 0x2FFB, + // #69 (10708+1): bp=IDS_Trinary_Operator:IDST + 0x2FF2, 0x2FF3, + // #70 (10709+756): bp=ID_Continue:IDC + 0x0030, 0x0039, 0x0041, 0x005A, 0x005F, 0x005F, 0x0061, 0x007A, + 0x00AA, 0x00AA, 0x00B5, 0x00B5, 0x00B7, 0x00B7, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, 0x02C6, 0x02D1, + 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, 0x0300, 0x0374, + 0x0376, 0x0377, 0x037A, 0x037D, 0x037F, 0x037F, 0x0386, 0x038A, + 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, + 0x0483, 0x0487, 0x048A, 0x052F, 0x0531, 0x0556, 0x0559, 0x0559, + 0x0560, 0x0588, 0x0591, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x05C2, + 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0610, 0x061A, 0x0620, 0x0669, 0x066E, 0x06D3, 0x06D5, 0x06DC, + 0x06DF, 0x06E8, 0x06EA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x074A, + 0x074D, 0x07B1, 0x07C0, 0x07F5, 0x07FA, 0x07FA, 0x07FD, 0x07FD, + 0x0800, 0x082D, 0x0840, 0x085B, 0x0860, 0x086A, 0x0870, 0x0887, + 0x0889, 0x088E, 0x0898, 0x08E1, 0x08E3, 0x0963, 0x0966, 0x096F, + 0x0971, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, + 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, + 0x09DF, 0x09E3, 0x09E6, 0x09F1, 0x09FC, 0x09FC, 0x09FE, 0x09FE, + 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A75, + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AE6, 0x0AEF, 0x0AF9, 0x0AFF, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3C, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, + 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B66, 0x0B6F, + 0x0B71, 0x0B71, 0x0B82, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, + 0x0BE6, 0x0BEF, 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, 0x0C3C, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, + 0x0C55, 0x0C56, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, + 0x0C66, 0x0C6F, 0x0C80, 0x0C83, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, + 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x0D00, 0x0D0C, + 0x0D0E, 0x0D10, 0x0D12, 0x0D44, 0x0D46, 0x0D48, 0x0D4A, 0x0D4E, + 0x0D54, 0x0D57, 0x0D5F, 0x0D63, 0x0D66, 0x0D6F, 0x0D7A, 0x0D7F, + 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, + 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF3, + 0x0E01, 0x0E3A, 0x0E40, 0x0E4E, 0x0E50, 0x0E59, 0x0E81, 0x0E82, + 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, + 0x0EA7, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EC8, 0x0ECD, + 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, 0x0F18, 0x0F19, + 0x0F20, 0x0F29, 0x0F35, 0x0F35, 0x0F37, 0x0F37, 0x0F39, 0x0F39, + 0x0F3E, 0x0F47, 0x0F49, 0x0F6C, 0x0F71, 0x0F84, 0x0F86, 0x0F97, + 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, 0x1000, 0x1049, 0x1050, 0x109D, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x135D, 0x135F, 0x1369, 0x1371, 0x1380, 0x138F, 0x13A0, 0x13F5, + 0x13F8, 0x13FD, 0x1401, 0x166C, 0x166F, 0x167F, 0x1681, 0x169A, + 0x16A0, 0x16EA, 0x16EE, 0x16F8, 0x1700, 0x1715, 0x171F, 0x1734, + 0x1740, 0x1753, 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + 0x1780, 0x17D3, 0x17D7, 0x17D7, 0x17DC, 0x17DD, 0x17E0, 0x17E9, + 0x180B, 0x180D, 0x180F, 0x1819, 0x1820, 0x1878, 0x1880, 0x18AA, + 0x18B0, 0x18F5, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, + 0x1946, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, 0x19B0, 0x19C9, + 0x19D0, 0x19DA, 0x1A00, 0x1A1B, 0x1A20, 0x1A5E, 0x1A60, 0x1A7C, + 0x1A7F, 0x1A89, 0x1A90, 0x1A99, 0x1AA7, 0x1AA7, 0x1AB0, 0x1ABD, + 0x1ABF, 0x1ACE, 0x1B00, 0x1B4C, 0x1B50, 0x1B59, 0x1B6B, 0x1B73, + 0x1B80, 0x1BF3, 0x1C00, 0x1C37, 0x1C40, 0x1C49, 0x1C4D, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CFA, 0x1D00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, + 0x203F, 0x2040, 0x2054, 0x2054, 0x2071, 0x2071, 0x207F, 0x207F, + 0x2090, 0x209C, 0x20D0, 0x20DC, 0x20E1, 0x20E1, 0x20E5, 0x20F0, + 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, + 0x2118, 0x211D, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, + 0x212A, 0x2139, 0x213C, 0x213F, 0x2145, 0x2149, 0x214E, 0x214E, + 0x2160, 0x2188, 0x2C00, 0x2CE4, 0x2CEB, 0x2CF3, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, + 0x2D7F, 0x2D96, 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, + 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, + 0x2DD8, 0x2DDE, 0x2DE0, 0x2DFF, 0x3005, 0x3007, 0x3021, 0x302F, + 0x3031, 0x3035, 0x3038, 0x303C, 0x3041, 0x3096, 0x3099, 0x309F, + 0x30A1, 0x30FA, 0x30FC, 0x30FF, 0x3105, 0x312F, 0x3131, 0x318E, + 0x31A0, 0x31BF, 0x31F0, 0x31FF, 0x3400, 0x4DBF, 0x4E00, 0xA48C, + 0xA4D0, 0xA4FD, 0xA500, 0xA60C, 0xA610, 0xA62B, 0xA640, 0xA66F, + 0xA674, 0xA67D, 0xA67F, 0xA6F1, 0xA717, 0xA71F, 0xA722, 0xA788, + 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, + 0xA7F2, 0xA827, 0xA82C, 0xA82C, 0xA840, 0xA873, 0xA880, 0xA8C5, + 0xA8D0, 0xA8D9, 0xA8E0, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA92D, + 0xA930, 0xA953, 0xA960, 0xA97C, 0xA980, 0xA9C0, 0xA9CF, 0xA9D9, + 0xA9E0, 0xA9FE, 0xAA00, 0xAA36, 0xAA40, 0xAA4D, 0xAA50, 0xAA59, + 0xAA60, 0xAA76, 0xAA7A, 0xAAC2, 0xAADB, 0xAADD, 0xAAE0, 0xAAEF, + 0xAAF2, 0xAAF6, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, 0xAB11, 0xAB16, + 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, 0xAB5C, 0xAB69, + 0xAB70, 0xABEA, 0xABEC, 0xABED, 0xABF0, 0xABF9, 0xAC00, 0xD7A3, + 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, + 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, 0xFE00, 0xFE0F, 0xFE20, 0xFE2F, 0xFE33, 0xFE34, + 0xFE4D, 0xFE4F, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0xFF10, 0xFF19, + 0xFF21, 0xFF3A, 0xFF3F, 0xFF3F, 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, + 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10140, 0x10174, + 0x101FD, 0x101FD, 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x102E0, 0x102E0, + 0x10300, 0x1031F, 0x1032D, 0x1034A, 0x10350, 0x1037A, 0x10380, 0x1039D, + 0x103A0, 0x103C3, 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, + 0x104A0, 0x104A9, 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, + 0x10530, 0x10563, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, + 0x105BB, 0x105BC, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + 0x10780, 0x10785, 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, + 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, + 0x1083F, 0x10855, 0x10860, 0x10876, 0x10880, 0x1089E, 0x108E0, 0x108F2, + 0x108F4, 0x108F5, 0x10900, 0x10915, 0x10920, 0x10939, 0x10980, 0x109B7, + 0x109BE, 0x109BF, 0x10A00, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, 0x10A13, + 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, + 0x10A60, 0x10A7C, 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE6, + 0x10B00, 0x10B35, 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, + 0x10C00, 0x10C48, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D27, + 0x10D30, 0x10D39, 0x10E80, 0x10EA9, 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, + 0x10F00, 0x10F1C, 0x10F27, 0x10F27, 0x10F30, 0x10F50, 0x10F70, 0x10F85, + 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, 0x11000, 0x11046, 0x11066, 0x11075, + 0x1107F, 0x110BA, 0x110C2, 0x110C2, 0x110D0, 0x110E8, 0x110F0, 0x110F9, + 0x11100, 0x11134, 0x11136, 0x1113F, 0x11144, 0x11147, 0x11150, 0x11173, + 0x11176, 0x11176, 0x11180, 0x111C4, 0x111C9, 0x111CC, 0x111CE, 0x111DA, + 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x11237, 0x1123E, 0x1123E, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A8, 0x112B0, 0x112EA, 0x112F0, 0x112F9, 0x11300, 0x11303, + 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, 0x1132A, 0x11330, + 0x11332, 0x11333, 0x11335, 0x11339, 0x1133B, 0x11344, 0x11347, 0x11348, + 0x1134B, 0x1134D, 0x11350, 0x11350, 0x11357, 0x11357, 0x1135D, 0x11363, + 0x11366, 0x1136C, 0x11370, 0x11374, 0x11400, 0x1144A, 0x11450, 0x11459, + 0x1145E, 0x11461, 0x11480, 0x114C5, 0x114C7, 0x114C7, 0x114D0, 0x114D9, + 0x11580, 0x115B5, 0x115B8, 0x115C0, 0x115D8, 0x115DD, 0x11600, 0x11640, + 0x11644, 0x11644, 0x11650, 0x11659, 0x11680, 0x116B8, 0x116C0, 0x116C9, + 0x11700, 0x1171A, 0x1171D, 0x1172B, 0x11730, 0x11739, 0x11740, 0x11746, + 0x11800, 0x1183A, 0x118A0, 0x118E9, 0x118FF, 0x11906, 0x11909, 0x11909, + 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x11935, 0x11937, 0x11938, + 0x1193B, 0x11943, 0x11950, 0x11959, 0x119A0, 0x119A7, 0x119AA, 0x119D7, + 0x119DA, 0x119E1, 0x119E3, 0x119E4, 0x11A00, 0x11A3E, 0x11A47, 0x11A47, + 0x11A50, 0x11A99, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, + 0x11C0A, 0x11C36, 0x11C38, 0x11C40, 0x11C50, 0x11C59, 0x11C72, 0x11C8F, + 0x11C92, 0x11CA7, 0x11CA9, 0x11CB6, 0x11D00, 0x11D06, 0x11D08, 0x11D09, + 0x11D0B, 0x11D36, 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, + 0x11D50, 0x11D59, 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, + 0x11D90, 0x11D91, 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, 0x11EE0, 0x11EF6, + 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12400, 0x1246E, 0x12480, 0x12543, + 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, + 0x16A40, 0x16A5E, 0x16A60, 0x16A69, 0x16A70, 0x16ABE, 0x16AC0, 0x16AC9, + 0x16AD0, 0x16AED, 0x16AF0, 0x16AF4, 0x16B00, 0x16B36, 0x16B40, 0x16B43, + 0x16B50, 0x16B59, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16E40, 0x16E7F, + 0x16F00, 0x16F4A, 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, 0x16FE0, 0x16FE1, + 0x16FE3, 0x16FE4, 0x16FF0, 0x16FF1, 0x17000, 0x187F7, 0x18800, 0x18CD5, + 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, + 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1BC9D, 0x1BC9E, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D165, 0x1D169, + 0x1D16D, 0x1D172, 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, + 0x1D242, 0x1D244, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, + 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, + 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, + 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, + 0x1D716, 0x1D734, 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, + 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1D7CE, 0x1D7FF, + 0x1DA00, 0x1DA36, 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, + 0x1DA9B, 0x1DA9F, 0x1DAA1, 0x1DAAF, 0x1DF00, 0x1DF1E, 0x1E000, 0x1E006, + 0x1E008, 0x1E018, 0x1E01B, 0x1E021, 0x1E023, 0x1E024, 0x1E026, 0x1E02A, + 0x1E100, 0x1E12C, 0x1E130, 0x1E13D, 0x1E140, 0x1E149, 0x1E14E, 0x1E14E, + 0x1E290, 0x1E2AE, 0x1E2C0, 0x1E2F9, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, + 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E8D0, 0x1E8D6, + 0x1E900, 0x1E94B, 0x1E950, 0x1E959, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, + 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, + 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, + 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, + 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, + 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, + 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, + 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, + 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1FBF0, 0x1FBF9, + 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, + 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, 0xE0100, 0xE01EF, + // #71 (11465+648): bp=ID_Start:IDS + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, + 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, + 0x0370, 0x0374, 0x0376, 0x0377, 0x037A, 0x037D, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x03F5, 0x03F7, 0x0481, 0x048A, 0x052F, 0x0531, 0x0556, + 0x0559, 0x0559, 0x0560, 0x0588, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0620, 0x064A, 0x066E, 0x066F, 0x0671, 0x06D3, 0x06D5, 0x06D5, + 0x06E5, 0x06E6, 0x06EE, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, + 0x0710, 0x0710, 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, + 0x07CA, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x07FA, 0x0800, 0x0815, + 0x081A, 0x081A, 0x0824, 0x0824, 0x0828, 0x0828, 0x0840, 0x0858, + 0x0860, 0x086A, 0x0870, 0x0887, 0x0889, 0x088E, 0x08A0, 0x08C9, + 0x0904, 0x0939, 0x093D, 0x093D, 0x0950, 0x0950, 0x0958, 0x0961, + 0x0971, 0x0980, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BD, 0x09BD, + 0x09CE, 0x09CE, 0x09DC, 0x09DD, 0x09DF, 0x09E1, 0x09F0, 0x09F1, + 0x09FC, 0x09FC, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A72, 0x0A74, 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, 0x0ABD, 0x0ABD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, + 0x0AF9, 0x0AF9, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, + 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B71, 0x0B71, 0x0B83, 0x0B83, + 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, + 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, 0x0BD0, 0x0BD0, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3D, 0x0C3D, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, 0x0C80, 0x0C80, 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, + 0x0CBD, 0x0CBD, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE1, 0x0CF1, 0x0CF2, + 0x0D04, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, + 0x0D4E, 0x0D4E, 0x0D54, 0x0D56, 0x0D5F, 0x0D61, 0x0D7A, 0x0D7F, + 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, + 0x0DC0, 0x0DC6, 0x0E01, 0x0E30, 0x0E32, 0x0E33, 0x0E40, 0x0E46, + 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, + 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB0, 0x0EB2, 0x0EB3, 0x0EBD, 0x0EBD, + 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, + 0x0F40, 0x0F47, 0x0F49, 0x0F6C, 0x0F88, 0x0F8C, 0x1000, 0x102A, + 0x103F, 0x103F, 0x1050, 0x1055, 0x105A, 0x105D, 0x1061, 0x1061, + 0x1065, 0x1066, 0x106E, 0x1070, 0x1075, 0x1081, 0x108E, 0x108E, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x1380, 0x138F, 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1401, 0x166C, + 0x166F, 0x167F, 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16EE, 0x16F8, + 0x1700, 0x1711, 0x171F, 0x1731, 0x1740, 0x1751, 0x1760, 0x176C, + 0x176E, 0x1770, 0x1780, 0x17B3, 0x17D7, 0x17D7, 0x17DC, 0x17DC, + 0x1820, 0x1878, 0x1880, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, + 0x19B0, 0x19C9, 0x1A00, 0x1A16, 0x1A20, 0x1A54, 0x1AA7, 0x1AA7, + 0x1B05, 0x1B33, 0x1B45, 0x1B4C, 0x1B83, 0x1BA0, 0x1BAE, 0x1BAF, + 0x1BBA, 0x1BE5, 0x1C00, 0x1C23, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, + 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, + 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, + 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, + 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x2102, 0x2102, 0x2107, 0x2107, + 0x210A, 0x2113, 0x2115, 0x2115, 0x2118, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x2139, 0x213C, 0x213F, + 0x2145, 0x2149, 0x214E, 0x214E, 0x2160, 0x2188, 0x2C00, 0x2CE4, + 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, + 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, 0x3038, 0x303C, + 0x3041, 0x3096, 0x309B, 0x309F, 0x30A1, 0x30FA, 0x30FC, 0x30FF, + 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, + 0x3400, 0x4DBF, 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, 0xA500, 0xA60C, + 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA640, 0xA66E, 0xA67F, 0xA69D, + 0xA6A0, 0xA6EF, 0xA717, 0xA71F, 0xA722, 0xA788, 0xA78B, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA801, + 0xA803, 0xA805, 0xA807, 0xA80A, 0xA80C, 0xA822, 0xA840, 0xA873, + 0xA882, 0xA8B3, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, 0xA930, 0xA946, 0xA960, 0xA97C, 0xA984, 0xA9B2, + 0xA9CF, 0xA9CF, 0xA9E0, 0xA9E4, 0xA9E6, 0xA9EF, 0xA9FA, 0xA9FE, + 0xAA00, 0xAA28, 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA60, 0xAA76, + 0xAA7A, 0xAA7A, 0xAA7E, 0xAAAF, 0xAAB1, 0xAAB1, 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADD, + 0xAAE0, 0xAAEA, 0xAAF2, 0xAAF4, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, + 0xAB5C, 0xAB69, 0xAB70, 0xABE2, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0xFB00, 0xFB06, + 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, 0xFB1F, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, + 0xFDF0, 0xFDFB, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0xFF21, 0xFF3A, + 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0x10000, 0x1000B, 0x1000D, 0x10026, + 0x10028, 0x1003A, 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, + 0x10080, 0x100FA, 0x10140, 0x10174, 0x10280, 0x1029C, 0x102A0, 0x102D0, + 0x10300, 0x1031F, 0x1032D, 0x1034A, 0x10350, 0x10375, 0x10380, 0x1039D, + 0x103A0, 0x103C3, 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, + 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, 0x10530, 0x10563, + 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, + 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, + 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, 0x10780, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, 0x10808, 0x10808, + 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, 0x1083F, 0x10855, + 0x10860, 0x10876, 0x10880, 0x1089E, 0x108E0, 0x108F2, 0x108F4, 0x108F5, + 0x10900, 0x10915, 0x10920, 0x10939, 0x10980, 0x109B7, 0x109BE, 0x109BF, + 0x10A00, 0x10A00, 0x10A10, 0x10A13, 0x10A15, 0x10A17, 0x10A19, 0x10A35, + 0x10A60, 0x10A7C, 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, + 0x10B00, 0x10B35, 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, + 0x10C00, 0x10C48, 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D23, + 0x10E80, 0x10EA9, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, + 0x10F30, 0x10F45, 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, + 0x11003, 0x11037, 0x11071, 0x11072, 0x11075, 0x11075, 0x11083, 0x110AF, + 0x110D0, 0x110E8, 0x11103, 0x11126, 0x11144, 0x11144, 0x11147, 0x11147, + 0x11150, 0x11172, 0x11176, 0x11176, 0x11183, 0x111B2, 0x111C1, 0x111C4, + 0x111DA, 0x111DA, 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x1122B, + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A8, 0x112B0, 0x112DE, 0x11305, 0x1130C, 0x1130F, 0x11310, + 0x11313, 0x11328, 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, + 0x1133D, 0x1133D, 0x11350, 0x11350, 0x1135D, 0x11361, 0x11400, 0x11434, + 0x11447, 0x1144A, 0x1145F, 0x11461, 0x11480, 0x114AF, 0x114C4, 0x114C5, + 0x114C7, 0x114C7, 0x11580, 0x115AE, 0x115D8, 0x115DB, 0x11600, 0x1162F, + 0x11644, 0x11644, 0x11680, 0x116AA, 0x116B8, 0x116B8, 0x11700, 0x1171A, + 0x11740, 0x11746, 0x11800, 0x1182B, 0x118A0, 0x118DF, 0x118FF, 0x11906, + 0x11909, 0x11909, 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x1192F, + 0x1193F, 0x1193F, 0x11941, 0x11941, 0x119A0, 0x119A7, 0x119AA, 0x119D0, + 0x119E1, 0x119E1, 0x119E3, 0x119E3, 0x11A00, 0x11A00, 0x11A0B, 0x11A32, + 0x11A3A, 0x11A3A, 0x11A50, 0x11A50, 0x11A5C, 0x11A89, 0x11A9D, 0x11A9D, + 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, 0x11C0A, 0x11C2E, 0x11C40, 0x11C40, + 0x11C72, 0x11C8F, 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D30, + 0x11D46, 0x11D46, 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D89, + 0x11D98, 0x11D98, 0x11EE0, 0x11EF2, 0x11FB0, 0x11FB0, 0x12000, 0x12399, + 0x12400, 0x1246E, 0x12480, 0x12543, 0x12F90, 0x12FF0, 0x13000, 0x1342E, + 0x14400, 0x14646, 0x16800, 0x16A38, 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, + 0x16AD0, 0x16AED, 0x16B00, 0x16B2F, 0x16B40, 0x16B43, 0x16B63, 0x16B77, + 0x16B7D, 0x16B8F, 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, 0x16F50, 0x16F50, + 0x16F93, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x17000, 0x187F7, + 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, + 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, + 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, + 0x1BC90, 0x1BC99, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, + 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, + 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, + 0x1D6A8, 0x1D6C0, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, + 0x1D716, 0x1D734, 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, + 0x1D78A, 0x1D7A8, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1DF00, 0x1DF1E, + 0x1E100, 0x1E12C, 0x1E137, 0x1E13D, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, + 0x1E2C0, 0x1E2EB, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E900, 0x1E943, 0x1E94B, 0x1E94B, + 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, + 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, + 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, + 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, + 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, + 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, + 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, + 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, + 0x1EEAB, 0x1EEBB, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, + 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #72 (12113+19): bp=Ideographic:Ideo + 0x3006, 0x3007, 0x3021, 0x3029, 0x3038, 0x303A, 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0x16FE4, 0x16FE4, + 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, 0x1B170, 0x1B2FB, + 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, + 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #73 (12132+1): bp=Join_Control:Join_C + 0x200C, 0x200D, + // #74 (12133+7): bp=Logical_Order_Exception:LOE + 0x0E40, 0x0E44, 0x0EC0, 0x0EC4, 0x19B5, 0x19B7, 0x19BA, 0x19BA, + 0xAAB5, 0xAAB6, 0xAAB9, 0xAAB9, 0xAABB, 0xAABC, + // #75 (12140+668): bp=Lowercase:Lower + 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, 0x00BA, 0x00BA, + 0x00DF, 0x00F6, 0x00F8, 0x00FF, 0x0101, 0x0101, 0x0103, 0x0103, + 0x0105, 0x0105, 0x0107, 0x0107, 0x0109, 0x0109, 0x010B, 0x010B, + 0x010D, 0x010D, 0x010F, 0x010F, 0x0111, 0x0111, 0x0113, 0x0113, + 0x0115, 0x0115, 0x0117, 0x0117, 0x0119, 0x0119, 0x011B, 0x011B, + 0x011D, 0x011D, 0x011F, 0x011F, 0x0121, 0x0121, 0x0123, 0x0123, + 0x0125, 0x0125, 0x0127, 0x0127, 0x0129, 0x0129, 0x012B, 0x012B, + 0x012D, 0x012D, 0x012F, 0x012F, 0x0131, 0x0131, 0x0133, 0x0133, + 0x0135, 0x0135, 0x0137, 0x0138, 0x013A, 0x013A, 0x013C, 0x013C, + 0x013E, 0x013E, 0x0140, 0x0140, 0x0142, 0x0142, 0x0144, 0x0144, + 0x0146, 0x0146, 0x0148, 0x0149, 0x014B, 0x014B, 0x014D, 0x014D, + 0x014F, 0x014F, 0x0151, 0x0151, 0x0153, 0x0153, 0x0155, 0x0155, + 0x0157, 0x0157, 0x0159, 0x0159, 0x015B, 0x015B, 0x015D, 0x015D, + 0x015F, 0x015F, 0x0161, 0x0161, 0x0163, 0x0163, 0x0165, 0x0165, + 0x0167, 0x0167, 0x0169, 0x0169, 0x016B, 0x016B, 0x016D, 0x016D, + 0x016F, 0x016F, 0x0171, 0x0171, 0x0173, 0x0173, 0x0175, 0x0175, + 0x0177, 0x0177, 0x017A, 0x017A, 0x017C, 0x017C, 0x017E, 0x0180, + 0x0183, 0x0183, 0x0185, 0x0185, 0x0188, 0x0188, 0x018C, 0x018D, + 0x0192, 0x0192, 0x0195, 0x0195, 0x0199, 0x019B, 0x019E, 0x019E, + 0x01A1, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x01A8, 0x01A8, + 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x01B0, 0x01B0, 0x01B4, 0x01B4, + 0x01B6, 0x01B6, 0x01B9, 0x01BA, 0x01BD, 0x01BF, 0x01C6, 0x01C6, + 0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CE, 0x01CE, 0x01D0, 0x01D0, + 0x01D2, 0x01D2, 0x01D4, 0x01D4, 0x01D6, 0x01D6, 0x01D8, 0x01D8, + 0x01DA, 0x01DA, 0x01DC, 0x01DD, 0x01DF, 0x01DF, 0x01E1, 0x01E1, + 0x01E3, 0x01E3, 0x01E5, 0x01E5, 0x01E7, 0x01E7, 0x01E9, 0x01E9, + 0x01EB, 0x01EB, 0x01ED, 0x01ED, 0x01EF, 0x01F0, 0x01F3, 0x01F3, + 0x01F5, 0x01F5, 0x01F9, 0x01F9, 0x01FB, 0x01FB, 0x01FD, 0x01FD, + 0x01FF, 0x01FF, 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, + 0x0207, 0x0207, 0x0209, 0x0209, 0x020B, 0x020B, 0x020D, 0x020D, + 0x020F, 0x020F, 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, + 0x0217, 0x0217, 0x0219, 0x0219, 0x021B, 0x021B, 0x021D, 0x021D, + 0x021F, 0x021F, 0x0221, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, + 0x0227, 0x0227, 0x0229, 0x0229, 0x022B, 0x022B, 0x022D, 0x022D, + 0x022F, 0x022F, 0x0231, 0x0231, 0x0233, 0x0239, 0x023C, 0x023C, + 0x023F, 0x0240, 0x0242, 0x0242, 0x0247, 0x0247, 0x0249, 0x0249, + 0x024B, 0x024B, 0x024D, 0x024D, 0x024F, 0x0293, 0x0295, 0x02B8, + 0x02C0, 0x02C1, 0x02E0, 0x02E4, 0x0345, 0x0345, 0x0371, 0x0371, + 0x0373, 0x0373, 0x0377, 0x0377, 0x037A, 0x037D, 0x0390, 0x0390, + 0x03AC, 0x03CE, 0x03D0, 0x03D1, 0x03D5, 0x03D7, 0x03D9, 0x03D9, + 0x03DB, 0x03DB, 0x03DD, 0x03DD, 0x03DF, 0x03DF, 0x03E1, 0x03E1, + 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7, 0x03E9, 0x03E9, + 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03F3, 0x03F5, 0x03F5, + 0x03F8, 0x03F8, 0x03FB, 0x03FC, 0x0430, 0x045F, 0x0461, 0x0461, + 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, + 0x046B, 0x046B, 0x046D, 0x046D, 0x046F, 0x046F, 0x0471, 0x0471, + 0x0473, 0x0473, 0x0475, 0x0475, 0x0477, 0x0477, 0x0479, 0x0479, + 0x047B, 0x047B, 0x047D, 0x047D, 0x047F, 0x047F, 0x0481, 0x0481, + 0x048B, 0x048B, 0x048D, 0x048D, 0x048F, 0x048F, 0x0491, 0x0491, + 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, + 0x049B, 0x049B, 0x049D, 0x049D, 0x049F, 0x049F, 0x04A1, 0x04A1, + 0x04A3, 0x04A3, 0x04A5, 0x04A5, 0x04A7, 0x04A7, 0x04A9, 0x04A9, + 0x04AB, 0x04AB, 0x04AD, 0x04AD, 0x04AF, 0x04AF, 0x04B1, 0x04B1, + 0x04B3, 0x04B3, 0x04B5, 0x04B5, 0x04B7, 0x04B7, 0x04B9, 0x04B9, + 0x04BB, 0x04BB, 0x04BD, 0x04BD, 0x04BF, 0x04BF, 0x04C2, 0x04C2, + 0x04C4, 0x04C4, 0x04C6, 0x04C6, 0x04C8, 0x04C8, 0x04CA, 0x04CA, + 0x04CC, 0x04CC, 0x04CE, 0x04CF, 0x04D1, 0x04D1, 0x04D3, 0x04D3, + 0x04D5, 0x04D5, 0x04D7, 0x04D7, 0x04D9, 0x04D9, 0x04DB, 0x04DB, + 0x04DD, 0x04DD, 0x04DF, 0x04DF, 0x04E1, 0x04E1, 0x04E3, 0x04E3, + 0x04E5, 0x04E5, 0x04E7, 0x04E7, 0x04E9, 0x04E9, 0x04EB, 0x04EB, + 0x04ED, 0x04ED, 0x04EF, 0x04EF, 0x04F1, 0x04F1, 0x04F3, 0x04F3, + 0x04F5, 0x04F5, 0x04F7, 0x04F7, 0x04F9, 0x04F9, 0x04FB, 0x04FB, + 0x04FD, 0x04FD, 0x04FF, 0x04FF, 0x0501, 0x0501, 0x0503, 0x0503, + 0x0505, 0x0505, 0x0507, 0x0507, 0x0509, 0x0509, 0x050B, 0x050B, + 0x050D, 0x050D, 0x050F, 0x050F, 0x0511, 0x0511, 0x0513, 0x0513, + 0x0515, 0x0515, 0x0517, 0x0517, 0x0519, 0x0519, 0x051B, 0x051B, + 0x051D, 0x051D, 0x051F, 0x051F, 0x0521, 0x0521, 0x0523, 0x0523, + 0x0525, 0x0525, 0x0527, 0x0527, 0x0529, 0x0529, 0x052B, 0x052B, + 0x052D, 0x052D, 0x052F, 0x052F, 0x0560, 0x0588, 0x10D0, 0x10FA, + 0x10FD, 0x10FF, 0x13F8, 0x13FD, 0x1C80, 0x1C88, 0x1D00, 0x1DBF, + 0x1E01, 0x1E01, 0x1E03, 0x1E03, 0x1E05, 0x1E05, 0x1E07, 0x1E07, + 0x1E09, 0x1E09, 0x1E0B, 0x1E0B, 0x1E0D, 0x1E0D, 0x1E0F, 0x1E0F, + 0x1E11, 0x1E11, 0x1E13, 0x1E13, 0x1E15, 0x1E15, 0x1E17, 0x1E17, + 0x1E19, 0x1E19, 0x1E1B, 0x1E1B, 0x1E1D, 0x1E1D, 0x1E1F, 0x1E1F, + 0x1E21, 0x1E21, 0x1E23, 0x1E23, 0x1E25, 0x1E25, 0x1E27, 0x1E27, + 0x1E29, 0x1E29, 0x1E2B, 0x1E2B, 0x1E2D, 0x1E2D, 0x1E2F, 0x1E2F, + 0x1E31, 0x1E31, 0x1E33, 0x1E33, 0x1E35, 0x1E35, 0x1E37, 0x1E37, + 0x1E39, 0x1E39, 0x1E3B, 0x1E3B, 0x1E3D, 0x1E3D, 0x1E3F, 0x1E3F, + 0x1E41, 0x1E41, 0x1E43, 0x1E43, 0x1E45, 0x1E45, 0x1E47, 0x1E47, + 0x1E49, 0x1E49, 0x1E4B, 0x1E4B, 0x1E4D, 0x1E4D, 0x1E4F, 0x1E4F, + 0x1E51, 0x1E51, 0x1E53, 0x1E53, 0x1E55, 0x1E55, 0x1E57, 0x1E57, + 0x1E59, 0x1E59, 0x1E5B, 0x1E5B, 0x1E5D, 0x1E5D, 0x1E5F, 0x1E5F, + 0x1E61, 0x1E61, 0x1E63, 0x1E63, 0x1E65, 0x1E65, 0x1E67, 0x1E67, + 0x1E69, 0x1E69, 0x1E6B, 0x1E6B, 0x1E6D, 0x1E6D, 0x1E6F, 0x1E6F, + 0x1E71, 0x1E71, 0x1E73, 0x1E73, 0x1E75, 0x1E75, 0x1E77, 0x1E77, + 0x1E79, 0x1E79, 0x1E7B, 0x1E7B, 0x1E7D, 0x1E7D, 0x1E7F, 0x1E7F, + 0x1E81, 0x1E81, 0x1E83, 0x1E83, 0x1E85, 0x1E85, 0x1E87, 0x1E87, + 0x1E89, 0x1E89, 0x1E8B, 0x1E8B, 0x1E8D, 0x1E8D, 0x1E8F, 0x1E8F, + 0x1E91, 0x1E91, 0x1E93, 0x1E93, 0x1E95, 0x1E9D, 0x1E9F, 0x1E9F, + 0x1EA1, 0x1EA1, 0x1EA3, 0x1EA3, 0x1EA5, 0x1EA5, 0x1EA7, 0x1EA7, + 0x1EA9, 0x1EA9, 0x1EAB, 0x1EAB, 0x1EAD, 0x1EAD, 0x1EAF, 0x1EAF, + 0x1EB1, 0x1EB1, 0x1EB3, 0x1EB3, 0x1EB5, 0x1EB5, 0x1EB7, 0x1EB7, + 0x1EB9, 0x1EB9, 0x1EBB, 0x1EBB, 0x1EBD, 0x1EBD, 0x1EBF, 0x1EBF, + 0x1EC1, 0x1EC1, 0x1EC3, 0x1EC3, 0x1EC5, 0x1EC5, 0x1EC7, 0x1EC7, + 0x1EC9, 0x1EC9, 0x1ECB, 0x1ECB, 0x1ECD, 0x1ECD, 0x1ECF, 0x1ECF, + 0x1ED1, 0x1ED1, 0x1ED3, 0x1ED3, 0x1ED5, 0x1ED5, 0x1ED7, 0x1ED7, + 0x1ED9, 0x1ED9, 0x1EDB, 0x1EDB, 0x1EDD, 0x1EDD, 0x1EDF, 0x1EDF, + 0x1EE1, 0x1EE1, 0x1EE3, 0x1EE3, 0x1EE5, 0x1EE5, 0x1EE7, 0x1EE7, + 0x1EE9, 0x1EE9, 0x1EEB, 0x1EEB, 0x1EED, 0x1EED, 0x1EEF, 0x1EEF, + 0x1EF1, 0x1EF1, 0x1EF3, 0x1EF3, 0x1EF5, 0x1EF5, 0x1EF7, 0x1EF7, + 0x1EF9, 0x1EF9, 0x1EFB, 0x1EFB, 0x1EFD, 0x1EFD, 0x1EFF, 0x1F07, + 0x1F10, 0x1F15, 0x1F20, 0x1F27, 0x1F30, 0x1F37, 0x1F40, 0x1F45, + 0x1F50, 0x1F57, 0x1F60, 0x1F67, 0x1F70, 0x1F7D, 0x1F80, 0x1F87, + 0x1F90, 0x1F97, 0x1FA0, 0x1FA7, 0x1FB0, 0x1FB4, 0x1FB6, 0x1FB7, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FC7, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FD7, 0x1FE0, 0x1FE7, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FF7, + 0x2071, 0x2071, 0x207F, 0x207F, 0x2090, 0x209C, 0x210A, 0x210A, + 0x210E, 0x210F, 0x2113, 0x2113, 0x212F, 0x212F, 0x2134, 0x2134, + 0x2139, 0x2139, 0x213C, 0x213D, 0x2146, 0x2149, 0x214E, 0x214E, + 0x2170, 0x217F, 0x2184, 0x2184, 0x24D0, 0x24E9, 0x2C30, 0x2C5F, + 0x2C61, 0x2C61, 0x2C65, 0x2C66, 0x2C68, 0x2C68, 0x2C6A, 0x2C6A, + 0x2C6C, 0x2C6C, 0x2C71, 0x2C71, 0x2C73, 0x2C74, 0x2C76, 0x2C7D, + 0x2C81, 0x2C81, 0x2C83, 0x2C83, 0x2C85, 0x2C85, 0x2C87, 0x2C87, + 0x2C89, 0x2C89, 0x2C8B, 0x2C8B, 0x2C8D, 0x2C8D, 0x2C8F, 0x2C8F, + 0x2C91, 0x2C91, 0x2C93, 0x2C93, 0x2C95, 0x2C95, 0x2C97, 0x2C97, + 0x2C99, 0x2C99, 0x2C9B, 0x2C9B, 0x2C9D, 0x2C9D, 0x2C9F, 0x2C9F, + 0x2CA1, 0x2CA1, 0x2CA3, 0x2CA3, 0x2CA5, 0x2CA5, 0x2CA7, 0x2CA7, + 0x2CA9, 0x2CA9, 0x2CAB, 0x2CAB, 0x2CAD, 0x2CAD, 0x2CAF, 0x2CAF, + 0x2CB1, 0x2CB1, 0x2CB3, 0x2CB3, 0x2CB5, 0x2CB5, 0x2CB7, 0x2CB7, + 0x2CB9, 0x2CB9, 0x2CBB, 0x2CBB, 0x2CBD, 0x2CBD, 0x2CBF, 0x2CBF, + 0x2CC1, 0x2CC1, 0x2CC3, 0x2CC3, 0x2CC5, 0x2CC5, 0x2CC7, 0x2CC7, + 0x2CC9, 0x2CC9, 0x2CCB, 0x2CCB, 0x2CCD, 0x2CCD, 0x2CCF, 0x2CCF, + 0x2CD1, 0x2CD1, 0x2CD3, 0x2CD3, 0x2CD5, 0x2CD5, 0x2CD7, 0x2CD7, + 0x2CD9, 0x2CD9, 0x2CDB, 0x2CDB, 0x2CDD, 0x2CDD, 0x2CDF, 0x2CDF, + 0x2CE1, 0x2CE1, 0x2CE3, 0x2CE4, 0x2CEC, 0x2CEC, 0x2CEE, 0x2CEE, + 0x2CF3, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + 0xA641, 0xA641, 0xA643, 0xA643, 0xA645, 0xA645, 0xA647, 0xA647, + 0xA649, 0xA649, 0xA64B, 0xA64B, 0xA64D, 0xA64D, 0xA64F, 0xA64F, + 0xA651, 0xA651, 0xA653, 0xA653, 0xA655, 0xA655, 0xA657, 0xA657, + 0xA659, 0xA659, 0xA65B, 0xA65B, 0xA65D, 0xA65D, 0xA65F, 0xA65F, + 0xA661, 0xA661, 0xA663, 0xA663, 0xA665, 0xA665, 0xA667, 0xA667, + 0xA669, 0xA669, 0xA66B, 0xA66B, 0xA66D, 0xA66D, 0xA681, 0xA681, + 0xA683, 0xA683, 0xA685, 0xA685, 0xA687, 0xA687, 0xA689, 0xA689, + 0xA68B, 0xA68B, 0xA68D, 0xA68D, 0xA68F, 0xA68F, 0xA691, 0xA691, + 0xA693, 0xA693, 0xA695, 0xA695, 0xA697, 0xA697, 0xA699, 0xA699, + 0xA69B, 0xA69D, 0xA723, 0xA723, 0xA725, 0xA725, 0xA727, 0xA727, + 0xA729, 0xA729, 0xA72B, 0xA72B, 0xA72D, 0xA72D, 0xA72F, 0xA731, + 0xA733, 0xA733, 0xA735, 0xA735, 0xA737, 0xA737, 0xA739, 0xA739, + 0xA73B, 0xA73B, 0xA73D, 0xA73D, 0xA73F, 0xA73F, 0xA741, 0xA741, + 0xA743, 0xA743, 0xA745, 0xA745, 0xA747, 0xA747, 0xA749, 0xA749, + 0xA74B, 0xA74B, 0xA74D, 0xA74D, 0xA74F, 0xA74F, 0xA751, 0xA751, + 0xA753, 0xA753, 0xA755, 0xA755, 0xA757, 0xA757, 0xA759, 0xA759, + 0xA75B, 0xA75B, 0xA75D, 0xA75D, 0xA75F, 0xA75F, 0xA761, 0xA761, + 0xA763, 0xA763, 0xA765, 0xA765, 0xA767, 0xA767, 0xA769, 0xA769, + 0xA76B, 0xA76B, 0xA76D, 0xA76D, 0xA76F, 0xA778, 0xA77A, 0xA77A, + 0xA77C, 0xA77C, 0xA77F, 0xA77F, 0xA781, 0xA781, 0xA783, 0xA783, + 0xA785, 0xA785, 0xA787, 0xA787, 0xA78C, 0xA78C, 0xA78E, 0xA78E, + 0xA791, 0xA791, 0xA793, 0xA795, 0xA797, 0xA797, 0xA799, 0xA799, + 0xA79B, 0xA79B, 0xA79D, 0xA79D, 0xA79F, 0xA79F, 0xA7A1, 0xA7A1, + 0xA7A3, 0xA7A3, 0xA7A5, 0xA7A5, 0xA7A7, 0xA7A7, 0xA7A9, 0xA7A9, + 0xA7AF, 0xA7AF, 0xA7B5, 0xA7B5, 0xA7B7, 0xA7B7, 0xA7B9, 0xA7B9, + 0xA7BB, 0xA7BB, 0xA7BD, 0xA7BD, 0xA7BF, 0xA7BF, 0xA7C1, 0xA7C1, + 0xA7C3, 0xA7C3, 0xA7C8, 0xA7C8, 0xA7CA, 0xA7CA, 0xA7D1, 0xA7D1, + 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D5, 0xA7D7, 0xA7D7, 0xA7D9, 0xA7D9, + 0xA7F6, 0xA7F6, 0xA7F8, 0xA7FA, 0xAB30, 0xAB5A, 0xAB5C, 0xAB68, + 0xAB70, 0xABBF, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF41, 0xFF5A, + 0x10428, 0x1044F, 0x104D8, 0x104FB, 0x10597, 0x105A1, 0x105A3, 0x105B1, + 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10780, 0x10780, 0x10783, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10CC0, 0x10CF2, 0x118C0, 0x118DF, + 0x16E60, 0x16E7F, 0x1D41A, 0x1D433, 0x1D44E, 0x1D454, 0x1D456, 0x1D467, + 0x1D482, 0x1D49B, 0x1D4B6, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D4CF, 0x1D4EA, 0x1D503, 0x1D51E, 0x1D537, 0x1D552, 0x1D56B, + 0x1D586, 0x1D59F, 0x1D5BA, 0x1D5D3, 0x1D5EE, 0x1D607, 0x1D622, 0x1D63B, + 0x1D656, 0x1D66F, 0x1D68A, 0x1D6A5, 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6E1, + 0x1D6FC, 0x1D714, 0x1D716, 0x1D71B, 0x1D736, 0x1D74E, 0x1D750, 0x1D755, + 0x1D770, 0x1D788, 0x1D78A, 0x1D78F, 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7C9, + 0x1D7CB, 0x1D7CB, 0x1DF00, 0x1DF09, 0x1DF0B, 0x1DF1E, 0x1E922, 0x1E943, + // #76 (12808+138): bp=Math + 0x002B, 0x002B, 0x003C, 0x003E, 0x005E, 0x005E, 0x007C, 0x007C, + 0x007E, 0x007E, 0x00AC, 0x00AC, 0x00B1, 0x00B1, 0x00D7, 0x00D7, + 0x00F7, 0x00F7, 0x03D0, 0x03D2, 0x03D5, 0x03D5, 0x03F0, 0x03F1, + 0x03F4, 0x03F6, 0x0606, 0x0608, 0x2016, 0x2016, 0x2032, 0x2034, + 0x2040, 0x2040, 0x2044, 0x2044, 0x2052, 0x2052, 0x2061, 0x2064, + 0x207A, 0x207E, 0x208A, 0x208E, 0x20D0, 0x20DC, 0x20E1, 0x20E1, + 0x20E5, 0x20E6, 0x20EB, 0x20EF, 0x2102, 0x2102, 0x2107, 0x2107, + 0x210A, 0x2113, 0x2115, 0x2115, 0x2118, 0x211D, 0x2124, 0x2124, + 0x2128, 0x2129, 0x212C, 0x212D, 0x212F, 0x2131, 0x2133, 0x2138, + 0x213C, 0x2149, 0x214B, 0x214B, 0x2190, 0x21A7, 0x21A9, 0x21AE, + 0x21B0, 0x21B1, 0x21B6, 0x21B7, 0x21BC, 0x21DB, 0x21DD, 0x21DD, + 0x21E4, 0x21E5, 0x21F4, 0x22FF, 0x2308, 0x230B, 0x2320, 0x2321, + 0x237C, 0x237C, 0x239B, 0x23B5, 0x23B7, 0x23B7, 0x23D0, 0x23D0, + 0x23DC, 0x23E2, 0x25A0, 0x25A1, 0x25AE, 0x25B7, 0x25BC, 0x25C1, + 0x25C6, 0x25C7, 0x25CA, 0x25CB, 0x25CF, 0x25D3, 0x25E2, 0x25E2, + 0x25E4, 0x25E4, 0x25E7, 0x25EC, 0x25F8, 0x25FF, 0x2605, 0x2606, + 0x2640, 0x2640, 0x2642, 0x2642, 0x2660, 0x2663, 0x266D, 0x266F, + 0x27C0, 0x27FF, 0x2900, 0x2AFF, 0x2B30, 0x2B44, 0x2B47, 0x2B4C, + 0xFB29, 0xFB29, 0xFE61, 0xFE66, 0xFE68, 0xFE68, 0xFF0B, 0xFF0B, + 0xFF1C, 0xFF1E, 0xFF3C, 0xFF3C, 0xFF3E, 0xFF3E, 0xFF5C, 0xFF5C, + 0xFF5E, 0xFF5E, 0xFFE2, 0xFFE2, 0xFFE9, 0xFFEC, 0x1D400, 0x1D454, + 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, + 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, + 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, + 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, + 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D7FF, + 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, + 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, + 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, + 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, + 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, + 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, + 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, + 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, + 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, + // #77 (12946+18): bp=Noncharacter_Code_Point:NChar + 0xFDD0, 0xFDEF, 0xFFFE, 0xFFFF, 0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, + 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, + 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, + 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF, + // #78 (12964+28): bp=Pattern_Syntax:Pat_Syn + 0x0021, 0x002F, 0x003A, 0x0040, 0x005B, 0x005E, 0x0060, 0x0060, + 0x007B, 0x007E, 0x00A1, 0x00A7, 0x00A9, 0x00A9, 0x00AB, 0x00AC, + 0x00AE, 0x00AE, 0x00B0, 0x00B1, 0x00B6, 0x00B6, 0x00BB, 0x00BB, + 0x00BF, 0x00BF, 0x00D7, 0x00D7, 0x00F7, 0x00F7, 0x2010, 0x2027, + 0x2030, 0x203E, 0x2041, 0x2053, 0x2055, 0x205E, 0x2190, 0x245F, + 0x2500, 0x2775, 0x2794, 0x2BFF, 0x2E00, 0x2E7F, 0x3001, 0x3003, + 0x3008, 0x3020, 0x3030, 0x3030, 0xFD3E, 0xFD3F, 0xFE45, 0xFE46, + // #79 (12992+5): bp=Pattern_White_Space:Pat_WS + 0x0009, 0x000D, 0x0020, 0x0020, 0x0085, 0x0085, 0x200E, 0x200F, + 0x2028, 0x2029, + // #80 (12997+13): bp=Quotation_Mark:QMark + 0x0022, 0x0022, 0x0027, 0x0027, 0x00AB, 0x00AB, 0x00BB, 0x00BB, + 0x2018, 0x201F, 0x2039, 0x203A, 0x2E42, 0x2E42, 0x300C, 0x300F, + 0x301D, 0x301F, 0xFE41, 0xFE44, 0xFF02, 0xFF02, 0xFF07, 0xFF07, + 0xFF62, 0xFF63, + // #81 (13010+3): bp=Radical + 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, + // #82 (13013+1): bp=Regional_Indicator:RI + 0x1F1E6, 0x1F1FF, + // #83 (13014+79): bp=Sentence_Terminal:STerm + 0x0021, 0x0021, 0x002E, 0x002E, 0x003F, 0x003F, 0x0589, 0x0589, + 0x061D, 0x061F, 0x06D4, 0x06D4, 0x0700, 0x0702, 0x07F9, 0x07F9, + 0x0837, 0x0837, 0x0839, 0x0839, 0x083D, 0x083E, 0x0964, 0x0965, + 0x104A, 0x104B, 0x1362, 0x1362, 0x1367, 0x1368, 0x166E, 0x166E, + 0x1735, 0x1736, 0x1803, 0x1803, 0x1809, 0x1809, 0x1944, 0x1945, + 0x1AA8, 0x1AAB, 0x1B5A, 0x1B5B, 0x1B5E, 0x1B5F, 0x1B7D, 0x1B7E, + 0x1C3B, 0x1C3C, 0x1C7E, 0x1C7F, 0x203C, 0x203D, 0x2047, 0x2049, + 0x2E2E, 0x2E2E, 0x2E3C, 0x2E3C, 0x2E53, 0x2E54, 0x3002, 0x3002, + 0xA4FF, 0xA4FF, 0xA60E, 0xA60F, 0xA6F3, 0xA6F3, 0xA6F7, 0xA6F7, + 0xA876, 0xA877, 0xA8CE, 0xA8CF, 0xA92F, 0xA92F, 0xA9C8, 0xA9C9, + 0xAA5D, 0xAA5F, 0xAAF0, 0xAAF1, 0xABEB, 0xABEB, 0xFE52, 0xFE52, + 0xFE56, 0xFE57, 0xFF01, 0xFF01, 0xFF0E, 0xFF0E, 0xFF1F, 0xFF1F, + 0xFF61, 0xFF61, 0x10A56, 0x10A57, 0x10F55, 0x10F59, 0x10F86, 0x10F89, + 0x11047, 0x11048, 0x110BE, 0x110C1, 0x11141, 0x11143, 0x111C5, 0x111C6, + 0x111CD, 0x111CD, 0x111DE, 0x111DF, 0x11238, 0x11239, 0x1123B, 0x1123C, + 0x112A9, 0x112A9, 0x1144B, 0x1144C, 0x115C2, 0x115C3, 0x115C9, 0x115D7, + 0x11641, 0x11642, 0x1173C, 0x1173E, 0x11944, 0x11944, 0x11946, 0x11946, + 0x11A42, 0x11A43, 0x11A9B, 0x11A9C, 0x11C41, 0x11C42, 0x11EF7, 0x11EF8, + 0x16A6E, 0x16A6F, 0x16AF5, 0x16AF5, 0x16B37, 0x16B38, 0x16B44, 0x16B44, + 0x16E98, 0x16E98, 0x1BC9F, 0x1BC9F, 0x1DA88, 0x1DA88, + // #84 (13093+32): bp=Soft_Dotted:SD + 0x0069, 0x006A, 0x012F, 0x012F, 0x0249, 0x0249, 0x0268, 0x0268, + 0x029D, 0x029D, 0x02B2, 0x02B2, 0x03F3, 0x03F3, 0x0456, 0x0456, + 0x0458, 0x0458, 0x1D62, 0x1D62, 0x1D96, 0x1D96, 0x1DA4, 0x1DA4, + 0x1DA8, 0x1DA8, 0x1E2D, 0x1E2D, 0x1ECB, 0x1ECB, 0x2071, 0x2071, + 0x2148, 0x2149, 0x2C7C, 0x2C7C, 0x1D422, 0x1D423, 0x1D456, 0x1D457, + 0x1D48A, 0x1D48B, 0x1D4BE, 0x1D4BF, 0x1D4F2, 0x1D4F3, 0x1D526, 0x1D527, + 0x1D55A, 0x1D55B, 0x1D58E, 0x1D58F, 0x1D5C2, 0x1D5C3, 0x1D5F6, 0x1D5F7, + 0x1D62A, 0x1D62B, 0x1D65E, 0x1D65F, 0x1D692, 0x1D693, 0x1DF1A, 0x1DF1A, + // #85 (13125+107): bp=Terminal_Punctuation:Term + 0x0021, 0x0021, 0x002C, 0x002C, 0x002E, 0x002E, 0x003A, 0x003B, + 0x003F, 0x003F, 0x037E, 0x037E, 0x0387, 0x0387, 0x0589, 0x0589, + 0x05C3, 0x05C3, 0x060C, 0x060C, 0x061B, 0x061B, 0x061D, 0x061F, + 0x06D4, 0x06D4, 0x0700, 0x070A, 0x070C, 0x070C, 0x07F8, 0x07F9, + 0x0830, 0x083E, 0x085E, 0x085E, 0x0964, 0x0965, 0x0E5A, 0x0E5B, + 0x0F08, 0x0F08, 0x0F0D, 0x0F12, 0x104A, 0x104B, 0x1361, 0x1368, + 0x166E, 0x166E, 0x16EB, 0x16ED, 0x1735, 0x1736, 0x17D4, 0x17D6, + 0x17DA, 0x17DA, 0x1802, 0x1805, 0x1808, 0x1809, 0x1944, 0x1945, + 0x1AA8, 0x1AAB, 0x1B5A, 0x1B5B, 0x1B5D, 0x1B5F, 0x1B7D, 0x1B7E, + 0x1C3B, 0x1C3F, 0x1C7E, 0x1C7F, 0x203C, 0x203D, 0x2047, 0x2049, + 0x2E2E, 0x2E2E, 0x2E3C, 0x2E3C, 0x2E41, 0x2E41, 0x2E4C, 0x2E4C, + 0x2E4E, 0x2E4F, 0x2E53, 0x2E54, 0x3001, 0x3002, 0xA4FE, 0xA4FF, + 0xA60D, 0xA60F, 0xA6F3, 0xA6F7, 0xA876, 0xA877, 0xA8CE, 0xA8CF, + 0xA92F, 0xA92F, 0xA9C7, 0xA9C9, 0xAA5D, 0xAA5F, 0xAADF, 0xAADF, + 0xAAF0, 0xAAF1, 0xABEB, 0xABEB, 0xFE50, 0xFE52, 0xFE54, 0xFE57, + 0xFF01, 0xFF01, 0xFF0C, 0xFF0C, 0xFF0E, 0xFF0E, 0xFF1A, 0xFF1B, + 0xFF1F, 0xFF1F, 0xFF61, 0xFF61, 0xFF64, 0xFF64, 0x1039F, 0x1039F, + 0x103D0, 0x103D0, 0x10857, 0x10857, 0x1091F, 0x1091F, 0x10A56, 0x10A57, + 0x10AF0, 0x10AF5, 0x10B3A, 0x10B3F, 0x10B99, 0x10B9C, 0x10F55, 0x10F59, + 0x10F86, 0x10F89, 0x11047, 0x1104D, 0x110BE, 0x110C1, 0x11141, 0x11143, + 0x111C5, 0x111C6, 0x111CD, 0x111CD, 0x111DE, 0x111DF, 0x11238, 0x1123C, + 0x112A9, 0x112A9, 0x1144B, 0x1144D, 0x1145A, 0x1145B, 0x115C2, 0x115C5, + 0x115C9, 0x115D7, 0x11641, 0x11642, 0x1173C, 0x1173E, 0x11944, 0x11944, + 0x11946, 0x11946, 0x11A42, 0x11A43, 0x11A9B, 0x11A9C, 0x11AA1, 0x11AA2, + 0x11C41, 0x11C43, 0x11C71, 0x11C71, 0x11EF7, 0x11EF8, 0x12470, 0x12474, + 0x16A6E, 0x16A6F, 0x16AF5, 0x16AF5, 0x16B37, 0x16B39, 0x16B44, 0x16B44, + 0x16E97, 0x16E98, 0x1BC9F, 0x1BC9F, 0x1DA87, 0x1DA8A, + // #86 (13232+15): bp=Unified_Ideograph:UIdeo + 0x3400, 0x4DBF, 0x4E00, 0x9FFF, 0xFA0E, 0xFA0F, 0xFA11, 0xFA11, + 0xFA13, 0xFA14, 0xFA1F, 0xFA1F, 0xFA21, 0xFA21, 0xFA23, 0xFA24, + 0xFA27, 0xFA29, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, + 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x30000, 0x3134A, + // #87 (13247+651): bp=Uppercase:Upper + 0x0041, 0x005A, 0x00C0, 0x00D6, 0x00D8, 0x00DE, 0x0100, 0x0100, + 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, 0x0108, 0x0108, + 0x010A, 0x010A, 0x010C, 0x010C, 0x010E, 0x010E, 0x0110, 0x0110, + 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, 0x0118, 0x0118, + 0x011A, 0x011A, 0x011C, 0x011C, 0x011E, 0x011E, 0x0120, 0x0120, + 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, 0x0128, 0x0128, + 0x012A, 0x012A, 0x012C, 0x012C, 0x012E, 0x012E, 0x0130, 0x0130, + 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, 0x0139, 0x0139, + 0x013B, 0x013B, 0x013D, 0x013D, 0x013F, 0x013F, 0x0141, 0x0141, + 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, 0x0147, 0x014A, 0x014A, + 0x014C, 0x014C, 0x014E, 0x014E, 0x0150, 0x0150, 0x0152, 0x0152, + 0x0154, 0x0154, 0x0156, 0x0156, 0x0158, 0x0158, 0x015A, 0x015A, + 0x015C, 0x015C, 0x015E, 0x015E, 0x0160, 0x0160, 0x0162, 0x0162, + 0x0164, 0x0164, 0x0166, 0x0166, 0x0168, 0x0168, 0x016A, 0x016A, + 0x016C, 0x016C, 0x016E, 0x016E, 0x0170, 0x0170, 0x0172, 0x0172, + 0x0174, 0x0174, 0x0176, 0x0176, 0x0178, 0x0179, 0x017B, 0x017B, + 0x017D, 0x017D, 0x0181, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, + 0x0189, 0x018B, 0x018E, 0x0191, 0x0193, 0x0194, 0x0196, 0x0198, + 0x019C, 0x019D, 0x019F, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, + 0x01A6, 0x01A7, 0x01A9, 0x01A9, 0x01AC, 0x01AC, 0x01AE, 0x01AF, + 0x01B1, 0x01B3, 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01BC, 0x01BC, + 0x01C4, 0x01C4, 0x01C7, 0x01C7, 0x01CA, 0x01CA, 0x01CD, 0x01CD, + 0x01CF, 0x01CF, 0x01D1, 0x01D1, 0x01D3, 0x01D3, 0x01D5, 0x01D5, + 0x01D7, 0x01D7, 0x01D9, 0x01D9, 0x01DB, 0x01DB, 0x01DE, 0x01DE, + 0x01E0, 0x01E0, 0x01E2, 0x01E2, 0x01E4, 0x01E4, 0x01E6, 0x01E6, + 0x01E8, 0x01E8, 0x01EA, 0x01EA, 0x01EC, 0x01EC, 0x01EE, 0x01EE, + 0x01F1, 0x01F1, 0x01F4, 0x01F4, 0x01F6, 0x01F8, 0x01FA, 0x01FA, + 0x01FC, 0x01FC, 0x01FE, 0x01FE, 0x0200, 0x0200, 0x0202, 0x0202, + 0x0204, 0x0204, 0x0206, 0x0206, 0x0208, 0x0208, 0x020A, 0x020A, + 0x020C, 0x020C, 0x020E, 0x020E, 0x0210, 0x0210, 0x0212, 0x0212, + 0x0214, 0x0214, 0x0216, 0x0216, 0x0218, 0x0218, 0x021A, 0x021A, + 0x021C, 0x021C, 0x021E, 0x021E, 0x0220, 0x0220, 0x0222, 0x0222, + 0x0224, 0x0224, 0x0226, 0x0226, 0x0228, 0x0228, 0x022A, 0x022A, + 0x022C, 0x022C, 0x022E, 0x022E, 0x0230, 0x0230, 0x0232, 0x0232, + 0x023A, 0x023B, 0x023D, 0x023E, 0x0241, 0x0241, 0x0243, 0x0246, + 0x0248, 0x0248, 0x024A, 0x024A, 0x024C, 0x024C, 0x024E, 0x024E, + 0x0370, 0x0370, 0x0372, 0x0372, 0x0376, 0x0376, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x038F, + 0x0391, 0x03A1, 0x03A3, 0x03AB, 0x03CF, 0x03CF, 0x03D2, 0x03D4, + 0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE, + 0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6, + 0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE, + 0x03F4, 0x03F4, 0x03F7, 0x03F7, 0x03F9, 0x03FA, 0x03FD, 0x042F, + 0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, + 0x0468, 0x0468, 0x046A, 0x046A, 0x046C, 0x046C, 0x046E, 0x046E, + 0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, + 0x0478, 0x0478, 0x047A, 0x047A, 0x047C, 0x047C, 0x047E, 0x047E, + 0x0480, 0x0480, 0x048A, 0x048A, 0x048C, 0x048C, 0x048E, 0x048E, + 0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, + 0x0498, 0x0498, 0x049A, 0x049A, 0x049C, 0x049C, 0x049E, 0x049E, + 0x04A0, 0x04A0, 0x04A2, 0x04A2, 0x04A4, 0x04A4, 0x04A6, 0x04A6, + 0x04A8, 0x04A8, 0x04AA, 0x04AA, 0x04AC, 0x04AC, 0x04AE, 0x04AE, + 0x04B0, 0x04B0, 0x04B2, 0x04B2, 0x04B4, 0x04B4, 0x04B6, 0x04B6, + 0x04B8, 0x04B8, 0x04BA, 0x04BA, 0x04BC, 0x04BC, 0x04BE, 0x04BE, + 0x04C0, 0x04C1, 0x04C3, 0x04C3, 0x04C5, 0x04C5, 0x04C7, 0x04C7, + 0x04C9, 0x04C9, 0x04CB, 0x04CB, 0x04CD, 0x04CD, 0x04D0, 0x04D0, + 0x04D2, 0x04D2, 0x04D4, 0x04D4, 0x04D6, 0x04D6, 0x04D8, 0x04D8, + 0x04DA, 0x04DA, 0x04DC, 0x04DC, 0x04DE, 0x04DE, 0x04E0, 0x04E0, + 0x04E2, 0x04E2, 0x04E4, 0x04E4, 0x04E6, 0x04E6, 0x04E8, 0x04E8, + 0x04EA, 0x04EA, 0x04EC, 0x04EC, 0x04EE, 0x04EE, 0x04F0, 0x04F0, + 0x04F2, 0x04F2, 0x04F4, 0x04F4, 0x04F6, 0x04F6, 0x04F8, 0x04F8, + 0x04FA, 0x04FA, 0x04FC, 0x04FC, 0x04FE, 0x04FE, 0x0500, 0x0500, + 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506, 0x0508, 0x0508, + 0x050A, 0x050A, 0x050C, 0x050C, 0x050E, 0x050E, 0x0510, 0x0510, + 0x0512, 0x0512, 0x0514, 0x0514, 0x0516, 0x0516, 0x0518, 0x0518, + 0x051A, 0x051A, 0x051C, 0x051C, 0x051E, 0x051E, 0x0520, 0x0520, + 0x0522, 0x0522, 0x0524, 0x0524, 0x0526, 0x0526, 0x0528, 0x0528, + 0x052A, 0x052A, 0x052C, 0x052C, 0x052E, 0x052E, 0x0531, 0x0556, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x13A0, 0x13F5, + 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1E00, 0x1E00, 0x1E02, 0x1E02, + 0x1E04, 0x1E04, 0x1E06, 0x1E06, 0x1E08, 0x1E08, 0x1E0A, 0x1E0A, + 0x1E0C, 0x1E0C, 0x1E0E, 0x1E0E, 0x1E10, 0x1E10, 0x1E12, 0x1E12, + 0x1E14, 0x1E14, 0x1E16, 0x1E16, 0x1E18, 0x1E18, 0x1E1A, 0x1E1A, + 0x1E1C, 0x1E1C, 0x1E1E, 0x1E1E, 0x1E20, 0x1E20, 0x1E22, 0x1E22, + 0x1E24, 0x1E24, 0x1E26, 0x1E26, 0x1E28, 0x1E28, 0x1E2A, 0x1E2A, + 0x1E2C, 0x1E2C, 0x1E2E, 0x1E2E, 0x1E30, 0x1E30, 0x1E32, 0x1E32, + 0x1E34, 0x1E34, 0x1E36, 0x1E36, 0x1E38, 0x1E38, 0x1E3A, 0x1E3A, + 0x1E3C, 0x1E3C, 0x1E3E, 0x1E3E, 0x1E40, 0x1E40, 0x1E42, 0x1E42, + 0x1E44, 0x1E44, 0x1E46, 0x1E46, 0x1E48, 0x1E48, 0x1E4A, 0x1E4A, + 0x1E4C, 0x1E4C, 0x1E4E, 0x1E4E, 0x1E50, 0x1E50, 0x1E52, 0x1E52, + 0x1E54, 0x1E54, 0x1E56, 0x1E56, 0x1E58, 0x1E58, 0x1E5A, 0x1E5A, + 0x1E5C, 0x1E5C, 0x1E5E, 0x1E5E, 0x1E60, 0x1E60, 0x1E62, 0x1E62, + 0x1E64, 0x1E64, 0x1E66, 0x1E66, 0x1E68, 0x1E68, 0x1E6A, 0x1E6A, + 0x1E6C, 0x1E6C, 0x1E6E, 0x1E6E, 0x1E70, 0x1E70, 0x1E72, 0x1E72, + 0x1E74, 0x1E74, 0x1E76, 0x1E76, 0x1E78, 0x1E78, 0x1E7A, 0x1E7A, + 0x1E7C, 0x1E7C, 0x1E7E, 0x1E7E, 0x1E80, 0x1E80, 0x1E82, 0x1E82, + 0x1E84, 0x1E84, 0x1E86, 0x1E86, 0x1E88, 0x1E88, 0x1E8A, 0x1E8A, + 0x1E8C, 0x1E8C, 0x1E8E, 0x1E8E, 0x1E90, 0x1E90, 0x1E92, 0x1E92, + 0x1E94, 0x1E94, 0x1E9E, 0x1E9E, 0x1EA0, 0x1EA0, 0x1EA2, 0x1EA2, + 0x1EA4, 0x1EA4, 0x1EA6, 0x1EA6, 0x1EA8, 0x1EA8, 0x1EAA, 0x1EAA, + 0x1EAC, 0x1EAC, 0x1EAE, 0x1EAE, 0x1EB0, 0x1EB0, 0x1EB2, 0x1EB2, + 0x1EB4, 0x1EB4, 0x1EB6, 0x1EB6, 0x1EB8, 0x1EB8, 0x1EBA, 0x1EBA, + 0x1EBC, 0x1EBC, 0x1EBE, 0x1EBE, 0x1EC0, 0x1EC0, 0x1EC2, 0x1EC2, + 0x1EC4, 0x1EC4, 0x1EC6, 0x1EC6, 0x1EC8, 0x1EC8, 0x1ECA, 0x1ECA, + 0x1ECC, 0x1ECC, 0x1ECE, 0x1ECE, 0x1ED0, 0x1ED0, 0x1ED2, 0x1ED2, + 0x1ED4, 0x1ED4, 0x1ED6, 0x1ED6, 0x1ED8, 0x1ED8, 0x1EDA, 0x1EDA, + 0x1EDC, 0x1EDC, 0x1EDE, 0x1EDE, 0x1EE0, 0x1EE0, 0x1EE2, 0x1EE2, + 0x1EE4, 0x1EE4, 0x1EE6, 0x1EE6, 0x1EE8, 0x1EE8, 0x1EEA, 0x1EEA, + 0x1EEC, 0x1EEC, 0x1EEE, 0x1EEE, 0x1EF0, 0x1EF0, 0x1EF2, 0x1EF2, + 0x1EF4, 0x1EF4, 0x1EF6, 0x1EF6, 0x1EF8, 0x1EF8, 0x1EFA, 0x1EFA, + 0x1EFC, 0x1EFC, 0x1EFE, 0x1EFE, 0x1F08, 0x1F0F, 0x1F18, 0x1F1D, + 0x1F28, 0x1F2F, 0x1F38, 0x1F3F, 0x1F48, 0x1F4D, 0x1F59, 0x1F59, + 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F5F, 0x1F68, 0x1F6F, + 0x1FB8, 0x1FBB, 0x1FC8, 0x1FCB, 0x1FD8, 0x1FDB, 0x1FE8, 0x1FEC, + 0x1FF8, 0x1FFB, 0x2102, 0x2102, 0x2107, 0x2107, 0x210B, 0x210D, + 0x2110, 0x2112, 0x2115, 0x2115, 0x2119, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, 0x2130, 0x2133, + 0x213E, 0x213F, 0x2145, 0x2145, 0x2160, 0x216F, 0x2183, 0x2183, + 0x24B6, 0x24CF, 0x2C00, 0x2C2F, 0x2C60, 0x2C60, 0x2C62, 0x2C64, + 0x2C67, 0x2C67, 0x2C69, 0x2C69, 0x2C6B, 0x2C6B, 0x2C6D, 0x2C70, + 0x2C72, 0x2C72, 0x2C75, 0x2C75, 0x2C7E, 0x2C80, 0x2C82, 0x2C82, + 0x2C84, 0x2C84, 0x2C86, 0x2C86, 0x2C88, 0x2C88, 0x2C8A, 0x2C8A, + 0x2C8C, 0x2C8C, 0x2C8E, 0x2C8E, 0x2C90, 0x2C90, 0x2C92, 0x2C92, + 0x2C94, 0x2C94, 0x2C96, 0x2C96, 0x2C98, 0x2C98, 0x2C9A, 0x2C9A, + 0x2C9C, 0x2C9C, 0x2C9E, 0x2C9E, 0x2CA0, 0x2CA0, 0x2CA2, 0x2CA2, + 0x2CA4, 0x2CA4, 0x2CA6, 0x2CA6, 0x2CA8, 0x2CA8, 0x2CAA, 0x2CAA, + 0x2CAC, 0x2CAC, 0x2CAE, 0x2CAE, 0x2CB0, 0x2CB0, 0x2CB2, 0x2CB2, + 0x2CB4, 0x2CB4, 0x2CB6, 0x2CB6, 0x2CB8, 0x2CB8, 0x2CBA, 0x2CBA, + 0x2CBC, 0x2CBC, 0x2CBE, 0x2CBE, 0x2CC0, 0x2CC0, 0x2CC2, 0x2CC2, + 0x2CC4, 0x2CC4, 0x2CC6, 0x2CC6, 0x2CC8, 0x2CC8, 0x2CCA, 0x2CCA, + 0x2CCC, 0x2CCC, 0x2CCE, 0x2CCE, 0x2CD0, 0x2CD0, 0x2CD2, 0x2CD2, + 0x2CD4, 0x2CD4, 0x2CD6, 0x2CD6, 0x2CD8, 0x2CD8, 0x2CDA, 0x2CDA, + 0x2CDC, 0x2CDC, 0x2CDE, 0x2CDE, 0x2CE0, 0x2CE0, 0x2CE2, 0x2CE2, + 0x2CEB, 0x2CEB, 0x2CED, 0x2CED, 0x2CF2, 0x2CF2, 0xA640, 0xA640, + 0xA642, 0xA642, 0xA644, 0xA644, 0xA646, 0xA646, 0xA648, 0xA648, + 0xA64A, 0xA64A, 0xA64C, 0xA64C, 0xA64E, 0xA64E, 0xA650, 0xA650, + 0xA652, 0xA652, 0xA654, 0xA654, 0xA656, 0xA656, 0xA658, 0xA658, + 0xA65A, 0xA65A, 0xA65C, 0xA65C, 0xA65E, 0xA65E, 0xA660, 0xA660, + 0xA662, 0xA662, 0xA664, 0xA664, 0xA666, 0xA666, 0xA668, 0xA668, + 0xA66A, 0xA66A, 0xA66C, 0xA66C, 0xA680, 0xA680, 0xA682, 0xA682, + 0xA684, 0xA684, 0xA686, 0xA686, 0xA688, 0xA688, 0xA68A, 0xA68A, + 0xA68C, 0xA68C, 0xA68E, 0xA68E, 0xA690, 0xA690, 0xA692, 0xA692, + 0xA694, 0xA694, 0xA696, 0xA696, 0xA698, 0xA698, 0xA69A, 0xA69A, + 0xA722, 0xA722, 0xA724, 0xA724, 0xA726, 0xA726, 0xA728, 0xA728, + 0xA72A, 0xA72A, 0xA72C, 0xA72C, 0xA72E, 0xA72E, 0xA732, 0xA732, + 0xA734, 0xA734, 0xA736, 0xA736, 0xA738, 0xA738, 0xA73A, 0xA73A, + 0xA73C, 0xA73C, 0xA73E, 0xA73E, 0xA740, 0xA740, 0xA742, 0xA742, + 0xA744, 0xA744, 0xA746, 0xA746, 0xA748, 0xA748, 0xA74A, 0xA74A, + 0xA74C, 0xA74C, 0xA74E, 0xA74E, 0xA750, 0xA750, 0xA752, 0xA752, + 0xA754, 0xA754, 0xA756, 0xA756, 0xA758, 0xA758, 0xA75A, 0xA75A, + 0xA75C, 0xA75C, 0xA75E, 0xA75E, 0xA760, 0xA760, 0xA762, 0xA762, + 0xA764, 0xA764, 0xA766, 0xA766, 0xA768, 0xA768, 0xA76A, 0xA76A, + 0xA76C, 0xA76C, 0xA76E, 0xA76E, 0xA779, 0xA779, 0xA77B, 0xA77B, + 0xA77D, 0xA77E, 0xA780, 0xA780, 0xA782, 0xA782, 0xA784, 0xA784, + 0xA786, 0xA786, 0xA78B, 0xA78B, 0xA78D, 0xA78D, 0xA790, 0xA790, + 0xA792, 0xA792, 0xA796, 0xA796, 0xA798, 0xA798, 0xA79A, 0xA79A, + 0xA79C, 0xA79C, 0xA79E, 0xA79E, 0xA7A0, 0xA7A0, 0xA7A2, 0xA7A2, + 0xA7A4, 0xA7A4, 0xA7A6, 0xA7A6, 0xA7A8, 0xA7A8, 0xA7AA, 0xA7AE, + 0xA7B0, 0xA7B4, 0xA7B6, 0xA7B6, 0xA7B8, 0xA7B8, 0xA7BA, 0xA7BA, + 0xA7BC, 0xA7BC, 0xA7BE, 0xA7BE, 0xA7C0, 0xA7C0, 0xA7C2, 0xA7C2, + 0xA7C4, 0xA7C7, 0xA7C9, 0xA7C9, 0xA7D0, 0xA7D0, 0xA7D6, 0xA7D6, + 0xA7D8, 0xA7D8, 0xA7F5, 0xA7F5, 0xFF21, 0xFF3A, 0x10400, 0x10427, + 0x104B0, 0x104D3, 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, + 0x10594, 0x10595, 0x10C80, 0x10CB2, 0x118A0, 0x118BF, 0x16E40, 0x16E5F, + 0x1D400, 0x1D419, 0x1D434, 0x1D44D, 0x1D468, 0x1D481, 0x1D49C, 0x1D49C, + 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, + 0x1D4AE, 0x1D4B5, 0x1D4D0, 0x1D4E9, 0x1D504, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D538, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D56C, 0x1D585, + 0x1D5A0, 0x1D5B9, 0x1D5D4, 0x1D5ED, 0x1D608, 0x1D621, 0x1D63C, 0x1D655, + 0x1D670, 0x1D689, 0x1D6A8, 0x1D6C0, 0x1D6E2, 0x1D6FA, 0x1D71C, 0x1D734, + 0x1D756, 0x1D76E, 0x1D790, 0x1D7A8, 0x1D7CA, 0x1D7CA, 0x1E900, 0x1E921, + 0x1F130, 0x1F149, 0x1F150, 0x1F169, 0x1F170, 0x1F189, + // #88 (13898+4): bp=Variation_Selector:VS + 0x180B, 0x180D, 0x180F, 0x180F, 0xFE00, 0xFE0F, 0xE0100, 0xE01EF, + // #89 (13902+10): bp=White_Space:space + 0x0009, 0x000D, 0x0020, 0x0020, 0x0085, 0x0085, 0x00A0, 0x00A0, + 0x1680, 0x1680, 0x2000, 0x200A, 0x2028, 0x2029, 0x202F, 0x202F, + 0x205F, 0x205F, 0x3000, 0x3000, + // #90 (13912+763): bp=XID_Continue:XIDC + 0x0030, 0x0039, 0x0041, 0x005A, 0x005F, 0x005F, 0x0061, 0x007A, + 0x00AA, 0x00AA, 0x00B5, 0x00B5, 0x00B7, 0x00B7, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, 0x02C6, 0x02D1, + 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, 0x0300, 0x0374, + 0x0376, 0x0377, 0x037B, 0x037D, 0x037F, 0x037F, 0x0386, 0x038A, + 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03F5, 0x03F7, 0x0481, + 0x0483, 0x0487, 0x048A, 0x052F, 0x0531, 0x0556, 0x0559, 0x0559, + 0x0560, 0x0588, 0x0591, 0x05BD, 0x05BF, 0x05BF, 0x05C1, 0x05C2, + 0x05C4, 0x05C5, 0x05C7, 0x05C7, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0610, 0x061A, 0x0620, 0x0669, 0x066E, 0x06D3, 0x06D5, 0x06DC, + 0x06DF, 0x06E8, 0x06EA, 0x06FC, 0x06FF, 0x06FF, 0x0710, 0x074A, + 0x074D, 0x07B1, 0x07C0, 0x07F5, 0x07FA, 0x07FA, 0x07FD, 0x07FD, + 0x0800, 0x082D, 0x0840, 0x085B, 0x0860, 0x086A, 0x0870, 0x0887, + 0x0889, 0x088E, 0x0898, 0x08E1, 0x08E3, 0x0963, 0x0966, 0x096F, + 0x0971, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, + 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, + 0x09DF, 0x09E3, 0x09E6, 0x09F1, 0x09FC, 0x09FC, 0x09FE, 0x09FE, + 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A75, + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AE6, 0x0AEF, 0x0AF9, 0x0AFF, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3C, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, + 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B66, 0x0B6F, + 0x0B71, 0x0B71, 0x0B82, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, + 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, + 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, + 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, + 0x0BE6, 0x0BEF, 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, + 0x0C2A, 0x0C39, 0x0C3C, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, + 0x0C55, 0x0C56, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, + 0x0C66, 0x0C6F, 0x0C80, 0x0C83, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, + 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x0D00, 0x0D0C, + 0x0D0E, 0x0D10, 0x0D12, 0x0D44, 0x0D46, 0x0D48, 0x0D4A, 0x0D4E, + 0x0D54, 0x0D57, 0x0D5F, 0x0D63, 0x0D66, 0x0D6F, 0x0D7A, 0x0D7F, + 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, + 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF3, + 0x0E01, 0x0E3A, 0x0E40, 0x0E4E, 0x0E50, 0x0E59, 0x0E81, 0x0E82, + 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, 0x0EA5, 0x0EA5, + 0x0EA7, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EC8, 0x0ECD, + 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, 0x0F18, 0x0F19, + 0x0F20, 0x0F29, 0x0F35, 0x0F35, 0x0F37, 0x0F37, 0x0F39, 0x0F39, + 0x0F3E, 0x0F47, 0x0F49, 0x0F6C, 0x0F71, 0x0F84, 0x0F86, 0x0F97, + 0x0F99, 0x0FBC, 0x0FC6, 0x0FC6, 0x1000, 0x1049, 0x1050, 0x109D, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x135D, 0x135F, 0x1369, 0x1371, 0x1380, 0x138F, 0x13A0, 0x13F5, + 0x13F8, 0x13FD, 0x1401, 0x166C, 0x166F, 0x167F, 0x1681, 0x169A, + 0x16A0, 0x16EA, 0x16EE, 0x16F8, 0x1700, 0x1715, 0x171F, 0x1734, + 0x1740, 0x1753, 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + 0x1780, 0x17D3, 0x17D7, 0x17D7, 0x17DC, 0x17DD, 0x17E0, 0x17E9, + 0x180B, 0x180D, 0x180F, 0x1819, 0x1820, 0x1878, 0x1880, 0x18AA, + 0x18B0, 0x18F5, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, + 0x1946, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, 0x19B0, 0x19C9, + 0x19D0, 0x19DA, 0x1A00, 0x1A1B, 0x1A20, 0x1A5E, 0x1A60, 0x1A7C, + 0x1A7F, 0x1A89, 0x1A90, 0x1A99, 0x1AA7, 0x1AA7, 0x1AB0, 0x1ABD, + 0x1ABF, 0x1ACE, 0x1B00, 0x1B4C, 0x1B50, 0x1B59, 0x1B6B, 0x1B73, + 0x1B80, 0x1BF3, 0x1C00, 0x1C37, 0x1C40, 0x1C49, 0x1C4D, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CD0, 0x1CD2, + 0x1CD4, 0x1CFA, 0x1D00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, + 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, + 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, + 0x203F, 0x2040, 0x2054, 0x2054, 0x2071, 0x2071, 0x207F, 0x207F, + 0x2090, 0x209C, 0x20D0, 0x20DC, 0x20E1, 0x20E1, 0x20E5, 0x20F0, + 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, + 0x2118, 0x211D, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, + 0x212A, 0x2139, 0x213C, 0x213F, 0x2145, 0x2149, 0x214E, 0x214E, + 0x2160, 0x2188, 0x2C00, 0x2CE4, 0x2CEB, 0x2CF3, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, + 0x2D7F, 0x2D96, 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, + 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, + 0x2DD8, 0x2DDE, 0x2DE0, 0x2DFF, 0x3005, 0x3007, 0x3021, 0x302F, + 0x3031, 0x3035, 0x3038, 0x303C, 0x3041, 0x3096, 0x3099, 0x309A, + 0x309D, 0x309F, 0x30A1, 0x30FA, 0x30FC, 0x30FF, 0x3105, 0x312F, + 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, 0x3400, 0x4DBF, + 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, 0xA500, 0xA60C, 0xA610, 0xA62B, + 0xA640, 0xA66F, 0xA674, 0xA67D, 0xA67F, 0xA6F1, 0xA717, 0xA71F, + 0xA722, 0xA788, 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, + 0xA7D5, 0xA7D9, 0xA7F2, 0xA827, 0xA82C, 0xA82C, 0xA840, 0xA873, + 0xA880, 0xA8C5, 0xA8D0, 0xA8D9, 0xA8E0, 0xA8F7, 0xA8FB, 0xA8FB, + 0xA8FD, 0xA92D, 0xA930, 0xA953, 0xA960, 0xA97C, 0xA980, 0xA9C0, + 0xA9CF, 0xA9D9, 0xA9E0, 0xA9FE, 0xAA00, 0xAA36, 0xAA40, 0xAA4D, + 0xAA50, 0xAA59, 0xAA60, 0xAA76, 0xAA7A, 0xAAC2, 0xAADB, 0xAADD, + 0xAAE0, 0xAAEF, 0xAAF2, 0xAAF6, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, + 0xAB5C, 0xAB69, 0xAB70, 0xABEA, 0xABEC, 0xABED, 0xABF0, 0xABF9, + 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, + 0xFA70, 0xFAD9, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFB1D, 0xFB28, + 0xFB2A, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, + 0xFB43, 0xFB44, 0xFB46, 0xFBB1, 0xFBD3, 0xFC5D, 0xFC64, 0xFD3D, + 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, 0xFDF0, 0xFDF9, 0xFE00, 0xFE0F, + 0xFE20, 0xFE2F, 0xFE33, 0xFE34, 0xFE4D, 0xFE4F, 0xFE71, 0xFE71, + 0xFE73, 0xFE73, 0xFE77, 0xFE77, 0xFE79, 0xFE79, 0xFE7B, 0xFE7B, + 0xFE7D, 0xFE7D, 0xFE7F, 0xFEFC, 0xFF10, 0xFF19, 0xFF21, 0xFF3A, + 0xFF3F, 0xFF3F, 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, 0xFFC2, 0xFFC7, + 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0x10000, 0x1000B, + 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, 0x1003F, 0x1004D, + 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10140, 0x10174, 0x101FD, 0x101FD, + 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x102E0, 0x102E0, 0x10300, 0x1031F, + 0x1032D, 0x1034A, 0x10350, 0x1037A, 0x10380, 0x1039D, 0x103A0, 0x103C3, + 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, 0x104A0, 0x104A9, + 0x104B0, 0x104D3, 0x104D8, 0x104FB, 0x10500, 0x10527, 0x10530, 0x10563, + 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, + 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, + 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, 0x10780, 0x10785, + 0x10787, 0x107B0, 0x107B2, 0x107BA, 0x10800, 0x10805, 0x10808, 0x10808, + 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, 0x1083F, 0x10855, + 0x10860, 0x10876, 0x10880, 0x1089E, 0x108E0, 0x108F2, 0x108F4, 0x108F5, + 0x10900, 0x10915, 0x10920, 0x10939, 0x10980, 0x109B7, 0x109BE, 0x109BF, + 0x10A00, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, 0x10A13, 0x10A15, 0x10A17, + 0x10A19, 0x10A35, 0x10A38, 0x10A3A, 0x10A3F, 0x10A3F, 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE6, 0x10B00, 0x10B35, + 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D27, 0x10D30, 0x10D39, + 0x10E80, 0x10EA9, 0x10EAB, 0x10EAC, 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, + 0x10F27, 0x10F27, 0x10F30, 0x10F50, 0x10F70, 0x10F85, 0x10FB0, 0x10FC4, + 0x10FE0, 0x10FF6, 0x11000, 0x11046, 0x11066, 0x11075, 0x1107F, 0x110BA, + 0x110C2, 0x110C2, 0x110D0, 0x110E8, 0x110F0, 0x110F9, 0x11100, 0x11134, + 0x11136, 0x1113F, 0x11144, 0x11147, 0x11150, 0x11173, 0x11176, 0x11176, + 0x11180, 0x111C4, 0x111C9, 0x111CC, 0x111CE, 0x111DA, 0x111DC, 0x111DC, + 0x11200, 0x11211, 0x11213, 0x11237, 0x1123E, 0x1123E, 0x11280, 0x11286, + 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, 0x1129F, 0x112A8, + 0x112B0, 0x112EA, 0x112F0, 0x112F9, 0x11300, 0x11303, 0x11305, 0x1130C, + 0x1130F, 0x11310, 0x11313, 0x11328, 0x1132A, 0x11330, 0x11332, 0x11333, + 0x11335, 0x11339, 0x1133B, 0x11344, 0x11347, 0x11348, 0x1134B, 0x1134D, + 0x11350, 0x11350, 0x11357, 0x11357, 0x1135D, 0x11363, 0x11366, 0x1136C, + 0x11370, 0x11374, 0x11400, 0x1144A, 0x11450, 0x11459, 0x1145E, 0x11461, + 0x11480, 0x114C5, 0x114C7, 0x114C7, 0x114D0, 0x114D9, 0x11580, 0x115B5, + 0x115B8, 0x115C0, 0x115D8, 0x115DD, 0x11600, 0x11640, 0x11644, 0x11644, + 0x11650, 0x11659, 0x11680, 0x116B8, 0x116C0, 0x116C9, 0x11700, 0x1171A, + 0x1171D, 0x1172B, 0x11730, 0x11739, 0x11740, 0x11746, 0x11800, 0x1183A, + 0x118A0, 0x118E9, 0x118FF, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, + 0x11915, 0x11916, 0x11918, 0x11935, 0x11937, 0x11938, 0x1193B, 0x11943, + 0x11950, 0x11959, 0x119A0, 0x119A7, 0x119AA, 0x119D7, 0x119DA, 0x119E1, + 0x119E3, 0x119E4, 0x11A00, 0x11A3E, 0x11A47, 0x11A47, 0x11A50, 0x11A99, + 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, 0x11C00, 0x11C08, 0x11C0A, 0x11C36, + 0x11C38, 0x11C40, 0x11C50, 0x11C59, 0x11C72, 0x11C8F, 0x11C92, 0x11CA7, + 0x11CA9, 0x11CB6, 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D36, + 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, 0x11D50, 0x11D59, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, 0x11D90, 0x11D91, + 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, 0x11EE0, 0x11EF6, 0x11FB0, 0x11FB0, + 0x12000, 0x12399, 0x12400, 0x1246E, 0x12480, 0x12543, 0x12F90, 0x12FF0, + 0x13000, 0x1342E, 0x14400, 0x14646, 0x16800, 0x16A38, 0x16A40, 0x16A5E, + 0x16A60, 0x16A69, 0x16A70, 0x16ABE, 0x16AC0, 0x16AC9, 0x16AD0, 0x16AED, + 0x16AF0, 0x16AF4, 0x16B00, 0x16B36, 0x16B40, 0x16B43, 0x16B50, 0x16B59, + 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, + 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE4, + 0x16FF0, 0x16FF1, 0x17000, 0x187F7, 0x18800, 0x18CD5, 0x18D00, 0x18D08, + 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B122, + 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, 0x1BC00, 0x1BC6A, + 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, 0x1BC9D, 0x1BC9E, + 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D165, 0x1D169, 0x1D16D, 0x1D172, + 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0x1D242, 0x1D244, + 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, + 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, + 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, + 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, + 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1D7CE, 0x1D7FF, 0x1DA00, 0x1DA36, + 0x1DA3B, 0x1DA6C, 0x1DA75, 0x1DA75, 0x1DA84, 0x1DA84, 0x1DA9B, 0x1DA9F, + 0x1DAA1, 0x1DAAF, 0x1DF00, 0x1DF1E, 0x1E000, 0x1E006, 0x1E008, 0x1E018, + 0x1E01B, 0x1E021, 0x1E023, 0x1E024, 0x1E026, 0x1E02A, 0x1E100, 0x1E12C, + 0x1E130, 0x1E13D, 0x1E140, 0x1E149, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AE, + 0x1E2C0, 0x1E2F9, 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, + 0x1E7F0, 0x1E7FE, 0x1E800, 0x1E8C4, 0x1E8D0, 0x1E8D6, 0x1E900, 0x1E94B, + 0x1E950, 0x1E959, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1FBF0, 0x1FBF9, 0x20000, 0x2A6DF, + 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, + 0x2F800, 0x2FA1D, 0x30000, 0x3134A, 0xE0100, 0xE01EF, + // #91 (14675+655): bp=XID_Start:XIDS + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, + 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02C1, + 0x02C6, 0x02D1, 0x02E0, 0x02E4, 0x02EC, 0x02EC, 0x02EE, 0x02EE, + 0x0370, 0x0374, 0x0376, 0x0377, 0x037B, 0x037D, 0x037F, 0x037F, + 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, + 0x03A3, 0x03F5, 0x03F7, 0x0481, 0x048A, 0x052F, 0x0531, 0x0556, + 0x0559, 0x0559, 0x0560, 0x0588, 0x05D0, 0x05EA, 0x05EF, 0x05F2, + 0x0620, 0x064A, 0x066E, 0x066F, 0x0671, 0x06D3, 0x06D5, 0x06D5, + 0x06E5, 0x06E6, 0x06EE, 0x06EF, 0x06FA, 0x06FC, 0x06FF, 0x06FF, + 0x0710, 0x0710, 0x0712, 0x072F, 0x074D, 0x07A5, 0x07B1, 0x07B1, + 0x07CA, 0x07EA, 0x07F4, 0x07F5, 0x07FA, 0x07FA, 0x0800, 0x0815, + 0x081A, 0x081A, 0x0824, 0x0824, 0x0828, 0x0828, 0x0840, 0x0858, + 0x0860, 0x086A, 0x0870, 0x0887, 0x0889, 0x088E, 0x08A0, 0x08C9, + 0x0904, 0x0939, 0x093D, 0x093D, 0x0950, 0x0950, 0x0958, 0x0961, + 0x0971, 0x0980, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BD, 0x09BD, + 0x09CE, 0x09CE, 0x09DC, 0x09DD, 0x09DF, 0x09E1, 0x09F0, 0x09F1, + 0x09FC, 0x09FC, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A72, 0x0A74, 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, 0x0ABD, 0x0ABD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE1, + 0x0AF9, 0x0AF9, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, 0x0B3D, 0x0B3D, + 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B71, 0x0B71, 0x0B83, 0x0B83, + 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, + 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, + 0x0BAE, 0x0BB9, 0x0BD0, 0x0BD0, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3D, 0x0C3D, 0x0C58, 0x0C5A, + 0x0C5D, 0x0C5D, 0x0C60, 0x0C61, 0x0C80, 0x0C80, 0x0C85, 0x0C8C, + 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, + 0x0CBD, 0x0CBD, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE1, 0x0CF1, 0x0CF2, + 0x0D04, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D3A, 0x0D3D, 0x0D3D, + 0x0D4E, 0x0D4E, 0x0D54, 0x0D56, 0x0D5F, 0x0D61, 0x0D7A, 0x0D7F, + 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, + 0x0DC0, 0x0DC6, 0x0E01, 0x0E30, 0x0E32, 0x0E32, 0x0E40, 0x0E46, + 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, + 0x0EA5, 0x0EA5, 0x0EA7, 0x0EB0, 0x0EB2, 0x0EB2, 0x0EBD, 0x0EBD, + 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0EDC, 0x0EDF, 0x0F00, 0x0F00, + 0x0F40, 0x0F47, 0x0F49, 0x0F6C, 0x0F88, 0x0F8C, 0x1000, 0x102A, + 0x103F, 0x103F, 0x1050, 0x1055, 0x105A, 0x105D, 0x1061, 0x1061, + 0x1065, 0x1066, 0x106E, 0x1070, 0x1075, 0x1081, 0x108E, 0x108E, + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x1380, 0x138F, 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0x1401, 0x166C, + 0x166F, 0x167F, 0x1681, 0x169A, 0x16A0, 0x16EA, 0x16EE, 0x16F8, + 0x1700, 0x1711, 0x171F, 0x1731, 0x1740, 0x1751, 0x1760, 0x176C, + 0x176E, 0x1770, 0x1780, 0x17B3, 0x17D7, 0x17D7, 0x17DC, 0x17DC, + 0x1820, 0x1878, 0x1880, 0x18A8, 0x18AA, 0x18AA, 0x18B0, 0x18F5, + 0x1900, 0x191E, 0x1950, 0x196D, 0x1970, 0x1974, 0x1980, 0x19AB, + 0x19B0, 0x19C9, 0x1A00, 0x1A16, 0x1A20, 0x1A54, 0x1AA7, 0x1AA7, + 0x1B05, 0x1B33, 0x1B45, 0x1B4C, 0x1B83, 0x1BA0, 0x1BAE, 0x1BAF, + 0x1BBA, 0x1BE5, 0x1C00, 0x1C23, 0x1C4D, 0x1C4F, 0x1C5A, 0x1C7D, + 0x1C80, 0x1C88, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF6, 0x1CFA, 0x1CFA, 0x1D00, 0x1DBF, + 0x1E00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, + 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, + 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, + 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, + 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x2102, 0x2102, 0x2107, 0x2107, + 0x210A, 0x2113, 0x2115, 0x2115, 0x2118, 0x211D, 0x2124, 0x2124, + 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x2139, 0x213C, 0x213F, + 0x2145, 0x2149, 0x214E, 0x214E, 0x2160, 0x2188, 0x2C00, 0x2CE4, + 0x2CEB, 0x2CEE, 0x2CF2, 0x2CF3, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, 0x2D30, 0x2D67, 0x2D6F, 0x2D6F, 0x2D80, 0x2D96, + 0x2DA0, 0x2DA6, 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, + 0x2DC0, 0x2DC6, 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, + 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, 0x3038, 0x303C, + 0x3041, 0x3096, 0x309D, 0x309F, 0x30A1, 0x30FA, 0x30FC, 0x30FF, + 0x3105, 0x312F, 0x3131, 0x318E, 0x31A0, 0x31BF, 0x31F0, 0x31FF, + 0x3400, 0x4DBF, 0x4E00, 0xA48C, 0xA4D0, 0xA4FD, 0xA500, 0xA60C, + 0xA610, 0xA61F, 0xA62A, 0xA62B, 0xA640, 0xA66E, 0xA67F, 0xA69D, + 0xA6A0, 0xA6EF, 0xA717, 0xA71F, 0xA722, 0xA788, 0xA78B, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA801, + 0xA803, 0xA805, 0xA807, 0xA80A, 0xA80C, 0xA822, 0xA840, 0xA873, + 0xA882, 0xA8B3, 0xA8F2, 0xA8F7, 0xA8FB, 0xA8FB, 0xA8FD, 0xA8FE, + 0xA90A, 0xA925, 0xA930, 0xA946, 0xA960, 0xA97C, 0xA984, 0xA9B2, + 0xA9CF, 0xA9CF, 0xA9E0, 0xA9E4, 0xA9E6, 0xA9EF, 0xA9FA, 0xA9FE, + 0xAA00, 0xAA28, 0xAA40, 0xAA42, 0xAA44, 0xAA4B, 0xAA60, 0xAA76, + 0xAA7A, 0xAA7A, 0xAA7E, 0xAAAF, 0xAAB1, 0xAAB1, 0xAAB5, 0xAAB6, + 0xAAB9, 0xAABD, 0xAAC0, 0xAAC0, 0xAAC2, 0xAAC2, 0xAADB, 0xAADD, + 0xAAE0, 0xAAEA, 0xAAF2, 0xAAF4, 0xAB01, 0xAB06, 0xAB09, 0xAB0E, + 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, 0xAB30, 0xAB5A, + 0xAB5C, 0xAB69, 0xAB70, 0xABE2, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0xFB00, 0xFB06, + 0xFB13, 0xFB17, 0xFB1D, 0xFB1D, 0xFB1F, 0xFB28, 0xFB2A, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFBB1, 0xFBD3, 0xFC5D, 0xFC64, 0xFD3D, 0xFD50, 0xFD8F, + 0xFD92, 0xFDC7, 0xFDF0, 0xFDF9, 0xFE71, 0xFE71, 0xFE73, 0xFE73, + 0xFE77, 0xFE77, 0xFE79, 0xFE79, 0xFE7B, 0xFE7B, 0xFE7D, 0xFE7D, + 0xFE7F, 0xFEFC, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0xFF66, 0xFF9D, + 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, + 0xFFDA, 0xFFDC, 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, + 0x1003C, 0x1003D, 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, + 0x10140, 0x10174, 0x10280, 0x1029C, 0x102A0, 0x102D0, 0x10300, 0x1031F, + 0x1032D, 0x1034A, 0x10350, 0x10375, 0x10380, 0x1039D, 0x103A0, 0x103C3, + 0x103C8, 0x103CF, 0x103D1, 0x103D5, 0x10400, 0x1049D, 0x104B0, 0x104D3, + 0x104D8, 0x104FB, 0x10500, 0x10527, 0x10530, 0x10563, 0x10570, 0x1057A, + 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, 0x10597, 0x105A1, + 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, 0x10600, 0x10736, + 0x10740, 0x10755, 0x10760, 0x10767, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, + 0x10837, 0x10838, 0x1083C, 0x1083C, 0x1083F, 0x10855, 0x10860, 0x10876, + 0x10880, 0x1089E, 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x10900, 0x10915, + 0x10920, 0x10939, 0x10980, 0x109B7, 0x109BE, 0x109BF, 0x10A00, 0x10A00, + 0x10A10, 0x10A13, 0x10A15, 0x10A17, 0x10A19, 0x10A35, 0x10A60, 0x10A7C, + 0x10A80, 0x10A9C, 0x10AC0, 0x10AC7, 0x10AC9, 0x10AE4, 0x10B00, 0x10B35, + 0x10B40, 0x10B55, 0x10B60, 0x10B72, 0x10B80, 0x10B91, 0x10C00, 0x10C48, + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10D00, 0x10D23, 0x10E80, 0x10EA9, + 0x10EB0, 0x10EB1, 0x10F00, 0x10F1C, 0x10F27, 0x10F27, 0x10F30, 0x10F45, + 0x10F70, 0x10F81, 0x10FB0, 0x10FC4, 0x10FE0, 0x10FF6, 0x11003, 0x11037, + 0x11071, 0x11072, 0x11075, 0x11075, 0x11083, 0x110AF, 0x110D0, 0x110E8, + 0x11103, 0x11126, 0x11144, 0x11144, 0x11147, 0x11147, 0x11150, 0x11172, + 0x11176, 0x11176, 0x11183, 0x111B2, 0x111C1, 0x111C4, 0x111DA, 0x111DA, + 0x111DC, 0x111DC, 0x11200, 0x11211, 0x11213, 0x1122B, 0x11280, 0x11286, + 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, 0x1129F, 0x112A8, + 0x112B0, 0x112DE, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133D, 0x1133D, + 0x11350, 0x11350, 0x1135D, 0x11361, 0x11400, 0x11434, 0x11447, 0x1144A, + 0x1145F, 0x11461, 0x11480, 0x114AF, 0x114C4, 0x114C5, 0x114C7, 0x114C7, + 0x11580, 0x115AE, 0x115D8, 0x115DB, 0x11600, 0x1162F, 0x11644, 0x11644, + 0x11680, 0x116AA, 0x116B8, 0x116B8, 0x11700, 0x1171A, 0x11740, 0x11746, + 0x11800, 0x1182B, 0x118A0, 0x118DF, 0x118FF, 0x11906, 0x11909, 0x11909, + 0x1190C, 0x11913, 0x11915, 0x11916, 0x11918, 0x1192F, 0x1193F, 0x1193F, + 0x11941, 0x11941, 0x119A0, 0x119A7, 0x119AA, 0x119D0, 0x119E1, 0x119E1, + 0x119E3, 0x119E3, 0x11A00, 0x11A00, 0x11A0B, 0x11A32, 0x11A3A, 0x11A3A, + 0x11A50, 0x11A50, 0x11A5C, 0x11A89, 0x11A9D, 0x11A9D, 0x11AB0, 0x11AF8, + 0x11C00, 0x11C08, 0x11C0A, 0x11C2E, 0x11C40, 0x11C40, 0x11C72, 0x11C8F, + 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D30, 0x11D46, 0x11D46, + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D89, 0x11D98, 0x11D98, + 0x11EE0, 0x11EF2, 0x11FB0, 0x11FB0, 0x12000, 0x12399, 0x12400, 0x1246E, + 0x12480, 0x12543, 0x12F90, 0x12FF0, 0x13000, 0x1342E, 0x14400, 0x14646, + 0x16800, 0x16A38, 0x16A40, 0x16A5E, 0x16A70, 0x16ABE, 0x16AD0, 0x16AED, + 0x16B00, 0x16B2F, 0x16B40, 0x16B43, 0x16B63, 0x16B77, 0x16B7D, 0x16B8F, + 0x16E40, 0x16E7F, 0x16F00, 0x16F4A, 0x16F50, 0x16F50, 0x16F93, 0x16F9F, + 0x16FE0, 0x16FE1, 0x16FE3, 0x16FE3, 0x17000, 0x187F7, 0x18800, 0x18CD5, + 0x18D00, 0x18D08, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, + 0x1B000, 0x1B122, 0x1B150, 0x1B152, 0x1B164, 0x1B167, 0x1B170, 0x1B2FB, + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, + 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D6C0, + 0x1D6C2, 0x1D6DA, 0x1D6DC, 0x1D6FA, 0x1D6FC, 0x1D714, 0x1D716, 0x1D734, + 0x1D736, 0x1D74E, 0x1D750, 0x1D76E, 0x1D770, 0x1D788, 0x1D78A, 0x1D7A8, + 0x1D7AA, 0x1D7C2, 0x1D7C4, 0x1D7CB, 0x1DF00, 0x1DF1E, 0x1E100, 0x1E12C, + 0x1E137, 0x1E13D, 0x1E14E, 0x1E14E, 0x1E290, 0x1E2AD, 0x1E2C0, 0x1E2EB, + 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, + 0x1E800, 0x1E8C4, 0x1E900, 0x1E943, 0x1E94B, 0x1E94B, 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, + 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, + 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, + 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, + 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, + 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, + 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, + 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #92 (15330+3): sc=Adlam:Adlm + 0x1E900, 0x1E94B, 0x1E950, 0x1E959, 0x1E95E, 0x1E95F, + // #93 (15333+3): sc=Ahom:Ahom scx=Ahom:Ahom + 0x11700, 0x1171A, 0x1171D, 0x1172B, 0x11730, 0x11746, + // #94 (15336+1): sc=Anatolian_Hieroglyphs:Hluw scx=Anatolian_Hieroglyphs:Hluw + 0x14400, 0x14646, + // #95 (15337+57): sc=Arabic:Arab + 0x0600, 0x0604, 0x0606, 0x060B, 0x060D, 0x061A, 0x061C, 0x061E, + 0x0620, 0x063F, 0x0641, 0x064A, 0x0656, 0x066F, 0x0671, 0x06DC, + 0x06DE, 0x06FF, 0x0750, 0x077F, 0x0870, 0x088E, 0x0890, 0x0891, + 0x0898, 0x08E1, 0x08E3, 0x08FF, 0xFB50, 0xFBC2, 0xFBD3, 0xFD3D, + 0xFD40, 0xFD8F, 0xFD92, 0xFDC7, 0xFDCF, 0xFDCF, 0xFDF0, 0xFDFF, + 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0x10E60, 0x10E7E, 0x1EE00, 0x1EE03, + 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, + 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, + 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, + 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, + 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, + 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, + 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, + 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, + 0x1EEF0, 0x1EEF1, + // #96 (15394+4): sc=Armenian:Armn scx=Armenian:Armn + 0x0531, 0x0556, 0x0559, 0x058A, 0x058D, 0x058F, 0xFB13, 0xFB17, + // #97 (15398+2): sc=Avestan:Avst scx=Avestan:Avst + 0x10B00, 0x10B35, 0x10B39, 0x10B3F, + // #98 (15400+2): sc=Balinese:Bali scx=Balinese:Bali + 0x1B00, 0x1B4C, 0x1B50, 0x1B7E, + // #99 (15402+2): sc=Bamum:Bamu scx=Bamum:Bamu + 0xA6A0, 0xA6F7, 0x16800, 0x16A38, + // #100 (15404+2): sc=Bassa_Vah:Bass scx=Bassa_Vah:Bass + 0x16AD0, 0x16AED, 0x16AF0, 0x16AF5, + // #101 (15406+2): sc=Batak:Batk scx=Batak:Batk + 0x1BC0, 0x1BF3, 0x1BFC, 0x1BFF, + // #102 (15408+14): sc=Bengali:Beng + 0x0980, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, + 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BC, 0x09C4, + 0x09C7, 0x09C8, 0x09CB, 0x09CE, 0x09D7, 0x09D7, 0x09DC, 0x09DD, + 0x09DF, 0x09E3, 0x09E6, 0x09FE, + // #103 (15422+4): sc=Bhaiksuki:Bhks scx=Bhaiksuki:Bhks + 0x11C00, 0x11C08, 0x11C0A, 0x11C36, 0x11C38, 0x11C45, 0x11C50, 0x11C6C, + // #104 (15426+3): sc=Bopomofo:Bopo + 0x02EA, 0x02EB, 0x3105, 0x312F, 0x31A0, 0x31BF, + // #105 (15429+3): sc=Brahmi:Brah scx=Brahmi:Brah + 0x11000, 0x1104D, 0x11052, 0x11075, 0x1107F, 0x1107F, + // #106 (15432+1): sc=Braille:Brai scx=Braille:Brai + 0x2800, 0x28FF, + // #107 (15433+2): sc=Buginese:Bugi + 0x1A00, 0x1A1B, 0x1A1E, 0x1A1F, + // #108 (15435+1): sc=Buhid:Buhd + 0x1740, 0x1753, + // #109 (15436+3): sc=Canadian_Aboriginal:Cans scx=Canadian_Aboriginal:Cans + 0x1400, 0x167F, 0x18B0, 0x18F5, 0x11AB0, 0x11ABF, + // #110 (15439+1): sc=Carian:Cari scx=Carian:Cari + 0x102A0, 0x102D0, + // #111 (15440+2): sc=Caucasian_Albanian:Aghb scx=Caucasian_Albanian:Aghb + 0x10530, 0x10563, 0x1056F, 0x1056F, + // #112 (15442+2): sc=Chakma:Cakm + 0x11100, 0x11134, 0x11136, 0x11147, + // #113 (15444+4): sc=Cham:Cham scx=Cham:Cham + 0xAA00, 0xAA36, 0xAA40, 0xAA4D, 0xAA50, 0xAA59, 0xAA5C, 0xAA5F, + // #114 (15448+3): sc=Cherokee:Cher scx=Cherokee:Cher + 0x13A0, 0x13F5, 0x13F8, 0x13FD, 0xAB70, 0xABBF, + // #115 (15451+1): sc=Chorasmian:Chrs scx=Chorasmian:Chrs + 0x10FB0, 0x10FCB, + // #116 (15452+174): sc=Common:Zyyy + 0x0000, 0x0040, 0x005B, 0x0060, 0x007B, 0x00A9, 0x00AB, 0x00B9, + 0x00BB, 0x00BF, 0x00D7, 0x00D7, 0x00F7, 0x00F7, 0x02B9, 0x02DF, + 0x02E5, 0x02E9, 0x02EC, 0x02FF, 0x0374, 0x0374, 0x037E, 0x037E, + 0x0385, 0x0385, 0x0387, 0x0387, 0x0605, 0x0605, 0x060C, 0x060C, + 0x061B, 0x061B, 0x061F, 0x061F, 0x0640, 0x0640, 0x06DD, 0x06DD, + 0x08E2, 0x08E2, 0x0964, 0x0965, 0x0E3F, 0x0E3F, 0x0FD5, 0x0FD8, + 0x10FB, 0x10FB, 0x16EB, 0x16ED, 0x1735, 0x1736, 0x1802, 0x1803, + 0x1805, 0x1805, 0x1CD3, 0x1CD3, 0x1CE1, 0x1CE1, 0x1CE9, 0x1CEC, + 0x1CEE, 0x1CF3, 0x1CF5, 0x1CF7, 0x1CFA, 0x1CFA, 0x2000, 0x200B, + 0x200E, 0x2064, 0x2066, 0x2070, 0x2074, 0x207E, 0x2080, 0x208E, + 0x20A0, 0x20C0, 0x2100, 0x2125, 0x2127, 0x2129, 0x212C, 0x2131, + 0x2133, 0x214D, 0x214F, 0x215F, 0x2189, 0x218B, 0x2190, 0x2426, + 0x2440, 0x244A, 0x2460, 0x27FF, 0x2900, 0x2B73, 0x2B76, 0x2B95, + 0x2B97, 0x2BFF, 0x2E00, 0x2E5D, 0x2FF0, 0x2FFB, 0x3000, 0x3004, + 0x3006, 0x3006, 0x3008, 0x3020, 0x3030, 0x3037, 0x303C, 0x303F, + 0x309B, 0x309C, 0x30A0, 0x30A0, 0x30FB, 0x30FC, 0x3190, 0x319F, + 0x31C0, 0x31E3, 0x3220, 0x325F, 0x327F, 0x32CF, 0x32FF, 0x32FF, + 0x3358, 0x33FF, 0x4DC0, 0x4DFF, 0xA700, 0xA721, 0xA788, 0xA78A, + 0xA830, 0xA839, 0xA92E, 0xA92E, 0xA9CF, 0xA9CF, 0xAB5B, 0xAB5B, + 0xAB6A, 0xAB6B, 0xFD3E, 0xFD3F, 0xFE10, 0xFE19, 0xFE30, 0xFE52, + 0xFE54, 0xFE66, 0xFE68, 0xFE6B, 0xFEFF, 0xFEFF, 0xFF01, 0xFF20, + 0xFF3B, 0xFF40, 0xFF5B, 0xFF65, 0xFF70, 0xFF70, 0xFF9E, 0xFF9F, + 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, 0xFFF9, 0xFFFD, 0x10100, 0x10102, + 0x10107, 0x10133, 0x10137, 0x1013F, 0x10190, 0x1019C, 0x101D0, 0x101FC, + 0x102E1, 0x102FB, 0x1BCA0, 0x1BCA3, 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, + 0x1D100, 0x1D126, 0x1D129, 0x1D166, 0x1D16A, 0x1D17A, 0x1D183, 0x1D184, + 0x1D18C, 0x1D1A9, 0x1D1AE, 0x1D1EA, 0x1D2E0, 0x1D2F3, 0x1D300, 0x1D356, + 0x1D360, 0x1D378, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, + 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, + 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, + 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, + 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, + 0x1D6A8, 0x1D7CB, 0x1D7CE, 0x1D7FF, 0x1EC71, 0x1ECB4, 0x1ED01, 0x1ED3D, + 0x1F000, 0x1F02B, 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, + 0x1F0C1, 0x1F0CF, 0x1F0D1, 0x1F0F5, 0x1F100, 0x1F1AD, 0x1F1E6, 0x1F1FF, + 0x1F201, 0x1F202, 0x1F210, 0x1F23B, 0x1F240, 0x1F248, 0x1F250, 0x1F251, + 0x1F260, 0x1F265, 0x1F300, 0x1F6D7, 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, + 0x1F700, 0x1F773, 0x1F780, 0x1F7D8, 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, + 0x1F800, 0x1F80B, 0x1F810, 0x1F847, 0x1F850, 0x1F859, 0x1F860, 0x1F887, + 0x1F890, 0x1F8AD, 0x1F8B0, 0x1F8B1, 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, + 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, + 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, + 0x1FAF0, 0x1FAF6, 0x1FB00, 0x1FB92, 0x1FB94, 0x1FBCA, 0x1FBF0, 0x1FBF9, + 0xE0001, 0xE0001, 0xE0020, 0xE007F, + // #117 (15626+3): sc=Coptic:Copt:Qaac + 0x03E2, 0x03EF, 0x2C80, 0x2CF3, 0x2CF9, 0x2CFF, + // #118 (15629+1): sc=Cypro_Minoan:Cpmn + 0x12F90, 0x12FF2, + // #119 (15630+4): sc=Cuneiform:Xsux scx=Cuneiform:Xsux + 0x12000, 0x12399, 0x12400, 0x1246E, 0x12470, 0x12474, 0x12480, 0x12543, + // #120 (15634+6): sc=Cypriot:Cprt + 0x10800, 0x10805, 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, + 0x1083C, 0x1083C, 0x1083F, 0x1083F, + // #121 (15640+8): sc=Cyrillic:Cyrl + 0x0400, 0x0484, 0x0487, 0x052F, 0x1C80, 0x1C88, 0x1D2B, 0x1D2B, + 0x1D78, 0x1D78, 0x2DE0, 0x2DFF, 0xA640, 0xA69F, 0xFE2E, 0xFE2F, + // #122 (15648+1): sc=Deseret:Dsrt scx=Deseret:Dsrt + 0x10400, 0x1044F, + // #123 (15649+4): sc=Devanagari:Deva + 0x0900, 0x0950, 0x0955, 0x0963, 0x0966, 0x097F, 0xA8E0, 0xA8FF, + // #124 (15653+8): sc=Dives_Akuru:Diak scx=Dives_Akuru:Diak + 0x11900, 0x11906, 0x11909, 0x11909, 0x1190C, 0x11913, 0x11915, 0x11916, + 0x11918, 0x11935, 0x11937, 0x11938, 0x1193B, 0x11946, 0x11950, 0x11959, + // #125 (15661+1): sc=Dogra:Dogr + 0x11800, 0x1183B, + // #126 (15662+5): sc=Duployan:Dupl + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1BC9C, 0x1BC9F, + // #127 (15667+2): sc=Egyptian_Hieroglyphs:Egyp scx=Egyptian_Hieroglyphs:Egyp + 0x13000, 0x1342E, 0x13430, 0x13438, + // #128 (15669+1): sc=Elbasan:Elba scx=Elbasan:Elba + 0x10500, 0x10527, + // #129 (15670+1): sc=Elymaic:Elym scx=Elymaic:Elym + 0x10FE0, 0x10FF6, + // #130 (15671+36): sc=Ethiopic:Ethi scx=Ethiopic:Ethi + 0x1200, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, + 0x125A, 0x125D, 0x1260, 0x1288, 0x128A, 0x128D, 0x1290, 0x12B0, + 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, + 0x12C8, 0x12D6, 0x12D8, 0x1310, 0x1312, 0x1315, 0x1318, 0x135A, + 0x135D, 0x137C, 0x1380, 0x1399, 0x2D80, 0x2D96, 0x2DA0, 0x2DA6, + 0x2DA8, 0x2DAE, 0x2DB0, 0x2DB6, 0x2DB8, 0x2DBE, 0x2DC0, 0x2DC6, + 0x2DC8, 0x2DCE, 0x2DD0, 0x2DD6, 0x2DD8, 0x2DDE, 0xAB01, 0xAB06, + 0xAB09, 0xAB0E, 0xAB11, 0xAB16, 0xAB20, 0xAB26, 0xAB28, 0xAB2E, + 0x1E7E0, 0x1E7E6, 0x1E7E8, 0x1E7EB, 0x1E7ED, 0x1E7EE, 0x1E7F0, 0x1E7FE, + // #131 (15707+10): sc=Georgian:Geor + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FA, + 0x10FC, 0x10FF, 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x2D00, 0x2D25, + 0x2D27, 0x2D27, 0x2D2D, 0x2D2D, + // #132 (15717+6): sc=Glagolitic:Glag + 0x2C00, 0x2C5F, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, + // #133 (15723+1): sc=Gothic:Goth scx=Gothic:Goth + 0x10330, 0x1034A, + // #134 (15724+15): sc=Grantha:Gran + 0x11300, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133C, 0x11344, + 0x11347, 0x11348, 0x1134B, 0x1134D, 0x11350, 0x11350, 0x11357, 0x11357, + 0x1135D, 0x11363, 0x11366, 0x1136C, 0x11370, 0x11374, + // #135 (15739+36): sc=Greek:Grek + 0x0370, 0x0373, 0x0375, 0x0377, 0x037A, 0x037D, 0x037F, 0x037F, + 0x0384, 0x0384, 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, + 0x038E, 0x03A1, 0x03A3, 0x03E1, 0x03F0, 0x03FF, 0x1D26, 0x1D2A, + 0x1D5D, 0x1D61, 0x1D66, 0x1D6A, 0x1DBF, 0x1DBF, 0x1F00, 0x1F15, + 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, + 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, + 0x1F80, 0x1FB4, 0x1FB6, 0x1FC4, 0x1FC6, 0x1FD3, 0x1FD6, 0x1FDB, + 0x1FDD, 0x1FEF, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFE, 0x2126, 0x2126, + 0xAB65, 0xAB65, 0x10140, 0x1018E, 0x101A0, 0x101A0, 0x1D200, 0x1D245, + // #136 (15775+14): sc=Gujarati:Gujr + 0x0A81, 0x0A83, 0x0A85, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, + 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, + 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, + 0x0AE6, 0x0AF1, 0x0AF9, 0x0AFF, + // #137 (15789+6): sc=Gunjala_Gondi:Gong + 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, 0x11D90, 0x11D91, + 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, + // #138 (15795+16): sc=Gurmukhi:Guru + 0x0A01, 0x0A03, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, + 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, + 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, + 0x0A51, 0x0A51, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A76, + // #139 (15811+20): sc=Han:Hani + 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, 0x3005, 0x3005, + 0x3007, 0x3007, 0x3021, 0x3029, 0x3038, 0x303B, 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, 0x16FE2, 0x16FE3, + 0x16FF0, 0x16FF1, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, 0x2B740, 0x2B81D, + 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, 0x30000, 0x3134A, + // #140 (15831+14): sc=Hangul:Hang + 0x1100, 0x11FF, 0x302E, 0x302F, 0x3131, 0x318E, 0x3200, 0x321E, + 0x3260, 0x327E, 0xA960, 0xA97C, 0xAC00, 0xD7A3, 0xD7B0, 0xD7C6, + 0xD7CB, 0xD7FB, 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, + 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, + // #141 (15845+2): sc=Hanifi_Rohingya:Rohg + 0x10D00, 0x10D27, 0x10D30, 0x10D39, + // #142 (15847+1): sc=Hanunoo:Hano + 0x1720, 0x1734, + // #143 (15848+3): sc=Hatran:Hatr scx=Hatran:Hatr + 0x108E0, 0x108F2, 0x108F4, 0x108F5, 0x108FB, 0x108FF, + // #144 (15851+9): sc=Hebrew:Hebr scx=Hebrew:Hebr + 0x0591, 0x05C7, 0x05D0, 0x05EA, 0x05EF, 0x05F4, 0xFB1D, 0xFB36, + 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, + 0xFB46, 0xFB4F, + // #145 (15860+5): sc=Hiragana:Hira + 0x3041, 0x3096, 0x309D, 0x309F, 0x1B001, 0x1B11F, 0x1B150, 0x1B152, + 0x1F200, 0x1F200, + // #146 (15865+2): sc=Imperial_Aramaic:Armi scx=Imperial_Aramaic:Armi + 0x10840, 0x10855, 0x10857, 0x1085F, + // #147 (15867+29): sc=Inherited:Zinh:Qaai + 0x0300, 0x036F, 0x0485, 0x0486, 0x064B, 0x0655, 0x0670, 0x0670, + 0x0951, 0x0954, 0x1AB0, 0x1ACE, 0x1CD0, 0x1CD2, 0x1CD4, 0x1CE0, + 0x1CE2, 0x1CE8, 0x1CED, 0x1CED, 0x1CF4, 0x1CF4, 0x1CF8, 0x1CF9, + 0x1DC0, 0x1DFF, 0x200C, 0x200D, 0x20D0, 0x20F0, 0x302A, 0x302D, + 0x3099, 0x309A, 0xFE00, 0xFE0F, 0xFE20, 0xFE2D, 0x101FD, 0x101FD, + 0x102E0, 0x102E0, 0x1133B, 0x1133B, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, + 0x1D167, 0x1D169, 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, + 0xE0100, 0xE01EF, + // #148 (15896+2): sc=Inscriptional_Pahlavi:Phli scx=Inscriptional_Pahlavi:Phli + 0x10B60, 0x10B72, 0x10B78, 0x10B7F, + // #149 (15898+2): sc=Inscriptional_Parthian:Prti scx=Inscriptional_Parthian:Prti + 0x10B40, 0x10B55, 0x10B58, 0x10B5F, + // #150 (15900+3): sc=Javanese:Java + 0xA980, 0xA9CD, 0xA9D0, 0xA9D9, 0xA9DE, 0xA9DF, + // #151 (15903+2): sc=Kaithi:Kthi + 0x11080, 0x110C2, 0x110CD, 0x110CD, + // #152 (15905+13): sc=Kannada:Knda + 0x0C80, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, + 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, + 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, + 0x0CF1, 0x0CF2, + // #153 (15918+13): sc=Katakana:Kana + 0x30A1, 0x30FA, 0x30FD, 0x30FF, 0x31F0, 0x31FF, 0x32D0, 0x32FE, + 0x3300, 0x3357, 0xFF66, 0xFF6F, 0xFF71, 0xFF9D, 0x1AFF0, 0x1AFF3, + 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, 0x1B000, 0x1B000, 0x1B120, 0x1B122, + 0x1B164, 0x1B167, + // #154 (15931+2): sc=Kayah_Li:Kali + 0xA900, 0xA92D, 0xA92F, 0xA92F, + // #155 (15933+8): sc=Kharoshthi:Khar scx=Kharoshthi:Khar + 0x10A00, 0x10A03, 0x10A05, 0x10A06, 0x10A0C, 0x10A13, 0x10A15, 0x10A17, + 0x10A19, 0x10A35, 0x10A38, 0x10A3A, 0x10A3F, 0x10A48, 0x10A50, 0x10A58, + // #156 (15941+2): sc=Khitan_Small_Script:Kits scx=Khitan_Small_Script:Kits + 0x16FE4, 0x16FE4, 0x18B00, 0x18CD5, + // #157 (15943+4): sc=Khmer:Khmr scx=Khmer:Khmr + 0x1780, 0x17DD, 0x17E0, 0x17E9, 0x17F0, 0x17F9, 0x19E0, 0x19FF, + // #158 (15947+2): sc=Khojki:Khoj + 0x11200, 0x11211, 0x11213, 0x1123E, + // #159 (15949+2): sc=Khudawadi:Sind + 0x112B0, 0x112EA, 0x112F0, 0x112F9, + // #160 (15951+11): sc=Lao:Laoo scx=Lao:Laoo + 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E86, 0x0E8A, 0x0E8C, 0x0EA3, + 0x0EA5, 0x0EA5, 0x0EA7, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, + 0x0EC8, 0x0ECD, 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDF, + // #161 (15962+38): sc=Latin:Latn + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02B8, 0x02E0, 0x02E4, + 0x1D00, 0x1D25, 0x1D2C, 0x1D5C, 0x1D62, 0x1D65, 0x1D6B, 0x1D77, + 0x1D79, 0x1DBE, 0x1E00, 0x1EFF, 0x2071, 0x2071, 0x207F, 0x207F, + 0x2090, 0x209C, 0x212A, 0x212B, 0x2132, 0x2132, 0x214E, 0x214E, + 0x2160, 0x2188, 0x2C60, 0x2C7F, 0xA722, 0xA787, 0xA78B, 0xA7CA, + 0xA7D0, 0xA7D1, 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA7FF, + 0xAB30, 0xAB5A, 0xAB5C, 0xAB64, 0xAB66, 0xAB69, 0xFB00, 0xFB06, + 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x1DF00, 0x1DF1E, + // #162 (16000+3): sc=Lepcha:Lepc scx=Lepcha:Lepc + 0x1C00, 0x1C37, 0x1C3B, 0x1C49, 0x1C4D, 0x1C4F, + // #163 (16003+5): sc=Limbu:Limb + 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, 0x1940, 0x1940, + 0x1944, 0x194F, + // #164 (16008+3): sc=Linear_A:Lina + 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + // #165 (16011+7): sc=Linear_B:Linb + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, + // #166 (16018+2): sc=Lisu:Lisu scx=Lisu:Lisu + 0xA4D0, 0xA4FF, 0x11FB0, 0x11FB0, + // #167 (16020+1): sc=Lycian:Lyci scx=Lycian:Lyci + 0x10280, 0x1029C, + // #168 (16021+2): sc=Lydian:Lydi scx=Lydian:Lydi + 0x10920, 0x10939, 0x1093F, 0x1093F, + // #169 (16023+1): sc=Mahajani:Mahj + 0x11150, 0x11176, + // #170 (16024+1): sc=Makasar:Maka scx=Makasar:Maka + 0x11EE0, 0x11EF8, + // #171 (16025+7): sc=Malayalam:Mlym + 0x0D00, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D44, 0x0D46, 0x0D48, + 0x0D4A, 0x0D4F, 0x0D54, 0x0D63, 0x0D66, 0x0D7F, + // #172 (16032+2): sc=Mandaic:Mand + 0x0840, 0x085B, 0x085E, 0x085E, + // #173 (16034+2): sc=Manichaean:Mani + 0x10AC0, 0x10AE6, 0x10AEB, 0x10AF6, + // #174 (16036+3): sc=Marchen:Marc scx=Marchen:Marc + 0x11C70, 0x11C8F, 0x11C92, 0x11CA7, 0x11CA9, 0x11CB6, + // #175 (16039+7): sc=Masaram_Gondi:Gonm + 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D36, 0x11D3A, 0x11D3A, + 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, 0x11D50, 0x11D59, + // #176 (16046+1): sc=Medefaidrin:Medf scx=Medefaidrin:Medf + 0x16E40, 0x16E9A, + // #177 (16047+3): sc=Meetei_Mayek:Mtei scx=Meetei_Mayek:Mtei + 0xAAE0, 0xAAF6, 0xABC0, 0xABED, 0xABF0, 0xABF9, + // #178 (16050+2): sc=Mende_Kikakui:Mend scx=Mende_Kikakui:Mend + 0x1E800, 0x1E8C4, 0x1E8C7, 0x1E8D6, + // #179 (16052+3): sc=Meroitic_Cursive:Merc scx=Meroitic_Cursive:Merc + 0x109A0, 0x109B7, 0x109BC, 0x109CF, 0x109D2, 0x109FF, + // #180 (16055+1): sc=Meroitic_Hieroglyphs:Mero scx=Meroitic_Hieroglyphs:Mero + 0x10980, 0x1099F, + // #181 (16056+3): sc=Miao:Plrd scx=Miao:Plrd + 0x16F00, 0x16F4A, 0x16F4F, 0x16F87, 0x16F8F, 0x16F9F, + // #182 (16059+2): sc=Modi:Modi + 0x11600, 0x11644, 0x11650, 0x11659, + // #183 (16061+6): sc=Mongolian:Mong + 0x1800, 0x1801, 0x1804, 0x1804, 0x1806, 0x1819, 0x1820, 0x1878, + 0x1880, 0x18AA, 0x11660, 0x1166C, + // #184 (16067+3): sc=Mro:Mroo scx=Mro:Mroo + 0x16A40, 0x16A5E, 0x16A60, 0x16A69, 0x16A6E, 0x16A6F, + // #185 (16070+5): sc=Multani:Mult + 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, 0x1128F, 0x1129D, + 0x1129F, 0x112A9, + // #186 (16075+3): sc=Myanmar:Mymr + 0x1000, 0x109F, 0xA9E0, 0xA9FE, 0xAA60, 0xAA7F, + // #187 (16078+2): sc=Nabataean:Nbat scx=Nabataean:Nbat + 0x10880, 0x1089E, 0x108A7, 0x108AF, + // #188 (16080+3): sc=Nandinagari:Nand + 0x119A0, 0x119A7, 0x119AA, 0x119D7, 0x119DA, 0x119E4, + // #189 (16083+4): sc=New_Tai_Lue:Talu scx=New_Tai_Lue:Talu + 0x1980, 0x19AB, 0x19B0, 0x19C9, 0x19D0, 0x19DA, 0x19DE, 0x19DF, + // #190 (16087+2): sc=Newa:Newa scx=Newa:Newa + 0x11400, 0x1145B, 0x1145D, 0x11461, + // #191 (16089+2): sc=Nko:Nkoo + 0x07C0, 0x07FA, 0x07FD, 0x07FF, + // #192 (16091+2): sc=Nushu:Nshu scx=Nushu:Nshu + 0x16FE1, 0x16FE1, 0x1B170, 0x1B2FB, + // #193 (16093+4): sc=Nyiakeng_Puachue_Hmong:Hmnp scx=Nyiakeng_Puachue_Hmong:Hmnp + 0x1E100, 0x1E12C, 0x1E130, 0x1E13D, 0x1E140, 0x1E149, 0x1E14E, 0x1E14F, + // #194 (16097+1): sc=Ogham:Ogam scx=Ogham:Ogam + 0x1680, 0x169C, + // #195 (16098+1): sc=Ol_Chiki:Olck scx=Ol_Chiki:Olck + 0x1C50, 0x1C7F, + // #196 (16099+3): sc=Old_Hungarian:Hung scx=Old_Hungarian:Hung + 0x10C80, 0x10CB2, 0x10CC0, 0x10CF2, 0x10CFA, 0x10CFF, + // #197 (16102+2): sc=Old_Italic:Ital scx=Old_Italic:Ital + 0x10300, 0x10323, 0x1032D, 0x1032F, + // #198 (16104+1): sc=Old_North_Arabian:Narb scx=Old_North_Arabian:Narb + 0x10A80, 0x10A9F, + // #199 (16105+1): sc=Old_Permic:Perm + 0x10350, 0x1037A, + // #200 (16106+2): sc=Old_Persian:Xpeo scx=Old_Persian:Xpeo + 0x103A0, 0x103C3, 0x103C8, 0x103D5, + // #201 (16108+1): sc=Old_Sogdian:Sogo scx=Old_Sogdian:Sogo + 0x10F00, 0x10F27, + // #202 (16109+1): sc=Old_South_Arabian:Sarb scx=Old_South_Arabian:Sarb + 0x10A60, 0x10A7F, + // #203 (16110+1): sc=Old_Turkic:Orkh scx=Old_Turkic:Orkh + 0x10C00, 0x10C48, + // #204 (16111+1): sc=Old_Uyghur:Ougr + 0x10F70, 0x10F89, + // #205 (16112+14): sc=Oriya:Orya + 0x0B01, 0x0B03, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, + 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B35, 0x0B39, 0x0B3C, 0x0B44, + 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, + 0x0B5F, 0x0B63, 0x0B66, 0x0B77, + // #206 (16126+2): sc=Osage:Osge scx=Osage:Osge + 0x104B0, 0x104D3, 0x104D8, 0x104FB, + // #207 (16128+2): sc=Osmanya:Osma scx=Osmanya:Osma + 0x10480, 0x1049D, 0x104A0, 0x104A9, + // #208 (16130+5): sc=Pahawh_Hmong:Hmng scx=Pahawh_Hmong:Hmng + 0x16B00, 0x16B45, 0x16B50, 0x16B59, 0x16B5B, 0x16B61, 0x16B63, 0x16B77, + 0x16B7D, 0x16B8F, + // #209 (16135+1): sc=Palmyrene:Palm scx=Palmyrene:Palm + 0x10860, 0x1087F, + // #210 (16136+1): sc=Pau_Cin_Hau:Pauc scx=Pau_Cin_Hau:Pauc + 0x11AC0, 0x11AF8, + // #211 (16137+1): sc=Phags_Pa:Phag + 0xA840, 0xA877, + // #212 (16138+2): sc=Phoenician:Phnx scx=Phoenician:Phnx + 0x10900, 0x1091B, 0x1091F, 0x1091F, + // #213 (16140+3): sc=Psalter_Pahlavi:Phlp + 0x10B80, 0x10B91, 0x10B99, 0x10B9C, 0x10BA9, 0x10BAF, + // #214 (16143+2): sc=Rejang:Rjng scx=Rejang:Rjng + 0xA930, 0xA953, 0xA95F, 0xA95F, + // #215 (16145+2): sc=Runic:Runr scx=Runic:Runr + 0x16A0, 0x16EA, 0x16EE, 0x16F8, + // #216 (16147+2): sc=Samaritan:Samr scx=Samaritan:Samr + 0x0800, 0x082D, 0x0830, 0x083E, + // #217 (16149+2): sc=Saurashtra:Saur scx=Saurashtra:Saur + 0xA880, 0xA8C5, 0xA8CE, 0xA8D9, + // #218 (16151+1): sc=Sharada:Shrd + 0x11180, 0x111DF, + // #219 (16152+1): sc=Shavian:Shaw scx=Shavian:Shaw + 0x10450, 0x1047F, + // #220 (16153+2): sc=Siddham:Sidd scx=Siddham:Sidd + 0x11580, 0x115B5, 0x115B8, 0x115DD, + // #221 (16155+3): sc=SignWriting:Sgnw scx=SignWriting:Sgnw + 0x1D800, 0x1DA8B, 0x1DA9B, 0x1DA9F, 0x1DAA1, 0x1DAAF, + // #222 (16158+13): sc=Sinhala:Sinh + 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, + 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, 0x0DCF, 0x0DD4, + 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, 0x0DF2, 0x0DF4, + 0x111E1, 0x111F4, + // #223 (16171+1): sc=Sogdian:Sogd + 0x10F30, 0x10F59, + // #224 (16172+2): sc=Sora_Sompeng:Sora scx=Sora_Sompeng:Sora + 0x110D0, 0x110E8, 0x110F0, 0x110F9, + // #225 (16174+1): sc=Soyombo:Soyo scx=Soyombo:Soyo + 0x11A50, 0x11AA2, + // #226 (16175+2): sc=Sundanese:Sund scx=Sundanese:Sund + 0x1B80, 0x1BBF, 0x1CC0, 0x1CC7, + // #227 (16177+1): sc=Syloti_Nagri:Sylo + 0xA800, 0xA82C, + // #228 (16178+4): sc=Syriac:Syrc + 0x0700, 0x070D, 0x070F, 0x074A, 0x074D, 0x074F, 0x0860, 0x086A, + // #229 (16182+2): sc=Tagalog:Tglg + 0x1700, 0x1715, 0x171F, 0x171F, + // #230 (16184+3): sc=Tagbanwa:Tagb + 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + // #231 (16187+2): sc=Tai_Le:Tale + 0x1950, 0x196D, 0x1970, 0x1974, + // #232 (16189+5): sc=Tai_Tham:Lana scx=Tai_Tham:Lana + 0x1A20, 0x1A5E, 0x1A60, 0x1A7C, 0x1A7F, 0x1A89, 0x1A90, 0x1A99, + 0x1AA0, 0x1AAD, + // #233 (16194+2): sc=Tai_Viet:Tavt scx=Tai_Viet:Tavt + 0xAA80, 0xAAC2, 0xAADB, 0xAADF, + // #234 (16196+2): sc=Takri:Takr + 0x11680, 0x116B9, 0x116C0, 0x116C9, + // #235 (16198+18): sc=Tamil:Taml + 0x0B82, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, + 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, + 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, 0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, + 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, 0x0BD7, 0x0BD7, 0x0BE6, 0x0BFA, + 0x11FC0, 0x11FF1, 0x11FFF, 0x11FFF, + // #236 (16216+2): sc=Tangsa:Tnsa scx=Tangsa:Tnsa + 0x16A70, 0x16ABE, 0x16AC0, 0x16AC9, + // #237 (16218+4): sc=Tangut:Tang scx=Tangut:Tang + 0x16FE0, 0x16FE0, 0x17000, 0x187F7, 0x18800, 0x18AFF, 0x18D00, 0x18D08, + // #238 (16222+13): sc=Telugu:Telu + 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C39, + 0x0C3C, 0x0C44, 0x0C46, 0x0C48, 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, + 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, 0x0C60, 0x0C63, 0x0C66, 0x0C6F, + 0x0C77, 0x0C7F, + // #239 (16235+1): sc=Thaana:Thaa + 0x0780, 0x07B1, + // #240 (16236+2): sc=Thai:Thai scx=Thai:Thai + 0x0E01, 0x0E3A, 0x0E40, 0x0E5B, + // #241 (16238+7): sc=Tibetan:Tibt scx=Tibetan:Tibt + 0x0F00, 0x0F47, 0x0F49, 0x0F6C, 0x0F71, 0x0F97, 0x0F99, 0x0FBC, + 0x0FBE, 0x0FCC, 0x0FCE, 0x0FD4, 0x0FD9, 0x0FDA, + // #242 (16245+3): sc=Tifinagh:Tfng scx=Tifinagh:Tfng + 0x2D30, 0x2D67, 0x2D6F, 0x2D70, 0x2D7F, 0x2D7F, + // #243 (16248+2): sc=Tirhuta:Tirh + 0x11480, 0x114C7, 0x114D0, 0x114D9, + // #244 (16250+1): sc=Toto scx=Toto + 0x1E290, 0x1E2AE, + // #245 (16251+2): sc=Ugaritic:Ugar scx=Ugaritic:Ugar + 0x10380, 0x1039D, 0x1039F, 0x1039F, + // #246 (16253+1): sc=Vai:Vaii scx=Vai:Vaii + 0xA500, 0xA62B, + // #247 (16254+8): sc=Vithkuqi:Vith scx=Vithkuqi:Vith + 0x10570, 0x1057A, 0x1057C, 0x1058A, 0x1058C, 0x10592, 0x10594, 0x10595, + 0x10597, 0x105A1, 0x105A3, 0x105B1, 0x105B3, 0x105B9, 0x105BB, 0x105BC, + // #248 (16262+2): sc=Wancho:Wcho scx=Wancho:Wcho + 0x1E2C0, 0x1E2F9, 0x1E2FF, 0x1E2FF, + // #249 (16264+2): sc=Warang_Citi:Wara scx=Warang_Citi:Wara + 0x118A0, 0x118F2, 0x118FF, 0x118FF, + // #250 (16266+3): sc=Yezidi:Yezi + 0x10E80, 0x10EA9, 0x10EAB, 0x10EAD, 0x10EB0, 0x10EB1, + // #251 (16269+2): sc=Yi:Yiii + 0xA000, 0xA48C, 0xA490, 0xA4C6, + // #252 (16271+1): sc=Zanabazar_Square:Zanb scx=Zanabazar_Square:Zanb + 0x11A00, 0x11A47, + // #253 (16272+5): scx=Adlam:Adlm + 0x061F, 0x061F, 0x0640, 0x0640, 0x1E900, 0x1E94B, 0x1E950, 0x1E959, + 0x1E95E, 0x1E95F, + // #254 (16277+51): scx=Arabic:Arab + 0x0600, 0x0604, 0x0606, 0x06DC, 0x06DE, 0x06FF, 0x0750, 0x077F, + 0x0870, 0x088E, 0x0890, 0x0891, 0x0898, 0x08E1, 0x08E3, 0x08FF, + 0xFB50, 0xFBC2, 0xFBD3, 0xFD8F, 0xFD92, 0xFDC7, 0xFDCF, 0xFDCF, + 0xFDF0, 0xFDFF, 0xFE70, 0xFE74, 0xFE76, 0xFEFC, 0x102E0, 0x102FB, + 0x10E60, 0x10E7E, 0x1EE00, 0x1EE03, 0x1EE05, 0x1EE1F, 0x1EE21, 0x1EE22, + 0x1EE24, 0x1EE24, 0x1EE27, 0x1EE27, 0x1EE29, 0x1EE32, 0x1EE34, 0x1EE37, + 0x1EE39, 0x1EE39, 0x1EE3B, 0x1EE3B, 0x1EE42, 0x1EE42, 0x1EE47, 0x1EE47, + 0x1EE49, 0x1EE49, 0x1EE4B, 0x1EE4B, 0x1EE4D, 0x1EE4F, 0x1EE51, 0x1EE52, + 0x1EE54, 0x1EE54, 0x1EE57, 0x1EE57, 0x1EE59, 0x1EE59, 0x1EE5B, 0x1EE5B, + 0x1EE5D, 0x1EE5D, 0x1EE5F, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE64, + 0x1EE67, 0x1EE6A, 0x1EE6C, 0x1EE72, 0x1EE74, 0x1EE77, 0x1EE79, 0x1EE7C, + 0x1EE7E, 0x1EE7E, 0x1EE80, 0x1EE89, 0x1EE8B, 0x1EE9B, 0x1EEA1, 0x1EEA3, + 0x1EEA5, 0x1EEA9, 0x1EEAB, 0x1EEBB, 0x1EEF0, 0x1EEF1, + // #255 (16328+26): scx=Bengali:Beng + 0x0951, 0x0952, 0x0964, 0x0965, 0x0980, 0x0983, 0x0985, 0x098C, + 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, + 0x09B6, 0x09B9, 0x09BC, 0x09C4, 0x09C7, 0x09C8, 0x09CB, 0x09CE, + 0x09D7, 0x09D7, 0x09DC, 0x09DD, 0x09DF, 0x09E3, 0x09E6, 0x09FE, + 0x1CD0, 0x1CD0, 0x1CD2, 0x1CD2, 0x1CD5, 0x1CD6, 0x1CD8, 0x1CD8, + 0x1CE1, 0x1CE1, 0x1CEA, 0x1CEA, 0x1CED, 0x1CED, 0x1CF2, 0x1CF2, + 0x1CF5, 0x1CF7, 0xA8F1, 0xA8F1, + // #256 (16354+12): scx=Bopomofo:Bopo + 0x02EA, 0x02EB, 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, + 0x302A, 0x302D, 0x3030, 0x3030, 0x3037, 0x3037, 0x30FB, 0x30FB, + 0x3105, 0x312F, 0x31A0, 0x31BF, 0xFE45, 0xFE46, 0xFF61, 0xFF65, + // #257 (16366+3): scx=Buginese:Bugi + 0x1A00, 0x1A1B, 0x1A1E, 0x1A1F, 0xA9CF, 0xA9CF, + // #258 (16369+2): scx=Buhid:Buhd + 0x1735, 0x1736, 0x1740, 0x1753, + // #259 (16371+4): scx=Chakma:Cakm + 0x09E6, 0x09EF, 0x1040, 0x1049, 0x11100, 0x11134, 0x11136, 0x11147, + // #260 (16375+148): scx=Common:Zyyy + 0x0000, 0x0040, 0x005B, 0x0060, 0x007B, 0x00A9, 0x00AB, 0x00B9, + 0x00BB, 0x00BF, 0x00D7, 0x00D7, 0x00F7, 0x00F7, 0x02B9, 0x02DF, + 0x02E5, 0x02E9, 0x02EC, 0x02FF, 0x0374, 0x0374, 0x037E, 0x037E, + 0x0385, 0x0385, 0x0387, 0x0387, 0x0605, 0x0605, 0x06DD, 0x06DD, + 0x08E2, 0x08E2, 0x0E3F, 0x0E3F, 0x0FD5, 0x0FD8, 0x16EB, 0x16ED, + 0x2000, 0x200B, 0x200E, 0x202E, 0x2030, 0x2064, 0x2066, 0x2070, + 0x2074, 0x207E, 0x2080, 0x208E, 0x20A0, 0x20C0, 0x2100, 0x2125, + 0x2127, 0x2129, 0x212C, 0x2131, 0x2133, 0x214D, 0x214F, 0x215F, + 0x2189, 0x218B, 0x2190, 0x2426, 0x2440, 0x244A, 0x2460, 0x27FF, + 0x2900, 0x2B73, 0x2B76, 0x2B95, 0x2B97, 0x2BFF, 0x2E00, 0x2E42, + 0x2E44, 0x2E5D, 0x2FF0, 0x2FFB, 0x3000, 0x3000, 0x3004, 0x3004, + 0x3012, 0x3012, 0x3020, 0x3020, 0x3036, 0x3036, 0x3248, 0x325F, + 0x327F, 0x327F, 0x32B1, 0x32BF, 0x32CC, 0x32CF, 0x3371, 0x337A, + 0x3380, 0x33DF, 0x33FF, 0x33FF, 0x4DC0, 0x4DFF, 0xA708, 0xA721, + 0xA788, 0xA78A, 0xAB5B, 0xAB5B, 0xAB6A, 0xAB6B, 0xFE10, 0xFE19, + 0xFE30, 0xFE44, 0xFE47, 0xFE52, 0xFE54, 0xFE66, 0xFE68, 0xFE6B, + 0xFEFF, 0xFEFF, 0xFF01, 0xFF20, 0xFF3B, 0xFF40, 0xFF5B, 0xFF60, + 0xFFE0, 0xFFE6, 0xFFE8, 0xFFEE, 0xFFF9, 0xFFFD, 0x10190, 0x1019C, + 0x101D0, 0x101FC, 0x1CF50, 0x1CFC3, 0x1D000, 0x1D0F5, 0x1D100, 0x1D126, + 0x1D129, 0x1D166, 0x1D16A, 0x1D17A, 0x1D183, 0x1D184, 0x1D18C, 0x1D1A9, + 0x1D1AE, 0x1D1EA, 0x1D2E0, 0x1D2F3, 0x1D300, 0x1D356, 0x1D372, 0x1D378, + 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, + 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, + 0x1D4BD, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, + 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, + 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A5, 0x1D6A8, 0x1D7CB, + 0x1D7CE, 0x1D7FF, 0x1EC71, 0x1ECB4, 0x1ED01, 0x1ED3D, 0x1F000, 0x1F02B, + 0x1F030, 0x1F093, 0x1F0A0, 0x1F0AE, 0x1F0B1, 0x1F0BF, 0x1F0C1, 0x1F0CF, + 0x1F0D1, 0x1F0F5, 0x1F100, 0x1F1AD, 0x1F1E6, 0x1F1FF, 0x1F201, 0x1F202, + 0x1F210, 0x1F23B, 0x1F240, 0x1F248, 0x1F260, 0x1F265, 0x1F300, 0x1F6D7, + 0x1F6DD, 0x1F6EC, 0x1F6F0, 0x1F6FC, 0x1F700, 0x1F773, 0x1F780, 0x1F7D8, + 0x1F7E0, 0x1F7EB, 0x1F7F0, 0x1F7F0, 0x1F800, 0x1F80B, 0x1F810, 0x1F847, + 0x1F850, 0x1F859, 0x1F860, 0x1F887, 0x1F890, 0x1F8AD, 0x1F8B0, 0x1F8B1, + 0x1F900, 0x1FA53, 0x1FA60, 0x1FA6D, 0x1FA70, 0x1FA74, 0x1FA78, 0x1FA7C, + 0x1FA80, 0x1FA86, 0x1FA90, 0x1FAAC, 0x1FAB0, 0x1FABA, 0x1FAC0, 0x1FAC5, + 0x1FAD0, 0x1FAD9, 0x1FAE0, 0x1FAE7, 0x1FAF0, 0x1FAF6, 0x1FB00, 0x1FB92, + 0x1FB94, 0x1FBCA, 0x1FBF0, 0x1FBF9, 0xE0001, 0xE0001, 0xE0020, 0xE007F, + // #261 (16523+4): scx=Coptic:Copt:Qaac + 0x03E2, 0x03EF, 0x2C80, 0x2CF3, 0x2CF9, 0x2CFF, 0x102E0, 0x102FB, + // #262 (16527+2): scx=Cypro_Minoan:Cpmn + 0x10100, 0x10101, 0x12F90, 0x12FF2, + // #263 (16529+9): scx=Cypriot:Cprt + 0x10100, 0x10102, 0x10107, 0x10133, 0x10137, 0x1013F, 0x10800, 0x10805, + 0x10808, 0x10808, 0x1080A, 0x10835, 0x10837, 0x10838, 0x1083C, 0x1083C, + 0x1083F, 0x1083F, + // #264 (16538+9): scx=Cyrillic:Cyrl + 0x0400, 0x052F, 0x1C80, 0x1C88, 0x1D2B, 0x1D2B, 0x1D78, 0x1D78, + 0x1DF8, 0x1DF8, 0x2DE0, 0x2DFF, 0x2E43, 0x2E43, 0xA640, 0xA69F, + 0xFE2E, 0xFE2F, + // #265 (16547+7): scx=Devanagari:Deva + 0x0900, 0x0952, 0x0955, 0x097F, 0x1CD0, 0x1CF6, 0x1CF8, 0x1CF9, + 0x20F0, 0x20F0, 0xA830, 0xA839, 0xA8E0, 0xA8FF, + // #266 (16554+3): scx=Dogra:Dogr + 0x0964, 0x096F, 0xA830, 0xA839, 0x11800, 0x1183B, + // #267 (16557+5): scx=Duployan:Dupl + 0x1BC00, 0x1BC6A, 0x1BC70, 0x1BC7C, 0x1BC80, 0x1BC88, 0x1BC90, 0x1BC99, + 0x1BC9C, 0x1BCA3, + // #268 (16562+9): scx=Georgian:Geor + 0x10A0, 0x10C5, 0x10C7, 0x10C7, 0x10CD, 0x10CD, 0x10D0, 0x10FF, + 0x1C90, 0x1CBA, 0x1CBD, 0x1CBF, 0x2D00, 0x2D25, 0x2D27, 0x2D27, + 0x2D2D, 0x2D2D, + // #269 (16571+10): scx=Glagolitic:Glag + 0x0484, 0x0484, 0x0487, 0x0487, 0x2C00, 0x2C5F, 0x2E43, 0x2E43, + 0xA66F, 0xA66F, 0x1E000, 0x1E006, 0x1E008, 0x1E018, 0x1E01B, 0x1E021, + 0x1E023, 0x1E024, 0x1E026, 0x1E02A, + // #270 (16581+25): scx=Grantha:Gran + 0x0951, 0x0952, 0x0964, 0x0965, 0x0BE6, 0x0BF3, 0x1CD0, 0x1CD0, + 0x1CD2, 0x1CD3, 0x1CF2, 0x1CF4, 0x1CF8, 0x1CF9, 0x20F0, 0x20F0, + 0x11300, 0x11303, 0x11305, 0x1130C, 0x1130F, 0x11310, 0x11313, 0x11328, + 0x1132A, 0x11330, 0x11332, 0x11333, 0x11335, 0x11339, 0x1133B, 0x11344, + 0x11347, 0x11348, 0x1134B, 0x1134D, 0x11350, 0x11350, 0x11357, 0x11357, + 0x1135D, 0x11363, 0x11366, 0x1136C, 0x11370, 0x11374, 0x11FD0, 0x11FD1, + 0x11FD3, 0x11FD3, + // #271 (16606+38): scx=Greek:Grek + 0x0342, 0x0342, 0x0345, 0x0345, 0x0370, 0x0373, 0x0375, 0x0377, + 0x037A, 0x037D, 0x037F, 0x037F, 0x0384, 0x0384, 0x0386, 0x0386, + 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03E1, + 0x03F0, 0x03FF, 0x1D26, 0x1D2A, 0x1D5D, 0x1D61, 0x1D66, 0x1D6A, + 0x1DBF, 0x1DC1, 0x1F00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, + 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, + 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FC4, + 0x1FC6, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FDD, 0x1FEF, 0x1FF2, 0x1FF4, + 0x1FF6, 0x1FFE, 0x2126, 0x2126, 0xAB65, 0xAB65, 0x10140, 0x1018E, + 0x101A0, 0x101A0, 0x1D200, 0x1D245, + // #272 (16644+17): scx=Gujarati:Gujr + 0x0951, 0x0952, 0x0964, 0x0965, 0x0A81, 0x0A83, 0x0A85, 0x0A8D, + 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, + 0x0AB5, 0x0AB9, 0x0ABC, 0x0AC5, 0x0AC7, 0x0AC9, 0x0ACB, 0x0ACD, + 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE3, 0x0AE6, 0x0AF1, 0x0AF9, 0x0AFF, + 0xA830, 0xA839, + // #273 (16661+7): scx=Gunjala_Gondi:Gong + 0x0964, 0x0965, 0x11D60, 0x11D65, 0x11D67, 0x11D68, 0x11D6A, 0x11D8E, + 0x11D90, 0x11D91, 0x11D93, 0x11D98, 0x11DA0, 0x11DA9, + // #274 (16668+19): scx=Gurmukhi:Guru + 0x0951, 0x0952, 0x0964, 0x0965, 0x0A01, 0x0A03, 0x0A05, 0x0A0A, + 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, + 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A3C, 0x0A3C, 0x0A3E, 0x0A42, + 0x0A47, 0x0A48, 0x0A4B, 0x0A4D, 0x0A51, 0x0A51, 0x0A59, 0x0A5C, + 0x0A5E, 0x0A5E, 0x0A66, 0x0A76, 0xA830, 0xA839, + // #275 (16687+37): scx=Han:Hani + 0x2E80, 0x2E99, 0x2E9B, 0x2EF3, 0x2F00, 0x2FD5, 0x3001, 0x3003, + 0x3005, 0x3011, 0x3013, 0x301F, 0x3021, 0x302D, 0x3030, 0x3030, + 0x3037, 0x303F, 0x30FB, 0x30FB, 0x3190, 0x319F, 0x31C0, 0x31E3, + 0x3220, 0x3247, 0x3280, 0x32B0, 0x32C0, 0x32CB, 0x32FF, 0x32FF, + 0x3358, 0x3370, 0x337B, 0x337F, 0x33E0, 0x33FE, 0x3400, 0x4DBF, + 0x4E00, 0x9FFF, 0xA700, 0xA707, 0xF900, 0xFA6D, 0xFA70, 0xFAD9, + 0xFE45, 0xFE46, 0xFF61, 0xFF65, 0x16FE2, 0x16FE3, 0x16FF0, 0x16FF1, + 0x1D360, 0x1D371, 0x1F250, 0x1F251, 0x20000, 0x2A6DF, 0x2A700, 0x2B738, + 0x2B740, 0x2B81D, 0x2B820, 0x2CEA1, 0x2CEB0, 0x2EBE0, 0x2F800, 0x2FA1D, + 0x30000, 0x3134A, + // #276 (16724+21): scx=Hangul:Hang + 0x1100, 0x11FF, 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, + 0x302E, 0x3030, 0x3037, 0x3037, 0x30FB, 0x30FB, 0x3131, 0x318E, + 0x3200, 0x321E, 0x3260, 0x327E, 0xA960, 0xA97C, 0xAC00, 0xD7A3, + 0xD7B0, 0xD7C6, 0xD7CB, 0xD7FB, 0xFE45, 0xFE46, 0xFF61, 0xFF65, + 0xFFA0, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, + 0xFFDA, 0xFFDC, + // #277 (16745+7): scx=Hanifi_Rohingya:Rohg + 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x0640, 0x0640, + 0x06D4, 0x06D4, 0x10D00, 0x10D27, 0x10D30, 0x10D39, + // #278 (16752+1): scx=Hanunoo:Hano + 0x1720, 0x1736, + // #279 (16753+16): scx=Hiragana:Hira + 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x3030, 0x3035, + 0x3037, 0x3037, 0x303C, 0x303D, 0x3041, 0x3096, 0x3099, 0x30A0, + 0x30FB, 0x30FC, 0xFE45, 0xFE46, 0xFF61, 0xFF65, 0xFF70, 0xFF70, + 0xFF9E, 0xFF9F, 0x1B001, 0x1B11F, 0x1B150, 0x1B152, 0x1F200, 0x1F200, + // #280 (16769+20): scx=Inherited:Zinh:Qaai + 0x0300, 0x0341, 0x0343, 0x0344, 0x0346, 0x0362, 0x0953, 0x0954, + 0x1AB0, 0x1ACE, 0x1DC2, 0x1DF7, 0x1DF9, 0x1DF9, 0x1DFB, 0x1DFF, + 0x200C, 0x200D, 0x20D0, 0x20EF, 0xFE00, 0xFE0F, 0xFE20, 0xFE2D, + 0x101FD, 0x101FD, 0x1CF00, 0x1CF2D, 0x1CF30, 0x1CF46, 0x1D167, 0x1D169, + 0x1D17B, 0x1D182, 0x1D185, 0x1D18B, 0x1D1AA, 0x1D1AD, 0xE0100, 0xE01EF, + // #281 (16789+3): scx=Javanese:Java + 0xA980, 0xA9CD, 0xA9CF, 0xA9D9, 0xA9DE, 0xA9DF, + // #282 (16792+4): scx=Kaithi:Kthi + 0x0966, 0x096F, 0xA830, 0xA839, 0x11080, 0x110C2, 0x110CD, 0x110CD, + // #283 (16796+21): scx=Kannada:Knda + 0x0951, 0x0952, 0x0964, 0x0965, 0x0C80, 0x0C8C, 0x0C8E, 0x0C90, + 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBC, 0x0CC4, + 0x0CC6, 0x0CC8, 0x0CCA, 0x0CCD, 0x0CD5, 0x0CD6, 0x0CDD, 0x0CDE, + 0x0CE0, 0x0CE3, 0x0CE6, 0x0CEF, 0x0CF1, 0x0CF2, 0x1CD0, 0x1CD0, + 0x1CD2, 0x1CD2, 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, 0x1CF4, 0x1CF4, + 0xA830, 0xA835, + // #284 (16817+19): scx=Katakana:Kana + 0x3001, 0x3003, 0x3008, 0x3011, 0x3013, 0x301F, 0x3030, 0x3035, + 0x3037, 0x3037, 0x303C, 0x303D, 0x3099, 0x309C, 0x30A0, 0x30FF, + 0x31F0, 0x31FF, 0x32D0, 0x32FE, 0x3300, 0x3357, 0xFE45, 0xFE46, + 0xFF61, 0xFF9F, 0x1AFF0, 0x1AFF3, 0x1AFF5, 0x1AFFB, 0x1AFFD, 0x1AFFE, + 0x1B000, 0x1B000, 0x1B120, 0x1B122, 0x1B164, 0x1B167, + // #285 (16836+1): scx=Kayah_Li:Kali + 0xA900, 0xA92F, + // #286 (16837+4): scx=Khojki:Khoj + 0x0AE6, 0x0AEF, 0xA830, 0xA839, 0x11200, 0x11211, 0x11213, 0x1123E, + // #287 (16841+4): scx=Khudawadi:Sind + 0x0964, 0x0965, 0xA830, 0xA839, 0x112B0, 0x112EA, 0x112F0, 0x112F9, + // #288 (16845+46): scx=Latin:Latn + 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00BA, 0x00BA, + 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x02B8, 0x02E0, 0x02E4, + 0x0363, 0x036F, 0x0485, 0x0486, 0x0951, 0x0952, 0x10FB, 0x10FB, + 0x1D00, 0x1D25, 0x1D2C, 0x1D5C, 0x1D62, 0x1D65, 0x1D6B, 0x1D77, + 0x1D79, 0x1DBE, 0x1E00, 0x1EFF, 0x202F, 0x202F, 0x2071, 0x2071, + 0x207F, 0x207F, 0x2090, 0x209C, 0x20F0, 0x20F0, 0x212A, 0x212B, + 0x2132, 0x2132, 0x214E, 0x214E, 0x2160, 0x2188, 0x2C60, 0x2C7F, + 0xA700, 0xA707, 0xA722, 0xA787, 0xA78B, 0xA7CA, 0xA7D0, 0xA7D1, + 0xA7D3, 0xA7D3, 0xA7D5, 0xA7D9, 0xA7F2, 0xA7FF, 0xA92E, 0xA92E, + 0xAB30, 0xAB5A, 0xAB5C, 0xAB64, 0xAB66, 0xAB69, 0xFB00, 0xFB06, + 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0x10780, 0x10785, 0x10787, 0x107B0, + 0x107B2, 0x107BA, 0x1DF00, 0x1DF1E, + // #289 (16891+6): scx=Limbu:Limb + 0x0965, 0x0965, 0x1900, 0x191E, 0x1920, 0x192B, 0x1930, 0x193B, + 0x1940, 0x1940, 0x1944, 0x194F, + // #290 (16897+4): scx=Linear_A:Lina + 0x10107, 0x10133, 0x10600, 0x10736, 0x10740, 0x10755, 0x10760, 0x10767, + // #291 (16901+10): scx=Linear_B:Linb + 0x10000, 0x1000B, 0x1000D, 0x10026, 0x10028, 0x1003A, 0x1003C, 0x1003D, + 0x1003F, 0x1004D, 0x10050, 0x1005D, 0x10080, 0x100FA, 0x10100, 0x10102, + 0x10107, 0x10133, 0x10137, 0x1013F, + // #292 (16911+3): scx=Mahajani:Mahj + 0x0964, 0x096F, 0xA830, 0xA839, 0x11150, 0x11176, + // #293 (16914+11): scx=Malayalam:Mlym + 0x0951, 0x0952, 0x0964, 0x0965, 0x0D00, 0x0D0C, 0x0D0E, 0x0D10, + 0x0D12, 0x0D44, 0x0D46, 0x0D48, 0x0D4A, 0x0D4F, 0x0D54, 0x0D63, + 0x0D66, 0x0D7F, 0x1CDA, 0x1CDA, 0xA830, 0xA832, + // #294 (16925+3): scx=Mandaic:Mand + 0x0640, 0x0640, 0x0840, 0x085B, 0x085E, 0x085E, + // #295 (16928+3): scx=Manichaean:Mani + 0x0640, 0x0640, 0x10AC0, 0x10AE6, 0x10AEB, 0x10AF6, + // #296 (16931+8): scx=Masaram_Gondi:Gonm + 0x0964, 0x0965, 0x11D00, 0x11D06, 0x11D08, 0x11D09, 0x11D0B, 0x11D36, + 0x11D3A, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D3F, 0x11D47, 0x11D50, 0x11D59, + // #297 (16939+3): scx=Modi:Modi + 0xA830, 0xA839, 0x11600, 0x11644, 0x11650, 0x11659, + // #298 (16942+5): scx=Mongolian:Mong + 0x1800, 0x1819, 0x1820, 0x1878, 0x1880, 0x18AA, 0x202F, 0x202F, + 0x11660, 0x1166C, + // #299 (16947+6): scx=Multani:Mult + 0x0A66, 0x0A6F, 0x11280, 0x11286, 0x11288, 0x11288, 0x1128A, 0x1128D, + 0x1128F, 0x1129D, 0x1129F, 0x112A9, + // #300 (16953+4): scx=Myanmar:Mymr + 0x1000, 0x109F, 0xA92E, 0xA92E, 0xA9E0, 0xA9FE, 0xAA60, 0xAA7F, + // #301 (16957+9): scx=Nandinagari:Nand + 0x0964, 0x0965, 0x0CE6, 0x0CEF, 0x1CE9, 0x1CE9, 0x1CF2, 0x1CF2, + 0x1CFA, 0x1CFA, 0xA830, 0xA835, 0x119A0, 0x119A7, 0x119AA, 0x119D7, + 0x119DA, 0x119E4, + // #302 (16966+6): scx=Nko:Nkoo + 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x07C0, 0x07FA, + 0x07FD, 0x07FF, 0xFD3E, 0xFD3F, + // #303 (16972+2): scx=Old_Permic:Perm + 0x0483, 0x0483, 0x10350, 0x1037A, + // #304 (16974+3): scx=Old_Uyghur:Ougr + 0x0640, 0x0640, 0x10AF2, 0x10AF2, 0x10F70, 0x10F89, + // #305 (16977+18): scx=Oriya:Orya + 0x0951, 0x0952, 0x0964, 0x0965, 0x0B01, 0x0B03, 0x0B05, 0x0B0C, + 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, + 0x0B35, 0x0B39, 0x0B3C, 0x0B44, 0x0B47, 0x0B48, 0x0B4B, 0x0B4D, + 0x0B55, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B63, 0x0B66, 0x0B77, + 0x1CDA, 0x1CDA, 0x1CF2, 0x1CF2, + // #306 (16995+3): scx=Phags_Pa:Phag + 0x1802, 0x1803, 0x1805, 0x1805, 0xA840, 0xA877, + // #307 (16998+4): scx=Psalter_Pahlavi:Phlp + 0x0640, 0x0640, 0x10B80, 0x10B91, 0x10B99, 0x10B9C, 0x10BA9, 0x10BAF, + // #308 (17002+6): scx=Sharada:Shrd + 0x0951, 0x0951, 0x1CD7, 0x1CD7, 0x1CD9, 0x1CD9, 0x1CDC, 0x1CDD, + 0x1CE0, 0x1CE0, 0x11180, 0x111DF, + // #309 (17008+14): scx=Sinhala:Sinh + 0x0964, 0x0965, 0x0D81, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, + 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCA, 0x0DCA, + 0x0DCF, 0x0DD4, 0x0DD6, 0x0DD6, 0x0DD8, 0x0DDF, 0x0DE6, 0x0DEF, + 0x0DF2, 0x0DF4, 0x111E1, 0x111F4, + // #310 (17022+2): scx=Sogdian:Sogd + 0x0640, 0x0640, 0x10F30, 0x10F59, + // #311 (17024+3): scx=Syloti_Nagri:Sylo + 0x0964, 0x0965, 0x09E6, 0x09EF, 0xA800, 0xA82C, + // #312 (17027+12): scx=Syriac:Syrc + 0x060C, 0x060C, 0x061B, 0x061C, 0x061F, 0x061F, 0x0640, 0x0640, + 0x064B, 0x0655, 0x0670, 0x0670, 0x0700, 0x070D, 0x070F, 0x074A, + 0x074D, 0x074F, 0x0860, 0x086A, 0x1DF8, 0x1DF8, 0x1DFA, 0x1DFA, + // #313 (17039+3): scx=Tagalog:Tglg + 0x1700, 0x1715, 0x171F, 0x171F, 0x1735, 0x1736, + // #314 (17042+4): scx=Tagbanwa:Tagb + 0x1735, 0x1736, 0x1760, 0x176C, 0x176E, 0x1770, 0x1772, 0x1773, + // #315 (17046+3): scx=Tai_Le:Tale + 0x1040, 0x1049, 0x1950, 0x196D, 0x1970, 0x1974, + // #316 (17049+4): scx=Takri:Takr + 0x0964, 0x0965, 0xA830, 0xA839, 0x11680, 0x116B9, 0x116C0, 0x116C9, + // #317 (17053+25): scx=Tamil:Taml + 0x0951, 0x0952, 0x0964, 0x0965, 0x0B82, 0x0B83, 0x0B85, 0x0B8A, + 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, + 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB9, + 0x0BBE, 0x0BC2, 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCD, 0x0BD0, 0x0BD0, + 0x0BD7, 0x0BD7, 0x0BE6, 0x0BFA, 0x1CDA, 0x1CDA, 0xA8F3, 0xA8F3, + 0x11301, 0x11301, 0x11303, 0x11303, 0x1133B, 0x1133C, 0x11FC0, 0x11FF1, + 0x11FFF, 0x11FFF, + // #318 (17078+17): scx=Telugu:Telu + 0x0951, 0x0952, 0x0964, 0x0965, 0x0C00, 0x0C0C, 0x0C0E, 0x0C10, + 0x0C12, 0x0C28, 0x0C2A, 0x0C39, 0x0C3C, 0x0C44, 0x0C46, 0x0C48, + 0x0C4A, 0x0C4D, 0x0C55, 0x0C56, 0x0C58, 0x0C5A, 0x0C5D, 0x0C5D, + 0x0C60, 0x0C63, 0x0C66, 0x0C6F, 0x0C77, 0x0C7F, 0x1CDA, 0x1CDA, + 0x1CF2, 0x1CF2, + // #319 (17095+7): scx=Thaana:Thaa + 0x060C, 0x060C, 0x061B, 0x061C, 0x061F, 0x061F, 0x0660, 0x0669, + 0x0780, 0x07B1, 0xFDF2, 0xFDF2, 0xFDFD, 0xFDFD, + // #320 (17102+6): scx=Tirhuta:Tirh + 0x0951, 0x0952, 0x0964, 0x0965, 0x1CF2, 0x1CF2, 0xA830, 0xA839, + 0x11480, 0x114C7, 0x114D0, 0x114D9, + // #321 (17108+7): scx=Yezidi:Yezi + 0x060C, 0x060C, 0x061B, 0x061B, 0x061F, 0x061F, 0x0660, 0x0669, + 0x10E80, 0x10EA9, 0x10EAB, 0x10EAD, 0x10EB0, 0x10EB1, + // #322 (17115+7): scx=Yi:Yiii + 0x3001, 0x3002, 0x3008, 0x3011, 0x3014, 0x301B, 0x30FB, 0x30FB, + 0xA000, 0xA48C, 0xA490, 0xA4C6, 0xFF61, 0xFF65 +}; + +template +const T5 unicode_property_data::rangenumbertable[] = +{ + { ptype::unknown, "*", 0 }, // #0 + { ptype::general_category, "Other:C", 1 }, // #1 + { ptype::general_category, "Control:Cc:cntrl", 2 }, // #2 + { ptype::general_category, "Format:Cf", 3 }, // #3 + { ptype::general_category, "Unassigned:Cn", 4 }, // #4 + { ptype::general_category, "Private_Use:Co", 5 }, // #5 + { ptype::general_category, "Surrogate:Cs", 6 }, // #6 + { ptype::general_category, "Letter:L", 7 }, // #7 + { ptype::general_category, "Cased_Letter:LC", 8 }, // #8 + { ptype::general_category, "Lowercase_Letter:Ll", 9 }, // #9 + { ptype::general_category, "Titlecase_Letter:Lt", 10 }, // #10 + { ptype::general_category, "Uppercase_Letter:Lu", 11 }, // #11 + { ptype::general_category, "Modifier_Letter:Lm", 12 }, // #12 + { ptype::general_category, "Other_Letter:Lo", 13 }, // #13 + { ptype::general_category, "Mark:M:Combining_Mark", 14 }, // #14 + { ptype::general_category, "Spacing_Mark:Mc", 15 }, // #15 + { ptype::general_category, "Enclosing_Mark:Me", 16 }, // #16 + { ptype::general_category, "Nonspacing_Mark:Mn", 17 }, // #17 + { ptype::general_category, "Number:N", 18 }, // #18 + { ptype::general_category, "Decimal_Number:Nd:digit", 19 }, // #19 + { ptype::general_category, "Letter_Number:Nl", 20 }, // #20 + { ptype::general_category, "Other_Number:No", 21 }, // #21 + { ptype::general_category, "Punctuation:P:punct", 22 }, // #22 + { ptype::general_category, "Connector_Punctuation:Pc", 23 }, // #23 + { ptype::general_category, "Dash_Punctuation:Pd", 24 }, // #24 + { ptype::general_category, "Close_Punctuation:Pe", 25 }, // #25 + { ptype::general_category, "Final_Punctuation:Pf", 26 }, // #26 + { ptype::general_category, "Initial_Punctuation:Pi", 27 }, // #27 + { ptype::general_category, "Other_Punctuation:Po", 28 }, // #28 + { ptype::general_category, "Open_Punctuation:Ps", 29 }, // #29 + { ptype::general_category, "Symbol:S", 30 }, // #30 + { ptype::general_category, "Currency_Symbol:Sc", 31 }, // #31 + { ptype::general_category, "Modifier_Symbol:Sk", 32 }, // #32 + { ptype::general_category, "Math_Symbol:Sm", 33 }, // #33 + { ptype::general_category, "Other_Symbol:So", 34 }, // #34 + { ptype::general_category, "Separator:Z", 35 }, // #35 + { ptype::general_category, "Line_Separator:Zl", 36 }, // #36 + { ptype::general_category, "Paragraph_Separator:Zp", 37 }, // #37 + { ptype::general_category, "Space_Separator:Zs", 38 }, // #38 + { ptype::binary, "ASCII", 39 }, // #39 + { ptype::binary, "ASCII_Hex_Digit:AHex", 40 }, // #40 + { ptype::binary, "Alphabetic:Alpha", 41 }, // #41 + { ptype::binary, "Any", 42 }, // #42 + { ptype::binary, "Assigned", 43 }, // #43 + { ptype::binary, "Bidi_Control:Bidi_C", 44 }, // #44 + { ptype::binary, "Bidi_Mirrored:Bidi_M", 45 }, // #45 + { ptype::binary, "Case_Ignorable:CI", 46 }, // #46 + { ptype::binary, "Cased", 47 }, // #47 + { ptype::binary, "Changes_When_Casefolded:CWCF", 48 }, // #48 + { ptype::binary, "Changes_When_Casemapped:CWCM", 49 }, // #49 + { ptype::binary, "Changes_When_Lowercased:CWL", 50 }, // #50 + { ptype::binary, "Changes_When_NFKC_Casefolded:CWKCF", 51 }, // #51 + { ptype::binary, "Changes_When_Titlecased:CWT", 52 }, // #52 + { ptype::binary, "Changes_When_Uppercased:CWU", 53 }, // #53 + { ptype::binary, "Dash", 54 }, // #54 + { ptype::binary, "Default_Ignorable_Code_Point:DI", 55 }, // #55 + { ptype::binary, "Deprecated:Dep", 56 }, // #56 + { ptype::binary, "Diacritic:Dia", 57 }, // #57 + { ptype::binary, "Emoji", 58 }, // #58 + { ptype::binary, "Emoji_Component:EComp", 59 }, // #59 + { ptype::binary, "Emoji_Modifier:EMod", 60 }, // #60 + { ptype::binary, "Emoji_Modifier_Base:EBase", 61 }, // #61 + { ptype::binary, "Emoji_Presentation:EPres", 62 }, // #62 + { ptype::binary, "Extended_Pictographic:ExtPict", 63 }, // #63 + { ptype::binary, "Extender:Ext", 64 }, // #64 + { ptype::binary, "Grapheme_Base:Gr_Base", 65 }, // #65 + { ptype::binary, "Grapheme_Extend:Gr_Ext", 66 }, // #66 + { ptype::binary, "Hex_Digit:Hex", 67 }, // #67 + { ptype::binary, "IDS_Binary_Operator:IDSB", 68 }, // #68 + { ptype::binary, "IDS_Trinary_Operator:IDST", 69 }, // #69 + { ptype::binary, "ID_Continue:IDC", 70 }, // #70 + { ptype::binary, "ID_Start:IDS", 71 }, // #71 + { ptype::binary, "Ideographic:Ideo", 72 }, // #72 + { ptype::binary, "Join_Control:Join_C", 73 }, // #73 + { ptype::binary, "Logical_Order_Exception:LOE", 74 }, // #74 + { ptype::binary, "Lowercase:Lower", 75 }, // #75 + { ptype::binary, "Math", 76 }, // #76 + { ptype::binary, "Noncharacter_Code_Point:NChar", 77 }, // #77 + { ptype::binary, "Pattern_Syntax:Pat_Syn", 78 }, // #78 + { ptype::binary, "Pattern_White_Space:Pat_WS", 79 }, // #79 + { ptype::binary, "Quotation_Mark:QMark", 80 }, // #80 + { ptype::binary, "Radical", 81 }, // #81 + { ptype::binary, "Regional_Indicator:RI", 82 }, // #82 + { ptype::binary, "Sentence_Terminal:STerm", 83 }, // #83 + { ptype::binary, "Soft_Dotted:SD", 84 }, // #84 + { ptype::binary, "Terminal_Punctuation:Term", 85 }, // #85 + { ptype::binary, "Unified_Ideograph:UIdeo", 86 }, // #86 + { ptype::binary, "Uppercase:Upper", 87 }, // #87 + { ptype::binary, "Variation_Selector:VS", 88 }, // #88 + { ptype::binary, "White_Space:space", 89 }, // #89 + { ptype::binary, "XID_Continue:XIDC", 90 }, // #90 + { ptype::binary, "XID_Start:XIDS", 91 }, // #91 + { ptype::script, "Adlam:Adlm", 92 }, // #92 + { ptype::script, "Ahom:Ahom", 93 }, // #93 + { ptype::script, "Anatolian_Hieroglyphs:Hluw", 94 }, // #94 + { ptype::script, "Arabic:Arab", 95 }, // #95 + { ptype::script, "Armenian:Armn", 96 }, // #96 + { ptype::script, "Avestan:Avst", 97 }, // #97 + { ptype::script, "Balinese:Bali", 98 }, // #98 + { ptype::script, "Bamum:Bamu", 99 }, // #99 + { ptype::script, "Bassa_Vah:Bass", 100 }, // #100 + { ptype::script, "Batak:Batk", 101 }, // #101 + { ptype::script, "Bengali:Beng", 102 }, // #102 + { ptype::script, "Bhaiksuki:Bhks", 103 }, // #103 + { ptype::script, "Bopomofo:Bopo", 104 }, // #104 + { ptype::script, "Brahmi:Brah", 105 }, // #105 + { ptype::script, "Braille:Brai", 106 }, // #106 + { ptype::script, "Buginese:Bugi", 107 }, // #107 + { ptype::script, "Buhid:Buhd", 108 }, // #108 + { ptype::script, "Canadian_Aboriginal:Cans", 109 }, // #109 + { ptype::script, "Carian:Cari", 110 }, // #110 + { ptype::script, "Caucasian_Albanian:Aghb", 111 }, // #111 + { ptype::script, "Chakma:Cakm", 112 }, // #112 + { ptype::script, "Cham:Cham", 113 }, // #113 + { ptype::script, "Cherokee:Cher", 114 }, // #114 + { ptype::script, "Chorasmian:Chrs", 115 }, // #115 + { ptype::script, "Common:Zyyy", 116 }, // #116 + { ptype::script, "Coptic:Copt:Qaac", 117 }, // #117 + { ptype::script, "Cypro_Minoan:Cpmn", 118 }, // #118 + { ptype::script, "Cuneiform:Xsux", 119 }, // #119 + { ptype::script, "Cypriot:Cprt", 120 }, // #120 + { ptype::script, "Cyrillic:Cyrl", 121 }, // #121 + { ptype::script, "Deseret:Dsrt", 122 }, // #122 + { ptype::script, "Devanagari:Deva", 123 }, // #123 + { ptype::script, "Dives_Akuru:Diak", 124 }, // #124 + { ptype::script, "Dogra:Dogr", 125 }, // #125 + { ptype::script, "Duployan:Dupl", 126 }, // #126 + { ptype::script, "Egyptian_Hieroglyphs:Egyp", 127 }, // #127 + { ptype::script, "Elbasan:Elba", 128 }, // #128 + { ptype::script, "Elymaic:Elym", 129 }, // #129 + { ptype::script, "Ethiopic:Ethi", 130 }, // #130 + { ptype::script, "Georgian:Geor", 131 }, // #131 + { ptype::script, "Glagolitic:Glag", 132 }, // #132 + { ptype::script, "Gothic:Goth", 133 }, // #133 + { ptype::script, "Grantha:Gran", 134 }, // #134 + { ptype::script, "Greek:Grek", 135 }, // #135 + { ptype::script, "Gujarati:Gujr", 136 }, // #136 + { ptype::script, "Gunjala_Gondi:Gong", 137 }, // #137 + { ptype::script, "Gurmukhi:Guru", 138 }, // #138 + { ptype::script, "Han:Hani", 139 }, // #139 + { ptype::script, "Hangul:Hang", 140 }, // #140 + { ptype::script, "Hanifi_Rohingya:Rohg", 141 }, // #141 + { ptype::script, "Hanunoo:Hano", 142 }, // #142 + { ptype::script, "Hatran:Hatr", 143 }, // #143 + { ptype::script, "Hebrew:Hebr", 144 }, // #144 + { ptype::script, "Hiragana:Hira", 145 }, // #145 + { ptype::script, "Imperial_Aramaic:Armi", 146 }, // #146 + { ptype::script, "Inherited:Zinh:Qaai", 147 }, // #147 + { ptype::script, "Inscriptional_Pahlavi:Phli", 148 }, // #148 + { ptype::script, "Inscriptional_Parthian:Prti", 149 }, // #149 + { ptype::script, "Javanese:Java", 150 }, // #150 + { ptype::script, "Kaithi:Kthi", 151 }, // #151 + { ptype::script, "Kannada:Knda", 152 }, // #152 + { ptype::script, "Katakana:Kana", 153 }, // #153 + { ptype::script, "Kayah_Li:Kali", 154 }, // #154 + { ptype::script, "Kharoshthi:Khar", 155 }, // #155 + { ptype::script, "Khitan_Small_Script:Kits", 156 }, // #156 + { ptype::script, "Khmer:Khmr", 157 }, // #157 + { ptype::script, "Khojki:Khoj", 158 }, // #158 + { ptype::script, "Khudawadi:Sind", 159 }, // #159 + { ptype::script, "Lao:Laoo", 160 }, // #160 + { ptype::script, "Latin:Latn", 161 }, // #161 + { ptype::script, "Lepcha:Lepc", 162 }, // #162 + { ptype::script, "Limbu:Limb", 163 }, // #163 + { ptype::script, "Linear_A:Lina", 164 }, // #164 + { ptype::script, "Linear_B:Linb", 165 }, // #165 + { ptype::script, "Lisu:Lisu", 166 }, // #166 + { ptype::script, "Lycian:Lyci", 167 }, // #167 + { ptype::script, "Lydian:Lydi", 168 }, // #168 + { ptype::script, "Mahajani:Mahj", 169 }, // #169 + { ptype::script, "Makasar:Maka", 170 }, // #170 + { ptype::script, "Malayalam:Mlym", 171 }, // #171 + { ptype::script, "Mandaic:Mand", 172 }, // #172 + { ptype::script, "Manichaean:Mani", 173 }, // #173 + { ptype::script, "Marchen:Marc", 174 }, // #174 + { ptype::script, "Masaram_Gondi:Gonm", 175 }, // #175 + { ptype::script, "Medefaidrin:Medf", 176 }, // #176 + { ptype::script, "Meetei_Mayek:Mtei", 177 }, // #177 + { ptype::script, "Mende_Kikakui:Mend", 178 }, // #178 + { ptype::script, "Meroitic_Cursive:Merc", 179 }, // #179 + { ptype::script, "Meroitic_Hieroglyphs:Mero", 180 }, // #180 + { ptype::script, "Miao:Plrd", 181 }, // #181 + { ptype::script, "Modi:Modi", 182 }, // #182 + { ptype::script, "Mongolian:Mong", 183 }, // #183 + { ptype::script, "Mro:Mroo", 184 }, // #184 + { ptype::script, "Multani:Mult", 185 }, // #185 + { ptype::script, "Myanmar:Mymr", 186 }, // #186 + { ptype::script, "Nabataean:Nbat", 187 }, // #187 + { ptype::script, "Nandinagari:Nand", 188 }, // #188 + { ptype::script, "New_Tai_Lue:Talu", 189 }, // #189 + { ptype::script, "Newa:Newa", 190 }, // #190 + { ptype::script, "Nko:Nkoo", 191 }, // #191 + { ptype::script, "Nushu:Nshu", 192 }, // #192 + { ptype::script, "Nyiakeng_Puachue_Hmong:Hmnp", 193 }, // #193 + { ptype::script, "Ogham:Ogam", 194 }, // #194 + { ptype::script, "Ol_Chiki:Olck", 195 }, // #195 + { ptype::script, "Old_Hungarian:Hung", 196 }, // #196 + { ptype::script, "Old_Italic:Ital", 197 }, // #197 + { ptype::script, "Old_North_Arabian:Narb", 198 }, // #198 + { ptype::script, "Old_Permic:Perm", 199 }, // #199 + { ptype::script, "Old_Persian:Xpeo", 200 }, // #200 + { ptype::script, "Old_Sogdian:Sogo", 201 }, // #201 + { ptype::script, "Old_South_Arabian:Sarb", 202 }, // #202 + { ptype::script, "Old_Turkic:Orkh", 203 }, // #203 + { ptype::script, "Old_Uyghur:Ougr", 204 }, // #204 + { ptype::script, "Oriya:Orya", 205 }, // #205 + { ptype::script, "Osage:Osge", 206 }, // #206 + { ptype::script, "Osmanya:Osma", 207 }, // #207 + { ptype::script, "Pahawh_Hmong:Hmng", 208 }, // #208 + { ptype::script, "Palmyrene:Palm", 209 }, // #209 + { ptype::script, "Pau_Cin_Hau:Pauc", 210 }, // #210 + { ptype::script, "Phags_Pa:Phag", 211 }, // #211 + { ptype::script, "Phoenician:Phnx", 212 }, // #212 + { ptype::script, "Psalter_Pahlavi:Phlp", 213 }, // #213 + { ptype::script, "Rejang:Rjng", 214 }, // #214 + { ptype::script, "Runic:Runr", 215 }, // #215 + { ptype::script, "Samaritan:Samr", 216 }, // #216 + { ptype::script, "Saurashtra:Saur", 217 }, // #217 + { ptype::script, "Sharada:Shrd", 218 }, // #218 + { ptype::script, "Shavian:Shaw", 219 }, // #219 + { ptype::script, "Siddham:Sidd", 220 }, // #220 + { ptype::script, "SignWriting:Sgnw", 221 }, // #221 + { ptype::script, "Sinhala:Sinh", 222 }, // #222 + { ptype::script, "Sogdian:Sogd", 223 }, // #223 + { ptype::script, "Sora_Sompeng:Sora", 224 }, // #224 + { ptype::script, "Soyombo:Soyo", 225 }, // #225 + { ptype::script, "Sundanese:Sund", 226 }, // #226 + { ptype::script, "Syloti_Nagri:Sylo", 227 }, // #227 + { ptype::script, "Syriac:Syrc", 228 }, // #228 + { ptype::script, "Tagalog:Tglg", 229 }, // #229 + { ptype::script, "Tagbanwa:Tagb", 230 }, // #230 + { ptype::script, "Tai_Le:Tale", 231 }, // #231 + { ptype::script, "Tai_Tham:Lana", 232 }, // #232 + { ptype::script, "Tai_Viet:Tavt", 233 }, // #233 + { ptype::script, "Takri:Takr", 234 }, // #234 + { ptype::script, "Tamil:Taml", 235 }, // #235 + { ptype::script, "Tangsa:Tnsa", 236 }, // #236 + { ptype::script, "Tangut:Tang", 237 }, // #237 + { ptype::script, "Telugu:Telu", 238 }, // #238 + { ptype::script, "Thaana:Thaa", 239 }, // #239 + { ptype::script, "Thai:Thai", 240 }, // #240 + { ptype::script, "Tibetan:Tibt", 241 }, // #241 + { ptype::script, "Tifinagh:Tfng", 242 }, // #242 + { ptype::script, "Tirhuta:Tirh", 243 }, // #243 + { ptype::script, "Toto", 244 }, // #244 + { ptype::script, "Ugaritic:Ugar", 245 }, // #245 + { ptype::script, "Vai:Vaii", 246 }, // #246 + { ptype::script, "Vithkuqi:Vith", 247 }, // #247 + { ptype::script, "Wancho:Wcho", 248 }, // #248 + { ptype::script, "Warang_Citi:Wara", 249 }, // #249 + { ptype::script, "Yezidi:Yezi", 250 }, // #250 + { ptype::script, "Yi:Yiii", 251 }, // #251 + { ptype::script, "Zanabazar_Square:Zanb", 252 }, // #252 + { ptype::script_extensions, "Adlam:Adlm", 253 }, // #253 + { ptype::script_extensions, "Ahom:Ahom", 93 }, // #254 + { ptype::script_extensions, "Anatolian_Hieroglyphs:Hluw", 94 }, // #255 + { ptype::script_extensions, "Arabic:Arab", 254 }, // #256 + { ptype::script_extensions, "Armenian:Armn", 96 }, // #257 + { ptype::script_extensions, "Avestan:Avst", 97 }, // #258 + { ptype::script_extensions, "Balinese:Bali", 98 }, // #259 + { ptype::script_extensions, "Bamum:Bamu", 99 }, // #260 + { ptype::script_extensions, "Bassa_Vah:Bass", 100 }, // #261 + { ptype::script_extensions, "Batak:Batk", 101 }, // #262 + { ptype::script_extensions, "Bengali:Beng", 255 }, // #263 + { ptype::script_extensions, "Bhaiksuki:Bhks", 103 }, // #264 + { ptype::script_extensions, "Bopomofo:Bopo", 256 }, // #265 + { ptype::script_extensions, "Brahmi:Brah", 105 }, // #266 + { ptype::script_extensions, "Braille:Brai", 106 }, // #267 + { ptype::script_extensions, "Buginese:Bugi", 257 }, // #268 + { ptype::script_extensions, "Buhid:Buhd", 258 }, // #269 + { ptype::script_extensions, "Canadian_Aboriginal:Cans", 109 }, // #270 + { ptype::script_extensions, "Carian:Cari", 110 }, // #271 + { ptype::script_extensions, "Caucasian_Albanian:Aghb", 111 }, // #272 + { ptype::script_extensions, "Chakma:Cakm", 259 }, // #273 + { ptype::script_extensions, "Cham:Cham", 113 }, // #274 + { ptype::script_extensions, "Cherokee:Cher", 114 }, // #275 + { ptype::script_extensions, "Chorasmian:Chrs", 115 }, // #276 + { ptype::script_extensions, "Common:Zyyy", 260 }, // #277 + { ptype::script_extensions, "Coptic:Copt:Qaac", 261 }, // #278 + { ptype::script_extensions, "Cypro_Minoan:Cpmn", 262 }, // #279 + { ptype::script_extensions, "Cuneiform:Xsux", 119 }, // #280 + { ptype::script_extensions, "Cypriot:Cprt", 263 }, // #281 + { ptype::script_extensions, "Cyrillic:Cyrl", 264 }, // #282 + { ptype::script_extensions, "Deseret:Dsrt", 122 }, // #283 + { ptype::script_extensions, "Devanagari:Deva", 265 }, // #284 + { ptype::script_extensions, "Dives_Akuru:Diak", 124 }, // #285 + { ptype::script_extensions, "Dogra:Dogr", 266 }, // #286 + { ptype::script_extensions, "Duployan:Dupl", 267 }, // #287 + { ptype::script_extensions, "Egyptian_Hieroglyphs:Egyp", 127 }, // #288 + { ptype::script_extensions, "Elbasan:Elba", 128 }, // #289 + { ptype::script_extensions, "Elymaic:Elym", 129 }, // #290 + { ptype::script_extensions, "Ethiopic:Ethi", 130 }, // #291 + { ptype::script_extensions, "Georgian:Geor", 268 }, // #292 + { ptype::script_extensions, "Glagolitic:Glag", 269 }, // #293 + { ptype::script_extensions, "Gothic:Goth", 133 }, // #294 + { ptype::script_extensions, "Grantha:Gran", 270 }, // #295 + { ptype::script_extensions, "Greek:Grek", 271 }, // #296 + { ptype::script_extensions, "Gujarati:Gujr", 272 }, // #297 + { ptype::script_extensions, "Gunjala_Gondi:Gong", 273 }, // #298 + { ptype::script_extensions, "Gurmukhi:Guru", 274 }, // #299 + { ptype::script_extensions, "Han:Hani", 275 }, // #300 + { ptype::script_extensions, "Hangul:Hang", 276 }, // #301 + { ptype::script_extensions, "Hanifi_Rohingya:Rohg", 277 }, // #302 + { ptype::script_extensions, "Hanunoo:Hano", 278 }, // #303 + { ptype::script_extensions, "Hatran:Hatr", 143 }, // #304 + { ptype::script_extensions, "Hebrew:Hebr", 144 }, // #305 + { ptype::script_extensions, "Hiragana:Hira", 279 }, // #306 + { ptype::script_extensions, "Imperial_Aramaic:Armi", 146 }, // #307 + { ptype::script_extensions, "Inherited:Zinh:Qaai", 280 }, // #308 + { ptype::script_extensions, "Inscriptional_Pahlavi:Phli", 148 }, // #309 + { ptype::script_extensions, "Inscriptional_Parthian:Prti", 149 }, // #310 + { ptype::script_extensions, "Javanese:Java", 281 }, // #311 + { ptype::script_extensions, "Kaithi:Kthi", 282 }, // #312 + { ptype::script_extensions, "Kannada:Knda", 283 }, // #313 + { ptype::script_extensions, "Katakana:Kana", 284 }, // #314 + { ptype::script_extensions, "Kayah_Li:Kali", 285 }, // #315 + { ptype::script_extensions, "Kharoshthi:Khar", 155 }, // #316 + { ptype::script_extensions, "Khitan_Small_Script:Kits", 156 }, // #317 + { ptype::script_extensions, "Khmer:Khmr", 157 }, // #318 + { ptype::script_extensions, "Khojki:Khoj", 286 }, // #319 + { ptype::script_extensions, "Khudawadi:Sind", 287 }, // #320 + { ptype::script_extensions, "Lao:Laoo", 160 }, // #321 + { ptype::script_extensions, "Latin:Latn", 288 }, // #322 + { ptype::script_extensions, "Lepcha:Lepc", 162 }, // #323 + { ptype::script_extensions, "Limbu:Limb", 289 }, // #324 + { ptype::script_extensions, "Linear_A:Lina", 290 }, // #325 + { ptype::script_extensions, "Linear_B:Linb", 291 }, // #326 + { ptype::script_extensions, "Lisu:Lisu", 166 }, // #327 + { ptype::script_extensions, "Lycian:Lyci", 167 }, // #328 + { ptype::script_extensions, "Lydian:Lydi", 168 }, // #329 + { ptype::script_extensions, "Mahajani:Mahj", 292 }, // #330 + { ptype::script_extensions, "Makasar:Maka", 170 }, // #331 + { ptype::script_extensions, "Malayalam:Mlym", 293 }, // #332 + { ptype::script_extensions, "Mandaic:Mand", 294 }, // #333 + { ptype::script_extensions, "Manichaean:Mani", 295 }, // #334 + { ptype::script_extensions, "Marchen:Marc", 174 }, // #335 + { ptype::script_extensions, "Masaram_Gondi:Gonm", 296 }, // #336 + { ptype::script_extensions, "Medefaidrin:Medf", 176 }, // #337 + { ptype::script_extensions, "Meetei_Mayek:Mtei", 177 }, // #338 + { ptype::script_extensions, "Mende_Kikakui:Mend", 178 }, // #339 + { ptype::script_extensions, "Meroitic_Cursive:Merc", 179 }, // #340 + { ptype::script_extensions, "Meroitic_Hieroglyphs:Mero", 180 }, // #341 + { ptype::script_extensions, "Miao:Plrd", 181 }, // #342 + { ptype::script_extensions, "Modi:Modi", 297 }, // #343 + { ptype::script_extensions, "Mongolian:Mong", 298 }, // #344 + { ptype::script_extensions, "Mro:Mroo", 184 }, // #345 + { ptype::script_extensions, "Multani:Mult", 299 }, // #346 + { ptype::script_extensions, "Myanmar:Mymr", 300 }, // #347 + { ptype::script_extensions, "Nabataean:Nbat", 187 }, // #348 + { ptype::script_extensions, "Nandinagari:Nand", 301 }, // #349 + { ptype::script_extensions, "New_Tai_Lue:Talu", 189 }, // #350 + { ptype::script_extensions, "Newa:Newa", 190 }, // #351 + { ptype::script_extensions, "Nko:Nkoo", 302 }, // #352 + { ptype::script_extensions, "Nushu:Nshu", 192 }, // #353 + { ptype::script_extensions, "Nyiakeng_Puachue_Hmong:Hmnp", 193 }, // #354 + { ptype::script_extensions, "Ogham:Ogam", 194 }, // #355 + { ptype::script_extensions, "Ol_Chiki:Olck", 195 }, // #356 + { ptype::script_extensions, "Old_Hungarian:Hung", 196 }, // #357 + { ptype::script_extensions, "Old_Italic:Ital", 197 }, // #358 + { ptype::script_extensions, "Old_North_Arabian:Narb", 198 }, // #359 + { ptype::script_extensions, "Old_Permic:Perm", 303 }, // #360 + { ptype::script_extensions, "Old_Persian:Xpeo", 200 }, // #361 + { ptype::script_extensions, "Old_Sogdian:Sogo", 201 }, // #362 + { ptype::script_extensions, "Old_South_Arabian:Sarb", 202 }, // #363 + { ptype::script_extensions, "Old_Turkic:Orkh", 203 }, // #364 + { ptype::script_extensions, "Old_Uyghur:Ougr", 304 }, // #365 + { ptype::script_extensions, "Oriya:Orya", 305 }, // #366 + { ptype::script_extensions, "Osage:Osge", 206 }, // #367 + { ptype::script_extensions, "Osmanya:Osma", 207 }, // #368 + { ptype::script_extensions, "Pahawh_Hmong:Hmng", 208 }, // #369 + { ptype::script_extensions, "Palmyrene:Palm", 209 }, // #370 + { ptype::script_extensions, "Pau_Cin_Hau:Pauc", 210 }, // #371 + { ptype::script_extensions, "Phags_Pa:Phag", 306 }, // #372 + { ptype::script_extensions, "Phoenician:Phnx", 212 }, // #373 + { ptype::script_extensions, "Psalter_Pahlavi:Phlp", 307 }, // #374 + { ptype::script_extensions, "Rejang:Rjng", 214 }, // #375 + { ptype::script_extensions, "Runic:Runr", 215 }, // #376 + { ptype::script_extensions, "Samaritan:Samr", 216 }, // #377 + { ptype::script_extensions, "Saurashtra:Saur", 217 }, // #378 + { ptype::script_extensions, "Sharada:Shrd", 308 }, // #379 + { ptype::script_extensions, "Shavian:Shaw", 219 }, // #380 + { ptype::script_extensions, "Siddham:Sidd", 220 }, // #381 + { ptype::script_extensions, "SignWriting:Sgnw", 221 }, // #382 + { ptype::script_extensions, "Sinhala:Sinh", 309 }, // #383 + { ptype::script_extensions, "Sogdian:Sogd", 310 }, // #384 + { ptype::script_extensions, "Sora_Sompeng:Sora", 224 }, // #385 + { ptype::script_extensions, "Soyombo:Soyo", 225 }, // #386 + { ptype::script_extensions, "Sundanese:Sund", 226 }, // #387 + { ptype::script_extensions, "Syloti_Nagri:Sylo", 311 }, // #388 + { ptype::script_extensions, "Syriac:Syrc", 312 }, // #389 + { ptype::script_extensions, "Tagalog:Tglg", 313 }, // #390 + { ptype::script_extensions, "Tagbanwa:Tagb", 314 }, // #391 + { ptype::script_extensions, "Tai_Le:Tale", 315 }, // #392 + { ptype::script_extensions, "Tai_Tham:Lana", 232 }, // #393 + { ptype::script_extensions, "Tai_Viet:Tavt", 233 }, // #394 + { ptype::script_extensions, "Takri:Takr", 316 }, // #395 + { ptype::script_extensions, "Tamil:Taml", 317 }, // #396 + { ptype::script_extensions, "Tangsa:Tnsa", 236 }, // #397 + { ptype::script_extensions, "Tangut:Tang", 237 }, // #398 + { ptype::script_extensions, "Telugu:Telu", 318 }, // #399 + { ptype::script_extensions, "Thaana:Thaa", 319 }, // #400 + { ptype::script_extensions, "Thai:Thai", 240 }, // #401 + { ptype::script_extensions, "Tibetan:Tibt", 241 }, // #402 + { ptype::script_extensions, "Tifinagh:Tfng", 242 }, // #403 + { ptype::script_extensions, "Tirhuta:Tirh", 320 }, // #404 + { ptype::script_extensions, "Toto", 244 }, // #405 + { ptype::script_extensions, "Ugaritic:Ugar", 245 }, // #406 + { ptype::script_extensions, "Vai:Vaii", 246 }, // #407 + { ptype::script_extensions, "Vithkuqi:Vith", 247 }, // #408 + { ptype::script_extensions, "Wancho:Wcho", 248 }, // #409 + { ptype::script_extensions, "Warang_Citi:Wara", 249 }, // #410 + { ptype::script_extensions, "Yezidi:Yezi", 321 }, // #411 + { ptype::script_extensions, "Yi:Yiii", 322 }, // #412 + { ptype::script_extensions, "Zanabazar_Square:Zanb", 252 }, // #413 + { ptype::unknown, "", 0 } +}; + +template +const T6 unicode_property_data::positiontable[] = +{ + { 0, 0 }, // #0 unknown + { 0, 725 }, // #1 gc=Other:C + { 0, 2 }, // #2 gc=Control:Cc:cntrl + { 2, 21 }, // #3 gc=Format:Cf + { 23, 698 }, // #4 gc=Unassigned:Cn + { 721, 3 }, // #5 gc=Private_Use:Co + { 724, 1 }, // #6 gc=Surrogate:Cs + { 725, 1883 }, // #7 gc=Letter:L + { 725, 1313 }, // #8 gc=Cased_Letter:LC + { 725, 657 }, // #9 gc=Lowercase_Letter:Ll + { 1382, 10 }, // #10 gc=Titlecase_Letter:Lt + { 1392, 646 }, // #11 gc=Uppercase_Letter:Lu + { 2038, 69 }, // #12 gc=Modifier_Letter:Lm + { 2107, 501 }, // #13 gc=Other_Letter:Lo + { 2608, 518 }, // #14 gc=Mark:M:Combining_Mark + { 2608, 177 }, // #15 gc=Spacing_Mark:Mc + { 2785, 5 }, // #16 gc=Enclosing_Mark:Me + { 2790, 336 }, // #17 gc=Nonspacing_Mark:Mn + { 3126, 145 }, // #18 gc=Number:N + { 3126, 62 }, // #19 gc=Decimal_Number:Nd:digit + { 3188, 12 }, // #20 gc=Letter_Number:Nl + { 3200, 71 }, // #21 gc=Other_Number:No + { 3271, 386 }, // #22 gc=Punctuation:P:punct + { 3271, 6 }, // #23 gc=Connector_Punctuation:Pc + { 3277, 19 }, // #24 gc=Dash_Punctuation:Pd + { 3296, 76 }, // #25 gc=Close_Punctuation:Pe + { 3372, 10 }, // #26 gc=Final_Punctuation:Pf + { 3382, 11 }, // #27 gc=Initial_Punctuation:Pi + { 3393, 185 }, // #28 gc=Other_Punctuation:Po + { 3578, 79 }, // #29 gc=Open_Punctuation:Ps + { 3657, 302 }, // #30 gc=Symbol:S + { 3657, 21 }, // #31 gc=Currency_Symbol:Sc + { 3678, 31 }, // #32 gc=Modifier_Symbol:Sk + { 3709, 64 }, // #33 gc=Math_Symbol:Sm + { 3773, 186 }, // #34 gc=Other_Symbol:So + { 3959, 9 }, // #35 gc=Separator:Z + { 3959, 1 }, // #36 gc=Line_Separator:Zl + { 3960, 1 }, // #37 gc=Paragraph_Separator:Zp + { 3961, 7 }, // #38 gc=Space_Separator:Zs + { 3968, 1 }, // #39 bp=ASCII + { 3969, 3 }, // #40 bp=ASCII_Hex_Digit:AHex + { 3972, 722 }, // #41 bp=Alphabetic:Alpha + { 4694, 1 }, // #42 bp=Any + { 4695, 0 }, // #43 bp=Assigned + { 4695, 4 }, // #44 bp=Bidi_Control:Bidi_C + { 4699, 114 }, // #45 bp=Bidi_Mirrored:Bidi_M + { 4813, 427 }, // #46 bp=Case_Ignorable:CI + { 5240, 155 }, // #47 bp=Cased + { 5395, 622 }, // #48 bp=Changes_When_Casefolded:CWCF + { 6017, 131 }, // #49 bp=Changes_When_Casemapped:CWCM + { 6148, 609 }, // #50 bp=Changes_When_Lowercased:CWL + { 6757, 838 }, // #51 bp=Changes_When_NFKC_Casefolded:CWKCF + { 7595, 626 }, // #52 bp=Changes_When_Titlecased:CWT + { 8221, 627 }, // #53 bp=Changes_When_Uppercased:CWU + { 8848, 23 }, // #54 bp=Dash + { 8871, 17 }, // #55 bp=Default_Ignorable_Code_Point:DI + { 8888, 8 }, // #56 bp=Deprecated:Dep + { 8896, 192 }, // #57 bp=Diacritic:Dia + { 9088, 153 }, // #58 bp=Emoji + { 9241, 10 }, // #59 bp=Emoji_Component:EComp + { 9251, 1 }, // #60 bp=Emoji_Modifier:EMod + { 9252, 40 }, // #61 bp=Emoji_Modifier_Base:EBase + { 9292, 83 }, // #62 bp=Emoji_Presentation:EPres + { 9375, 78 }, // #63 bp=Extended_Pictographic:ExtPict + { 9453, 33 }, // #64 bp=Extender:Ext + { 9486, 861 }, // #65 bp=Grapheme_Base:Gr_Base + { 10347, 353 }, // #66 bp=Grapheme_Extend:Gr_Ext + { 10700, 6 }, // #67 bp=Hex_Digit:Hex + { 10706, 2 }, // #68 bp=IDS_Binary_Operator:IDSB + { 10708, 1 }, // #69 bp=IDS_Trinary_Operator:IDST + { 10709, 756 }, // #70 bp=ID_Continue:IDC + { 11465, 648 }, // #71 bp=ID_Start:IDS + { 12113, 19 }, // #72 bp=Ideographic:Ideo + { 12132, 1 }, // #73 bp=Join_Control:Join_C + { 12133, 7 }, // #74 bp=Logical_Order_Exception:LOE + { 12140, 668 }, // #75 bp=Lowercase:Lower + { 12808, 138 }, // #76 bp=Math + { 12946, 18 }, // #77 bp=Noncharacter_Code_Point:NChar + { 12964, 28 }, // #78 bp=Pattern_Syntax:Pat_Syn + { 12992, 5 }, // #79 bp=Pattern_White_Space:Pat_WS + { 12997, 13 }, // #80 bp=Quotation_Mark:QMark + { 13010, 3 }, // #81 bp=Radical + { 13013, 1 }, // #82 bp=Regional_Indicator:RI + { 13014, 79 }, // #83 bp=Sentence_Terminal:STerm + { 13093, 32 }, // #84 bp=Soft_Dotted:SD + { 13125, 107 }, // #85 bp=Terminal_Punctuation:Term + { 13232, 15 }, // #86 bp=Unified_Ideograph:UIdeo + { 13247, 651 }, // #87 bp=Uppercase:Upper + { 13898, 4 }, // #88 bp=Variation_Selector:VS + { 13902, 10 }, // #89 bp=White_Space:space + { 13912, 763 }, // #90 bp=XID_Continue:XIDC + { 14675, 655 }, // #91 bp=XID_Start:XIDS + { 15330, 3 }, // #92 sc=Adlam:Adlm + { 15333, 3 }, // #93 sc=Ahom:Ahom scx=Ahom:Ahom + { 15336, 1 }, // #94 sc=Anatolian_Hieroglyphs:Hluw scx=Anatolian_Hieroglyphs:Hluw + { 15337, 57 }, // #95 sc=Arabic:Arab + { 15394, 4 }, // #96 sc=Armenian:Armn scx=Armenian:Armn + { 15398, 2 }, // #97 sc=Avestan:Avst scx=Avestan:Avst + { 15400, 2 }, // #98 sc=Balinese:Bali scx=Balinese:Bali + { 15402, 2 }, // #99 sc=Bamum:Bamu scx=Bamum:Bamu + { 15404, 2 }, // #100 sc=Bassa_Vah:Bass scx=Bassa_Vah:Bass + { 15406, 2 }, // #101 sc=Batak:Batk scx=Batak:Batk + { 15408, 14 }, // #102 sc=Bengali:Beng + { 15422, 4 }, // #103 sc=Bhaiksuki:Bhks scx=Bhaiksuki:Bhks + { 15426, 3 }, // #104 sc=Bopomofo:Bopo + { 15429, 3 }, // #105 sc=Brahmi:Brah scx=Brahmi:Brah + { 15432, 1 }, // #106 sc=Braille:Brai scx=Braille:Brai + { 15433, 2 }, // #107 sc=Buginese:Bugi + { 15435, 1 }, // #108 sc=Buhid:Buhd + { 15436, 3 }, // #109 sc=Canadian_Aboriginal:Cans scx=Canadian_Aboriginal:Cans + { 15439, 1 }, // #110 sc=Carian:Cari scx=Carian:Cari + { 15440, 2 }, // #111 sc=Caucasian_Albanian:Aghb scx=Caucasian_Albanian:Aghb + { 15442, 2 }, // #112 sc=Chakma:Cakm + { 15444, 4 }, // #113 sc=Cham:Cham scx=Cham:Cham + { 15448, 3 }, // #114 sc=Cherokee:Cher scx=Cherokee:Cher + { 15451, 1 }, // #115 sc=Chorasmian:Chrs scx=Chorasmian:Chrs + { 15452, 174 }, // #116 sc=Common:Zyyy + { 15626, 3 }, // #117 sc=Coptic:Copt:Qaac + { 15629, 1 }, // #118 sc=Cypro_Minoan:Cpmn + { 15630, 4 }, // #119 sc=Cuneiform:Xsux scx=Cuneiform:Xsux + { 15634, 6 }, // #120 sc=Cypriot:Cprt + { 15640, 8 }, // #121 sc=Cyrillic:Cyrl + { 15648, 1 }, // #122 sc=Deseret:Dsrt scx=Deseret:Dsrt + { 15649, 4 }, // #123 sc=Devanagari:Deva + { 15653, 8 }, // #124 sc=Dives_Akuru:Diak scx=Dives_Akuru:Diak + { 15661, 1 }, // #125 sc=Dogra:Dogr + { 15662, 5 }, // #126 sc=Duployan:Dupl + { 15667, 2 }, // #127 sc=Egyptian_Hieroglyphs:Egyp scx=Egyptian_Hieroglyphs:Egyp + { 15669, 1 }, // #128 sc=Elbasan:Elba scx=Elbasan:Elba + { 15670, 1 }, // #129 sc=Elymaic:Elym scx=Elymaic:Elym + { 15671, 36 }, // #130 sc=Ethiopic:Ethi scx=Ethiopic:Ethi + { 15707, 10 }, // #131 sc=Georgian:Geor + { 15717, 6 }, // #132 sc=Glagolitic:Glag + { 15723, 1 }, // #133 sc=Gothic:Goth scx=Gothic:Goth + { 15724, 15 }, // #134 sc=Grantha:Gran + { 15739, 36 }, // #135 sc=Greek:Grek + { 15775, 14 }, // #136 sc=Gujarati:Gujr + { 15789, 6 }, // #137 sc=Gunjala_Gondi:Gong + { 15795, 16 }, // #138 sc=Gurmukhi:Guru + { 15811, 20 }, // #139 sc=Han:Hani + { 15831, 14 }, // #140 sc=Hangul:Hang + { 15845, 2 }, // #141 sc=Hanifi_Rohingya:Rohg + { 15847, 1 }, // #142 sc=Hanunoo:Hano + { 15848, 3 }, // #143 sc=Hatran:Hatr scx=Hatran:Hatr + { 15851, 9 }, // #144 sc=Hebrew:Hebr scx=Hebrew:Hebr + { 15860, 5 }, // #145 sc=Hiragana:Hira + { 15865, 2 }, // #146 sc=Imperial_Aramaic:Armi scx=Imperial_Aramaic:Armi + { 15867, 29 }, // #147 sc=Inherited:Zinh:Qaai + { 15896, 2 }, // #148 sc=Inscriptional_Pahlavi:Phli scx=Inscriptional_Pahlavi:Phli + { 15898, 2 }, // #149 sc=Inscriptional_Parthian:Prti scx=Inscriptional_Parthian:Prti + { 15900, 3 }, // #150 sc=Javanese:Java + { 15903, 2 }, // #151 sc=Kaithi:Kthi + { 15905, 13 }, // #152 sc=Kannada:Knda + { 15918, 13 }, // #153 sc=Katakana:Kana + { 15931, 2 }, // #154 sc=Kayah_Li:Kali + { 15933, 8 }, // #155 sc=Kharoshthi:Khar scx=Kharoshthi:Khar + { 15941, 2 }, // #156 sc=Khitan_Small_Script:Kits scx=Khitan_Small_Script:Kits + { 15943, 4 }, // #157 sc=Khmer:Khmr scx=Khmer:Khmr + { 15947, 2 }, // #158 sc=Khojki:Khoj + { 15949, 2 }, // #159 sc=Khudawadi:Sind + { 15951, 11 }, // #160 sc=Lao:Laoo scx=Lao:Laoo + { 15962, 38 }, // #161 sc=Latin:Latn + { 16000, 3 }, // #162 sc=Lepcha:Lepc scx=Lepcha:Lepc + { 16003, 5 }, // #163 sc=Limbu:Limb + { 16008, 3 }, // #164 sc=Linear_A:Lina + { 16011, 7 }, // #165 sc=Linear_B:Linb + { 16018, 2 }, // #166 sc=Lisu:Lisu scx=Lisu:Lisu + { 16020, 1 }, // #167 sc=Lycian:Lyci scx=Lycian:Lyci + { 16021, 2 }, // #168 sc=Lydian:Lydi scx=Lydian:Lydi + { 16023, 1 }, // #169 sc=Mahajani:Mahj + { 16024, 1 }, // #170 sc=Makasar:Maka scx=Makasar:Maka + { 16025, 7 }, // #171 sc=Malayalam:Mlym + { 16032, 2 }, // #172 sc=Mandaic:Mand + { 16034, 2 }, // #173 sc=Manichaean:Mani + { 16036, 3 }, // #174 sc=Marchen:Marc scx=Marchen:Marc + { 16039, 7 }, // #175 sc=Masaram_Gondi:Gonm + { 16046, 1 }, // #176 sc=Medefaidrin:Medf scx=Medefaidrin:Medf + { 16047, 3 }, // #177 sc=Meetei_Mayek:Mtei scx=Meetei_Mayek:Mtei + { 16050, 2 }, // #178 sc=Mende_Kikakui:Mend scx=Mende_Kikakui:Mend + { 16052, 3 }, // #179 sc=Meroitic_Cursive:Merc scx=Meroitic_Cursive:Merc + { 16055, 1 }, // #180 sc=Meroitic_Hieroglyphs:Mero scx=Meroitic_Hieroglyphs:Mero + { 16056, 3 }, // #181 sc=Miao:Plrd scx=Miao:Plrd + { 16059, 2 }, // #182 sc=Modi:Modi + { 16061, 6 }, // #183 sc=Mongolian:Mong + { 16067, 3 }, // #184 sc=Mro:Mroo scx=Mro:Mroo + { 16070, 5 }, // #185 sc=Multani:Mult + { 16075, 3 }, // #186 sc=Myanmar:Mymr + { 16078, 2 }, // #187 sc=Nabataean:Nbat scx=Nabataean:Nbat + { 16080, 3 }, // #188 sc=Nandinagari:Nand + { 16083, 4 }, // #189 sc=New_Tai_Lue:Talu scx=New_Tai_Lue:Talu + { 16087, 2 }, // #190 sc=Newa:Newa scx=Newa:Newa + { 16089, 2 }, // #191 sc=Nko:Nkoo + { 16091, 2 }, // #192 sc=Nushu:Nshu scx=Nushu:Nshu + { 16093, 4 }, // #193 sc=Nyiakeng_Puachue_Hmong:Hmnp scx=Nyiakeng_Puachue_Hmong:Hmnp + { 16097, 1 }, // #194 sc=Ogham:Ogam scx=Ogham:Ogam + { 16098, 1 }, // #195 sc=Ol_Chiki:Olck scx=Ol_Chiki:Olck + { 16099, 3 }, // #196 sc=Old_Hungarian:Hung scx=Old_Hungarian:Hung + { 16102, 2 }, // #197 sc=Old_Italic:Ital scx=Old_Italic:Ital + { 16104, 1 }, // #198 sc=Old_North_Arabian:Narb scx=Old_North_Arabian:Narb + { 16105, 1 }, // #199 sc=Old_Permic:Perm + { 16106, 2 }, // #200 sc=Old_Persian:Xpeo scx=Old_Persian:Xpeo + { 16108, 1 }, // #201 sc=Old_Sogdian:Sogo scx=Old_Sogdian:Sogo + { 16109, 1 }, // #202 sc=Old_South_Arabian:Sarb scx=Old_South_Arabian:Sarb + { 16110, 1 }, // #203 sc=Old_Turkic:Orkh scx=Old_Turkic:Orkh + { 16111, 1 }, // #204 sc=Old_Uyghur:Ougr + { 16112, 14 }, // #205 sc=Oriya:Orya + { 16126, 2 }, // #206 sc=Osage:Osge scx=Osage:Osge + { 16128, 2 }, // #207 sc=Osmanya:Osma scx=Osmanya:Osma + { 16130, 5 }, // #208 sc=Pahawh_Hmong:Hmng scx=Pahawh_Hmong:Hmng + { 16135, 1 }, // #209 sc=Palmyrene:Palm scx=Palmyrene:Palm + { 16136, 1 }, // #210 sc=Pau_Cin_Hau:Pauc scx=Pau_Cin_Hau:Pauc + { 16137, 1 }, // #211 sc=Phags_Pa:Phag + { 16138, 2 }, // #212 sc=Phoenician:Phnx scx=Phoenician:Phnx + { 16140, 3 }, // #213 sc=Psalter_Pahlavi:Phlp + { 16143, 2 }, // #214 sc=Rejang:Rjng scx=Rejang:Rjng + { 16145, 2 }, // #215 sc=Runic:Runr scx=Runic:Runr + { 16147, 2 }, // #216 sc=Samaritan:Samr scx=Samaritan:Samr + { 16149, 2 }, // #217 sc=Saurashtra:Saur scx=Saurashtra:Saur + { 16151, 1 }, // #218 sc=Sharada:Shrd + { 16152, 1 }, // #219 sc=Shavian:Shaw scx=Shavian:Shaw + { 16153, 2 }, // #220 sc=Siddham:Sidd scx=Siddham:Sidd + { 16155, 3 }, // #221 sc=SignWriting:Sgnw scx=SignWriting:Sgnw + { 16158, 13 }, // #222 sc=Sinhala:Sinh + { 16171, 1 }, // #223 sc=Sogdian:Sogd + { 16172, 2 }, // #224 sc=Sora_Sompeng:Sora scx=Sora_Sompeng:Sora + { 16174, 1 }, // #225 sc=Soyombo:Soyo scx=Soyombo:Soyo + { 16175, 2 }, // #226 sc=Sundanese:Sund scx=Sundanese:Sund + { 16177, 1 }, // #227 sc=Syloti_Nagri:Sylo + { 16178, 4 }, // #228 sc=Syriac:Syrc + { 16182, 2 }, // #229 sc=Tagalog:Tglg + { 16184, 3 }, // #230 sc=Tagbanwa:Tagb + { 16187, 2 }, // #231 sc=Tai_Le:Tale + { 16189, 5 }, // #232 sc=Tai_Tham:Lana scx=Tai_Tham:Lana + { 16194, 2 }, // #233 sc=Tai_Viet:Tavt scx=Tai_Viet:Tavt + { 16196, 2 }, // #234 sc=Takri:Takr + { 16198, 18 }, // #235 sc=Tamil:Taml + { 16216, 2 }, // #236 sc=Tangsa:Tnsa scx=Tangsa:Tnsa + { 16218, 4 }, // #237 sc=Tangut:Tang scx=Tangut:Tang + { 16222, 13 }, // #238 sc=Telugu:Telu + { 16235, 1 }, // #239 sc=Thaana:Thaa + { 16236, 2 }, // #240 sc=Thai:Thai scx=Thai:Thai + { 16238, 7 }, // #241 sc=Tibetan:Tibt scx=Tibetan:Tibt + { 16245, 3 }, // #242 sc=Tifinagh:Tfng scx=Tifinagh:Tfng + { 16248, 2 }, // #243 sc=Tirhuta:Tirh + { 16250, 1 }, // #244 sc=Toto scx=Toto + { 16251, 2 }, // #245 sc=Ugaritic:Ugar scx=Ugaritic:Ugar + { 16253, 1 }, // #246 sc=Vai:Vaii scx=Vai:Vaii + { 16254, 8 }, // #247 sc=Vithkuqi:Vith scx=Vithkuqi:Vith + { 16262, 2 }, // #248 sc=Wancho:Wcho scx=Wancho:Wcho + { 16264, 2 }, // #249 sc=Warang_Citi:Wara scx=Warang_Citi:Wara + { 16266, 3 }, // #250 sc=Yezidi:Yezi + { 16269, 2 }, // #251 sc=Yi:Yiii + { 16271, 1 }, // #252 sc=Zanabazar_Square:Zanb scx=Zanabazar_Square:Zanb + { 16272, 5 }, // #253 scx=Adlam:Adlm + { 16277, 51 }, // #254 scx=Arabic:Arab + { 16328, 26 }, // #255 scx=Bengali:Beng + { 16354, 12 }, // #256 scx=Bopomofo:Bopo + { 16366, 3 }, // #257 scx=Buginese:Bugi + { 16369, 2 }, // #258 scx=Buhid:Buhd + { 16371, 4 }, // #259 scx=Chakma:Cakm + { 16375, 148 }, // #260 scx=Common:Zyyy + { 16523, 4 }, // #261 scx=Coptic:Copt:Qaac + { 16527, 2 }, // #262 scx=Cypro_Minoan:Cpmn + { 16529, 9 }, // #263 scx=Cypriot:Cprt + { 16538, 9 }, // #264 scx=Cyrillic:Cyrl + { 16547, 7 }, // #265 scx=Devanagari:Deva + { 16554, 3 }, // #266 scx=Dogra:Dogr + { 16557, 5 }, // #267 scx=Duployan:Dupl + { 16562, 9 }, // #268 scx=Georgian:Geor + { 16571, 10 }, // #269 scx=Glagolitic:Glag + { 16581, 25 }, // #270 scx=Grantha:Gran + { 16606, 38 }, // #271 scx=Greek:Grek + { 16644, 17 }, // #272 scx=Gujarati:Gujr + { 16661, 7 }, // #273 scx=Gunjala_Gondi:Gong + { 16668, 19 }, // #274 scx=Gurmukhi:Guru + { 16687, 37 }, // #275 scx=Han:Hani + { 16724, 21 }, // #276 scx=Hangul:Hang + { 16745, 7 }, // #277 scx=Hanifi_Rohingya:Rohg + { 16752, 1 }, // #278 scx=Hanunoo:Hano + { 16753, 16 }, // #279 scx=Hiragana:Hira + { 16769, 20 }, // #280 scx=Inherited:Zinh:Qaai + { 16789, 3 }, // #281 scx=Javanese:Java + { 16792, 4 }, // #282 scx=Kaithi:Kthi + { 16796, 21 }, // #283 scx=Kannada:Knda + { 16817, 19 }, // #284 scx=Katakana:Kana + { 16836, 1 }, // #285 scx=Kayah_Li:Kali + { 16837, 4 }, // #286 scx=Khojki:Khoj + { 16841, 4 }, // #287 scx=Khudawadi:Sind + { 16845, 46 }, // #288 scx=Latin:Latn + { 16891, 6 }, // #289 scx=Limbu:Limb + { 16897, 4 }, // #290 scx=Linear_A:Lina + { 16901, 10 }, // #291 scx=Linear_B:Linb + { 16911, 3 }, // #292 scx=Mahajani:Mahj + { 16914, 11 }, // #293 scx=Malayalam:Mlym + { 16925, 3 }, // #294 scx=Mandaic:Mand + { 16928, 3 }, // #295 scx=Manichaean:Mani + { 16931, 8 }, // #296 scx=Masaram_Gondi:Gonm + { 16939, 3 }, // #297 scx=Modi:Modi + { 16942, 5 }, // #298 scx=Mongolian:Mong + { 16947, 6 }, // #299 scx=Multani:Mult + { 16953, 4 }, // #300 scx=Myanmar:Mymr + { 16957, 9 }, // #301 scx=Nandinagari:Nand + { 16966, 6 }, // #302 scx=Nko:Nkoo + { 16972, 2 }, // #303 scx=Old_Permic:Perm + { 16974, 3 }, // #304 scx=Old_Uyghur:Ougr + { 16977, 18 }, // #305 scx=Oriya:Orya + { 16995, 3 }, // #306 scx=Phags_Pa:Phag + { 16998, 4 }, // #307 scx=Psalter_Pahlavi:Phlp + { 17002, 6 }, // #308 scx=Sharada:Shrd + { 17008, 14 }, // #309 scx=Sinhala:Sinh + { 17022, 2 }, // #310 scx=Sogdian:Sogd + { 17024, 3 }, // #311 scx=Syloti_Nagri:Sylo + { 17027, 12 }, // #312 scx=Syriac:Syrc + { 17039, 3 }, // #313 scx=Tagalog:Tglg + { 17042, 4 }, // #314 scx=Tagbanwa:Tagb + { 17046, 3 }, // #315 scx=Tai_Le:Tale + { 17049, 4 }, // #316 scx=Takri:Takr + { 17053, 25 }, // #317 scx=Tamil:Taml + { 17078, 17 }, // #318 scx=Telugu:Telu + { 17095, 7 }, // #319 scx=Thaana:Thaa + { 17102, 6 }, // #320 scx=Tirhuta:Tirh + { 17108, 7 }, // #321 scx=Yezidi:Yezi + { 17115, 7 } // #322 scx=Yi:Yiii +}; +#define SRELL_UPDATA_VERSION 110 diff --git a/lib/srell3_009/unicode/readme_en.txt b/lib/srell3_009/unicode/readme_en.txt new file mode 100644 index 000000000..0901777de --- /dev/null +++ b/lib/srell3_009/unicode/readme_en.txt @@ -0,0 +1,76 @@ +Contents of this directory: + + 1. ucfdataout2.cpp + 2. updataout.cpp + +---- +1. ucfdataout2.cpp + + This is a C++ source file for a program that generates a newer version +of srell_ucfdata2.hpp, which is a C++ source file that SRELL 2.500- includes +for case-folding. It is generated by ucfdataout with CaseFolding.txt provided +by the Unicode Consortium. + + +--------------------------------------------------------------------------- + | What is CaseFolding.txt? + | + | It is a data file needed for case-insensitive matching based on the + | Unicode Standard. Whenever a new version of the Unicode Standard is + | released, CaseFolding.txt may also be updated accordingly. + | + +--------------------------------------------------------------------------- + + 1-1. Usage + + 1) compile ucfdataout2.cpp, + 2) get the latest version of CaseFolding.txt, which is available at + http://www.unicode.org/Public/UNIDATA/CaseFolding.txt , + 3) put CaseFolding.txt and a binary file generated at 1) in the same + directory and run the binary file, + 4) move the newly generated "srell_ucfdata2.hpp" to the directory in where + SRELL is put. + + 1-2. Compatibility + + srell_ucfdata2.hpp is not compatible with srell_ucfdata.hpp that SRELL up + to 2.401 was using. + +---- +2. updataout.cpp + + This is a C++ source file for a program that generates a newer version +of srell_updata.hpp, which is a C++ source file that SRELL includes for +the Unicode property escapes (\p{...} and \P{...}). It is generated by +updataout with the following text files provided by the Unicode Consortium: + + * DerivedCoreProperties.txt + * DerivedNormalizationProps.txt + * emoji-data.txt + * PropList.txt + * ScriptExtensions.txt + * Scripts.txt + * UnicodeData.txt + + As well as CaseFolding.txt mentioned above, these files may be updated +accordingly whenever a new version of the Unicode Standard is released. + + 2-1. Usage + + 1) compile updataout.cpp, + 2) get the latest versions of the text files mentioned above, which are + available at: + a. emoji-data.txt: http://www.unicode.org/Public/UNIDATA/emoji/ + b. others: http://www.unicode.org/Public/UNIDATA/ , + 3) put the text files and a binary file generated at 1) in the same + directory and run the binary file, + 4) move the newly generated "srell_updata.hpp" to the directory in where + SRELL is put. + + Note: emoji-data.txt has been moved from /Public/UNIDATA/ to + /Public/emoji/(version number)/ since Unicode 11.0.0. + Since Unicode 13.0.0, moved to /Public/UNIDATA/emoji/ . + + 2-2. Compatibility + + srell_updata.hpp does not have compatibility issues as of this release. + diff --git a/lib/srell3_009/unicode/readme_ja.txt b/lib/srell3_009/unicode/readme_ja.txt new file mode 100644 index 000000000..8ece4001b --- /dev/null +++ b/lib/srell3_009/unicode/readme_ja.txt @@ -0,0 +1,84 @@ +■同梱物について + + 1. ucfdataout2.cpp + 2. updataout.cpp + +---- +1. ucfdataout2.cpp + + srell_ucfdata2.hppの最新版を作成するプログラムのソースファイルです。SRELLの +2.5以降はcase-insensitiveな(大文字小文字の違いを無視した)照合を行うために、 +このsrell_ucfdata2.hppを必要とします。 + + ucfdataout2は、Unicode Consortiumより提供されているCaseFolding.txtというテキ +ストデータからsrell_ucfdata2.hppを自動生成します。 + + +--------------------------------------------------------------------------- + | CaseFolding.txtとは + | + | Case-insensitiveな照合を行う際には、大文字小文字の違いを吸収するために + | "case-folding" と呼ばれる処理が行われます。Unicode規格に基づいた + | case-foldingを行うために、Unicode Consortiumから提供されているのが + | CaseFolding.txtです。 + | + | このデータファイルはUnicode規格がアップデートされるとそれに合わせて + | アップデートされる可能性があります。 + | + +--------------------------------------------------------------------------- + + 1-1. 使用方法 + + 1) ucfdataout2.cppをコンパイルします。 + 2) 最新版のCaseFolding.txtを次のURLより取得します。 + http://www.unicode.org/Public/UNIDATA/CaseFolding.txt , + 3) CaseFolding.txtと、1)で作成したバイナリとを同じフォルダに置いて + バイナリを実行します。 + 4) srell_ucfdata2.hppが生成されますので、それをSRELLの置かれているディレク + トリへと移動させます。 + + 1-2. 互換性 + + srell_ucfdata2.hppは、SRELL 2.401までが利用していたsrell_updata.hppと互換 + 性がありません。 + +---- +2. updataout.cpp + + srell_updata.hppの最新版を作成するプログラムのソースファイルです。SRELLは +Unicode property escapes(\p{...} と \P{...})を含む正規表現と文字列との照合 +を行うために、このsrell_updata.hppを必要とします。 + + updataoutは、Unicode Consortiumより提供されている次のテキストデータから +srell_updata.hppを自動生成します。 + + ・DerivedCoreProperties.txt + ・DerivedNormalizationProps.txt + ・emoji-data.txt + ・PropList.txt + ・ScriptExtensions.txt + ・Scripts.txt + ・UnicodeData.txt + + 先述のCaseFolding.txt同様、これらのテキストデータファイルもUnicode規格が +アップデートされるとそれに合わせてアップデートされる可能性があります。 + + 2-1. 使用方法 + + 1) updataout.cppをコンパイルします。 + 2) 前記テキストファイルの最新版を次のURLより取得します。 + a. emoji-data.txt: http://www.unicode.org/Public/UNIDATA/emoji/ + b. それ以外: http://www.unicode.org/Public/UNIDATA/ + 3) これらのテキストファイルと、1)で作成したバイナリとを同じフォルダに + 置いてバイナリを実行します。 + 4) srell_updata.hppが生成されますので、それをSRELLの置かれているディレク + トリへと移動させます。 + + 補註: Unicode 11.0.0以降、emoji-data.txt は /Public/UNIDATA/ から + /Public/emoji/(ヴァージョン番号)/ へ移されました。 + さらに Unicode 13.0.0以降、/Public/UNIDATA/emoji/ へ移されました。 + + 2-2. 互換性 + + srell_updata.hpp には非互換となるような変更はこれまでのところ加えられてい + ません。 + diff --git a/lib/srell3_009/unicode/ucfdataout2.cpp b/lib/srell3_009/unicode/ucfdataout2.cpp new file mode 100644 index 000000000..1575a301d --- /dev/null +++ b/lib/srell3_009/unicode/ucfdataout2.cpp @@ -0,0 +1,590 @@ +// +// ucfdataout.cpp: version 2.100 (2020/05/13). +// +// This is a program that generates srell_ucfdata.hpp from CaseFolding.txt +// provided by the Unicode Consortium. The latese version is available at: +// http://www.unicode.org/Public/UNIDATA/CaseFolding.txt +// + +#include +#include +#include +#include +#include "../srell.hpp" + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(disable:4996) +#endif + +namespace unishared +{ +template +std::string stringify(const Type value, const char *const fmt) +{ + char buffer[BufSize]; + std::sprintf(buffer, fmt, value); + return std::string(buffer); +} + +bool read_file(std::string &str, const char *const filename, const char *const dir) +{ + const std::string path(std::string(dir ? dir : "") + filename); + FILE *const fp = std::fopen(path.c_str(), "r"); + + std::fprintf(stdout, "Reading '%s'... ", path.c_str()); + + if (fp) + { + static const std::size_t bufsize = 4096; + char *const buffer = static_cast(std::malloc(bufsize)); + + if (buffer) + { + for (;;) + { + const std::size_t size = std::fread(buffer, 1, bufsize, fp); + + if (!size) + break; + + str.append(buffer, size); + } + std::fclose(fp); + std::fputs("done.\n", stdout); + std::free(buffer); + return true; + } + } + std::fputs("failed...\n", stdout); + return false; +} + +bool write_file(const char *const filename, const std::string &str) +{ + FILE *const fp = std::fopen(filename, "wb"); + + std::fprintf(stdout, "Writing '%s'... ", filename); + + if (fp) + { + const bool success = std::fwrite(str.c_str(), 1, str.size(), fp) == str.size(); + std::fclose(fp); + if (success) + { + std::fputs("done.\n", stdout); + return true; + } + } + std::fputs("failed...\n", stdout); + return false; +} +} +// namespace unishared + +struct ucf_options +{ + const char *infilename; + const char *outfilename; + const char *indir; + int version; + int errorno; + + ucf_options(const int argc, const char *const *const argv) + : infilename("CaseFolding.txt") + , outfilename("srell_ucfdata2.hpp") + , indir("") + , version(2) + , errorno(0) + { + bool outfile_specified = false; + + for (int index = 1; index < argc; ++index) + { + const char firstchar = argv[index][0]; + + if (firstchar == '-' || firstchar == '/') + { + const char *const option = argv[index] + 1; + + ++index; + if (std::strcmp(option, "i") == 0) + { + if (index >= argc) + goto NO_ARGUMENT; + infilename = argv[index]; + } + else if (std::strcmp(option, "o") == 0) + { + if (index >= argc) + goto NO_ARGUMENT; + outfilename = argv[index]; + outfile_specified = true; + } + else if (std::strcmp(option, "v") == 0) + { + if (index >= argc) + goto NO_ARGUMENT; + version = static_cast(std::strtol(argv[index], NULL, 10)); + if (!outfile_specified && version < 2) + { + static const char *const v1name = "srell_ucfdata.hpp"; + outfilename = v1name; + } + } + else if (std::strcmp(option, "id") == 0) + { + if (index >= argc) + goto NO_ARGUMENT; + indir = argv[index]; + } + else + { + --index; + goto UNKNOWN_OPTION; + } + + continue; + + NO_ARGUMENT: + std::fprintf(stdout, "[Error] no argument for \"%s\" specified.\n", argv[--index]); + errorno = -2; + } + else + { + UNKNOWN_OPTION: + std::fprintf(stdout, "[Error] unknown option \"%s\" found.\n", argv[index]); + errorno = -1; + } + } + } +}; +// struct ucf_options + +class unicode_casefolding +{ +public: + + unicode_casefolding() + : maxdelta_(0L), maxdelta_cp_(0L), ucf_maxcodepoint_(0L), rev_maxcodepoint_(0L) + , ucf_numofsegs_(1U), rev_numofsegs_(1U), numofcps_from_(0U), numofcps_to_(0U) + , max_appearance_(0U), nextoffset_(0x100L), rev_charsets_(1, -1L) + { + } + + int create_ucfdata(std::string &outdata, const ucf_options &opts) + { + const std::string indent("\t\t\t"); + int errorno = opts.errorno; + std::string buf; + + if (errorno) + return errorno; + + if (unishared::read_file(buf, opts.infilename, opts.indir)) + { + static const srell::regex re_line("^.*$", srell::regex::multiline); + const srell::cregex_iterator eos; + srell::cregex_iterator iter(buf.c_str(), buf.c_str() + buf.size(), re_line); + srell::cmatch match; + int colcount = 0; + + for (; iter != eos; ++iter) + { + if (iter->length(0)) + { + static const srell::regex re_datainfo("^# (.*)$"); + + if (!srell::regex_match((*iter)[0].first, (*iter)[0].second, match, re_datainfo)) + { + outdata.append(1, '\n'); + break; + } + outdata += "// " + match.str(1) + "\n"; + } + } + + if (opts.version <= 1) + outdata += "template \nstruct unicode_casefolding\n{\n\tstatic const T1 *table()\n\t{\n\t\tstatic const T1 ucftable[] =\n\t\t{\n"; + else + outdata += "template \nstruct unicode_casefolding\n{\n"; + + for (; iter != eos; ++iter) + { + static const srell::regex re_cfdata("^\\s*([0-9A-Fa-f]+); ([CS]); ([0-9A-Fa-f]+);\\s*#\\s*(.*)$"); + const srell::cmatch &line = *iter; + + if (srell::regex_match(line[0].first, line[0].second, match, re_cfdata)) + { + const std::string from(match[1]); + const std::string to(match[3]); + const std::string type(match[2]); + const std::string name(match[4]); + + update(from, to); + + if (opts.version == 1) + outdata += indent + "{ 0x" + from + ", 0x" + to + " },\t// " + type + "; " + name + "\n"; + else if (opts.version <= 0) + { + if (colcount == 0) + outdata += indent; + outdata += "{ 0x" + from + ", 0x" + to + " },"; + if (++colcount == 4) + { + outdata.append(1, '\n'); + colcount = 0; + } + } + } + else if (opts.version == 1) + { + static const srell::regex re_comment_or_emptyline("^#.*|^$"); + + if (!srell::regex_match(line[0].first, line[0].second, re_comment_or_emptyline)) + outdata += indent + "// " + line.str(0) + "\n"; + } + } + if (colcount > 0) + outdata.append(1, '\n'); + if (opts.version <= 1) + outdata += indent + "{ 0, 0 }\n\t\t};\n\t\treturn ucftable;\n\t}\n"; + + outdata += "\tstatic const T2 ucf_maxcodepoint = 0x" + unishared::stringify<16>(ucf_maxcodepoint_, "%.4lX") + ";\n"; + outdata += "\tstatic const T3 ucf_deltatablesize = 0x" + unishared::stringify<16>(ucf_numofsegs_ << 8, "%X") + ";\n"; + + outdata += "\tstatic const T2 rev_maxcodepoint = 0x" + unishared::stringify<16>(rev_maxcodepoint_, "%.4lX") + ";\n"; + outdata += "\tstatic const T3 rev_indextablesize = 0x" + unishared::stringify<16>(rev_numofsegs_ << 8, "%X") + ";\n"; + outdata += "\tstatic const T3 rev_charsettablesize = " + unishared::stringify<16>(numofcps_to_ * 2 + numofcps_from_ + 1, "%u") + ";\t// 1 + " + unishared::stringify<16>(numofcps_to_, "%u") + " * 2 + " + unishared::stringify<16>(numofcps_from_, "%u") + "\n"; + outdata += "\tstatic const T3 rev_maxset = " + unishared::stringify<16>(maxset(), "%u") + ";\n"; + outdata += "\tstatic const T2 eos = 0;\n"; + + if (opts.version >= 2) + { + outdata += "\n\tstatic const T2 ucf_deltatable[];\n\tstatic const T3 ucf_segmenttable[];\n\tstatic const T3 rev_indextable[];\n\tstatic const T3 rev_segmenttable[];\n\tstatic const T2 rev_charsettable[];\n\n\tstatic const T2 *ucf_deltatable_ptr()\n\t{\n\t\treturn ucf_deltatable;\n\t}\n\tstatic const T3 *ucf_segmenttable_ptr()\n\t{\n\t\treturn ucf_segmenttable;\n\t}\n\tstatic const T3 *rev_indextable_ptr()\n\t{\n\t\treturn rev_indextable;\n\t}\n\tstatic const T3 *rev_segmenttable_ptr()\n\t{\n\t\treturn rev_segmenttable;\n\t}\n\tstatic const T2 *rev_charsettable_ptr()\n\t{\n\t\treturn rev_charsettable;\n\t}\n};\n\n"; + out_v2tables(outdata); + outdata += "#define SRELL_UCFDATA_VERSION 200\n"; + } + else + outdata += "};\n#define SRELL_UCFDATA_VER 201909L\n"; + + std::fprintf(stdout, "MaxDelta: %+ld (U+%.4lX->U+%.4lX)\n", maxdelta_, maxdelta_cp_, maxdelta_cp_ + maxdelta_); + } + else + errorno = 1; + + return errorno; + } + +private: + + void update(const std::string &from, const std::string &to) + { + const long cp_from = std::strtol(from.c_str(), NULL, 16); + const long cp_to = std::strtol(to.c_str(), NULL, 16); + const long delta = cp_to - cp_from; + const long segno_from = cp_from >> 8; + const long segno_to = cp_to >> 8; + + update_tables(cp_from, cp_to, segno_from); + + ++numofcps_from_; + if (std::abs(maxdelta_) < std::abs(delta)) + { + maxdelta_cp_ = cp_from; + maxdelta_ = delta; + } + + if (ucf_maxcodepoint_ < cp_from) + ucf_maxcodepoint_ = cp_from; + + if (rev_maxcodepoint_ < cp_to) + rev_maxcodepoint_ = cp_to; + + if (rev_maxcodepoint_ < cp_from) + rev_maxcodepoint_ = cp_from; + + if (!ucf_countedsegnos.count(segno_from)) + { + ucf_countedsegnos[segno_from] = 1; + ++ucf_numofsegs_; + } + + if (!rev_countedsegnos.count(segno_to)) + { + rev_countedsegnos[segno_to] = 1; + ++rev_numofsegs_; + } + if (!rev_countedsegnos.count(segno_from)) + { + rev_countedsegnos[segno_from] = 1; + ++rev_numofsegs_; + } + + if (!cps_counted_as_foldedto.count(cp_to)) + { + cps_counted_as_foldedto[cp_to] = 1; + ++numofcps_to_; + } + + if (appearance_counts_.count(to)) + ++appearance_counts_[to]; + else + appearance_counts_[to] = 1; + + if (max_appearance_ < appearance_counts_[to]) + max_appearance_ = appearance_counts_[to]; + } + + unsigned int maxset() const + { + return max_appearance_ + 1; + } + + void out_v2tables(std::string &outdata) + { + const char *const headers[] = { + "template \nconst ", + " unicode_casefolding::", + "[] =\n{\n" + }; + + create_revtables(); + out_lowertable(outdata, headers, "T2", "ucf_deltatable", ucf_deltas_, ucf_segments_); + outdata.append(1, '\n'); + out_uppertable(outdata, headers, "T3", "ucf_segmenttable", ucf_segments_); + outdata.append(1, '\n'); + out_lowertable(outdata, headers, "T3", "rev_indextable", rev_indices_, rev_segments_); + outdata.append(1, '\n'); + out_uppertable(outdata, headers, "T3", "rev_segmenttable", rev_segments_); + outdata.append(1, '\n'); + out_cstable(outdata, headers, "T2", "rev_charsettable", rev_charsets_); + } + + // Updates ucf_segments_, ucf_deltas_, and rev_charsets_. + void update_tables(const long cp_from, const long cp_to, const long segno_from) + { + if (segno_from >= static_cast(ucf_segments_.size())) + ucf_segments_.resize(segno_from + 1, 0L); + + long &offset_of_segment = ucf_segments_[segno_from]; + + if (offset_of_segment == 0L) + { + offset_of_segment = nextoffset_; + nextoffset_ += 0x100L; + ucf_deltas_.resize(nextoffset_, 0L); + } + + ucf_deltas_[offset_of_segment + (cp_from & 0xffL)] = cp_to - cp_from; + + for (long index = 0L;; ++index) + { + if (index == static_cast(rev_charsets_.size())) + { + rev_charsets_.push_back(cp_to); + rev_charsets_.push_back(cp_from); + rev_charsets_.push_back(-1L); + break; + } + if (rev_charsets_[index] == cp_to) + { + for (++index; rev_charsets_[index] != -1L; ++index); + + rev_charsets_.insert(index, 1, cp_from); + break; + } + } + } + + // Creates rev_segments_ and rev_indices_ from rev_charsets_. + void create_revtables() + { + long nextoffset = 0x100L; + for (long index = 0L; index < static_cast(rev_charsets_.size()); ++index) + { + const long bocs = index; // Beginning of charset. + + for (; rev_charsets_[index] != -1L; ++index) + { + const long &u21ch = rev_charsets_[index]; + const long segno = u21ch >> 8L; + + if (segno >= static_cast(rev_segments_.size())) + rev_segments_.resize(segno + 1, 0L); + + long &offset_of_segment = rev_segments_[segno]; + + if (offset_of_segment == 0L) + { + offset_of_segment = nextoffset; + nextoffset += 0x100L; + rev_indices_.resize(nextoffset, 0L); + } + rev_indices_[offset_of_segment + (u21ch & 0xffL)] = bocs; + } + } + } + + void out_lowertable(std::string &outdata, const char *const headers[], const char *const type, const char *const funcname, const std::basic_string &table, const std::basic_string &segtable) const + { + int end = static_cast(table.size()); + + outdata += headers[0]; + outdata += type; + outdata += headers[1]; + outdata += funcname; + outdata += headers[2]; + + for (int i = 0; i < end;) + { + const int col = i & 15; + + if ((i & 255) == 0) + { + if (i) + { + for (int j = 0; j < static_cast(segtable.size()); ++j) + { + if (segtable[j] == i) + { + outdata += "\n\t// For u+" + unishared::stringify<16>(j, "%.2X") + "xx (" + unishared::stringify<16>(i, "%d") + ")\n"; + break; + } + } + } + else + outdata += "\t// For common (0)\n"; + } + + outdata += col == 0 ? "\t" : (col & 3) == 0 ? " " : " "; + if (table[i] >= 0L) + outdata += unishared::stringify<16>(table[i], "%ld"); + else + outdata += "static_cast<", outdata += type, outdata += ">(", outdata += unishared::stringify<16>(table[i], "%ld") + ")"; + + if (++i == end) + outdata.append(1, '\n'); + else if (col == 15) + outdata += ",\n"; + else + outdata.append(1, ','); + } + outdata += "};\n"; + } + + void out_uppertable(std::string &outdata, const char *const headers[], const char *const type, const char *const funcname, const std::basic_string &table) const + { + int end = static_cast(table.size()); + + outdata += headers[0]; + outdata += type; + outdata += headers[1]; + outdata += funcname; + outdata += headers[2]; + + for (int i = 0; i < end;) + { + const int col = i & 15; + + outdata += col == 0 ? "\t" : (col & 3) == 0 ? " " : " "; + if (table[i] >= 0) + outdata += unishared::stringify<16>(table[i], "%ld"); + else + outdata += "static_cast<", outdata += type, outdata += ">(", outdata += unishared::stringify<16>(table[i], "%ld") + ")"; + + if (++i == end) + outdata.append(1, '\n'); + else if (col == 15) + outdata += ",\n"; + else + outdata.append(1, ','); + } + outdata += "};\n"; + } + + void out_cstable(std::string &outdata, const char *const headers[], const char *const type, const char *const funcname, const std::basic_string &table) const + { + int end = static_cast(table.size()); + bool newline = true; + int bos = 0; + int prevprintedbos = -1; + + outdata += headers[0]; + outdata += type; + outdata += headers[1]; + outdata += funcname; + outdata += headers[2]; + + for (int i = 0; i < end;) + { + const long val = table[i]; + + outdata += newline ? "\t" : " "; + newline = false; + + if (val == -1L) + outdata += "eos"; + else + outdata += "0x", outdata += unishared::stringify<16>(val, "%.4lX"); + + if (++i != end) + outdata.append(1, ','); + + if (val == -1L) + { + if (prevprintedbos != bos / 10 || i == end) + { + outdata += "\t// "; + outdata += unishared::stringify<16>(bos, "%d"); + prevprintedbos = bos / 10; + } + outdata.append(1, '\n'); + newline = true; + bos = i; + } + } + outdata += "};\n"; + } + + typedef std::map flagset_type; + + long maxdelta_; // = 0L; + long maxdelta_cp_; // = 0L; + long ucf_maxcodepoint_; // = 0L; // The max code point for case-folding. + long rev_maxcodepoint_; // = 0L; // The max code point for reverse lookup. + unsigned int ucf_numofsegs_; // = 1U; // The number of segments in the delta table. + unsigned int rev_numofsegs_; // = 1U; // The number of segments in the table for reverse lookup. + unsigned int numofcps_from_; // = 0U; // The number of code points in "folded from"s. + unsigned int numofcps_to_; // = 0U; // The number of code points in "folded to"s. + + flagset_type ucf_countedsegnos; // The set of segment nos marked as "counted" for case-folding. + flagset_type rev_countedsegnos; // The set of segment nos marked as "counted" for reverse lookup. + flagset_type cps_counted_as_foldedto; // The set of code points marked as "folded to". + + unsigned int max_appearance_; + std::map appearance_counts_; + + long nextoffset_; + std::basic_string ucf_deltas_; + std::basic_string ucf_segments_; + std::basic_string rev_indices_; + std::basic_string rev_segments_; + std::basic_string rev_deltas_; + std::basic_string rev_charsets_; +}; +// class unicode_casefolding + +int main(const int argc, const char *const *const argv) +{ + ucf_options ucfopts(argc, argv); + std::string outdata; + unicode_casefolding ucf; + int errorno = ucf.create_ucfdata(outdata, ucfopts); + + if (errorno == 0) + { + if (!unishared::write_file(ucfopts.outfilename, outdata)) + errorno = 2; + } + return errorno; +} diff --git a/lib/srell3_009/unicode/updataout.cpp b/lib/srell3_009/unicode/updataout.cpp new file mode 100644 index 000000000..1501572c7 --- /dev/null +++ b/lib/srell3_009/unicode/updataout.cpp @@ -0,0 +1,1066 @@ +// +// updataout.cpp: version 1.400 (2021/10/10). +// +// This is a program that generates srell_updata.hpp from: +// DerivedCoreProperties.txt +// DerivedNormalizationProps.txt +// emoji-data.txt +// PropList.txt +// ScriptExtensions.txt +// Scripts.txt +// UnicodeData.txt +// provided by the Unicode Consortium. The latese versions of them +// except emoji-data.txt are available at: http://www.unicode.org/Public/UNIDATA/ +// emoji-data.txt is available at: http://www.unicode.org/Public/UNIDATA/emoji/ +// + +#include +#include +#include +#include +#include +#include +#include +#include "../srell.hpp" + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(disable:4996) +#endif + +namespace updata +{ +static const char *const property_names[] = { // 3 + "General_Category:gc", "Script:sc", "Script_Extensions:scx", "" +}; +static const char *const binary_property_names[] = { // 53 (52+1) + // *1: http://unicode.org/reports/tr18/#General_Category_Property + // *2: 9th field in UnicodeData.txt + "ASCII", // *1 + "ASCII_Hex_Digit:AHex", // PropList.txt + "Alphabetic:Alpha", // DerivedCoreProperties.txt + "Any", // *1 + "Assigned", // *1 + "Bidi_Control:Bidi_C", // PropList.txt + "Bidi_Mirrored:Bidi_M", // *2 + "Case_Ignorable:CI", // DerivedCoreProperties.txt + "Cased", // DerivedCoreProperties.txt + "Changes_When_Casefolded:CWCF", // DerivedCoreProperties.txt + "Changes_When_Casemapped:CWCM", // DerivedCoreProperties.txt + "Changes_When_Lowercased:CWL", // DerivedCoreProperties.txt + "Changes_When_NFKC_Casefolded:CWKCF", // DerivedNormalizationProps.txt + "Changes_When_Titlecased:CWT", // DerivedCoreProperties.txt + "Changes_When_Uppercased:CWU", // DerivedCoreProperties.txt + "Dash", // PropList.txt + "Default_Ignorable_Code_Point:DI", // DerivedCoreProperties.txt + "Deprecated:Dep", // PropList.txt + "Diacritic:Dia", // PropList.txt + "Emoji", // emoji-data.txt + "Emoji_Component:EComp", // emoji-data.txt + "Emoji_Modifier:EMod", // emoji-data.txt + "Emoji_Modifier_Base:EBase", // emoji-data.txt + "Emoji_Presentation:EPres", // emoji-data.txt + "Extended_Pictographic:ExtPict", // emoji-data.txt + "Extender:Ext", // PropList.txt + "Grapheme_Base:Gr_Base", // DerivedCoreProperties.txt + "Grapheme_Extend:Gr_Ext", // DerivedCoreProperties.txt + "Hex_Digit:Hex", // PropList.txt + "IDS_Binary_Operator:IDSB", // PropList.txt + "IDS_Trinary_Operator:IDST", // PropList.txt + "ID_Continue:IDC", // DerivedCoreProperties.txt + "ID_Start:IDS", // DerivedCoreProperties.txt + "Ideographic:Ideo", // PropList.txt + "Join_Control:Join_C", // PropList.txt + "Logical_Order_Exception:LOE", // PropList.txt + "Lowercase:Lower", // DerivedCoreProperties.txt + "Math", // DerivedCoreProperties.txt + "Noncharacter_Code_Point:NChar", // PropList.txt + "Pattern_Syntax:Pat_Syn", // PropList.txt + "Pattern_White_Space:Pat_WS", // PropList.txt + "Quotation_Mark:QMark", // PropList.txt + "Radical", // PropList.txt + "Regional_Indicator:RI", // PropList.txt + "Sentence_Terminal:STerm", // PropList.txt + "Soft_Dotted:SD", // PropList.txt + "Terminal_Punctuation:Term", // PropList.txt + "Unified_Ideograph:UIdeo", // PropList.txt + "Uppercase:Upper", // DerivedCoreProperties.txt + "Variation_Selector:VS", // PropList.txt + "White_Space:space", // PropList.txt + "XID_Continue:XIDC", // DerivedCoreProperties.txt + "XID_Start:XIDS", // DerivedCoreProperties.txt + // ECMAScript 2019/Unicode 11: + // "Extended_Pictographic:ExtPict", + // ECMAScript 2021/Unicode 13: + // Aliases: EComp, EMod, EBase, EPres, and ExtPict + "" +}; +static const char *const gc_values[] = { // 38 + "Other:C", "Control:Cc:cntrl", "Format:Cf", "Unassigned:Cn", + "Private_Use:Co", "Surrogate:Cs", "Letter:L", "Cased_Letter:LC", + "Lowercase_Letter:Ll", "Titlecase_Letter:Lt", "Uppercase_Letter:Lu", "Modifier_Letter:Lm", + "Other_Letter:Lo", "Mark:M:Combining_Mark", "Spacing_Mark:Mc", "Enclosing_Mark:Me", + "Nonspacing_Mark:Mn", "Number:N", "Decimal_Number:Nd:digit", "Letter_Number:Nl", + "Other_Number:No", "Punctuation:P:punct", "Connector_Punctuation:Pc", "Dash_Punctuation:Pd", + "Close_Punctuation:Pe", "Final_Punctuation:Pf", "Initial_Punctuation:Pi", "Other_Punctuation:Po", + "Open_Punctuation:Ps", "Symbol:S", "Currency_Symbol:Sc", "Modifier_Symbol:Sk", + "Math_Symbol:Sm", "Other_Symbol:So", "Separator:Z", "Line_Separator:Zl", + "Paragraph_Separator:Zp", "Space_Separator:Zs", "" +}; +static const char *const script_names[] = { // 161 (141+7+4+4+5) + "Adlam:Adlm", "Ahom:Ahom", "Anatolian_Hieroglyphs:Hluw", "Arabic:Arab", + "Armenian:Armn", "Avestan:Avst", "Balinese:Bali", "Bamum:Bamu", + "Bassa_Vah:Bass", "Batak:Batk", "Bengali:Beng", "Bhaiksuki:Bhks", + "Bopomofo:Bopo", "Brahmi:Brah", "Braille:Brai", "Buginese:Bugi", + "Buhid:Buhd", "Canadian_Aboriginal:Cans", "Carian:Cari", "Caucasian_Albanian:Aghb", + "Chakma:Cakm", "Cham:Cham", "Cherokee:Cher", "Chorasmian:Chrs", + "Common:Zyyy", "Coptic:Copt:Qaac", "Cypro_Minoan:Cpmn", "Cuneiform:Xsux", + "Cypriot:Cprt", "Cyrillic:Cyrl", "Deseret:Dsrt", "Devanagari:Deva", + "Dives_Akuru:Diak", "Dogra:Dogr", "Duployan:Dupl", "Egyptian_Hieroglyphs:Egyp", + "Elbasan:Elba", "Elymaic:Elym", "Ethiopic:Ethi", "Georgian:Geor", + "Glagolitic:Glag", "Gothic:Goth", "Grantha:Gran", "Greek:Grek", + "Gujarati:Gujr", "Gunjala_Gondi:Gong", "Gurmukhi:Guru", "Han:Hani", + "Hangul:Hang", "Hanifi_Rohingya:Rohg", "Hanunoo:Hano", "Hatran:Hatr", + "Hebrew:Hebr", "Hiragana:Hira", "Imperial_Aramaic:Armi", "Inherited:Zinh:Qaai", + "Inscriptional_Pahlavi:Phli", "Inscriptional_Parthian:Prti", "Javanese:Java", "Kaithi:Kthi", + "Kannada:Knda", "Katakana:Kana", "Kayah_Li:Kali", "Kharoshthi:Khar", + "Khitan_Small_Script:Kits", "Khmer:Khmr", "Khojki:Khoj", "Khudawadi:Sind", + "Lao:Laoo", "Latin:Latn", "Lepcha:Lepc", "Limbu:Limb", + "Linear_A:Lina", "Linear_B:Linb", "Lisu:Lisu", "Lycian:Lyci", + "Lydian:Lydi", "Mahajani:Mahj", "Makasar:Maka", "Malayalam:Mlym", + "Mandaic:Mand", "Manichaean:Mani", "Marchen:Marc", "Masaram_Gondi:Gonm", + "Medefaidrin:Medf", "Meetei_Mayek:Mtei", "Mende_Kikakui:Mend", "Meroitic_Cursive:Merc", + "Meroitic_Hieroglyphs:Mero", "Miao:Plrd", "Modi:Modi", "Mongolian:Mong", + "Mro:Mroo", "Multani:Mult", "Myanmar:Mymr", "Nabataean:Nbat", + "Nandinagari:Nand", "New_Tai_Lue:Talu", "Newa:Newa", "Nko:Nkoo", + "Nushu:Nshu", "Nyiakeng_Puachue_Hmong:Hmnp", "Ogham:Ogam", "Ol_Chiki:Olck", + "Old_Hungarian:Hung", "Old_Italic:Ital", "Old_North_Arabian:Narb", "Old_Permic:Perm", + "Old_Persian:Xpeo", "Old_Sogdian:Sogo", "Old_South_Arabian:Sarb", "Old_Turkic:Orkh", + "Old_Uyghur:Ougr", "Oriya:Orya", "Osage:Osge", "Osmanya:Osma", + "Pahawh_Hmong:Hmng", "Palmyrene:Palm", "Pau_Cin_Hau:Pauc", "Phags_Pa:Phag", + "Phoenician:Phnx", "Psalter_Pahlavi:Phlp", "Rejang:Rjng", "Runic:Runr", + "Samaritan:Samr", "Saurashtra:Saur", "Sharada:Shrd", "Shavian:Shaw", + "Siddham:Sidd", "SignWriting:Sgnw", "Sinhala:Sinh", "Sogdian:Sogd", + "Sora_Sompeng:Sora", "Soyombo:Soyo", "Sundanese:Sund", "Syloti_Nagri:Sylo", + "Syriac:Syrc", "Tagalog:Tglg", "Tagbanwa:Tagb", "Tai_Le:Tale", + "Tai_Tham:Lana", "Tai_Viet:Tavt", "Takri:Takr", "Tamil:Taml", + "Tangsa:Tnsa", "Tangut:Tang", "Telugu:Telu", "Thaana:Thaa", + "Thai:Thai", "Tibetan:Tibt", "Tifinagh:Tfng", "Tirhuta:Tirh", + "Toto", "Ugaritic:Ugar", "Vai:Vaii", "Vithkuqi:Vith", + "Wancho:Wcho", "Warang_Citi:Wara", "Yezidi:Yezi", "Yi:Yiii", + "Zanabazar_Square:Zanb", + // ECMAScript 2019/Unicode 11: + // "Dogra:Dogr", "Gunjala_Gondi:Gong", "Hanifi_Rohingya:Rohg", + // "Makasar:Maka", "Medefaidrin:Medf", "Old_Sogdian:Sogo", "Sogdian:Sogd", + // ECMAScript 2020/Unicode 12 + // "Elymaic:Elym", "Nandinagari:Nand", "Nyiakeng_Puachue_Hmong:Hmnp", "Wancho:Wcho", + // ECMAScript 2021/Unicode 13 + // "Chorasmian:Chrs", "Dives_Akuru:Diak", "Khitan_Small_Script:Kits", "Yezidi:Yezi", + // ECMAScript 2022/Unicode 14: + // "Cypro_Minoan:Cpmn", "Old_Uyghur:Ougr", "Tangsa:Tnsa", "Toto", + // "Vithkuqi:Vith" + "" +}; +} // namespace updata + +namespace unishared +{ +template +std::string stringify(const Type value, const char *const fmt) +{ + char buffer[BufSize]; + std::sprintf(buffer, fmt, value); + return std::string(buffer); +} + +void throw_error(const char *const s, ...) +{ + char buffer[256]; + + va_list va; + va_start(va, s); + std::vsprintf(buffer, s, va); + va_end(va); + throw std::runtime_error(buffer); +} + +void read_file(std::string &str, const char *const filename, const char *const dir) +{ + const std::string path(std::string(dir ? dir : "") + filename); + FILE *const fp = std::fopen(path.c_str(), "r"); + + std::fprintf(stdout, "Reading '%s'... ", path.c_str()); + + if (fp) + { + static const std::size_t bufsize = 4096; + char *const buffer = static_cast(std::malloc(bufsize)); + + if (buffer) + { + for (;;) + { + const std::size_t size = std::fread(buffer, 1, bufsize, fp); + + if (!size) + break; + + str.append(buffer, size); + } + std::fclose(fp); + std::fputs("done.\n", stdout); + std::free(buffer); + return; + } + } + std::fputs("failed...", stdout); + throw_error("could not open!"); +} + +bool write_file(const char *const filename, const std::string &str) +{ + FILE *const fp = std::fopen(filename, "wb"); + + std::fprintf(stdout, "Writing '%s'... ", filename); + + if (fp) + { + const bool success = std::fwrite(str.c_str(), 1, str.size(), fp) == str.size(); + std::fclose(fp); + if (success) + { + std::fputs("done.\n", stdout); + return true; + } + } + std::fputs("failed...\n", stdout); + return false; +} +} // namespace unishared + +struct up_options +{ + const char *outfilename; + const char *indir; + int version; + int errorno; + + up_options(const int argc, const char *const *const argv) + : outfilename("srell_updata.hpp") + , indir("") + , version(110) + , errorno(0) + { + for (int index = 1; index < argc; ++index) + { + const char firstchar = argv[index][0]; + + if (firstchar == '-' || firstchar == '/') + { + const char *const option = argv[index] + 1; + + if (std::strcmp(option, "o") == 0) + { + if (index + 1 >= argc) + goto NO_ARGUMENT; + outfilename = argv[++index]; + } + else if (std::strcmp(option, "v") == 0) + { + if (index + 1 >= argc) + goto NO_ARGUMENT; + version = static_cast(std::strtod(argv[++index], NULL) * 100.0); + } + else if (std::strcmp(option, "id") == 0) + { + if (index + 1 >= argc) + goto NO_ARGUMENT; + indir = argv[++index]; + } + else + goto UNKNOWN_OPTION; + + continue; + + NO_ARGUMENT: + std::fprintf(stdout, "[Error] no argument for \"%s\" specified.\n", argv[index]); + errorno = -2; + } + else + { + UNKNOWN_OPTION: + std::fprintf(stdout, "[Error] unknown option \"%s\" found.\n", argv[index]); + errorno = -1; + } + } + } +}; +// struct up_options + +class unicode_property +{ +public: + + unicode_property() + : re_licenseline_("^#\\s*(.*)$") + , re_licenseend_("^#\\s*$") + { + } + + int create_updata(std::string &outdata, const up_options &opts) + { + int errorno = opts.errorno; + const char *const unidatafilename = "UnicodeData.txt"; + const char *const propdatafiles[] = { "PropList.txt", "DerivedCoreProperties.txt", "emoji-data.txt", "DerivedNormalizationProps.txt", "" }; + const char *const scfilename = "Scripts.txt"; + const char *const scxfilename = "ScriptExtensions.txt"; + std::string licensetext; + rangeholder general_category_values; + rangeholder binary_properties; + rangeholder scripts; + rangeholder scriptextensions; + sortedrangeholder combined_properties; +// scriptnameholder ucs_to_scriptname; // codepoint->scriptname. + + if (errorno) + return errorno; + + try + { + licensetext = "// "; + licensetext += unidatafilename; + licensetext += "\n//\n"; + + read_unidata(general_category_values, binary_properties, unidatafilename, opts.indir); + set_additionalbinprops(binary_properties, general_category_values); // for ASCII, Any, Cn. + create_compositecategories(general_category_values); // This needs "Cn". + + read_binprops(binary_properties, licensetext, propdatafiles, opts.indir); + + read_scripts(scripts, /* ucs_to_scriptname, */ licensetext, scfilename, opts.indir); + + scriptextensions = scripts; + modify_for_scx(scriptextensions, /* ucs_to_scriptname, */ licensetext, scxfilename, opts.indir); + + combine_properties(combined_properties, general_category_values, "gc", updata::gc_values); + combine_properties(combined_properties, binary_properties, "bp", updata::binary_property_names); + combine_properties(combined_properties, scripts, "sc", updata::script_names); + combine_properties(combined_properties, scriptextensions, "scx", updata::script_names); + do_formatting(outdata, combined_properties, opts.version); + + licensetext.append(1, '\n'); + outdata.insert(0, licensetext); + } + catch (std::runtime_error &e) + { + std::printf("\nError: %s\n", e.what()); + errorno = 1; + } + return errorno; + } + +private: + + typedef srell::regex_internal::uchar32 uchar32; + typedef srell::regex_internal::range_pairs ucprange_array; + typedef srell::regex_internal::range_pair ucprange; + typedef srell::regex_internal::range_pair_helper ucprange_helper; + typedef std::map rangeholder; +// typedef srell::regex_internal::bitset<0x110000> ucsset; + typedef std::vector strings_type; + typedef std::map scriptnameholder; + typedef std::map name_mapper; + typedef name_mapper canonicalname_mapper; + static const uchar32 invalid_u32value = srell::regex_internal::constants::invalid_u32value; + static const uchar32 compositeclass = invalid_u32value; + + struct sorted_name_and_ranges + { + std::string ptype; + std::string canonicalname; + std::string namealiases; + ucprange_array ucpranges; + }; + typedef std::vector sortedrangeholder; + + void split(strings_type &parts, const std::string &data, const char splitter) + { + std::string::size_type readpos = 0; + + for (;;) + { + std::string::size_type lineend = data.find(splitter, readpos); + + if (lineend == std::string::npos) + { +// if (readpos == data.size()) +// break; + + parts.push_back(data.substr(readpos, data.size() - readpos)); + break; + } + + parts.push_back(data.substr(readpos, lineend - readpos)); + ++lineend; + readpos = lineend; + } + } + + std::string join(const char c, const strings_type &parts, const bool add_final_also = false) + { + std::string out; + + for (strings_type::size_type i = 0; i < parts.size(); ++i) + out.append(parts[i] + c); + + if (!add_final_also && out.size()) + out.resize(out.size() - 1); + + return out; + } + + void read_unidata(rangeholder &gc, rangeholder &bp, const char *const unidatafilename, const char *const indir) + { + const srell::regex re_dataline("^([0-9A-F]+);([^;]*);(([^;]*);(?:[^;]*;){6}([^;]*)(?:;[^;]*){5})$"); + const srell::regex re_rangefirst("^<(.*), First>$"); + + const std::string stringY("Y"); + const std::string stringN("N"); + uchar32 prevucp = invalid_u32value; + std::string data; + strings_type lines; + srell::cmatch cmatch; +// strings_type parts; + std::string rangename; + std::string rangefirstproperty; + uchar32 rangefirstcp = 0; + ucprange range; + ucprange_array bidi_mirrored_ranges; + + unishared::read_file(data, unidatafilename, indir); + split(lines, data, '\n'); + + for (strings_type::size_type i = 0; i < lines.size(); ++i) + { + const std::string &line = lines[i]; + const char *const lineend = line.c_str() + line.size(); + + if (srell::regex_match(line.c_str(), lineend, cmatch, re_dataline)) + { + const srell::cmatch::value_type &codepoint = cmatch[1]; + const srell::cmatch::value_type &name = cmatch[2]; + const std::string name_string(name.str()); + const std::string property(cmatch[3].str()); + + range.first = range.second = static_cast(std::strtol(codepoint.first, NULL, 16)); + + if (prevucp >= range.first && prevucp != invalid_u32value) + unishared::throw_error("out of order: %.4lX >= %.4lX", prevucp, range.first); + +// parts.clear(); +// split(parts, property, ';'); +// if (parts.size() != 13) +// unishared::throw_error("number of fields is not 13, but %u\n\t[%s]", parts.size(), line.c_str()); + +// const std::string &general_category = parts[0]; +// const std::string &bidi_mirrored = parts[7]; + const std::string general_category(cmatch[4].str()); + const std::string bidi_mirrored(cmatch[5].str()); + + prevucp = range.first; + + if (rangename.size()) + { + if (name_string.compare("<" + rangename + ", Last>") != 0) + unishared::throw_error("<%s, Last> does not follow its First line.\n\t%s follows insteadly.", rangename.c_str(), name_string.c_str()); + + if (property != rangefirstproperty) + { + unishared::throw_error("\"%s\": properties of First and Last are different.\n\tFirst: %s\n\tLast: %s", rangename.c_str(), rangefirstproperty.c_str(), property.c_str()); + } + + range.first = rangefirstcp; + rangename.clear(); + } + else if (srell::regex_match(name.first, name.second, cmatch, re_rangefirst)) + { + rangename = cmatch[1]; + rangefirstproperty = property; + rangefirstcp = range.first; + continue; + } + + // register "general_category" value. + gc[general_category].join(range); + + // register "bidi_mirrored" value. + if (bidi_mirrored == stringY) + { + bidi_mirrored_ranges.join(range); + } + else if (bidi_mirrored != stringN) + unishared::throw_error("unknown Bidi_Mirrored value [%s] in %s.", bidi_mirrored.c_str(), line.c_str()); + } + else if (line.size()) + unishared::throw_error("unknown format [%s]", line.c_str()); + } + bp["Bidi_Mirrored"] = bidi_mirrored_ranges; + } + + // binary properties created from UnicodeData.txt. + void set_additionalbinprops(rangeholder &bp, rangeholder &gc) + { + ucprange_array assigned_ranges; + + for (rangeholder::iterator it = gc.begin(); it != gc.end(); ++it) + assigned_ranges.merge(it->second); + + bp["Any"].join(ucprange_helper(0x0000, 0x10ffff)); + bp["ASCII"].join(ucprange_helper(0x0000, 0x007f)); + bp["Assigned"]; // Only creates. No data. + +// bp["Assigned"] = assigned_ranges; + assigned_ranges.negation(); + gc["Cn"] = assigned_ranges; + } + + void create_compositecategory(rangeholder &gc, const char *const newname, const char *const *categories) + { + ucprange_array array; + uchar32 total = 0; + + array.append_newpair(ucprange_helper(compositeclass, 0)); + + for (; **categories; ++categories) + { + const char *const c = *categories; + const uchar32 count = static_cast(gc[*categories].size()); + + array.append_newpair(ucprange_helper(c[0], c[1])); + array.append_newpair(ucprange_helper(count, 0)); + total += count; + } + array[0].second = total; + gc[newname] = array; + } + + void create_compositecategories(rangeholder &gc) + { + const char *const categoryLC[] = { "Ll", "Lt", "Lu", "" }; + const char *const categoryL[] = { "Ll", "Lt", "Lu", "Lm", "Lo", "" }; + const char *const categoryM[] = { "Mc", "Me", "Mn", "" }; + const char *const categoryN[] = { "Nd", "Nl", "No", "" }; + const char *const categoryC[] = { "Cc", "Cf", "Cn", "Co", "Cs", "" }; + const char *const categoryP[] = { "Pc", "Pd", "Pe", "Pf", "Pi", "Po", "Ps", "" }; + const char *const categoryZ[] = { "Zl", "Zp", "Zs", "" }; + const char *const categoryS[] = { "Sc", "Sk", "Sm", "So", "" }; + + create_compositecategory(gc, "LC", categoryLC); + create_compositecategory(gc, "L", categoryL); + create_compositecategory(gc, "M", categoryM); + create_compositecategory(gc, "N", categoryN); + create_compositecategory(gc, "C", categoryC); + create_compositecategory(gc, "P", categoryP); + create_compositecategory(gc, "Z", categoryZ); + create_compositecategory(gc, "S", categoryS); + } + + void read_files(std::string &out, const char *const *propdatafiles, const char separator, const char *const indir) + { + for (; **propdatafiles; ++propdatafiles) + { + std::string data; + unishared::read_file(data, *propdatafiles, indir); + out.append(data); + out.append(1, separator); + out.append(1, '\n'); + } + } + + void read_binprops(rangeholder &bp, std::string &licensetext, const char *const *propdatafiles, const char *const indir) + { + const srell::regex re_propfmt("^\\s*([0-9A-Fa-f]{4,})(?:\\.\\.([0-9A-Fa-f]{4,}))?\\s*;\\s*(\\S+)\\s*(#.*)?$"); + const char separator = '\0'; + bool licenseend_found = false; + ucprange range; + strings_type lines; + srell::cmatch cmatch; + + { + std::string alldata; + read_files(alldata, propdatafiles, separator, indir); + split(lines, alldata, '\n'); + } + + for (std::string::size_type i = 0; i < lines.size(); ++i) + { + const std::string &line = lines[i]; + const char *const lineend = line.c_str() + line.size(); + + if (!licenseend_found) + { + if (srell::regex_match(line.c_str(), lineend, cmatch, re_licenseend_)) + { + licensetext += "//\n"; + licenseend_found = true; + } + else if (srell::regex_match(line.c_str(), lineend, cmatch, re_licenseline_)) + { + licensetext += "// " + cmatch[1].str() + '\n'; + } + } + else if (line.size() == 1 && line[0] == separator) + { + licenseend_found = false; + } + else if (srell::regex_match(line.c_str(), lineend, cmatch, re_propfmt)) + { + const srell::cmatch::value_type &begin = cmatch[1]; + const srell::cmatch::value_type &end = cmatch[2]; + const srell::cmatch::value_type &property = cmatch[3]; +// const srell::cmatch::value_type &comment = cmatch[4]; + + range.first = static_cast(std::strtol(begin.first, NULL, 16)); + if (end.matched) + range.second = static_cast(std::strtol(end.first, NULL, 16)); + else + range.second = range.first; + + bp[property].join(range); + } + } + } + + void read_scripts(rangeholder &sc, /* scriptnameholder &ucs_to_scriptname, */ std::string &licensetext, const char *const filename, const char *const indir) + { + const srell::regex re_scriptdata("^\\s*([0-9A-Fa-f]{4,})(?:\\.\\.([0-9A-Fa-f]{4,}))?\\s*;\\s*(\\S+)\\s*(#.*)?$"); + bool licenseend_found = false; + ucprange range; + strings_type lines; + srell::cmatch cmatch; + + { + std::string data; + + unishared::read_file(data, filename, indir); + split(lines, data, '\n'); + } + + for (std::string::size_type i = 0; i < lines.size(); ++i) + { + const std::string &line = lines[i]; + const char *const lineend = line.c_str() + line.size(); + + if (!licenseend_found) + { + if (srell::regex_match(line.c_str(), lineend, cmatch, re_licenseend_)) + { + licensetext += "//\n"; + licenseend_found = true; + } + else if (srell::regex_match(line.c_str(), lineend, cmatch, re_licenseline_)) + { + licensetext += "// " + cmatch[1].str() + '\n'; + } + } + else if (srell::regex_match(line.c_str(), lineend, cmatch, re_scriptdata)) + { + const srell::cmatch::value_type &begin = cmatch[1]; + const srell::cmatch::value_type &end = cmatch[2]; + const srell::cmatch::value_type &scriptname = cmatch[3]; +// const srell::cmatch::value_type &comment = cmatch[4]; + + range.first = static_cast(std::strtol(begin.first, NULL, 16)); + if (end.matched) + range.second = static_cast(std::strtol(end.first, NULL, 16)); + else + range.second = range.first; + + sc[scriptname].join(range); + } + } + } + + canonicalname_mapper load_canonicalnames(const char *const *names) + { + canonicalname_mapper canonicalnames; + strings_type parts; + + for (; **names; ++names) + { + parts.clear(); + split(parts, *names, ':'); + const std::string canonicalname(parts[0]); + for (strings_type::size_type i = 0; i < parts.size(); ++i) + { + canonicalnames[parts[i]] = canonicalname; + } + } + return canonicalnames; + } + + void modify_for_scx(rangeholder &scx, /* scriptnameholder &ucs_to_scriptname, */ std::string &licensetext, const char *const filename, const char *const indir) + { + const srell::regex re_scxdata("^\\s*([0-9A-Fa-f]{4,})(?:\\.\\.([0-9A-Fa-f]{4,}))?\\s*;\\s*(\\S.*?\\S)\\s*(#.*)?$"); + const canonicalname_mapper canonicalnames(load_canonicalnames(updata::script_names)); + const std::string name_common("Common"); + const std::string name_inherited("Inherited"); + bool licenseend_found = false; + ucprange_array common = scx[name_common]; + ucprange_array inherited = scx[name_inherited]; + ucprange range; + strings_type lines; + srell::cmatch cmatch; + strings_type scxparts; + std::map warning_out; + + { + std::string data; + + unishared::read_file(data, filename, indir); + split(lines, data, '\n'); + } + + for (std::string::size_type i = 0; i < lines.size(); ++i) + { + const std::string &line = lines[i]; + const char *const lineend = line.c_str() + line.size(); + + if (!licenseend_found) + { + if (srell::regex_match(line.c_str(), lineend, cmatch, re_licenseend_)) + { + licensetext += "//\n"; + licenseend_found = true; + } + else if (srell::regex_match(line.c_str(), lineend, cmatch, re_licenseline_)) + { + licensetext += "// " + cmatch[1].str() + '\n'; + } + } + else if (srell::regex_match(line.c_str(), lineend, cmatch, re_scxdata)) + { + const srell::cmatch::value_type &begin = cmatch[1]; + const srell::cmatch::value_type &end = cmatch[2]; + const srell::cmatch::value_type &scxnames = cmatch[3]; +// const srell::cmatch::value_type &comment = cmatch[4]; + + range.first = static_cast(std::strtol(begin.first, NULL, 16)); + if (end.matched) + range.second = static_cast(std::strtol(end.first, NULL, 16)); + else + range.second = range.first; + + common.remove_range(range); + inherited.remove_range(range); + + { + scxparts.clear(); + split(scxparts, scxnames, ' '); + for (strings_type::size_type i = 0; i < scxparts.size(); ++i) + { + const std::string &scriptname = scxparts[i]; + + if (scriptname.size()) + { + const canonicalname_mapper::const_iterator it = canonicalnames.find(scriptname); + + if (it != canonicalnames.end()) + scx[it->second].join(range); + else + { +// unishared::throw_error("canonical name for \"%s\" is not found.", scriptname.c_str()); + if (!warning_out.count(scriptname)) + { + std::printf("[Info] canonical name for \"%s\" is not found. New script?\n", scriptname.c_str()); + warning_out[scriptname] = true; + } + } + } + } + } + } + } + scx[name_common] = common; + scx[name_inherited] = inherited; + } + + void combine_properties(sortedrangeholder &base, const rangeholder &addition, const char *const ptype, const char *const *aliasnames) + { + const canonicalname_mapper canonicalnames(load_canonicalnames(aliasnames)); + sorted_name_and_ranges elem; + strings_type names; + + for (; **aliasnames; ++aliasnames) + { + const std::string aliases(*aliasnames); + bool pdata_found = false; + + names.clear(); + split(names, aliases, ':'); + + const std::string canonicalname(names[0]); + + for (strings_type::size_type i = 0; i < names.size(); ++i) + { + const rangeholder::const_iterator it = addition.find(names[i]); + + if (it != addition.end()) + { + elem.ucpranges = it->second; + pdata_found = true; + break; + } + } + + if (!pdata_found) + unishared::throw_error("no property value for \"%s\" found.", aliases.c_str()); + + elem.ptype = ptype; + elem.canonicalname = canonicalname; + elem.namealiases = aliases; + base.push_back(elem); + } + } + + name_mapper create_ptype_mappings() + { + name_mapper categories; + + categories["gc"] = "general_category"; + categories["bp"] = "binary"; + categories["sc"] = "script"; + categories["scx"] = "script_extensions"; + return categories; + } + + std::string create_ptypes(const name_mapper &ptypes) + { + std::string ptypedef("\tstruct ptype\n\t{\n\t\tstatic const T2 unknown = 0;\n"); + const char *names[] = { "bp", "gc", "sc", "scx", "" }; + + for (unsigned int i = 0; *names[i];) + { + const name_mapper::const_iterator it = ptypes.find(names[i]); + + if (it == ptypes.end()) + unishared::throw_error("name for ptype \"%s\" is not found.", names[i]); + + ptypedef += "\t\tstatic const T2 " + it->second + " = " + unishared::stringify<16>(++i, "%u") + ";\n"; + } + + ptypedef += "\t};\n"; + return ptypedef; + } + + std::string ranges_to_string(const ucprange_array &array, const std::string &indent) + { + std::string rangestring(indent); + unsigned count = 0; + + for (ucprange_array::size_type i = 0; i < array.size(); ++i) + { + const ucprange &range = array[i]; + if (count == 4) + { + count = 0; + rangestring += '\n' + indent; + } + else if (count) + { + rangestring += ' '; + } + rangestring += "0x" + unishared::stringify<16>(range.first, "%.4lX") + ", 0x" + unishared::stringify<16>(range.second, "%.4lX") + ','; + ++count; + } + return rangestring; + } + + void drop_finalcomma(std::string &data) + { + std::string::size_type commapos = data.rfind(','); + if (commapos != std::string::npos) + data.erase(commapos, 1); + } + + std::string create_pnametable(const std::string &return_table, const int version, const std::string &template1, const std::string &template2, const std::string &indent) + { + std::string out(version == 100 ? "\tstatic const T3 *propertyname_table()\n\t{\n\t\tstatic const T3 table[] =\n\t\t{\n" : template1 + "const T3 " + template2 + "propertynametable[] =\n{\n"); + const char *const *pnames = updata::property_names; + + out.append(indent + "\"*\",\t// #0:unknown\n"); + out.append(indent + "\"*\",\t// #1:binary\n"); + + for (unsigned int i = 2; **pnames; ++pnames, ++i) + { + out.append(indent); + out.append(1, '"'); + out.append(*pnames); + out.append("\",\t// #" + unishared::stringify<16>(i, "%u") + '\n'); + } + out.append(indent + "\"\"\n"); + out.append(return_table); + + return out; + } + + std::string join_dropcomma_append(const strings_type &s, const std::string &return_table) + { + std::string tmp(join('\n', s, true)); + + drop_finalcomma(tmp); + tmp.append(return_table); + return tmp; + } + + void do_formatting(std::string &out, const sortedrangeholder &alldata, const int version) + { + typedef std::map registered_sequence; + const std::string template1("template \n"); + const std::string template2("unicode_property_data::"); + const std::string return_table(version == 100 ? "\t\t};\n\t\treturn table;\n\t}\n" : "};\n"); + const std::string indent(version == 100 ? "\t\t\t" : "\t"); + name_mapper ptype_mappings(create_ptype_mappings()); + const std::string ptypes(create_ptypes(ptype_mappings)); + const std::string pnames(create_pnametable(return_table, version, template1, template2, indent)); + std::string pnumbers("\tstatic const T1 unknown = 0;\n"); // property numbers. + strings_type rangetable; + strings_type lookup_ranges; + unsigned int property_id_number = 1; + unsigned int property_number = 1; + registered_sequence registered; + std::string lookup_numbers; + unsigned int offset = 0; + + out.append(template1 + "struct unicode_property_data\n{\n"); + if (version == 100) + { + rangetable.push_back(std::string("\tstatic const T4 *ranges()\n\t{\n\t\tstatic const T4 table[] =\n\t\t{")); + lookup_ranges.push_back(std::string("\tstatic const T6 *position_table()\n\t{\n\t\tstatic const T6 table[] =\n\t\t{\n\t\t\t{ 0, 0 },\t// #0 unknown")); + } + else + { + rangetable.push_back(template1 + "const T4 " + template2 + "rangetable[] =\n{"); + lookup_ranges.push_back(template1 + "const T6 " + template2 + "positiontable[] =\n{\n\t{ 0, 0 },\t// #0 unknown"); + } + + for (sortedrangeholder::size_type i = 0; i < alldata.size(); ++i) + { + const sorted_name_and_ranges &elem = alldata[i]; + const std::string ptype = elem.ptype; + const std::string name = elem.canonicalname; + const std::string aliases = elem.namealiases; + const ucprange_array &array = elem.ucpranges; + const std::string pnumber_keyname(ptype + '_' + name); + const std::string position_comment(' ' + ptype + '=' + aliases); + std::string rangestring(ranges_to_string(array, indent)); + unsigned int numofranges = static_cast(array.size()); + unsigned int pno = property_number; + const registered_sequence::const_iterator rit = registered.find(rangestring); + + if (rit != registered.end()) + { + pno = rit->second; + lookup_ranges[pno] += position_comment; + rangetable[pno * 2 - 1] += position_comment; + lookup_numbers.append(indent + "{ ptype::" + ptype_mappings[ptype] + ", \"" + aliases + "\", " + unishared::stringify<16>(pno, "%u") + " },\t// #" + unishared::stringify<16>(property_id_number, "%u") + "\n"); + } + else + { + // ucpranges of "Assigned" is empty. + const bool compositeclass_found = array.size() && array[0].first == compositeclass; + + if (compositeclass_found) + { + std::printf("[Info] composite property \"%s\" found.\n", aliases.c_str()); + numofranges = array[0].second; + rangestring = indent + "// "; + + for (ucprange_array::size_type i = 1; i < array.size(); ++i) + { + const ucprange &range = array[i]; + + if (i > 1) + rangestring += " + "; + rangestring += static_cast(range.first); + rangestring += static_cast(range.second); + rangestring += ':' + unishared::stringify<16>(array[++i].first, "%u"); + } + } + else + { + registered[rangestring] = property_number; + } + + lookup_numbers.append(indent + "{ ptype::" + ptype_mappings[ptype] + ", \"" + aliases + "\", " + unishared::stringify<16>(property_number, "%u") + " },\t// #" + unishared::stringify<16>(property_id_number, "%u") + "\n"); + lookup_ranges.push_back(indent + "{ " + unishared::stringify<16>(offset, "%u") + ", " + unishared::stringify<16>(numofranges, "%u") + " },\t// #" + unishared::stringify<16>(pno, "%u") + position_comment); + rangetable.push_back(indent + "// #" + unishared::stringify<16>(pno, "%u") + " (" + unishared::stringify<16>(offset, "%u") + '+' + unishared::stringify<16>(numofranges, "%u") + "):" + position_comment); + rangetable.push_back(rangestring); + + if (!compositeclass_found) + offset += numofranges; + + ++property_number; + } + pnumbers.append("\tstatic const T1 " + pnumber_keyname + " = " + unishared::stringify<16>(property_id_number, "%u") + ";\t// #" + unishared::stringify<16>(pno, "%u") + '\n'); + ++property_id_number; + } + + pnumbers.append("\tstatic const T1 last_property_number = " + unishared::stringify<16>(--property_number, "%u") + ";\n"); + + lookup_numbers.append(indent + "{ ptype::unknown, \"\", 0 }\n"); + lookup_numbers.append(return_table); + lookup_numbers.insert(0, version == 100 ? "\tstatic const T5 *rangenumber_table()\n\t{\n\t\tstatic const T5 table[] =\n\t\t{\n\t\t\t{ ptype::unknown, \"*\", 0 },\t// #0\n" : template1 + "const T5 " + template2 + "rangenumbertable[] =\n{\n\t{ ptype::unknown, \"*\", 0 },\t// #0\n"); + + out.append(pnumbers); + out.append(ptypes); + if (version == 100) + { + out.append(pnames); + out.append(join_dropcomma_append(rangetable, return_table)); + out.append(lookup_numbers); + out.append(join_dropcomma_append(lookup_ranges, return_table)); + out.append("};\n"); + } + else + { + out.append("\tstatic const T3 propertynametable[];\n"); + out.append("\tstatic const T4 rangetable[];\n"); + out.append("\tstatic const T5 rangenumbertable[];\n"); + out.append("\tstatic const T6 positiontable[];\n\n"); + + out.append("\tstatic const T3 *propertyname_table()\n\t{\n\t\treturn propertynametable;\n\t}\n"); + out.append("\tstatic const T4 *ranges()\n\t{\n\t\treturn rangetable;\n\t}\n"); + out.append("\tstatic const T5 *rangenumber_table()\n\t{\n\t\treturn rangenumbertable;\n\t}\n"); + out.append("\tstatic const T6 *position_table()\n\t{\n\t\treturn positiontable;\n\t}\n"); + out.append("};\n\n"); + out.append(pnames); + out.append("\n"); + out.append(join_dropcomma_append(rangetable, return_table)); + out.append("\n"); + out.append(lookup_numbers); + out.append("\n"); + out.append(join_dropcomma_append(lookup_ranges, return_table)); + } + if (version > 100) + out.append("#define SRELL_UPDATA_VERSION 110\n"); + } + + srell::regex re_licenseline_; + srell::regex re_licenseend_; +}; +// class unicode_property + +int main(const int argc, const char *const *const argv) +{ + up_options upopts(argc, argv); + std::string outdata; + unicode_property up; + int errorno = up.create_updata(outdata, upopts); + + if (errorno == 0) + { + if (!unishared::write_file(upopts.outfilename, outdata)) + errorno = 2; + } + return errorno; +}