diff options
author | YDBot <[email protected]> | 2025-09-26 05:40:56 +0000 |
---|---|---|
committer | YDBot <[email protected]> | 2025-09-26 05:40:56 +0000 |
commit | a7e5af7043672a57f330696519f435f19fcd03d0 (patch) | |
tree | fa751accfbb8afcd928340c9078b00453c07dde1 /contrib/libs | |
parent | d7cd65635ff05f602b8eb7c6e2a42217057dd2c6 (diff) | |
parent | ee5ee24a4d661a146d6142a78050207193937281 (diff) |
Merge pull request #25828 from ydb-platform/merge-rightlib-250926-0050
Diffstat (limited to 'contrib/libs')
224 files changed, 52500 insertions, 7173 deletions
diff --git a/contrib/libs/apache/arrow/cpp/src/arrow/vendored/datetime/date.h b/contrib/libs/apache/arrow/cpp/src/arrow/vendored/datetime/date.h index 6d0455a354b..484ba0c9aa1 100644 --- a/contrib/libs/apache/arrow/cpp/src/arrow/vendored/datetime/date.h +++ b/contrib/libs/apache/arrow/cpp/src/arrow/vendored/datetime/date.h @@ -967,8 +967,8 @@ operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& inline namespace literals { -CONSTCD11 date::day operator "" _d(unsigned long long d) NOEXCEPT; -CONSTCD11 date::year operator "" _y(unsigned long long y) NOEXCEPT; +CONSTCD11 date::day operator ""_d(unsigned long long d) NOEXCEPT; +CONSTCD11 date::year operator ""_y(unsigned long long y) NOEXCEPT; } // inline namespace literals #endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) @@ -1870,7 +1870,7 @@ inline namespace literals CONSTCD11 inline date::day -operator "" _d(unsigned long long d) NOEXCEPT +operator ""_d(unsigned long long d) NOEXCEPT { return date::day{static_cast<unsigned>(d)}; } @@ -1878,7 +1878,7 @@ operator "" _d(unsigned long long d) NOEXCEPT CONSTCD11 inline date::year -operator "" _y(unsigned long long y) NOEXCEPT +operator ""_y(unsigned long long y) NOEXCEPT { return date::year(static_cast<int>(y)); } diff --git a/contrib/libs/apache/arrow/cpp/src/arrow/vendored/string_view.hpp b/contrib/libs/apache/arrow/cpp/src/arrow/vendored/string_view.hpp index a2d5567854f..3ef07575932 100644 --- a/contrib/libs/apache/arrow/cpp/src/arrow/vendored/string_view.hpp +++ b/contrib/libs/apache/arrow/cpp/src/arrow/vendored/string_view.hpp @@ -144,22 +144,22 @@ inline namespace literals { inline namespace string_view_literals { -constexpr std::string_view operator "" _sv( const char* str, size_t len ) noexcept // (1) +constexpr std::string_view operator ""_sv( const char* str, size_t len ) noexcept // (1) { return std::string_view{ str, len }; } -constexpr std::u16string_view operator "" _sv( const char16_t* str, size_t len ) noexcept // (2) +constexpr std::u16string_view operator ""_sv( const char16_t* str, size_t len ) noexcept // (2) { return std::u16string_view{ str, len }; } -constexpr std::u32string_view operator "" _sv( const char32_t* str, size_t len ) noexcept // (3) +constexpr std::u32string_view operator ""_sv( const char32_t* str, size_t len ) noexcept // (3) { return std::u32string_view{ str, len }; } -constexpr std::wstring_view operator "" _sv( const wchar_t* str, size_t len ) noexcept // (4) +constexpr std::wstring_view operator ""_sv( const wchar_t* str, size_t len ) noexcept // (4) { return std::wstring_view{ str, len }; } @@ -1336,22 +1336,22 @@ nssv_inline_ns namespace string_view_literals { #if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS -nssv_constexpr nonstd::sv_lite::string_view operator "" sv( const char* str, size_t len ) nssv_noexcept // (1) +nssv_constexpr nonstd::sv_lite::string_view operator ""sv( const char* str, size_t len ) nssv_noexcept // (1) { return nonstd::sv_lite::string_view{ str, len }; } -nssv_constexpr nonstd::sv_lite::u16string_view operator "" sv( const char16_t* str, size_t len ) nssv_noexcept // (2) +nssv_constexpr nonstd::sv_lite::u16string_view operator ""sv( const char16_t* str, size_t len ) nssv_noexcept // (2) { return nonstd::sv_lite::u16string_view{ str, len }; } -nssv_constexpr nonstd::sv_lite::u32string_view operator "" sv( const char32_t* str, size_t len ) nssv_noexcept // (3) +nssv_constexpr nonstd::sv_lite::u32string_view operator ""sv( const char32_t* str, size_t len ) nssv_noexcept // (3) { return nonstd::sv_lite::u32string_view{ str, len }; } -nssv_constexpr nonstd::sv_lite::wstring_view operator "" sv( const wchar_t* str, size_t len ) nssv_noexcept // (4) +nssv_constexpr nonstd::sv_lite::wstring_view operator ""sv( const wchar_t* str, size_t len ) nssv_noexcept // (4) { return nonstd::sv_lite::wstring_view{ str, len }; } @@ -1360,22 +1360,22 @@ nssv_constexpr nonstd::sv_lite::wstring_view operator "" sv( const wchar_t* str, #if nssv_CONFIG_USR_SV_OPERATOR -nssv_constexpr nonstd::sv_lite::string_view operator "" _sv( const char* str, size_t len ) nssv_noexcept // (1) +nssv_constexpr nonstd::sv_lite::string_view operator ""_sv( const char* str, size_t len ) nssv_noexcept // (1) { return nonstd::sv_lite::string_view{ str, len }; } -nssv_constexpr nonstd::sv_lite::u16string_view operator "" _sv( const char16_t* str, size_t len ) nssv_noexcept // (2) +nssv_constexpr nonstd::sv_lite::u16string_view operator ""_sv( const char16_t* str, size_t len ) nssv_noexcept // (2) { return nonstd::sv_lite::u16string_view{ str, len }; } -nssv_constexpr nonstd::sv_lite::u32string_view operator "" _sv( const char32_t* str, size_t len ) nssv_noexcept // (3) +nssv_constexpr nonstd::sv_lite::u32string_view operator ""_sv( const char32_t* str, size_t len ) nssv_noexcept // (3) { return nonstd::sv_lite::u32string_view{ str, len }; } -nssv_constexpr nonstd::sv_lite::wstring_view operator "" _sv( const wchar_t* str, size_t len ) nssv_noexcept // (4) +nssv_constexpr nonstd::sv_lite::wstring_view operator ""_sv( const wchar_t* str, size_t len ) nssv_noexcept // (4) { return nonstd::sv_lite::wstring_view{ str, len }; } diff --git a/contrib/libs/apache/arrow/patches/deprecated-literal-operator.sh b/contrib/libs/apache/arrow/patches/deprecated-literal-operator.sh new file mode 100644 index 00000000000..9aa38005c8b --- /dev/null +++ b/contrib/libs/apache/arrow/patches/deprecated-literal-operator.sh @@ -0,0 +1,3 @@ +set -xue +sed -e 's|operator "" |operator ""|g' cpp/src/arrow/vendored/datetime/date.h -i +sed -e 's|operator "" |operator ""|g' cpp/src/arrow/vendored/string_view.hpp -i diff --git a/contrib/libs/cxxsupp/builtins/.yandex_meta/build.ym b/contrib/libs/cxxsupp/builtins/.yandex_meta/build.ym index 58bb1ed8a02..c9e76124555 100644 --- a/contrib/libs/cxxsupp/builtins/.yandex_meta/build.ym +++ b/contrib/libs/cxxsupp/builtins/.yandex_meta/build.ym @@ -1,6 +1,6 @@ {% extends '//builtin/bag.ym' %} -{% block current_version %}21.1.0{% endblock %} +{% block current_version %}21.1.1{% endblock %} {% block current_url %} https://github.com/llvm/llvm-project/releases/download/llvmorg-{{self.version().strip()}}/compiler-rt-{{self.version().strip()}}.src.tar.xz diff --git a/contrib/libs/cxxsupp/builtins/cpu_model/aarch64.c b/contrib/libs/cxxsupp/builtins/cpu_model/aarch64.c index be002dd7199..d7880529ebe 100644 --- a/contrib/libs/cxxsupp/builtins/cpu_model/aarch64.c +++ b/contrib/libs/cxxsupp/builtins/cpu_model/aarch64.c @@ -34,12 +34,12 @@ typedef struct __ifunc_arg_t { _Bool __aarch64_have_lse_atomics __attribute__((visibility("hidden"), nocommon)) = false; -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) // clang-format off: should not reorder sys/auxv.h alphabetically #include <sys/auxv.h> // clang-format on #include "aarch64/hwcap.inc" -#include "aarch64/lse_atomics/freebsd.inc" +#include "aarch64/lse_atomics/elf_aux_info.inc" #elif defined(__Fuchsia__) #include "aarch64/hwcap.inc" #include "aarch64/lse_atomics/fuchsia.inc" @@ -68,9 +68,9 @@ struct { // clang-format off #if defined(__APPLE__) #include "aarch64/fmv/apple.inc" -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__OpenBSD__) #include "aarch64/fmv/mrs.inc" -#include "aarch64/fmv/freebsd.inc" +#include "aarch64/fmv/elf_aux_info.inc" #elif defined(__Fuchsia__) #include "aarch64/fmv/fuchsia.inc" #elif defined(__ANDROID__) diff --git a/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/fmv/freebsd.inc b/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/fmv/elf_aux_info.inc index aa975dc854f..aa975dc854f 100644 --- a/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/fmv/freebsd.inc +++ b/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/fmv/elf_aux_info.inc diff --git a/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/lse_atomics/freebsd.inc b/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/lse_atomics/elf_aux_info.inc index 4a1f9c2c27c..4a1f9c2c27c 100644 --- a/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/lse_atomics/freebsd.inc +++ b/contrib/libs/cxxsupp/builtins/cpu_model/aarch64/lse_atomics/elf_aux_info.inc diff --git a/contrib/libs/cxxsupp/builtins/ya.make b/contrib/libs/cxxsupp/builtins/ya.make index 98ffe3b56ab..383d34b214a 100644 --- a/contrib/libs/cxxsupp/builtins/ya.make +++ b/contrib/libs/cxxsupp/builtins/ya.make @@ -12,9 +12,9 @@ LICENSE( LICENSE_TEXTS(.yandex_meta/licenses.list.txt) -VERSION(21.1.0) +VERSION(21.1.1) -ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.0/compiler-rt-21.1.0.src.tar.xz) +ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.1/compiler-rt-21.1.1.src.tar.xz) NO_COMPILER_WARNINGS() diff --git a/contrib/libs/cxxsupp/libcxx/.yandex_meta/build.ym b/contrib/libs/cxxsupp/libcxx/.yandex_meta/build.ym index 6cf8416ff2f..44e7693fb5a 100644 --- a/contrib/libs/cxxsupp/libcxx/.yandex_meta/build.ym +++ b/contrib/libs/cxxsupp/libcxx/.yandex_meta/build.ym @@ -75,6 +75,9 @@ cat << EOF > ya.make LIBRARY() +# Ensure this library is mutually exclusive with "system stl" mode +NO_BUILD_IF(USE_STL_SYSTEM) + LICENSE( Apache-2.0 AND Apache-2.0 WITH LLVM-exception AND diff --git a/contrib/libs/cxxsupp/libcxx/ya.make b/contrib/libs/cxxsupp/libcxx/ya.make index 5b56e018e25..8346845c4df 100644 --- a/contrib/libs/cxxsupp/libcxx/ya.make +++ b/contrib/libs/cxxsupp/libcxx/ya.make @@ -2,6 +2,9 @@ LIBRARY() +# Ensure this library is mutually exclusive with "system stl" mode +NO_BUILD_IF(USE_STL_SYSTEM) + LICENSE( Apache-2.0 AND Apache-2.0 WITH LLVM-exception AND diff --git a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/__init__.py b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/__init__.py index 96742daf8d4..f6cce72be13 100644 --- a/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/__init__.py +++ b/contrib/libs/cxxsupp/libcxxabi/.yandex_meta/__init__.py @@ -45,14 +45,24 @@ def post_install(self): ) with self.yamakes["."] as libcxxabi: - # As of 1.2.3, musl libc does not provide __cxa_thread_atexit_impl libcxxabi.after( "SRCS", """ - IF (NOT MUSL) - CFLAGS( - -DHAVE___CXA_THREAD_ATEXIT_IMPL - ) + IF (OS_ANDROID) + # __cxa_thread_atexit_impl was introduced in Android 6.0 + # https://android.googlesource.com/platform/bionic/+/main/libc/libc.map.txt#16 + IF (ANDROID_API >= 23) + CFLAGS( + -DHAVE___CXA_THREAD_ATEXIT_IMPL + ) + ENDIF() + ELSE() + # As of 1.2.3, musl libc does not provide __cxa_thread_atexit_impl + IF (NOT MUSL) + CFLAGS( + -DHAVE___CXA_THREAD_ATEXIT_IMPL + ) + ENDIF() ENDIF() """, ) diff --git a/contrib/libs/cxxsupp/libcxxabi/ya.make b/contrib/libs/cxxsupp/libcxxabi/ya.make index c64ffff7e7f..0e7e3fae6dd 100644 --- a/contrib/libs/cxxsupp/libcxxabi/ya.make +++ b/contrib/libs/cxxsupp/libcxxabi/ya.make @@ -58,10 +58,21 @@ SRCS( src/stdlib_typeinfo.cpp ) -IF (NOT MUSL) - CFLAGS( - -DHAVE___CXA_THREAD_ATEXIT_IMPL - ) +IF (OS_ANDROID) + # __cxa_thread_atexit_impl was introduced in Android 6.0 + # https://android.googlesource.com/platform/bionic/+/main/libc/libc.map.txt#16 + IF (ANDROID_API >= 23) + CFLAGS( + -DHAVE___CXA_THREAD_ATEXIT_IMPL + ) + ENDIF() +ELSE() + # As of 1.2.3, musl libc does not provide __cxa_thread_atexit_impl + IF (NOT MUSL) + CFLAGS( + -DHAVE___CXA_THREAD_ATEXIT_IMPL + ) + ENDIF() ENDIF() IF (OS_EMSCRIPTEN AND ARCH_WASM64) diff --git a/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix b/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix index ea2b3d3c96e..877e037ad87 100644 --- a/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix +++ b/contrib/libs/cxxsupp/openmp/.yandex_meta/override.nix @@ -1,12 +1,12 @@ pkgs: attrs: with pkgs; with attrs; rec { pname = "openmp"; - version = "21.1.0"; + version = "21.1.1"; src = fetchFromGitHub { owner = "llvm"; repo = "llvm-project"; rev = "llvmorg-${version}"; - hash = "sha256-4DLEZuhREHMl2t0f1iqvXSRSE5VBMVxd94Tj4m8Yf9s="; + hash = "sha256-IB9Z3bIMwfgw2W2Vxo89CmtCM9DfOyV2Ei64nqgHrgc="; }; buildInputs = [ pkgs.python3 ]; diff --git a/contrib/libs/cxxsupp/openmp/ya.make b/contrib/libs/cxxsupp/openmp/ya.make index a201f724c57..011bd150948 100644 --- a/contrib/libs/cxxsupp/openmp/ya.make +++ b/contrib/libs/cxxsupp/openmp/ya.make @@ -12,9 +12,9 @@ LICENSE( LICENSE_TEXTS(.yandex_meta/licenses.list.txt) -VERSION(21.1.0) +VERSION(21.1.1) -ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/llvmorg-21.1.0.tar.gz) +ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/llvmorg-21.1.1.tar.gz) ADDINCL( GLOBAL contrib/libs/cxxsupp/openmp diff --git a/contrib/libs/fmt/include/fmt/format.h b/contrib/libs/fmt/include/fmt/format.h index 7d18edf0bb7..ea102a8fec9 100644 --- a/contrib/libs/fmt/include/fmt/format.h +++ b/contrib/libs/fmt/include/fmt/format.h @@ -3033,14 +3033,14 @@ constexpr auto operator""_a() return {}; } # else -constexpr auto operator"" _a(const char* s, size_t) -> detail::udl_arg<char> { +constexpr auto operator""_a(const char* s, size_t) -> detail::udl_arg<char> { return {s}; } # endif // DEPRECATED! // User-defined literal equivalent of fmt::format. -FMT_DEPRECATED constexpr auto operator"" _format(const char* s, size_t n) +FMT_DEPRECATED constexpr auto operator""_format(const char* s, size_t n) -> detail::udl_formatter<char> { return {{s, n}}; } diff --git a/contrib/libs/fmt/include/fmt/xchar.h b/contrib/libs/fmt/include/fmt/xchar.h index 55825077f8e..56a893f95c0 100644 --- a/contrib/libs/fmt/include/fmt/xchar.h +++ b/contrib/libs/fmt/include/fmt/xchar.h @@ -47,13 +47,13 @@ constexpr format_arg_store<wformat_context, Args...> make_wformat_args( } inline namespace literals { -constexpr auto operator"" _format(const wchar_t* s, size_t n) +constexpr auto operator""_format(const wchar_t* s, size_t n) -> detail::udl_formatter<wchar_t> { return {{s, n}}; } #if FMT_USE_USER_DEFINED_LITERALS && !FMT_USE_NONTYPE_TEMPLATE_PARAMETERS -constexpr detail::udl_arg<wchar_t> operator"" _a(const wchar_t* s, size_t) { +constexpr detail::udl_arg<wchar_t> operator""_a(const wchar_t* s, size_t) { return {s}; } #endif diff --git a/contrib/libs/fmt/patches/03-deprecated-literal-operator.sh b/contrib/libs/fmt/patches/03-deprecated-literal-operator.sh new file mode 100644 index 00000000000..cc49db794f6 --- /dev/null +++ b/contrib/libs/fmt/patches/03-deprecated-literal-operator.sh @@ -0,0 +1,3 @@ +set -xue +sed -e 's|operator"" |operator""|g' include/fmt/format.h -i +sed -e 's|operator"" |operator""|g' include/fmt/xchar.h -i diff --git a/contrib/libs/libfuzzer/.yandex_meta/override.nix b/contrib/libs/libfuzzer/.yandex_meta/override.nix index 39a56cb01f3..97028954c8a 100644 --- a/contrib/libs/libfuzzer/.yandex_meta/override.nix +++ b/contrib/libs/libfuzzer/.yandex_meta/override.nix @@ -1,11 +1,11 @@ pkgs: attrs: with pkgs; with attrs; rec { - version = "21.1.0"; + version = "21.1.1"; src = fetchFromGitHub { owner = "llvm"; repo = "llvm-project"; rev = "llvmorg-${version}"; - hash = "sha256-4DLEZuhREHMl2t0f1iqvXSRSE5VBMVxd94Tj4m8Yf9s="; + hash = "sha256-IB9Z3bIMwfgw2W2Vxo89CmtCM9DfOyV2Ei64nqgHrgc="; }; sourceRoot = "source/compiler-rt"; diff --git a/contrib/libs/libfuzzer/lib/fuzzer/afl/ya.make b/contrib/libs/libfuzzer/lib/fuzzer/afl/ya.make index 971906fa807..1c05725c76b 100644 --- a/contrib/libs/libfuzzer/lib/fuzzer/afl/ya.make +++ b/contrib/libs/libfuzzer/lib/fuzzer/afl/ya.make @@ -8,7 +8,7 @@ LICENSE_TEXTS(.yandex_meta/licenses.list.txt) SUBSCRIBER(g:cpp-contrib) -VERSION(21.1.0) +VERSION(21.1.1) PEERDIR( contrib/libs/afl/llvm_mode diff --git a/contrib/libs/libfuzzer/ya.make b/contrib/libs/libfuzzer/ya.make index e609fcaf2c6..faa88619d86 100644 --- a/contrib/libs/libfuzzer/ya.make +++ b/contrib/libs/libfuzzer/ya.make @@ -12,9 +12,9 @@ LICENSE( LICENSE_TEXTS(.yandex_meta/licenses.list.txt) -VERSION(21.1.0) +VERSION(21.1.1) -ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/llvmorg-21.1.0.tar.gz) +ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/llvmorg-21.1.1.tar.gz) SET(SANITIZER_CFLAGS) diff --git a/contrib/libs/libunwind/.yandex_meta/override.nix b/contrib/libs/libunwind/.yandex_meta/override.nix index 62a744391ac..1c00f543f7f 100644 --- a/contrib/libs/libunwind/.yandex_meta/override.nix +++ b/contrib/libs/libunwind/.yandex_meta/override.nix @@ -1,11 +1,11 @@ pkgs: attrs: with pkgs; with attrs; rec { - version = "21.1.0"; + version = "21.1.1"; src = fetchFromGitHub { owner = "llvm"; repo = "llvm-project"; rev = "llvmorg-${version}"; - hash = "sha256-4DLEZuhREHMl2t0f1iqvXSRSE5VBMVxd94Tj4m8Yf9s="; + hash = "sha256-IB9Z3bIMwfgw2W2Vxo89CmtCM9DfOyV2Ei64nqgHrgc="; }; patches = []; diff --git a/contrib/libs/libunwind/ya.make b/contrib/libs/libunwind/ya.make index b3178771252..9e0857cc44d 100644 --- a/contrib/libs/libunwind/ya.make +++ b/contrib/libs/libunwind/ya.make @@ -11,9 +11,9 @@ LICENSE( LICENSE_TEXTS(.yandex_meta/licenses.list.txt) -VERSION(21.1.0) +VERSION(21.1.1) -ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/llvmorg-21.1.0.tar.gz) +ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/llvmorg-21.1.1.tar.gz) PEERDIR( library/cpp/sanitizer/include diff --git a/contrib/libs/llvm/flang-rt/.yandex_meta/__init__.py b/contrib/libs/llvm/flang-rt/.yandex_meta/__init__.py new file mode 100644 index 00000000000..f951e7a4800 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/.yandex_meta/__init__.py @@ -0,0 +1,38 @@ +from devtools.yamaker.platform_macros import LLVM_VERSION +from devtools.yamaker.project import CMakeNinjaNixProject + + +def post_install(self): + with self.yamakes["."] as flang_rt: + flang_rt.before( + "END", + """ + IF (OS_WINDOWS) + LDFLAGS( + /LIBPATH:${ARCADIA_ROOT}/build/essentials/flang-empty-runtimes + ) + ENDIF() + """, + ) + + +llvm_flang_rt = CMakeNinjaNixProject( + nixattr=f"llvmPackages_{LLVM_VERSION}.compiler-rt", + arcdir="contrib/libs/llvm/flang-rt", + cmake_subdir="runtimes", + build_subdir="runtimes/build", + flags=[ + "-DLLVM_ENABLE_RUNTIMES=flang-rt", + ], + copy_sources=[ + "flang/include/flang/Common/windows-include.h", + ], + disable_includes=[ + "stdfloat", + "cuda/", + ], + platform_dispatchers=[ + "flang-rt/config.h", + ], + post_install=post_install, +) diff --git a/contrib/libs/llvm/flang-rt/.yandex_meta/devtools.copyrights.report b/contrib/libs/llvm/flang-rt/.yandex_meta/devtools.copyrights.report new file mode 100644 index 00000000000..38779d45b8a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/.yandex_meta/devtools.copyrights.report @@ -0,0 +1,46 @@ +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# $ IGNORE_FILES {file1.ext1} {file2.ext2} - (optional) ignore listed files when generating license macro and credits +# $ RENAME {original license id} TO {new license id} # user comments - (optional) use {new license id} instead {original license id} in ya.make files +# $ # user comments +# $ +# ${action} {license id} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP COPYRIGHT_SERVICE_LABEL 6889c51be687d2aa2ca198228ffada0d +BELONGS ya.make + License text: + Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. + All rights reserved. + Scancode info: + Original SPDX id: COPYRIGHT_SERVICE_LABEL + Score : 100.00 + Match type : COPYRIGHT + Files with this license: + LICENSE.TXT [242:243] diff --git a/contrib/libs/llvm/flang-rt/.yandex_meta/devtools.licenses.report b/contrib/libs/llvm/flang-rt/.yandex_meta/devtools.licenses.report new file mode 100644 index 00000000000..6b36c6c8b1d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/.yandex_meta/devtools.licenses.report @@ -0,0 +1,948 @@ +# File format ($ symbol means the beginning of a line): +# +# $ # this message +# $ # ======================= +# $ # comments (all commentaries should starts with some number of spaces and # symbol) +# $ IGNORE_FILES {file1.ext1} {file2.ext2} - (optional) ignore listed files when generating license macro and credits +# $ RENAME {original license id} TO {new license id} # user comments - (optional) use {new license id} instead {original license id} in ya.make files +# $ # user comments +# $ +# ${action} {license id} {license text hash} +# $BELONGS ./ya/make/file/relative/path/1/ya.make ./ya/make/2/ya.make +# ${all_file_action} filename +# $ # user commentaries (many lines) +# $ generated description - files with this license, license text... (some number of lines that starts with some number of spaces, do not modify) +# ${action} {license spdx} {license text hash} +# $BELONGS ./ya/make/file/relative/path/3/ya.make +# ${all_file_action} filename +# $ # user commentaries +# $ generated description +# $ ... +# +# You can modify action, all_file_action and add commentaries +# Available actions: +# keep - keep license in contrib and use in credits +# skip - skip license +# remove - remove all files with this license +# rename - save license text/links into licenses texts file, but not store SPDX into LINCENSE macro. You should store correct license id into devtools.license.spdx.txt file +# +# {all file action} records will be generated when license text contains filename that exists on filesystem (in contrib directory) +# We suppose that that files can contain some license info +# Available all file actions: +# FILE_IGNORE - ignore file (do nothing) +# FILE_INCLUDE - include all file data into licenses text file +# ======================= + +KEEP Apache-2.0 WITH LLVM-exception 3cd6ea1904395f4162edc527b90cadab +BELONGS ya.make + License text: + SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang-rt/README.md [5:5] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + flang-rt/README.md [5:5] + +KEEP Apache-2.0 WITH LLVM-exception 46de3ad957a7feef77f4d3a511e79b6a +BELONGS ya.make + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 99.69 + Match type : TEXT + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang-rt/LICENSE.TXT [2:205] + flang/LICENSE.TXT [2:205] + +KEEP Apache-2.0 WITH LLVM-exception 705a75a25bce12b12334e8fc577d8a46 +BELONGS ya.make + License text: + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang-rt/config-linux.h [3:4] + flang-rt/lib/runtime/complex-reduction.c [3:4] + flang-rt/lib/runtime/complex-reduction.h [3:4] + flang-rt/lib/runtime/environment-default-list.h [3:4] + flang/include/flang/Common/ISO_Fortran_binding_wrapper.h [3:4] + flang/include/flang/Common/api-attrs.h [3:4] + flang/include/flang/Common/float128.h [3:4] + flang/include/flang/Common/float80.h [3:4] + flang/include/flang/Decimal/decimal.h [3:4] + flang/include/flang/ISO_Fortran_binding.h [3:4] + flang/include/flang/Runtime/entry-names.h [3:4] + flang/include/flang/Runtime/magic-numbers.h [3:4] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + flang-rt/config-linux.h [3:4] + flang-rt/lib/runtime/complex-reduction.c [3:4] + flang-rt/lib/runtime/complex-reduction.h [3:4] + flang-rt/lib/runtime/environment-default-list.h [3:4] + flang/include/flang/Common/ISO_Fortran_binding_wrapper.h [3:4] + flang/include/flang/Common/api-attrs.h [3:4] + flang/include/flang/Common/float128.h [3:4] + flang/include/flang/Common/float80.h [3:4] + flang/include/flang/Decimal/decimal.h [3:4] + flang/include/flang/ISO_Fortran_binding.h [3:4] + flang/include/flang/Runtime/entry-names.h [3:4] + flang/include/flang/Runtime/magic-numbers.h [3:4] + +KEEP Apache-2.0 WITH LLVM-exception 755ab7da3ff8c5d6ae90bdbebd177e49 +BELONGS ya.make + License text: + // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + // See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang-rt/include/flang-rt/runtime/allocator-registry.h [3:4] + flang-rt/include/flang-rt/runtime/array-constructor.h [3:4] + flang-rt/include/flang-rt/runtime/assign-impl.h [3:4] + flang-rt/include/flang-rt/runtime/buffer.h [3:4] + flang-rt/include/flang-rt/runtime/connection.h [3:4] + flang-rt/include/flang-rt/runtime/derived.h [3:4] + flang-rt/include/flang-rt/runtime/descriptor.h [3:4] + flang-rt/include/flang-rt/runtime/emit-encoded.h [3:4] + flang-rt/include/flang-rt/runtime/environment.h [3:4] + flang-rt/include/flang-rt/runtime/file.h [3:4] + flang-rt/include/flang-rt/runtime/format-implementation.h [3:4] + flang-rt/include/flang-rt/runtime/format.h [3:4] + flang-rt/include/flang-rt/runtime/internal-unit.h [3:4] + flang-rt/include/flang-rt/runtime/io-error.h [3:4] + flang-rt/include/flang-rt/runtime/io-stmt.h [3:4] + flang-rt/include/flang-rt/runtime/lock.h [3:4] + flang-rt/include/flang-rt/runtime/memory.h [3:4] + flang-rt/include/flang-rt/runtime/namelist.h [3:4] + flang-rt/include/flang-rt/runtime/non-tbp-dio.h [3:4] + flang-rt/include/flang-rt/runtime/numeric-templates.h [3:4] + flang-rt/include/flang-rt/runtime/random-templates.h [3:4] + flang-rt/include/flang-rt/runtime/reduction-templates.h [3:4] + flang-rt/include/flang-rt/runtime/stat.h [3:4] + flang-rt/include/flang-rt/runtime/terminator.h [3:4] + flang-rt/include/flang-rt/runtime/tools.h [3:4] + flang-rt/include/flang-rt/runtime/type-code.h [3:4] + flang-rt/include/flang-rt/runtime/type-info.h [3:4] + flang-rt/include/flang-rt/runtime/utf.h [3:4] + flang-rt/include/flang-rt/runtime/work-queue.h [3:4] + flang-rt/lib/runtime/ISO_Fortran_binding.cpp [3:4] + flang-rt/lib/runtime/ISO_Fortran_util.h [3:4] + flang-rt/lib/runtime/allocatable.cpp [3:4] + flang-rt/lib/runtime/allocator-registry.cpp [3:4] + flang-rt/lib/runtime/array-constructor.cpp [3:4] + flang-rt/lib/runtime/assign.cpp [3:4] + flang-rt/lib/runtime/buffer.cpp [3:4] + flang-rt/lib/runtime/character.cpp [3:4] + flang-rt/lib/runtime/command.cpp [3:4] + flang-rt/lib/runtime/complex-powi.cpp [3:4] + flang-rt/lib/runtime/connection.cpp [3:4] + flang-rt/lib/runtime/copy.cpp [3:4] + flang-rt/lib/runtime/copy.h [3:4] + flang-rt/lib/runtime/derived-api.cpp [3:4] + flang-rt/lib/runtime/derived.cpp [3:4] + flang-rt/lib/runtime/descriptor-io.cpp [3:4] + flang-rt/lib/runtime/descriptor-io.h [3:4] + flang-rt/lib/runtime/descriptor.cpp [3:4] + flang-rt/lib/runtime/dot-product.cpp [3:4] + flang-rt/lib/runtime/edit-input.cpp [3:4] + flang-rt/lib/runtime/edit-input.h [3:4] + flang-rt/lib/runtime/edit-output.cpp [3:4] + flang-rt/lib/runtime/edit-output.h [3:4] + flang-rt/lib/runtime/environment.cpp [3:4] + flang-rt/lib/runtime/exceptions.cpp [3:4] + flang-rt/lib/runtime/execute.cpp [3:4] + flang-rt/lib/runtime/extensions.cpp [3:4] + flang-rt/lib/runtime/external-unit.cpp [3:4] + flang-rt/lib/runtime/extrema.cpp [3:4] + flang-rt/lib/runtime/file.cpp [3:4] + flang-rt/lib/runtime/findloc.cpp [3:4] + flang-rt/lib/runtime/format.cpp [3:4] + flang-rt/lib/runtime/inquiry.cpp [3:4] + flang-rt/lib/runtime/internal-unit.cpp [3:4] + flang-rt/lib/runtime/io-api-common.h [3:4] + flang-rt/lib/runtime/io-api-minimal.cpp [3:4] + flang-rt/lib/runtime/io-api.cpp [3:4] + flang-rt/lib/runtime/io-error.cpp [3:4] + flang-rt/lib/runtime/io-stmt.cpp [3:4] + flang-rt/lib/runtime/iostat.cpp [3:4] + flang-rt/lib/runtime/main.cpp [3:4] + flang-rt/lib/runtime/matmul-transpose.cpp [3:4] + flang-rt/lib/runtime/matmul.cpp [3:4] + flang-rt/lib/runtime/memory.cpp [3:4] + flang-rt/lib/runtime/misc-intrinsic.cpp [3:4] + flang-rt/lib/runtime/namelist.cpp [3:4] + flang-rt/lib/runtime/non-tbp-dio.cpp [3:4] + flang-rt/lib/runtime/numeric.cpp [3:4] + flang-rt/lib/runtime/pointer.cpp [3:4] + flang-rt/lib/runtime/product.cpp [3:4] + flang-rt/lib/runtime/pseudo-unit.cpp [3:4] + flang-rt/lib/runtime/ragged.cpp [3:4] + flang-rt/lib/runtime/random.cpp [3:4] + flang-rt/lib/runtime/reduce.cpp [3:4] + flang-rt/lib/runtime/reduction.cpp [3:4] + flang-rt/lib/runtime/stack.h [3:4] + flang-rt/lib/runtime/stat.cpp [3:4] + flang-rt/lib/runtime/stop.cpp [3:4] + flang-rt/lib/runtime/sum.cpp [3:4] + flang-rt/lib/runtime/support.cpp [3:4] + flang-rt/lib/runtime/temporary-stack.cpp [3:4] + flang-rt/lib/runtime/terminator.cpp [3:4] + flang-rt/lib/runtime/time-intrinsic.cpp [3:4] + flang-rt/lib/runtime/tools.cpp [3:4] + flang-rt/lib/runtime/transformational.cpp [3:4] + flang-rt/lib/runtime/type-code.cpp [3:4] + flang-rt/lib/runtime/type-info.cpp [3:4] + flang-rt/lib/runtime/unit-map.cpp [3:4] + flang-rt/lib/runtime/unit-map.h [3:4] + flang-rt/lib/runtime/unit.cpp [3:4] + flang-rt/lib/runtime/unit.h [3:4] + flang-rt/lib/runtime/utf.cpp [3:4] + flang-rt/lib/runtime/work-queue.cpp [3:4] + flang/include/flang/Common/Fortran-consts.h [3:4] + flang/include/flang/Common/bit-population-count.h [3:4] + flang/include/flang/Common/constexpr-bitset.h [3:4] + flang/include/flang/Common/enum-class.h [3:4] + flang/include/flang/Common/enum-set.h [3:4] + flang/include/flang/Common/erfc-scaled.h [3:4] + flang/include/flang/Common/fast-int-set.h [3:4] + flang/include/flang/Common/format.h [3:4] + flang/include/flang/Common/idioms.h [3:4] + flang/include/flang/Common/leading-zero-bit-count.h [3:4] + flang/include/flang/Common/optional.h [3:4] + flang/include/flang/Common/real.h [3:4] + flang/include/flang/Common/reference-wrapper.h [3:4] + flang/include/flang/Common/restorer.h [3:4] + flang/include/flang/Common/type-kinds.h [3:4] + flang/include/flang/Common/uint128.h [3:4] + flang/include/flang/Common/variant.h [3:4] + flang/include/flang/Common/visit.h [3:4] + flang/include/flang/Common/windows-include.h [3:4] + flang/include/flang/Decimal/binary-floating-point.h [3:4] + flang/include/flang/Runtime/allocatable.h [3:4] + flang/include/flang/Runtime/allocator-registry-consts.h [3:4] + flang/include/flang/Runtime/array-constructor-consts.h [3:4] + flang/include/flang/Runtime/assign.h [3:4] + flang/include/flang/Runtime/c-or-cpp.h [3:4] + flang/include/flang/Runtime/character.h [3:4] + flang/include/flang/Runtime/command.h [3:4] + flang/include/flang/Runtime/complex.h [3:4] + flang/include/flang/Runtime/cpp-type.h [3:4] + flang/include/flang/Runtime/derived-api.h [3:4] + flang/include/flang/Runtime/descriptor-consts.h [3:4] + flang/include/flang/Runtime/exceptions.h [3:4] + flang/include/flang/Runtime/execute.h [3:4] + flang/include/flang/Runtime/extensions.h [3:4] + flang/include/flang/Runtime/freestanding-tools.h [3:4] + flang/include/flang/Runtime/inquiry.h [3:4] + flang/include/flang/Runtime/io-api.h [3:4] + flang/include/flang/Runtime/iostat-consts.h [3:4] + flang/include/flang/Runtime/iostat.h [3:4] + flang/include/flang/Runtime/main.h [3:4] + flang/include/flang/Runtime/matmul-instances.inc [3:4] + flang/include/flang/Runtime/matmul-transpose.h [3:4] + flang/include/flang/Runtime/matmul.h [3:4] + flang/include/flang/Runtime/misc-intrinsic.h [3:4] + flang/include/flang/Runtime/numeric.h [3:4] + flang/include/flang/Runtime/pointer.h [3:4] + flang/include/flang/Runtime/ragged.h [3:4] + flang/include/flang/Runtime/random.h [3:4] + flang/include/flang/Runtime/reduce.h [3:4] + flang/include/flang/Runtime/reduction.h [3:4] + flang/include/flang/Runtime/stop.h [3:4] + flang/include/flang/Runtime/support.h [3:4] + flang/include/flang/Runtime/temporary-stack.h [3:4] + flang/include/flang/Runtime/time-intrinsic.h [3:4] + flang/include/flang/Runtime/transformational.h [3:4] + flang/lib/Decimal/big-radix-floating-point.h [3:4] + flang/lib/Decimal/binary-to-decimal.cpp [3:4] + flang/lib/Decimal/decimal-to-binary.cpp [3:4] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + flang-rt/include/flang-rt/runtime/allocator-registry.h [3:4] + flang-rt/include/flang-rt/runtime/array-constructor.h [3:4] + flang-rt/include/flang-rt/runtime/assign-impl.h [3:4] + flang-rt/include/flang-rt/runtime/buffer.h [3:4] + flang-rt/include/flang-rt/runtime/connection.h [3:4] + flang-rt/include/flang-rt/runtime/derived.h [3:4] + flang-rt/include/flang-rt/runtime/descriptor.h [3:4] + flang-rt/include/flang-rt/runtime/emit-encoded.h [3:4] + flang-rt/include/flang-rt/runtime/environment.h [3:4] + flang-rt/include/flang-rt/runtime/file.h [3:4] + flang-rt/include/flang-rt/runtime/format-implementation.h [3:4] + flang-rt/include/flang-rt/runtime/format.h [3:4] + flang-rt/include/flang-rt/runtime/internal-unit.h [3:4] + flang-rt/include/flang-rt/runtime/io-error.h [3:4] + flang-rt/include/flang-rt/runtime/io-stmt.h [3:4] + flang-rt/include/flang-rt/runtime/lock.h [3:4] + flang-rt/include/flang-rt/runtime/memory.h [3:4] + flang-rt/include/flang-rt/runtime/namelist.h [3:4] + flang-rt/include/flang-rt/runtime/non-tbp-dio.h [3:4] + flang-rt/include/flang-rt/runtime/numeric-templates.h [3:4] + flang-rt/include/flang-rt/runtime/random-templates.h [3:4] + flang-rt/include/flang-rt/runtime/reduction-templates.h [3:4] + flang-rt/include/flang-rt/runtime/stat.h [3:4] + flang-rt/include/flang-rt/runtime/terminator.h [3:4] + flang-rt/include/flang-rt/runtime/tools.h [3:4] + flang-rt/include/flang-rt/runtime/type-code.h [3:4] + flang-rt/include/flang-rt/runtime/type-info.h [3:4] + flang-rt/include/flang-rt/runtime/utf.h [3:4] + flang-rt/include/flang-rt/runtime/work-queue.h [3:4] + flang-rt/lib/runtime/ISO_Fortran_binding.cpp [3:4] + flang-rt/lib/runtime/ISO_Fortran_util.h [3:4] + flang-rt/lib/runtime/allocatable.cpp [3:4] + flang-rt/lib/runtime/allocator-registry.cpp [3:4] + flang-rt/lib/runtime/array-constructor.cpp [3:4] + flang-rt/lib/runtime/assign.cpp [3:4] + flang-rt/lib/runtime/buffer.cpp [3:4] + flang-rt/lib/runtime/character.cpp [3:4] + flang-rt/lib/runtime/command.cpp [3:4] + flang-rt/lib/runtime/complex-powi.cpp [3:4] + flang-rt/lib/runtime/connection.cpp [3:4] + flang-rt/lib/runtime/copy.cpp [3:4] + flang-rt/lib/runtime/copy.h [3:4] + flang-rt/lib/runtime/derived-api.cpp [3:4] + flang-rt/lib/runtime/derived.cpp [3:4] + flang-rt/lib/runtime/descriptor-io.cpp [3:4] + flang-rt/lib/runtime/descriptor-io.h [3:4] + flang-rt/lib/runtime/descriptor.cpp [3:4] + flang-rt/lib/runtime/dot-product.cpp [3:4] + flang-rt/lib/runtime/edit-input.cpp [3:4] + flang-rt/lib/runtime/edit-input.h [3:4] + flang-rt/lib/runtime/edit-output.cpp [3:4] + flang-rt/lib/runtime/edit-output.h [3:4] + flang-rt/lib/runtime/environment.cpp [3:4] + flang-rt/lib/runtime/exceptions.cpp [3:4] + flang-rt/lib/runtime/execute.cpp [3:4] + flang-rt/lib/runtime/extensions.cpp [3:4] + flang-rt/lib/runtime/external-unit.cpp [3:4] + flang-rt/lib/runtime/extrema.cpp [3:4] + flang-rt/lib/runtime/file.cpp [3:4] + flang-rt/lib/runtime/findloc.cpp [3:4] + flang-rt/lib/runtime/format.cpp [3:4] + flang-rt/lib/runtime/inquiry.cpp [3:4] + flang-rt/lib/runtime/internal-unit.cpp [3:4] + flang-rt/lib/runtime/io-api-common.h [3:4] + flang-rt/lib/runtime/io-api-minimal.cpp [3:4] + flang-rt/lib/runtime/io-api.cpp [3:4] + flang-rt/lib/runtime/io-error.cpp [3:4] + flang-rt/lib/runtime/io-stmt.cpp [3:4] + flang-rt/lib/runtime/iostat.cpp [3:4] + flang-rt/lib/runtime/main.cpp [3:4] + flang-rt/lib/runtime/matmul-transpose.cpp [3:4] + flang-rt/lib/runtime/matmul.cpp [3:4] + flang-rt/lib/runtime/memory.cpp [3:4] + flang-rt/lib/runtime/misc-intrinsic.cpp [3:4] + flang-rt/lib/runtime/namelist.cpp [3:4] + flang-rt/lib/runtime/non-tbp-dio.cpp [3:4] + flang-rt/lib/runtime/numeric.cpp [3:4] + flang-rt/lib/runtime/pointer.cpp [3:4] + flang-rt/lib/runtime/product.cpp [3:4] + flang-rt/lib/runtime/pseudo-unit.cpp [3:4] + flang-rt/lib/runtime/ragged.cpp [3:4] + flang-rt/lib/runtime/random.cpp [3:4] + flang-rt/lib/runtime/reduce.cpp [3:4] + flang-rt/lib/runtime/reduction.cpp [3:4] + flang-rt/lib/runtime/stack.h [3:4] + flang-rt/lib/runtime/stat.cpp [3:4] + flang-rt/lib/runtime/stop.cpp [3:4] + flang-rt/lib/runtime/sum.cpp [3:4] + flang-rt/lib/runtime/support.cpp [3:4] + flang-rt/lib/runtime/temporary-stack.cpp [3:4] + flang-rt/lib/runtime/terminator.cpp [3:4] + flang-rt/lib/runtime/time-intrinsic.cpp [3:4] + flang-rt/lib/runtime/tools.cpp [3:4] + flang-rt/lib/runtime/transformational.cpp [3:4] + flang-rt/lib/runtime/type-code.cpp [3:4] + flang-rt/lib/runtime/type-info.cpp [3:4] + flang-rt/lib/runtime/unit-map.cpp [3:4] + flang-rt/lib/runtime/unit-map.h [3:4] + flang-rt/lib/runtime/unit.cpp [3:4] + flang-rt/lib/runtime/unit.h [3:4] + flang-rt/lib/runtime/utf.cpp [3:4] + flang-rt/lib/runtime/work-queue.cpp [3:4] + flang/include/flang/Common/Fortran-consts.h [3:4] + flang/include/flang/Common/bit-population-count.h [3:4] + flang/include/flang/Common/constexpr-bitset.h [3:4] + flang/include/flang/Common/enum-class.h [3:4] + flang/include/flang/Common/enum-set.h [3:4] + flang/include/flang/Common/erfc-scaled.h [3:4] + flang/include/flang/Common/fast-int-set.h [3:4] + flang/include/flang/Common/format.h [3:4] + flang/include/flang/Common/idioms.h [3:4] + flang/include/flang/Common/leading-zero-bit-count.h [3:4] + flang/include/flang/Common/optional.h [3:4] + flang/include/flang/Common/real.h [3:4] + flang/include/flang/Common/reference-wrapper.h [3:4] + flang/include/flang/Common/restorer.h [3:4] + flang/include/flang/Common/type-kinds.h [3:4] + flang/include/flang/Common/uint128.h [3:4] + flang/include/flang/Common/variant.h [3:4] + flang/include/flang/Common/visit.h [3:4] + flang/include/flang/Common/windows-include.h [3:4] + flang/include/flang/Decimal/binary-floating-point.h [3:4] + flang/include/flang/Runtime/allocatable.h [3:4] + flang/include/flang/Runtime/allocator-registry-consts.h [3:4] + flang/include/flang/Runtime/array-constructor-consts.h [3:4] + flang/include/flang/Runtime/assign.h [3:4] + flang/include/flang/Runtime/c-or-cpp.h [3:4] + flang/include/flang/Runtime/character.h [3:4] + flang/include/flang/Runtime/command.h [3:4] + flang/include/flang/Runtime/complex.h [3:4] + flang/include/flang/Runtime/cpp-type.h [3:4] + flang/include/flang/Runtime/derived-api.h [3:4] + flang/include/flang/Runtime/descriptor-consts.h [3:4] + flang/include/flang/Runtime/exceptions.h [3:4] + flang/include/flang/Runtime/execute.h [3:4] + flang/include/flang/Runtime/extensions.h [3:4] + flang/include/flang/Runtime/freestanding-tools.h [3:4] + flang/include/flang/Runtime/inquiry.h [3:4] + flang/include/flang/Runtime/io-api.h [3:4] + flang/include/flang/Runtime/iostat-consts.h [3:4] + flang/include/flang/Runtime/iostat.h [3:4] + flang/include/flang/Runtime/main.h [3:4] + flang/include/flang/Runtime/matmul-instances.inc [3:4] + flang/include/flang/Runtime/matmul-transpose.h [3:4] + flang/include/flang/Runtime/matmul.h [3:4] + flang/include/flang/Runtime/misc-intrinsic.h [3:4] + flang/include/flang/Runtime/numeric.h [3:4] + flang/include/flang/Runtime/pointer.h [3:4] + flang/include/flang/Runtime/ragged.h [3:4] + flang/include/flang/Runtime/random.h [3:4] + flang/include/flang/Runtime/reduce.h [3:4] + flang/include/flang/Runtime/reduction.h [3:4] + flang/include/flang/Runtime/stop.h [3:4] + flang/include/flang/Runtime/support.h [3:4] + flang/include/flang/Runtime/temporary-stack.h [3:4] + flang/include/flang/Runtime/time-intrinsic.h [3:4] + flang/include/flang/Runtime/transformational.h [3:4] + flang/lib/Decimal/big-radix-floating-point.h [3:4] + flang/lib/Decimal/binary-to-decimal.cpp [3:4] + flang/lib/Decimal/decimal-to-binary.cpp [3:4] + +KEEP NCSA 7e1c6e0177b0a462d79445a1e2d85892 +BELONGS ya.make + License text: + Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): + ============================================================================== + University of Illinois/NCSA + Open Source License + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : REFERENCE + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + LICENSE.TXT [237:240] + +KEEP Apache-2.0 WITH LLVM-exception 8494a9caed330d9a4f40e19cce7dc770 +BELONGS ya.make + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TEXT + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + LICENSE.TXT [208:222] + flang-rt/LICENSE.TXT [208:222] + flang/LICENSE.TXT [208:222] + +KEEP Apache-2.0 WITH LLVM-exception 920007a31ffdd1aecc6f9a8b12515826 +BELONGS ya.make + License text: + // The original source code is distributed under the Apache License v2.0 + Scancode info: + Original SPDX id: LicenseRef-scancode-unknown-license-reference + Score : 11.00 + Match type : INTRO + Links : https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unknown-license-reference.LICENSE + Files with this license: + flang/include/flang/Common/reference-wrapper.h [14:14] + +KEEP Apache-2.0 WITH LLVM-exception 9ac77f65a898755c7eed97099caded94 +BELONGS ya.make + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TEXT + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + LICENSE.TXT [5:205] + +KEEP NCSA b160d8bd561da097b0edd40b062e1c84 +BELONGS ya.make + Note: matched license text is too long. Read it in the source files. + Scancode info: + Original SPDX id: NCSA + Score : 100.00 + Match type : TEXT + Links : http://www.otm.illinois.edu/faculty/forms/opensource.asp, https://spdx.org/licenses/NCSA + Files with this license: + LICENSE.TXT [253:278] + +KEEP Apache-2.0 WITH LLVM-exception b7566a1930e050e1090162bf1d543650 +BELONGS ya.make + License text: + // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang-rt/include/flang-rt/runtime/allocator-registry.h [5:5] + flang-rt/include/flang-rt/runtime/array-constructor.h [5:5] + flang-rt/include/flang-rt/runtime/assign-impl.h [5:5] + flang-rt/include/flang-rt/runtime/buffer.h [5:5] + flang-rt/include/flang-rt/runtime/connection.h [5:5] + flang-rt/include/flang-rt/runtime/derived.h [5:5] + flang-rt/include/flang-rt/runtime/descriptor.h [5:5] + flang-rt/include/flang-rt/runtime/emit-encoded.h [5:5] + flang-rt/include/flang-rt/runtime/environment.h [5:5] + flang-rt/include/flang-rt/runtime/file.h [5:5] + flang-rt/include/flang-rt/runtime/format-implementation.h [5:5] + flang-rt/include/flang-rt/runtime/format.h [5:5] + flang-rt/include/flang-rt/runtime/internal-unit.h [5:5] + flang-rt/include/flang-rt/runtime/io-error.h [5:5] + flang-rt/include/flang-rt/runtime/io-stmt.h [5:5] + flang-rt/include/flang-rt/runtime/lock.h [5:5] + flang-rt/include/flang-rt/runtime/memory.h [5:5] + flang-rt/include/flang-rt/runtime/namelist.h [5:5] + flang-rt/include/flang-rt/runtime/non-tbp-dio.h [5:5] + flang-rt/include/flang-rt/runtime/numeric-templates.h [5:5] + flang-rt/include/flang-rt/runtime/random-templates.h [5:5] + flang-rt/include/flang-rt/runtime/reduction-templates.h [5:5] + flang-rt/include/flang-rt/runtime/stat.h [5:5] + flang-rt/include/flang-rt/runtime/terminator.h [5:5] + flang-rt/include/flang-rt/runtime/tools.h [5:5] + flang-rt/include/flang-rt/runtime/type-code.h [5:5] + flang-rt/include/flang-rt/runtime/type-info.h [5:5] + flang-rt/include/flang-rt/runtime/utf.h [5:5] + flang-rt/include/flang-rt/runtime/work-queue.h [5:5] + flang-rt/lib/runtime/ISO_Fortran_binding.cpp [5:5] + flang-rt/lib/runtime/ISO_Fortran_util.h [5:5] + flang-rt/lib/runtime/allocatable.cpp [5:5] + flang-rt/lib/runtime/allocator-registry.cpp [5:5] + flang-rt/lib/runtime/array-constructor.cpp [5:5] + flang-rt/lib/runtime/assign.cpp [5:5] + flang-rt/lib/runtime/buffer.cpp [5:5] + flang-rt/lib/runtime/character.cpp [5:5] + flang-rt/lib/runtime/command.cpp [5:5] + flang-rt/lib/runtime/complex-powi.cpp [5:5] + flang-rt/lib/runtime/connection.cpp [5:5] + flang-rt/lib/runtime/copy.cpp [5:5] + flang-rt/lib/runtime/copy.h [5:5] + flang-rt/lib/runtime/derived-api.cpp [5:5] + flang-rt/lib/runtime/derived.cpp [5:5] + flang-rt/lib/runtime/descriptor-io.cpp [5:5] + flang-rt/lib/runtime/descriptor-io.h [5:5] + flang-rt/lib/runtime/descriptor.cpp [5:5] + flang-rt/lib/runtime/dot-product.cpp [5:5] + flang-rt/lib/runtime/edit-input.cpp [5:5] + flang-rt/lib/runtime/edit-input.h [5:5] + flang-rt/lib/runtime/edit-output.cpp [5:5] + flang-rt/lib/runtime/edit-output.h [5:5] + flang-rt/lib/runtime/environment.cpp [5:5] + flang-rt/lib/runtime/exceptions.cpp [5:5] + flang-rt/lib/runtime/execute.cpp [5:5] + flang-rt/lib/runtime/extensions.cpp [5:5] + flang-rt/lib/runtime/external-unit.cpp [5:5] + flang-rt/lib/runtime/extrema.cpp [5:5] + flang-rt/lib/runtime/file.cpp [5:5] + flang-rt/lib/runtime/findloc.cpp [5:5] + flang-rt/lib/runtime/format.cpp [5:5] + flang-rt/lib/runtime/inquiry.cpp [5:5] + flang-rt/lib/runtime/internal-unit.cpp [5:5] + flang-rt/lib/runtime/io-api-common.h [5:5] + flang-rt/lib/runtime/io-api-minimal.cpp [5:5] + flang-rt/lib/runtime/io-api.cpp [5:5] + flang-rt/lib/runtime/io-error.cpp [5:5] + flang-rt/lib/runtime/io-stmt.cpp [5:5] + flang-rt/lib/runtime/iostat.cpp [5:5] + flang-rt/lib/runtime/main.cpp [5:5] + flang-rt/lib/runtime/matmul-transpose.cpp [5:5] + flang-rt/lib/runtime/matmul.cpp [5:5] + flang-rt/lib/runtime/memory.cpp [5:5] + flang-rt/lib/runtime/misc-intrinsic.cpp [5:5] + flang-rt/lib/runtime/namelist.cpp [5:5] + flang-rt/lib/runtime/non-tbp-dio.cpp [5:5] + flang-rt/lib/runtime/numeric.cpp [5:5] + flang-rt/lib/runtime/pointer.cpp [5:5] + flang-rt/lib/runtime/product.cpp [5:5] + flang-rt/lib/runtime/pseudo-unit.cpp [5:5] + flang-rt/lib/runtime/ragged.cpp [5:5] + flang-rt/lib/runtime/random.cpp [5:5] + flang-rt/lib/runtime/reduce.cpp [5:5] + flang-rt/lib/runtime/reduction.cpp [5:5] + flang-rt/lib/runtime/stack.h [5:5] + flang-rt/lib/runtime/stat.cpp [5:5] + flang-rt/lib/runtime/stop.cpp [5:5] + flang-rt/lib/runtime/sum.cpp [5:5] + flang-rt/lib/runtime/support.cpp [5:5] + flang-rt/lib/runtime/temporary-stack.cpp [5:5] + flang-rt/lib/runtime/terminator.cpp [5:5] + flang-rt/lib/runtime/time-intrinsic.cpp [5:5] + flang-rt/lib/runtime/tools.cpp [5:5] + flang-rt/lib/runtime/transformational.cpp [5:5] + flang-rt/lib/runtime/type-code.cpp [5:5] + flang-rt/lib/runtime/type-info.cpp [5:5] + flang-rt/lib/runtime/unit-map.cpp [5:5] + flang-rt/lib/runtime/unit-map.h [5:5] + flang-rt/lib/runtime/unit.cpp [5:5] + flang-rt/lib/runtime/unit.h [5:5] + flang-rt/lib/runtime/utf.cpp [5:5] + flang-rt/lib/runtime/work-queue.cpp [5:5] + flang/include/flang/Common/Fortran-consts.h [5:5] + flang/include/flang/Common/bit-population-count.h [5:5] + flang/include/flang/Common/constexpr-bitset.h [5:5] + flang/include/flang/Common/enum-class.h [5:5] + flang/include/flang/Common/enum-set.h [5:5] + flang/include/flang/Common/erfc-scaled.h [5:5] + flang/include/flang/Common/fast-int-set.h [5:5] + flang/include/flang/Common/format.h [5:5] + flang/include/flang/Common/idioms.h [5:5] + flang/include/flang/Common/leading-zero-bit-count.h [5:5] + flang/include/flang/Common/optional.h [5:5] + flang/include/flang/Common/real.h [5:5] + flang/include/flang/Common/reference-wrapper.h [5:5] + flang/include/flang/Common/restorer.h [5:5] + flang/include/flang/Common/type-kinds.h [5:5] + flang/include/flang/Common/uint128.h [5:5] + flang/include/flang/Common/variant.h [5:5] + flang/include/flang/Common/visit.h [5:5] + flang/include/flang/Common/windows-include.h [5:5] + flang/include/flang/Decimal/binary-floating-point.h [5:5] + flang/include/flang/Runtime/allocatable.h [5:5] + flang/include/flang/Runtime/allocator-registry-consts.h [5:5] + flang/include/flang/Runtime/array-constructor-consts.h [5:5] + flang/include/flang/Runtime/assign.h [5:5] + flang/include/flang/Runtime/c-or-cpp.h [5:5] + flang/include/flang/Runtime/character.h [5:5] + flang/include/flang/Runtime/command.h [5:5] + flang/include/flang/Runtime/complex.h [5:5] + flang/include/flang/Runtime/cpp-type.h [5:5] + flang/include/flang/Runtime/derived-api.h [5:5] + flang/include/flang/Runtime/descriptor-consts.h [5:5] + flang/include/flang/Runtime/exceptions.h [5:5] + flang/include/flang/Runtime/execute.h [5:5] + flang/include/flang/Runtime/extensions.h [5:5] + flang/include/flang/Runtime/freestanding-tools.h [5:5] + flang/include/flang/Runtime/inquiry.h [5:5] + flang/include/flang/Runtime/io-api.h [5:5] + flang/include/flang/Runtime/iostat-consts.h [5:5] + flang/include/flang/Runtime/iostat.h [5:5] + flang/include/flang/Runtime/main.h [5:5] + flang/include/flang/Runtime/matmul-instances.inc [5:5] + flang/include/flang/Runtime/matmul-transpose.h [5:5] + flang/include/flang/Runtime/matmul.h [5:5] + flang/include/flang/Runtime/misc-intrinsic.h [5:5] + flang/include/flang/Runtime/numeric.h [5:5] + flang/include/flang/Runtime/pointer.h [5:5] + flang/include/flang/Runtime/ragged.h [5:5] + flang/include/flang/Runtime/random.h [5:5] + flang/include/flang/Runtime/reduce.h [5:5] + flang/include/flang/Runtime/reduction.h [5:5] + flang/include/flang/Runtime/stop.h [5:5] + flang/include/flang/Runtime/support.h [5:5] + flang/include/flang/Runtime/temporary-stack.h [5:5] + flang/include/flang/Runtime/time-intrinsic.h [5:5] + flang/include/flang/Runtime/transformational.h [5:5] + flang/lib/Decimal/big-radix-floating-point.h [5:5] + flang/lib/Decimal/binary-to-decimal.cpp [5:5] + flang/lib/Decimal/decimal-to-binary.cpp [5:5] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + flang-rt/include/flang-rt/runtime/allocator-registry.h [5:5] + flang-rt/include/flang-rt/runtime/array-constructor.h [5:5] + flang-rt/include/flang-rt/runtime/assign-impl.h [5:5] + flang-rt/include/flang-rt/runtime/buffer.h [5:5] + flang-rt/include/flang-rt/runtime/connection.h [5:5] + flang-rt/include/flang-rt/runtime/derived.h [5:5] + flang-rt/include/flang-rt/runtime/descriptor.h [5:5] + flang-rt/include/flang-rt/runtime/emit-encoded.h [5:5] + flang-rt/include/flang-rt/runtime/environment.h [5:5] + flang-rt/include/flang-rt/runtime/file.h [5:5] + flang-rt/include/flang-rt/runtime/format-implementation.h [5:5] + flang-rt/include/flang-rt/runtime/format.h [5:5] + flang-rt/include/flang-rt/runtime/internal-unit.h [5:5] + flang-rt/include/flang-rt/runtime/io-error.h [5:5] + flang-rt/include/flang-rt/runtime/io-stmt.h [5:5] + flang-rt/include/flang-rt/runtime/lock.h [5:5] + flang-rt/include/flang-rt/runtime/memory.h [5:5] + flang-rt/include/flang-rt/runtime/namelist.h [5:5] + flang-rt/include/flang-rt/runtime/non-tbp-dio.h [5:5] + flang-rt/include/flang-rt/runtime/numeric-templates.h [5:5] + flang-rt/include/flang-rt/runtime/random-templates.h [5:5] + flang-rt/include/flang-rt/runtime/reduction-templates.h [5:5] + flang-rt/include/flang-rt/runtime/stat.h [5:5] + flang-rt/include/flang-rt/runtime/terminator.h [5:5] + flang-rt/include/flang-rt/runtime/tools.h [5:5] + flang-rt/include/flang-rt/runtime/type-code.h [5:5] + flang-rt/include/flang-rt/runtime/type-info.h [5:5] + flang-rt/include/flang-rt/runtime/utf.h [5:5] + flang-rt/include/flang-rt/runtime/work-queue.h [5:5] + flang-rt/lib/runtime/ISO_Fortran_binding.cpp [5:5] + flang-rt/lib/runtime/ISO_Fortran_util.h [5:5] + flang-rt/lib/runtime/allocatable.cpp [5:5] + flang-rt/lib/runtime/allocator-registry.cpp [5:5] + flang-rt/lib/runtime/array-constructor.cpp [5:5] + flang-rt/lib/runtime/assign.cpp [5:5] + flang-rt/lib/runtime/buffer.cpp [5:5] + flang-rt/lib/runtime/character.cpp [5:5] + flang-rt/lib/runtime/command.cpp [5:5] + flang-rt/lib/runtime/complex-powi.cpp [5:5] + flang-rt/lib/runtime/connection.cpp [5:5] + flang-rt/lib/runtime/copy.cpp [5:5] + flang-rt/lib/runtime/copy.h [5:5] + flang-rt/lib/runtime/derived-api.cpp [5:5] + flang-rt/lib/runtime/derived.cpp [5:5] + flang-rt/lib/runtime/descriptor-io.cpp [5:5] + flang-rt/lib/runtime/descriptor-io.h [5:5] + flang-rt/lib/runtime/descriptor.cpp [5:5] + flang-rt/lib/runtime/dot-product.cpp [5:5] + flang-rt/lib/runtime/edit-input.cpp [5:5] + flang-rt/lib/runtime/edit-input.h [5:5] + flang-rt/lib/runtime/edit-output.cpp [5:5] + flang-rt/lib/runtime/edit-output.h [5:5] + flang-rt/lib/runtime/environment.cpp [5:5] + flang-rt/lib/runtime/exceptions.cpp [5:5] + flang-rt/lib/runtime/execute.cpp [5:5] + flang-rt/lib/runtime/extensions.cpp [5:5] + flang-rt/lib/runtime/external-unit.cpp [5:5] + flang-rt/lib/runtime/extrema.cpp [5:5] + flang-rt/lib/runtime/file.cpp [5:5] + flang-rt/lib/runtime/findloc.cpp [5:5] + flang-rt/lib/runtime/format.cpp [5:5] + flang-rt/lib/runtime/inquiry.cpp [5:5] + flang-rt/lib/runtime/internal-unit.cpp [5:5] + flang-rt/lib/runtime/io-api-common.h [5:5] + flang-rt/lib/runtime/io-api-minimal.cpp [5:5] + flang-rt/lib/runtime/io-api.cpp [5:5] + flang-rt/lib/runtime/io-error.cpp [5:5] + flang-rt/lib/runtime/io-stmt.cpp [5:5] + flang-rt/lib/runtime/iostat.cpp [5:5] + flang-rt/lib/runtime/main.cpp [5:5] + flang-rt/lib/runtime/matmul-transpose.cpp [5:5] + flang-rt/lib/runtime/matmul.cpp [5:5] + flang-rt/lib/runtime/memory.cpp [5:5] + flang-rt/lib/runtime/misc-intrinsic.cpp [5:5] + flang-rt/lib/runtime/namelist.cpp [5:5] + flang-rt/lib/runtime/non-tbp-dio.cpp [5:5] + flang-rt/lib/runtime/numeric.cpp [5:5] + flang-rt/lib/runtime/pointer.cpp [5:5] + flang-rt/lib/runtime/product.cpp [5:5] + flang-rt/lib/runtime/pseudo-unit.cpp [5:5] + flang-rt/lib/runtime/ragged.cpp [5:5] + flang-rt/lib/runtime/random.cpp [5:5] + flang-rt/lib/runtime/reduce.cpp [5:5] + flang-rt/lib/runtime/reduction.cpp [5:5] + flang-rt/lib/runtime/stack.h [5:5] + flang-rt/lib/runtime/stat.cpp [5:5] + flang-rt/lib/runtime/stop.cpp [5:5] + flang-rt/lib/runtime/sum.cpp [5:5] + flang-rt/lib/runtime/support.cpp [5:5] + flang-rt/lib/runtime/temporary-stack.cpp [5:5] + flang-rt/lib/runtime/terminator.cpp [5:5] + flang-rt/lib/runtime/time-intrinsic.cpp [5:5] + flang-rt/lib/runtime/tools.cpp [5:5] + flang-rt/lib/runtime/transformational.cpp [5:5] + flang-rt/lib/runtime/type-code.cpp [5:5] + flang-rt/lib/runtime/type-info.cpp [5:5] + flang-rt/lib/runtime/unit-map.cpp [5:5] + flang-rt/lib/runtime/unit-map.h [5:5] + flang-rt/lib/runtime/unit.cpp [5:5] + flang-rt/lib/runtime/unit.h [5:5] + flang-rt/lib/runtime/utf.cpp [5:5] + flang-rt/lib/runtime/work-queue.cpp [5:5] + flang/include/flang/Common/Fortran-consts.h [5:5] + flang/include/flang/Common/bit-population-count.h [5:5] + flang/include/flang/Common/constexpr-bitset.h [5:5] + flang/include/flang/Common/enum-class.h [5:5] + flang/include/flang/Common/enum-set.h [5:5] + flang/include/flang/Common/erfc-scaled.h [5:5] + flang/include/flang/Common/fast-int-set.h [5:5] + flang/include/flang/Common/format.h [5:5] + flang/include/flang/Common/idioms.h [5:5] + flang/include/flang/Common/leading-zero-bit-count.h [5:5] + flang/include/flang/Common/optional.h [5:5] + flang/include/flang/Common/real.h [5:5] + flang/include/flang/Common/reference-wrapper.h [5:5] + flang/include/flang/Common/restorer.h [5:5] + flang/include/flang/Common/type-kinds.h [5:5] + flang/include/flang/Common/uint128.h [5:5] + flang/include/flang/Common/variant.h [5:5] + flang/include/flang/Common/visit.h [5:5] + flang/include/flang/Common/windows-include.h [5:5] + flang/include/flang/Decimal/binary-floating-point.h [5:5] + flang/include/flang/Runtime/allocatable.h [5:5] + flang/include/flang/Runtime/allocator-registry-consts.h [5:5] + flang/include/flang/Runtime/array-constructor-consts.h [5:5] + flang/include/flang/Runtime/assign.h [5:5] + flang/include/flang/Runtime/c-or-cpp.h [5:5] + flang/include/flang/Runtime/character.h [5:5] + flang/include/flang/Runtime/command.h [5:5] + flang/include/flang/Runtime/complex.h [5:5] + flang/include/flang/Runtime/cpp-type.h [5:5] + flang/include/flang/Runtime/derived-api.h [5:5] + flang/include/flang/Runtime/descriptor-consts.h [5:5] + flang/include/flang/Runtime/exceptions.h [5:5] + flang/include/flang/Runtime/execute.h [5:5] + flang/include/flang/Runtime/extensions.h [5:5] + flang/include/flang/Runtime/freestanding-tools.h [5:5] + flang/include/flang/Runtime/inquiry.h [5:5] + flang/include/flang/Runtime/io-api.h [5:5] + flang/include/flang/Runtime/iostat-consts.h [5:5] + flang/include/flang/Runtime/iostat.h [5:5] + flang/include/flang/Runtime/main.h [5:5] + flang/include/flang/Runtime/matmul-instances.inc [5:5] + flang/include/flang/Runtime/matmul-transpose.h [5:5] + flang/include/flang/Runtime/matmul.h [5:5] + flang/include/flang/Runtime/misc-intrinsic.h [5:5] + flang/include/flang/Runtime/numeric.h [5:5] + flang/include/flang/Runtime/pointer.h [5:5] + flang/include/flang/Runtime/ragged.h [5:5] + flang/include/flang/Runtime/random.h [5:5] + flang/include/flang/Runtime/reduce.h [5:5] + flang/include/flang/Runtime/reduction.h [5:5] + flang/include/flang/Runtime/stop.h [5:5] + flang/include/flang/Runtime/support.h [5:5] + flang/include/flang/Runtime/temporary-stack.h [5:5] + flang/include/flang/Runtime/time-intrinsic.h [5:5] + flang/include/flang/Runtime/transformational.h [5:5] + flang/lib/Decimal/big-radix-floating-point.h [5:5] + flang/lib/Decimal/binary-to-decimal.cpp [5:5] + flang/lib/Decimal/decimal-to-binary.cpp [5:5] + +KEEP Apache-2.0 WITH LLVM-exception c1e6c6536fcc444f916047679115c618 +BELONGS ya.make + License text: + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : TAG + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang-rt/config-linux.h [5:5] + flang-rt/lib/runtime/complex-reduction.c [5:5] + flang-rt/lib/runtime/complex-reduction.h [5:5] + flang-rt/lib/runtime/environment-default-list.h [5:5] + flang/include/flang/Common/ISO_Fortran_binding_wrapper.h [5:5] + flang/include/flang/Common/api-attrs.h [5:5] + flang/include/flang/Common/float128.h [5:5] + flang/include/flang/Common/float80.h [5:5] + flang/include/flang/Decimal/decimal.h [5:5] + flang/include/flang/ISO_Fortran_binding.h [5:5] + flang/include/flang/Runtime/entry-names.h [5:5] + flang/include/flang/Runtime/magic-numbers.h [5:5] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : TAG + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + flang-rt/config-linux.h [5:5] + flang-rt/lib/runtime/complex-reduction.c [5:5] + flang-rt/lib/runtime/complex-reduction.h [5:5] + flang-rt/lib/runtime/environment-default-list.h [5:5] + flang/include/flang/Common/ISO_Fortran_binding_wrapper.h [5:5] + flang/include/flang/Common/api-attrs.h [5:5] + flang/include/flang/Common/float128.h [5:5] + flang/include/flang/Common/float80.h [5:5] + flang/include/flang/Decimal/decimal.h [5:5] + flang/include/flang/ISO_Fortran_binding.h [5:5] + flang/include/flang/Runtime/entry-names.h [5:5] + flang/include/flang/Runtime/magic-numbers.h [5:5] + +KEEP Apache-2.0 WITH LLVM-exception df18889e552d44a4679aff552267f802 +BELONGS ya.make + License text: + The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + LICENSE.TXT [2:2] + flang-rt/LICENSE.TXT [2:2] + flang/LICENSE.TXT [2:2] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + LICENSE.TXT [2:2] + flang-rt/LICENSE.TXT [2:2] + flang/LICENSE.TXT [2:2] + +KEEP Apache-2.0 WITH LLVM-exception ed67892e7cae8c050a15bc8c61ac8aa2 +BELONGS ya.make + License text: + // The original source code is distributed under the Apache License v2.0 + // with LLVM Exceptions. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 81.82 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang/include/flang/Common/reference-wrapper.h [14:15] + Scancode info: + Original SPDX id: LLVM-exception + Score : 81.82 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + flang/include/flang/Common/reference-wrapper.h [14:15] + +KEEP Apache-2.0 WITH LLVM-exception ffcb177513ee7cc880ebfe3c64e5187e +BELONGS ya.make + License text: + Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + See https://llvm.org/LICENSE.txt for license information. + Scancode info: + Original SPDX id: Apache-2.0 + Score : 100.00 + Match type : NOTICE + Links : http://www.apache.org/licenses/, http://www.apache.org/licenses/LICENSE-2.0, https://spdx.org/licenses/Apache-2.0 + Files with this license: + flang-rt/README.md [3:4] + Scancode info: + Original SPDX id: LLVM-exception + Score : 100.00 + Match type : NOTICE + Links : http://llvm.org/foundation/relicensing/LICENSE.txt, https://spdx.org/licenses/LLVM-exception + Files with this license: + flang-rt/README.md [3:4] diff --git a/contrib/libs/llvm/flang-rt/.yandex_meta/disable-fortran.patch b/contrib/libs/llvm/flang-rt/.yandex_meta/disable-fortran.patch new file mode 100644 index 00000000000..8d342b2be9d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/.yandex_meta/disable-fortran.patch @@ -0,0 +1,13 @@ +diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt +index d048ac4b3e5a..231428b20be6 100644 +--- a/flang-rt/CMakeLists.txt ++++ b/flang-rt/CMakeLists.txt +@@ -55,7 +55,7 @@ if (CMAKE_VERSION VERSION_LESS "3.24") + set(CMAKE_Fortran_LINKER_WRAPPER_FLAG_SEP ",") + endif () + endif () +-enable_language(Fortran) ++# enable_language(Fortran) + + + list(APPEND CMAKE_MODULE_PATH diff --git a/contrib/libs/llvm/flang-rt/.yandex_meta/licenses.list.txt b/contrib/libs/llvm/flang-rt/.yandex_meta/licenses.list.txt new file mode 100644 index 00000000000..111cfd48e34 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/.yandex_meta/licenses.list.txt @@ -0,0 +1,508 @@ +====================Apache-2.0 WITH LLVM-exception==================== + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +====================Apache-2.0 WITH LLVM-exception==================== + Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + See https://llvm.org/LICENSE.txt for license information. + + +====================Apache-2.0 WITH LLVM-exception==================== + SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +====================Apache-2.0 WITH LLVM-exception==================== + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + + +====================Apache-2.0 WITH LLVM-exception==================== + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +====================Apache-2.0 WITH LLVM-exception==================== +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + + +====================Apache-2.0 WITH LLVM-exception==================== +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. + + +====================Apache-2.0 WITH LLVM-exception==================== +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +====================Apache-2.0 WITH LLVM-exception==================== +// The original source code is distributed under the Apache License v2.0 + + +====================Apache-2.0 WITH LLVM-exception==================== +// The original source code is distributed under the Apache License v2.0 +// with LLVM Exceptions. + + +====================Apache-2.0 WITH LLVM-exception==================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + + +====================Apache-2.0 WITH LLVM-exception==================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +====================COPYRIGHT==================== +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +All rights reserved. + + +====================NCSA==================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +University of Illinois/NCSA +Open Source License + + +====================NCSA==================== +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. diff --git a/contrib/libs/llvm/flang-rt/.yandex_meta/override.nix b/contrib/libs/llvm/flang-rt/.yandex_meta/override.nix new file mode 100644 index 00000000000..c460cb7cfbd --- /dev/null +++ b/contrib/libs/llvm/flang-rt/.yandex_meta/override.nix @@ -0,0 +1,20 @@ +pkgs: attrs: with pkgs; with attrs; rec { + version = "21.1.1"; + + src = fetchFromGitHub { + owner = "llvm"; + repo = "llvm-project"; + rev = "llvmorg-${version}"; + hash = "sha256-IB9Z3bIMwfgw2W2Vxo89CmtCM9DfOyV2Ei64nqgHrgc="; + }; + + patches = [ + ./disable-fortran.patch + ]; + postPatch = ""; + + sourceRoot = "source"; + + # Remove -DSCUDO_DEFAULT_OPTIONS set in llvmPackages.compiler-rt + env.NIX_FLAGS_COMPILE = ""; +} diff --git a/contrib/libs/llvm/flang-rt/CODE_OF_CONDUCT.md b/contrib/libs/llvm/flang-rt/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..0c653c06015 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +# Code of Conduct + +The LLVM Community Code of Conduct can be found at https://llvm.org/docs/CodeOfConduct.html. diff --git a/contrib/libs/llvm/flang-rt/CONTRIBUTING.md b/contrib/libs/llvm/flang-rt/CONTRIBUTING.md new file mode 100644 index 00000000000..646d709a694 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/CONTRIBUTING.md @@ -0,0 +1,16 @@ +# Contributing to LLVM + +Thank you for your interest in contributing to LLVM! There are many ways to +contribute, and we appreciate all contributions. + +To get started with contributing, please take a look at the +[Contributing to LLVM](https://llvm.org/docs/Contributing.html) guide. It +describes how to get involved, raise issues and submit patches. + +## Getting in touch + +Join the [LLVM Discourse forums](https://discourse.llvm.org/) or [Discord +chat](https://discord.gg/xS7Z362). + +The LLVM project has adopted a [code of conduct](https://llvm.org/docs/CodeOfConduct.html) for +participants to all modes of communication within the project. diff --git a/contrib/libs/llvm/flang-rt/LICENSE.TXT b/contrib/libs/llvm/flang-rt/LICENSE.TXT new file mode 100644 index 00000000000..fa6ac540007 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/LICENSE.TXT @@ -0,0 +1,279 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + diff --git a/contrib/libs/llvm/flang-rt/README.md b/contrib/libs/llvm/flang-rt/README.md new file mode 100644 index 00000000000..a9b29ecbc1a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/README.md @@ -0,0 +1,44 @@ +# The LLVM Compiler Infrastructure + +[](https://securityscorecards.dev/viewer/?uri=github.com/llvm/llvm-project) +[](https://www.bestpractices.dev/projects/8273) +[](https://github.com/llvm/llvm-project/actions/workflows/libcxx-build-and-test.yaml?query=event%3Aschedule) + +Welcome to the LLVM project! + +This repository contains the source code for LLVM, a toolkit for the +construction of highly optimized compilers, optimizers, and run-time +environments. + +The LLVM project has multiple components. The core of the project is +itself called "LLVM". This contains all of the tools, libraries, and header +files needed to process intermediate representations and convert them into +object files. Tools include an assembler, disassembler, bitcode analyzer, and +bitcode optimizer. + +C-like languages use the [Clang](https://clang.llvm.org/) frontend. This +component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode +-- and from there into object files, using LLVM. + +Other components include: +the [libc++ C++ standard library](https://libcxx.llvm.org), +the [LLD linker](https://lld.llvm.org), and more. + +## Getting the Source Code and Building LLVM + +Consult the +[Getting Started with LLVM](https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm) +page for information on building and running LLVM. + +For information on how to contribute to the LLVM project, please take a look at +the [Contributing to LLVM](https://llvm.org/docs/Contributing.html) guide. + +## Getting in touch + +Join the [LLVM Discourse forums](https://discourse.llvm.org/), [Discord +chat](https://discord.gg/xS7Z362), +[LLVM Office Hours](https://llvm.org/docs/GettingInvolved.html#office-hours) or +[Regular sync-ups](https://llvm.org/docs/GettingInvolved.html#online-sync-ups). + +The LLVM project has adopted a [code of conduct](https://llvm.org/docs/CodeOfConduct.html) for +participants to all modes of communication within the project. diff --git a/contrib/libs/llvm/flang-rt/SECURITY.md b/contrib/libs/llvm/flang-rt/SECURITY.md new file mode 100644 index 00000000000..f6a5e6c0162 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/SECURITY.md @@ -0,0 +1,5 @@ +# Reporting LLVM Security Issues + +To report security issues in LLVM, please follow the steps outlined on the +[LLVM Security Group](https://llvm.org/docs/Security.html#how-to-report-a-security-issue) +page. diff --git a/contrib/libs/llvm/flang-rt/flang-rt/CODE_OWNERS.TXT b/contrib/libs/llvm/flang-rt/flang-rt/CODE_OWNERS.TXT new file mode 100644 index 00000000000..c836eef486e --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/CODE_OWNERS.TXT @@ -0,0 +1,13 @@ +This file is a list of the people responsible for ensuring that patches for a +particular part of Flang are reviewed, either by themself or by someone else. +They are also the gatekeepers for their part of Flang, with the final word on +what goes in or not. + +The list is sorted by surname and formatted to allow easy grepping and +beautification by scripts. The fields are: name (N), email (E), web-address +(W), PGP key ID and fingerprint (P), and description (D). Each entry should +contain at least the (N), (E) and (D) fields. + +N: Steve Scalpone +D: Anything not covered by others diff --git a/contrib/libs/llvm/flang-rt/flang-rt/LICENSE.TXT b/contrib/libs/llvm/flang-rt/flang-rt/LICENSE.TXT new file mode 100644 index 00000000000..53bb2e7fbc7 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/LICENSE.TXT @@ -0,0 +1,234 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. diff --git a/contrib/libs/llvm/flang-rt/flang-rt/README.md b/contrib/libs/llvm/flang-rt/flang-rt/README.md new file mode 100644 index 00000000000..4fe66a85a26 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/README.md @@ -0,0 +1,193 @@ +<!--===- README.md + + Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + See https://llvm.org/LICENSE.txt for license information. + SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +--> + +# Fortran Runtime (Flang-RT) + +Flang-RT is the runtime library for code emitted by the Flang compiler +(https://flang.llvm.org). + + +## Getting Started + +There are two build modes for the Flang-RT. The bootstrap build, also +called the in-tree build, and the runtime-only build, also called the +out-of-tree build. +Not to be confused with the terms +[in-source and out-of-source](https://cmake.org/cmake/help/latest/manual/cmake.1.html#introduction-to-cmake-buildsystems) +builds as defined by CMake. In an in-source build, the source directory and the +build directory are identical, whereas with an out-of-source build the +build artifacts are stored somewhere else, possibly in a subdirectory of the +source directory. LLVM does not support in-source builds. + + +### Requirements + +Requirements: + * [Same as LLVM](https://llvm.org/docs/GettingStarted.html#requirements). + + +### Bootstrapping Runtimes Build + +The bootstrapping build will first build Clang and Flang, then use these +compilers to compile Flang-RT. CMake will create a secondary build tree +configured to use these just-built compilers. The secondary build will reuse +the same build options (Flags, Debug/Release, ...) as the primary build. +It will also ensure that once built, Flang-RT is found by Flang from either +the build- or install-prefix. To enable, add `flang-rt` to +`LLVM_ENABLE_RUNTIMES`: + +```bash +cmake -S <path-to-llvm-project-source>/llvm \ + -GNinja \ + -DLLVM_ENABLE_PROJECTS="clang;flang" \ + -DLLVM_ENABLE_RUNTIMES=flang-rt \ + ... +``` + +It is recommended to enable building OpenMP alongside Flang and Flang-RT +as well. This will build `omp_lib.mod` required to use OpenMP from Fortran. +Building Compiler-RT may also be required, particularly on platforms that do +not provide all C-ABI functionality (such as Windows). + +```bash +cmake -S <path-to-llvm-project-source>/llvm \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_ENABLE_PROJECTS="clang;flang;openmp" \ + -DLLVM_ENABLE_RUNTIMES="compiler-rt;flang-rt" \ + ... +``` + +By default, the enabled runtimes will only be built for the host platform +(`-DLLVM_RUNTIME_TARGETS=default`). To add additional targets to support +cross-compilation via `flang --target=<target-triple>`, add more triples to +`LLVM_RUNTIME_TARGETS`, such as +`-DLLVM_RUNTIME_TARGETS="default;aarch64-linux-gnu"`. + +After configuration, build, test, and install the runtime(s) via + +```shell +$ ninja flang-rt +$ ninja check-flang-rt +$ ninja install +``` + + +### Standalone Runtimes Build + +Instead of building Clang and Flang from scratch, the standalone Runtime build +uses CMake's environment introspection to find a C, C++, and Fortran compiler. +The compiler to be used can be controlled using CMake's standard mechanisms such +as `CMAKE_CXX_COMPILER`, `CMAKE_CXX_COMPILER`, and `CMAKE_Fortran_COMPILER`. +`CMAKE_Fortran_COMPILER` must be `flang` built from the same Git commit as +Flang-RT to ensure they are using the same ABI. The C and C++ compiler +can be any compiler supporting the same ABI. + +In addition to the compiler, the build must be able to find LLVM development +tools such as `lit` and `FileCheck` that are not found in an LLVM's install +directory. Use `CMAKE_BINARY_DIR` to point to directory where LLVM has +been built. When building Flang as part of a bootstrapping build +(`LLVM_ENABLE_PROJECTS=flang`), Flang-RT is automatically added +unless configured with `-DFLANG_ENABLE_FLANG_RT=OFF`. Add that option to avoid +having two conflicting versions of the same library. + +A simple build configuration might look like the following: + +```bash +cmake -S <path-to-llvm-project-source>/runtimes \ + -GNinja \ + -DLLVM_BINARY_DIR=<path-to-llvm-builddir> \ + -DCMAKE_Fortran_COMPILER=<path-to-llvm-builddir>/bin/flang \ + -DCMAKE_Fortran_COMPILER_WORKS=yes \ + -DLLVM_ENABLE_RUNTIMES=flang-rt \ + ... +``` + +The `CMAKE_Fortran_COMPILER_WORKS` parameter must be set because otherwise CMake +will test whether the Fortran compiler can compile and link programs which will +obviously fail without a runtime library available yet. + +Building Flang-RT for cross-compilation triple, the target triple can +be selected using `LLVM_DEFAULT_TARGET_TRIPLE` AND `LLVM_RUNTIMES_TARGET`. +Of course, Flang-RT can be built multiple times with different build +configurations, but have to be located manually when using with the Flang +driver using the `-L` option. + +After configuration, build, test, and install the runtime via + +```shell +$ ninja +$ ninja check-flang-rt +$ ninja install +``` + + +## Configuration Option Reference + +Flang-RT has the followign configuration options. This is in +addition to the build options the LLVM_ENABLE_RUNTIMES mechanism and +CMake itself provide. + + * `FLANG_RT_INCLUDE_TESTS` (boolean; default: `ON`) + + When `OFF`, does not add any tests and unittests. The `check-flang-rt` + build target will do nothing. + + * `FLANG_RUNTIME_F128_MATH_LIB` (default: `""`) + + Determines the implementation of `REAL(16)` math functions. If set to + `libquadmath`, uses `quadmath.h` and `-lquadmath` typically distributed with + gcc. If empty, disables `REAL(16)` support. For any other value, introspects + the compiler for `__float128` or 128-bit `long double` support. + [More details](docs/Real16MathSupport.md). + + * `FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT` (values: `"CUDA"`,`"OpenMP"`, `""` default: `""`) + + When set to `CUDA`, builds Flang-RT with experimental support for GPU + accelerators using CUDA. `CMAKE_CUDA_COMPILER` must be set if not + automatically detected by CMake. `nvcc` as well as `clang` are supported. + + When set to `OpenMP`, builds Flang-RT with experimental support for + GPU accelerators using OpenMP offloading. Only Clang is supported for + `CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER`. + + * `FLANG_RT_INCLUDE_CUF` (bool, default: `OFF`) + + Compiles the `libflang_rt.cuda_<CUDA-version>.a/.so` library. This is + independent of `FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA` and only + requires a + [CUDA Toolkit installation](https://cmake.org/cmake/help/latest/module/FindCUDAToolkit.html) + (no `CMAKE_CUDA_COMPILER`). + + +### Experimental CUDA Support + +With `-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=CUDA`, the following +additional configuration options become available. + + * `FLANG_RT_LIBCUDACXX_PATH` (path, default: `""`) + + Path to libcu++ package installation. + + * `FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS` (boolean, default: `OFF`) + + Do not compile global variables' definitions when producing PTX library. + Default is `OFF`, meaning global variable definitions are compiled by + default. + + +### Experimental OpenMP Offload Support + +With `-DFLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT=OpenMP`, the following +additional configuration options become available. + + * `FLANG_RT_DEVICE_ARCHITECTURES` (default: `"all"`) + + A list of device architectures that Flang-RT is going to support. + If `"all"` uses a pre-defined list of architectures. Same purpose as + `LIBOMPTARGET_DEVICE_ARCHITECTURES` from liboffload. diff --git a/contrib/libs/llvm/flang-rt/flang-rt/config-linux.h b/contrib/libs/llvm/flang-rt/flang-rt/config-linux.h new file mode 100644 index 00000000000..45e72bd8751 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/config-linux.h @@ -0,0 +1,24 @@ +/*===-- cmake/config.cmake.in ---------------------------------------*- C -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ + +#ifndef FORTRAN_RUNTIME_CONFIG_H +#define FORTRAN_RUNTIME_CONFIG_H + +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the declaration of `strerror_s', and to 0 if you + don't. */ +#define HAVE_DECL_STRERROR_S 0 + +/* Define to 1 if you have the `backtrace' function. */ +#define HAVE_BACKTRACE TRUE + +#define BACKTRACE_HEADER <execinfo.h> + +#endif diff --git a/contrib/libs/llvm/flang-rt/flang-rt/config-musl.h b/contrib/libs/llvm/flang-rt/flang-rt/config-musl.h new file mode 100644 index 00000000000..c0f7f9336db --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/config-musl.h @@ -0,0 +1,3 @@ +#pragma once + +#undef HAVE_BACKTRACE diff --git a/contrib/libs/llvm/flang-rt/flang-rt/config-win.h b/contrib/libs/llvm/flang-rt/flang-rt/config-win.h new file mode 100644 index 00000000000..2454274b902 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/config-win.h @@ -0,0 +1,8 @@ +#pragma once + +#include "config-linux.h" + +#undef HAVE_STRERROR_R +#define HAVE_DECL_STRERROR_S 1 + +#undef HAVE_BACKTRACE diff --git a/contrib/libs/llvm/flang-rt/flang-rt/config.h b/contrib/libs/llvm/flang-rt/flang-rt/config.h new file mode 100644 index 00000000000..f6b2107fe4f --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/config.h @@ -0,0 +1,11 @@ +#pragma once + +#if defined(_MSC_VER) +# include "config-win.h" +#else +# include "config-linux.h" +#endif + +#if defined(_musl_) +# include "config-musl.h" +#endif diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/allocator-registry.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/allocator-registry.h new file mode 100644 index 00000000000..f0ba77a3607 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/allocator-registry.h @@ -0,0 +1,60 @@ +//===-- include/flang-rt/runtime/allocator-registry.h -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_ALLOCATOR_REGISTRY_H_ +#define FLANG_RT_RUNTIME_ALLOCATOR_REGISTRY_H_ + +#include "flang/Common/api-attrs.h" +#include "flang/Runtime/allocator-registry-consts.h" +#include <cstdint> +#include <cstdlib> +#include <vector> + +#define MAX_ALLOCATOR 7 // 3 bits are reserved in the descriptor. + +namespace Fortran::runtime { + +using AllocFct = void *(*)(std::size_t, std::int64_t *); +using FreeFct = void (*)(void *); + +typedef struct Allocator_t { + AllocFct alloc{nullptr}; + FreeFct free{nullptr}; +} Allocator_t; + +static RT_API_ATTRS void *MallocWrapper( + std::size_t size, [[maybe_unused]] std::int64_t *) { + return std::malloc(size); +} +#ifdef RT_DEVICE_COMPILATION +static RT_API_ATTRS void FreeWrapper(void *p) { return std::free(p); } +#endif + +struct AllocatorRegistry { +#ifdef RT_DEVICE_COMPILATION + RT_API_ATTRS constexpr AllocatorRegistry() + : allocators{{&MallocWrapper, &FreeWrapper}} {} +#else + constexpr AllocatorRegistry() { + allocators[kDefaultAllocator] = {&MallocWrapper, &std::free}; + }; +#endif + RT_API_ATTRS void Register(int, Allocator_t); + RT_API_ATTRS AllocFct GetAllocator(int pos); + RT_API_ATTRS FreeFct GetDeallocator(int pos); + + Allocator_t allocators[MAX_ALLOCATOR]; +}; + +RT_OFFLOAD_VAR_GROUP_BEGIN +extern RT_VAR_ATTRS AllocatorRegistry allocatorRegistry; +RT_OFFLOAD_VAR_GROUP_END + +} // namespace Fortran::runtime + +#endif // FLANG_RT_RUNTIME_ALLOCATOR_REGISTRY_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/array-constructor.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/array-constructor.h new file mode 100644 index 00000000000..9c037177161 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/array-constructor.h @@ -0,0 +1,57 @@ +//===-- include/flang-rt/runtime/array-constructor.h ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// External APIs to create temporary storage for array constructors when their +// final extents or length parameters cannot be pre-computed. + +#ifndef FLANG_RT_RUNTIME_ARRAY_CONSTRUCTOR_H_ +#define FLANG_RT_RUNTIME_ARRAY_CONSTRUCTOR_H_ + +#include "descriptor.h" +#include "flang/Runtime/array-constructor-consts.h" +#include "flang/Runtime/entry-names.h" +#include <cstdint> + +namespace Fortran::runtime { + +// Runtime data structure to hold information about the storage of +// an array constructor being constructed. +struct ArrayConstructorVector { + RT_API_ATTRS ArrayConstructorVector(class Descriptor &to, + SubscriptValue nextValuePosition, SubscriptValue actualAllocationSize, + const char *sourceFile, int sourceLine, bool useValueLengthParameters) + : to{to}, nextValuePosition{nextValuePosition}, + actualAllocationSize{actualAllocationSize}, sourceFile{sourceFile}, + sourceLine{sourceLine}, + useValueLengthParameters_{useValueLengthParameters} {} + + RT_API_ATTRS bool useValueLengthParameters() const { + return useValueLengthParameters_; + } + + class Descriptor &to; + SubscriptValue nextValuePosition; + SubscriptValue actualAllocationSize; + const char *sourceFile; + int sourceLine; + +private: + unsigned char useValueLengthParameters_ : 1; +}; + +static_assert(sizeof(Fortran::runtime::ArrayConstructorVector) <= + MaxArrayConstructorVectorSizeInBytes, + "ABI requires sizeof(ArrayConstructorVector) to be smaller than " + "MaxArrayConstructorVectorSizeInBytes"); +static_assert(alignof(Fortran::runtime::ArrayConstructorVector) <= + MaxArrayConstructorVectorAlignInBytes, + "ABI requires alignof(ArrayConstructorVector) to be smaller than " + "MaxArrayConstructorVectorAlignInBytes"); + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_ARRAY_CONSTRUCTOR_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/assign-impl.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/assign-impl.h new file mode 100644 index 00000000000..cc931f6713c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/assign-impl.h @@ -0,0 +1,31 @@ +//===-- include/flang-rt/runtime/assign-impl.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_ASSIGN_IMPL_H_ +#define FLANG_RT_RUNTIME_ASSIGN_IMPL_H_ + +#include "flang/Runtime/freestanding-tools.h" + +namespace Fortran::runtime { +class Descriptor; +class Terminator; + +// Assign one object to another via allocate statement from source specifier. +// Note that if allocate object and source expression have the same rank, the +// value of the allocate object becomes the value provided; otherwise the value +// of each element of allocate object becomes the value provided (9.7.1.2(7)). +#ifdef RT_DEVICE_COMPILATION +RT_API_ATTRS void DoFromSourceAssign(Descriptor &, const Descriptor &, + Terminator &, MemmoveFct memmoveFct = &MemmoveWrapper); +#else +RT_API_ATTRS void DoFromSourceAssign(Descriptor &, const Descriptor &, + Terminator &, MemmoveFct memmoveFct = &Fortran::runtime::memmove); +#endif + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_ASSIGN_IMPL_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/buffer.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/buffer.h new file mode 100644 index 00000000000..b5a9ce9e35e --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/buffer.h @@ -0,0 +1,224 @@ +//===-- include/flang-rt/runtime/buffer.h -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// External file buffering + +#ifndef FLANG_RT_RUNTIME_BUFFER_H_ +#define FLANG_RT_RUNTIME_BUFFER_H_ + +#include "io-error.h" +#include "memory.h" +#include "flang/Runtime/freestanding-tools.h" +#include <algorithm> +#include <cinttypes> +#include <cstring> + +namespace Fortran::runtime::io { + +RT_API_ATTRS void LeftShiftBufferCircularly( + char *, std::size_t bytes, std::size_t shift); + +// Maintains a view of a contiguous region of a file in a memory buffer. +// The valid data in the buffer may be circular, but any active frame +// will also be contiguous in memory. The requirement stems from the need to +// preserve read data that may be reused by means of Tn/TLn edit descriptors +// without needing to position the file (which may not always be possible, +// e.g. a socket) and a general desire to reduce system call counts. +// +// Possible scenario with a tiny 32-byte buffer after a ReadFrame or +// WriteFrame with a file offset of 103 to access "DEF": +// +// fileOffset_ 100 --+ +-+ frame of interest (103:105) +// file: ............ABCDEFGHIJKLMNOPQRSTUVWXYZ.... +// buffer: [NOPQRSTUVWXYZ......ABCDEFGHIJKLM] (size_ == 32) +// | +-- frame_ == 3 +// +----- start_ == 19, length_ == 26 +// +// The buffer holds length_ == 26 bytes from file offsets 100:125. +// Those 26 bytes "wrap around" the end of the circular buffer, +// so file offsets 100:112 map to buffer offsets 19:31 ("A..M") and +// file offsets 113:125 map to buffer offsets 0:12 ("N..Z") +// The 3-byte frame of file offsets 103:105 is contiguous in the buffer +// at buffer offset (start_ + frame_) == 22 ("DEF"). + +template <typename STORE, std::size_t minBuffer = 65536> class FileFrame { +public: + using FileOffset = std::int64_t; + + RT_API_ATTRS ~FileFrame() { FreeMemoryAndNullify(buffer_); } + + // The valid data in the buffer begins at buffer_[start_] and proceeds + // with possible wrap-around for length_ bytes. The current frame + // is offset by frame_ bytes into that region and is guaranteed to + // be contiguous for at least as many bytes as were requested. + + RT_API_ATTRS FileOffset FrameAt() const { return fileOffset_ + frame_; } + RT_API_ATTRS char *Frame() const { return buffer_ + start_ + frame_; } + RT_API_ATTRS std::size_t FrameLength() const { + return std::min<std::size_t>(length_ - frame_, size_ - (start_ + frame_)); + } + RT_API_ATTRS std::size_t BytesBufferedBeforeFrame() const { + return frame_ - start_; + } + + // Returns a short frame at a non-fatal EOF. Can return a long frame as well. + RT_API_ATTRS std::size_t ReadFrame( + FileOffset at, std::size_t bytes, IoErrorHandler &handler) { + Flush(handler); + Reallocate(bytes, handler); + std::int64_t newFrame{at - fileOffset_}; + if (newFrame < 0 || newFrame > length_) { + Reset(at); + } else { + frame_ = newFrame; + } + RUNTIME_CHECK(handler, at == fileOffset_ + frame_); + if (static_cast<std::int64_t>(start_ + frame_ + bytes) > size_) { + DiscardLeadingBytes(frame_, handler); + MakeDataContiguous(handler, bytes); + RUNTIME_CHECK(handler, at == fileOffset_ + frame_); + } + if (FrameLength() < bytes) { + auto next{start_ + length_}; + RUNTIME_CHECK(handler, next < size_); + auto minBytes{bytes - FrameLength()}; + auto maxBytes{size_ - next}; + auto got{Store().Read( + fileOffset_ + length_, buffer_ + next, minBytes, maxBytes, handler)}; + length_ += got; + RUNTIME_CHECK(handler, length_ <= size_); + } + return FrameLength(); + } + + RT_API_ATTRS void WriteFrame( + FileOffset at, std::size_t bytes, IoErrorHandler &handler) { + Reallocate(bytes, handler); + std::int64_t newFrame{at - fileOffset_}; + if (!dirty_ || newFrame < 0 || newFrame > length_) { + Flush(handler); + Reset(at); + } else if (start_ + newFrame + static_cast<std::int64_t>(bytes) > size_) { + // Flush leading data before "at", retain from "at" onward + Flush(handler, length_ - newFrame); + MakeDataContiguous(handler, bytes); + } else { + frame_ = newFrame; + } + RUNTIME_CHECK(handler, at == fileOffset_ + frame_); + dirty_ = true; + length_ = std::max<std::int64_t>(length_, frame_ + bytes); + } + + RT_API_ATTRS void Flush(IoErrorHandler &handler, std::int64_t keep = 0) { + if (dirty_) { + while (length_ > keep) { + std::size_t chunk{ + std::min<std::size_t>(length_ - keep, size_ - start_)}; + std::size_t put{ + Store().Write(fileOffset_, buffer_ + start_, chunk, handler)}; + DiscardLeadingBytes(put, handler); + if (put < chunk) { + break; + } + } + if (length_ == 0) { + Reset(fileOffset_); + } + } + } + + RT_API_ATTRS void TruncateFrame(std::int64_t at, IoErrorHandler &handler) { + RUNTIME_CHECK(handler, !dirty_); + if (at <= fileOffset_) { + Reset(at); + } else if (at < fileOffset_ + length_) { + length_ = at - fileOffset_; + } + } + +private: + RT_API_ATTRS STORE &Store() { return static_cast<STORE &>(*this); } + + RT_API_ATTRS void Reallocate( + std::int64_t bytes, const Terminator &terminator) { + if (bytes > size_) { + char *old{buffer_}; + auto oldSize{size_}; + size_ = std::max<std::int64_t>(bytes, size_ + minBuffer); + buffer_ = + reinterpret_cast<char *>(AllocateMemoryOrCrash(terminator, size_)); + auto chunk{std::min<std::int64_t>(length_, oldSize - start_)}; + // "memcpy" in glibc has a "nonnull" attribute on the source pointer. + // Avoid passing a null pointer, since it would result in an undefined + // behavior. + if (old != nullptr) { + std::memcpy(buffer_, old + start_, chunk); + std::memcpy(buffer_ + chunk, old, length_ - chunk); + FreeMemory(old); + } + start_ = 0; + } + } + + RT_API_ATTRS void Reset(FileOffset at) { + start_ = length_ = frame_ = 0; + fileOffset_ = at; + dirty_ = false; + } + + RT_API_ATTRS void DiscardLeadingBytes( + std::int64_t n, const Terminator &terminator) { + RUNTIME_CHECK(terminator, length_ >= n); + length_ -= n; + if (length_ == 0) { + start_ = 0; + } else { + start_ += n; + if (start_ >= size_) { + start_ -= size_; + } + } + if (frame_ >= n) { + frame_ -= n; + } else { + frame_ = 0; + } + fileOffset_ += n; + } + + RT_API_ATTRS void MakeDataContiguous( + IoErrorHandler &handler, std::size_t bytes) { + if (static_cast<std::int64_t>(start_ + bytes) > size_) { + // Frame would wrap around; shift current data (if any) to force + // contiguity. + RUNTIME_CHECK(handler, length_ < size_); + if (start_ + length_ <= size_) { + // [......abcde..] -> [abcde........] + runtime::memmove(buffer_, buffer_ + start_, length_); + } else { + // [cde........ab] -> [abcde........] + auto n{start_ + length_ - size_}; // 3 for cde + RUNTIME_CHECK(handler, length_ >= n); + runtime::memmove(buffer_ + n, buffer_ + start_, length_ - n); // cdeab + LeftShiftBufferCircularly(buffer_, length_, n); // abcde + } + start_ = 0; + } + } + + char *buffer_{nullptr}; + std::int64_t size_{0}; // current allocated buffer size + FileOffset fileOffset_{0}; // file offset corresponding to buffer valid data + std::int64_t start_{0}; // buffer_[] offset of valid data + std::int64_t length_{0}; // valid data length (can wrap) + std::int64_t frame_{0}; // offset of current frame in valid data + bool dirty_{false}; +}; +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_BUFFER_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/connection.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/connection.h new file mode 100644 index 00000000000..601669942cd --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/connection.h @@ -0,0 +1,144 @@ +//===-- include/flang-rt/runtime/connection.h -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Fortran I/O connection state (abstracted over internal & external units) + +#ifndef FLANG_RT_RUNTIME_CONNECTION_H_ +#define FLANG_RT_RUNTIME_CONNECTION_H_ + +#include "format.h" +#include "flang/Common/optional.h" +#include <cinttypes> + +namespace Fortran::runtime::io { + +class IoStatementState; + +enum class Direction { Output, Input }; +enum class Access { Sequential, Direct, Stream }; + +// These characteristics of a connection are immutable after being +// established in an OPEN statement. +struct ConnectionAttributes { + Access access{Access::Sequential}; // ACCESS='SEQUENTIAL', 'DIRECT', 'STREAM' + Fortran::common::optional<bool> isUnformatted; // FORM='UNFORMATTED' if true + bool isUTF8{false}; // ENCODING='UTF-8' + unsigned char internalIoCharKind{0}; // 0->external, 1/2/4->internal + Fortran::common::optional<std::int64_t> openRecl; // RECL= on OPEN + + RT_API_ATTRS bool IsRecordFile() const { + // Formatted stream files are viewed as having records, at least on input + return access != Access::Stream || !isUnformatted.value_or(true); + } + + template <typename CHAR = char> constexpr RT_API_ATTRS bool useUTF8() const { + // For wide CHARACTER kinds, always use UTF-8 for formatted I/O. + // For single-byte CHARACTER, encode characters >= 0x80 with + // UTF-8 iff the mode is set. + return internalIoCharKind == 0 && (sizeof(CHAR) > 1 || isUTF8); + } +}; + +struct ConnectionState : public ConnectionAttributes { + RT_API_ATTRS bool IsAtEOF() const { + // true when read has hit EOF or endfile record + return endfileRecordNumber && currentRecordNumber >= *endfileRecordNumber; + } + RT_API_ATTRS bool IsAfterEndfile() const { + // true after ENDFILE until repositioned + return endfileRecordNumber && currentRecordNumber > *endfileRecordNumber; + } + + // All positions and measurements are always in units of bytes, + // not characters. Multi-byte character encodings are possible in + // both internal I/O (when the character kind of the variable is 2 or 4) + // and external formatted I/O (when the encoding is UTF-8). + RT_API_ATTRS std::size_t RemainingSpaceInRecord() const { + auto recl{recordLength.value_or(openRecl.value_or( + executionEnvironment.listDirectedOutputLineLengthLimit))}; + return positionInRecord >= recl ? 0 : recl - positionInRecord; + } + RT_API_ATTRS bool NeedAdvance(std::size_t width) const { + return positionInRecord > 0 && width > RemainingSpaceInRecord(); + } + RT_API_ATTRS void HandleAbsolutePosition(std::int64_t n) { + positionInRecord = (n < 0 ? 0 : n) + leftTabLimit.value_or(0); + } + RT_API_ATTRS void HandleRelativePosition(std::int64_t n) { + auto least{leftTabLimit.value_or(0)}; + auto newPos{positionInRecord + n}; + positionInRecord = newPos < least ? least : newPos; + ; + } + + RT_API_ATTRS void BeginRecord() { + positionInRecord = 0; + furthestPositionInRecord = 0; + unterminatedRecord = false; + } + + RT_API_ATTRS Fortran::common::optional<std::int64_t> + EffectiveRecordLength() const { + // When an input record is longer than an explicit RECL= from OPEN + // it is effectively truncated on input. + return openRecl && recordLength && *openRecl < *recordLength ? openRecl + : recordLength; + } + + Fortran::common::optional<std::int64_t> recordLength; + + std::int64_t currentRecordNumber{1}; // 1 is first + + // positionInRecord is the 0-based bytes offset in the current record + // to/from which the next data transfer will occur. It can be past + // furthestPositionInRecord if moved by an X or T or TR control edit + // descriptor. + std::int64_t positionInRecord{0}; + + // furthestPositionInRecord is the 0-based byte offset of the greatest + // position in the current record to/from which any data transfer has + // occurred, plus one. It can be viewed as a count of bytes processed. + std::int64_t furthestPositionInRecord{0}; // max(position+bytes) + + // Set at end of non-advancing I/O data transfer + Fortran::common::optional<std::int64_t> + leftTabLimit; // offset in current record + + // currentRecordNumber value captured after ENDFILE/REWIND/BACKSPACE statement + // or an end-of-file READ condition on a sequential access file + Fortran::common::optional<std::int64_t> endfileRecordNumber; + + // Mutable modes set at OPEN() that can be overridden in READ/WRITE & FORMAT + MutableModes modes; // BLANK=, DECIMAL=, SIGN=, ROUND=, PAD=, DELIM=, kP + + // Set when processing repeated items during list-directed & NAMELIST input + // in order to keep a span of records in frame on a non-positionable file, + // so that backspacing to the beginning of the repeated item doesn't require + // repositioning the external storage medium when that's impossible. + bool pinnedFrame{false}; + + // Set when the last record of a file is not properly terminated + // so that a non-advancing READ will not signal EOR. + bool unterminatedRecord{false}; +}; + +// Utility class for capturing and restoring a position in an input stream. +class SavedPosition { +public: + explicit RT_API_ATTRS SavedPosition(IoStatementState &); + RT_API_ATTRS ~SavedPosition(); + RT_API_ATTRS void Cancel() { cancelled_ = true; } + +private: + IoStatementState &io_; + ConnectionState saved_; + bool cancelled_{false}; +}; + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_CONNECTION_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/derived.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/derived.h new file mode 100644 index 00000000000..ac6962c5716 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/derived.h @@ -0,0 +1,51 @@ +//===-- include/flang-rt/runtime/derived.h ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Internal runtime utilities for derived type operations. + +#ifndef FLANG_RT_RUNTIME_DERIVED_H_ +#define FLANG_RT_RUNTIME_DERIVED_H_ + +#include "flang/Common/api-attrs.h" + +namespace Fortran::runtime::typeInfo { +class DerivedType; +} + +namespace Fortran::runtime { +class Descriptor; +class Terminator; + +// Perform default component initialization, allocate automatic components. +// Returns a STAT= code (0 when all's well). +RT_API_ATTRS int Initialize(const Descriptor &, const typeInfo::DerivedType &, + Terminator &, bool hasStat = false, const Descriptor *errMsg = nullptr); + +// Initializes an object clone from the original object. +// Each allocatable member of the clone is allocated with the same bounds as +// in the original object, if it is also allocated in it. +// Returns a STAT= code (0 when all's well). +RT_API_ATTRS int InitializeClone(const Descriptor &, const Descriptor &, + const typeInfo::DerivedType &, Terminator &, bool hasStat = false, + const Descriptor *errMsg = nullptr); + +// Call FINAL subroutines, if any +RT_API_ATTRS void Finalize( + const Descriptor &, const typeInfo::DerivedType &derived, Terminator *); + +// Call FINAL subroutines, deallocate allocatable & automatic components. +// Does not deallocate the original descriptor. +RT_API_ATTRS void Destroy(const Descriptor &, bool finalize, + const typeInfo::DerivedType &, Terminator *); + +// Return true if the passed descriptor is for a derived type +// entity that has a dynamic (allocatable, automatic) component. +RT_API_ATTRS bool HasDynamicComponent(const Descriptor &); + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_DERIVED_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/descriptor.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/descriptor.h new file mode 100644 index 00000000000..68106f3462c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/descriptor.h @@ -0,0 +1,623 @@ +//===-- include/flang-rt/runtime/descriptor.h -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_DESCRIPTOR_H_ +#define FLANG_RT_RUNTIME_DESCRIPTOR_H_ + +// Defines data structures used during execution of a Fortran program +// to implement nontrivial dummy arguments, pointers, allocatables, +// function results, and the special behaviors of instances of derived types. +// This header file includes and extends the published language +// interoperability header that is required by the Fortran 2018 standard +// as a subset of definitions suitable for exposure to user C/C++ code. +// User C code is welcome to depend on that ISO_Fortran_binding.h file, +// but should never reference this internal header. + +#include "memory.h" +#include "type-code.h" +#include "flang-rt/runtime/allocator-registry.h" +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Common/optional.h" +#include "flang/Runtime/descriptor-consts.h" +#include <algorithm> +#include <cassert> +#include <cinttypes> +#include <cstddef> +#include <cstdio> +#include <cstdlib> +#include <cstring> + +/// Value used for asyncObject when no specific stream is specified. +static constexpr std::int64_t *kNoAsyncObject = nullptr; + +namespace Fortran::runtime { + +class Terminator; + +RT_VAR_GROUP_BEGIN +static constexpr RT_CONST_VAR_ATTRS int maxRank{CFI_MAX_RANK}; +RT_VAR_GROUP_END + +// A C++ view of the sole interoperable standard descriptor (ISO::CFI_cdesc_t) +// and its type and per-dimension information. + +class Dimension { +public: + RT_API_ATTRS SubscriptValue LowerBound() const { return raw_.lower_bound; } + RT_API_ATTRS SubscriptValue Extent() const { return raw_.extent; } + RT_API_ATTRS SubscriptValue UpperBound() const { + return LowerBound() + Extent() - 1; + } + RT_API_ATTRS SubscriptValue ByteStride() const { return raw_.sm; } + + RT_API_ATTRS Dimension &SetBounds( + SubscriptValue lower, SubscriptValue upper) { + if (upper >= lower) { + raw_.lower_bound = lower; + raw_.extent = upper - lower + 1; + } else { + raw_.lower_bound = 1; + raw_.extent = 0; + } + return *this; + } + // Do not use this API to cause the LB of an empty dimension + // to be anything other than 1. Use SetBounds() instead if you can. + RT_API_ATTRS Dimension &SetLowerBound(SubscriptValue lower) { + raw_.lower_bound = lower; + return *this; + } + RT_API_ATTRS Dimension &SetUpperBound(SubscriptValue upper) { + auto lower{raw_.lower_bound}; + raw_.extent = upper >= lower ? upper - lower + 1 : 0; + return *this; + } + RT_API_ATTRS Dimension &SetExtent(SubscriptValue extent) { + raw_.extent = extent; + return *this; + } + RT_API_ATTRS Dimension &SetByteStride(SubscriptValue bytes) { + raw_.sm = bytes; + return *this; + } + +private: + ISO::CFI_dim_t raw_; +}; + +// The storage for this object follows the last used dim[] entry in a +// Descriptor (CFI_cdesc_t) generic descriptor. Space matters here, since +// descriptors serve as POINTER and ALLOCATABLE components of derived type +// instances. The presence of this structure is encoded in the +// CFI_cdesc_t.extra field, and the number of elements in the len_[] +// array is determined by derivedType_->LenParameters(). +class DescriptorAddendum { +public: + explicit RT_API_ATTRS DescriptorAddendum( + const typeInfo::DerivedType *dt = nullptr) + : derivedType_{dt}, len_{0} {} + RT_API_ATTRS DescriptorAddendum &operator=(const DescriptorAddendum &); + + RT_API_ATTRS const typeInfo::DerivedType *derivedType() const { + return derivedType_; + } + RT_API_ATTRS DescriptorAddendum &set_derivedType( + const typeInfo::DerivedType *dt) { + derivedType_ = dt; + return *this; + } + + RT_API_ATTRS std::size_t LenParameters() const; + + RT_API_ATTRS typeInfo::TypeParameterValue LenParameterValue(int which) const { + return len_[which]; + } + static constexpr RT_API_ATTRS std::size_t SizeInBytes(int lenParameters) { + // TODO: Don't waste that last word if lenParameters == 0 + return sizeof(DescriptorAddendum) + + std::max(lenParameters - 1, 0) * sizeof(typeInfo::TypeParameterValue); + } + RT_API_ATTRS std::size_t SizeInBytes() const; + + RT_API_ATTRS void SetLenParameterValue( + int which, typeInfo::TypeParameterValue x) { + len_[which] = x; + } + + void Dump(FILE * = stdout) const; + +private: + const typeInfo::DerivedType *derivedType_; + typeInfo::TypeParameterValue len_[1]; // must be the last component + // The LEN type parameter values can also include captured values of + // specification expressions that were used for bounds and for LEN type + // parameters of components. The values have been truncated to the LEN + // type parameter's type, if shorter than 64 bits, then sign-extended. +}; + +// A C++ view of a standard descriptor object. +class Descriptor { +public: + // Be advised: this class type is not suitable for use when allocating + // a descriptor -- it is a dynamic view of the common descriptor format. + // If used in a simple declaration of a local variable or dynamic allocation, + // the size is going to be correct only by accident, since the true size of + // a descriptor depends on the number of its dimensions and the presence and + // size of an addendum, which depends on the type of the data. + // Use the class template StaticDescriptor (below) to declare a descriptor + // whose type and rank are fixed and known at compilation time. Use the + // Create() static member functions otherwise to dynamically allocate a + // descriptor. + + RT_API_ATTRS Descriptor(const Descriptor &); + RT_API_ATTRS Descriptor &operator=(const Descriptor &); + + // Returns the number of bytes occupied by an element of the given + // category and kind including any alignment padding required + // between adjacent elements. + static RT_API_ATTRS std::size_t BytesFor(TypeCategory category, int kind); + + RT_API_ATTRS void Establish(TypeCode t, std::size_t elementBytes, + void *p = nullptr, int rank = maxRank, + const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other, + bool addendum = false); + RT_API_ATTRS void Establish(TypeCategory, int kind, void *p = nullptr, + int rank = maxRank, const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other, + bool addendum = false); + RT_API_ATTRS void Establish(int characterKind, std::size_t characters, + void *p = nullptr, int rank = maxRank, + const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other, + bool addendum = false); + RT_API_ATTRS void Establish(const typeInfo::DerivedType &dt, + void *p = nullptr, int rank = maxRank, + const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other); + + // To create a descriptor for a derived type the caller + // must provide non-null dt argument. + // The addendum argument is only used for testing purposes, + // and it may force a descriptor with an addendum while + // dt may be null. + static RT_API_ATTRS OwningPtr<Descriptor> Create(TypeCode t, + std::size_t elementBytes, void *p = nullptr, int rank = maxRank, + const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other, + bool addendum = false, const typeInfo::DerivedType *dt = nullptr); + static RT_API_ATTRS OwningPtr<Descriptor> Create(TypeCategory, int kind, + void *p = nullptr, int rank = maxRank, + const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other); + static RT_API_ATTRS OwningPtr<Descriptor> Create(int characterKind, + SubscriptValue characters, void *p = nullptr, int rank = maxRank, + const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other); + static RT_API_ATTRS OwningPtr<Descriptor> Create( + const typeInfo::DerivedType &dt, void *p = nullptr, int rank = maxRank, + const SubscriptValue *extent = nullptr, + ISO::CFI_attribute_t attribute = CFI_attribute_other); + + RT_API_ATTRS ISO::CFI_cdesc_t &raw() { return raw_; } + RT_API_ATTRS const ISO::CFI_cdesc_t &raw() const { return raw_; } + RT_API_ATTRS std::size_t ElementBytes() const { return raw_.elem_len; } + RT_API_ATTRS int rank() const { return raw_.rank; } + RT_API_ATTRS TypeCode type() const { return TypeCode{raw_.type}; } + + RT_API_ATTRS Descriptor &set_base_addr(void *p) { + raw_.base_addr = p; + return *this; + } + + RT_API_ATTRS bool IsPointer() const { + return raw_.attribute == CFI_attribute_pointer; + } + RT_API_ATTRS bool IsAllocatable() const { + return raw_.attribute == CFI_attribute_allocatable; + } + RT_API_ATTRS bool IsAllocated() const { return raw_.base_addr != nullptr; } + + RT_API_ATTRS Dimension &GetDimension(int dim) { + return *reinterpret_cast<Dimension *>(&raw_.dim[dim]); + } + RT_API_ATTRS const Dimension &GetDimension(int dim) const { + return *reinterpret_cast<const Dimension *>(&raw_.dim[dim]); + } + + RT_API_ATTRS std::size_t SubscriptByteOffset( + int dim, SubscriptValue subscriptValue) const { + const Dimension &dimension{GetDimension(dim)}; + return (subscriptValue - dimension.LowerBound()) * dimension.ByteStride(); + } + + RT_API_ATTRS std::size_t SubscriptsToByteOffset( + const SubscriptValue subscript[]) const { + std::size_t offset{0}; + for (int j{0}; j < raw_.rank; ++j) { + offset += SubscriptByteOffset(j, subscript[j]); + } + return offset; + } + + template <typename A = char> + RT_API_ATTRS A *OffsetElement(std::size_t offset = 0) const { + return reinterpret_cast<A *>( + reinterpret_cast<char *>(raw_.base_addr) + offset); + } + + template <typename A> + RT_API_ATTRS A *Element(const SubscriptValue subscript[]) const { + return OffsetElement<A>(SubscriptsToByteOffset(subscript)); + } + + template <typename A> + RT_API_ATTRS A *ElementComponent( + const SubscriptValue subscript[], std::size_t componentOffset) const { + return OffsetElement<A>( + SubscriptsToByteOffset(subscript) + componentOffset); + } + + template <typename A> + RT_API_ATTRS A *ZeroBasedIndexedElement(std::size_t n) const { + if (raw_.rank == 0) { + if (n == 0) { + return OffsetElement<A>(); + } + } else if (raw_.rank == 1) { + const auto &dim{GetDimension(0)}; + if (n < static_cast<std::size_t>(dim.Extent())) { + return OffsetElement<A>(n * dim.ByteStride()); + } + } else { + SubscriptValue at[maxRank]; + if (SubscriptsForZeroBasedElementNumber(at, n)) { + return Element<A>(at); + } + } + return nullptr; + } + + RT_API_ATTRS int GetLowerBounds(SubscriptValue subscript[]) const { + for (int j{0}; j < raw_.rank; ++j) { + subscript[j] = GetDimension(j).LowerBound(); + } + return raw_.rank; + } + + RT_API_ATTRS int GetShape(SubscriptValue subscript[]) const { + for (int j{0}; j < raw_.rank; ++j) { + subscript[j] = GetDimension(j).Extent(); + } + return raw_.rank; + } + + // When the passed subscript vector contains the last (or first) + // subscripts of the array, these wrap the subscripts around to + // their first (or last) values and return false. + RT_API_ATTRS bool IncrementSubscripts( + SubscriptValue subscript[], const int *permutation = nullptr) const { + for (int j{0}; j < raw_.rank; ++j) { + int k{permutation ? permutation[j] : j}; + const Dimension &dim{GetDimension(k)}; + if (subscript[k]++ < dim.UpperBound()) { + return true; + } + subscript[k] = dim.LowerBound(); + } + return false; + } + + RT_API_ATTRS bool DecrementSubscripts( + SubscriptValue[], const int *permutation = nullptr) const; + + // False when out of range. + RT_API_ATTRS bool SubscriptsForZeroBasedElementNumber( + SubscriptValue subscript[], std::size_t elementNumber, + const int *permutation = nullptr) const { + if (raw_.rank == 0) { + return elementNumber == 0; + } + std::size_t dimCoefficient[maxRank]; + int k0{permutation ? permutation[0] : 0}; + dimCoefficient[0] = 1; + auto coefficient{static_cast<std::size_t>(GetDimension(k0).Extent())}; + for (int j{1}; j < raw_.rank; ++j) { + int k{permutation ? permutation[j] : j}; + const Dimension &dim{GetDimension(k)}; + dimCoefficient[j] = coefficient; + coefficient *= dim.Extent(); + } + if (elementNumber >= coefficient) { + return false; // out of range + } + for (int j{raw_.rank - 1}; j > 0; --j) { + int k{permutation ? permutation[j] : j}; + const Dimension &dim{GetDimension(k)}; + std::size_t quotient{elementNumber / dimCoefficient[j]}; + subscript[k] = quotient + dim.LowerBound(); + elementNumber -= quotient * dimCoefficient[j]; + } + subscript[k0] = elementNumber + GetDimension(k0).LowerBound(); + return true; + } + + RT_API_ATTRS std::size_t ZeroBasedElementNumber( + const SubscriptValue *, const int *permutation = nullptr) const; + + RT_API_ATTRS DescriptorAddendum *Addendum() { + if (HasAddendum()) { + return reinterpret_cast<DescriptorAddendum *>(&GetDimension(rank())); + } else { + return nullptr; + } + } + RT_API_ATTRS const DescriptorAddendum *Addendum() const { + if (HasAddendum()) { + return reinterpret_cast<const DescriptorAddendum *>( + &GetDimension(rank())); + } else { + return nullptr; + } + } + + // Returns size in bytes of the descriptor (not the data) + static constexpr RT_API_ATTRS std::size_t SizeInBytes( + int rank, bool addendum = false, int lengthTypeParameters = 0) { + std::size_t bytes{sizeof(Descriptor) - sizeof(Dimension)}; + bytes += rank * sizeof(Dimension); + if (addendum || lengthTypeParameters > 0) { + bytes += DescriptorAddendum::SizeInBytes(lengthTypeParameters); + } + return bytes; + } + + RT_API_ATTRS std::size_t SizeInBytes() const; + + RT_API_ATTRS std::size_t Elements() const; + RT_API_ATTRS std::size_t InlineElements() const { + int n{rank()}; + if (n == 0) { + return 1; + } else { + auto elements{static_cast<std::size_t>(GetDimension(0).Extent())}; + for (int j{1}; j < n; ++j) { + elements *= GetDimension(j).Extent(); + } + return elements; + } + } + + // Allocate() assumes Elements() and ElementBytes() work; + // define the extents of the dimensions and the element length + // before calling. It (re)computes the byte strides after + // allocation. Does not allocate automatic components or + // perform default component initialization. + RT_API_ATTRS int Allocate(std::int64_t *asyncObject); + RT_API_ATTRS void SetByteStrides(); + + // Deallocates storage; does not call FINAL subroutines or + // deallocate allocatable/automatic components. + RT_API_ATTRS int Deallocate() { + ISO::CFI_cdesc_t &descriptor{raw()}; + void *pointer{descriptor.base_addr}; + if (!pointer) { + return CFI_ERROR_BASE_ADDR_NULL; + } else { + int allocIndex{MapAllocIdx()}; + if (allocIndex == kDefaultAllocator) { + std::free(pointer); + } else { + allocatorRegistry.GetDeallocator(MapAllocIdx())(pointer); + } + descriptor.base_addr = nullptr; + return CFI_SUCCESS; + } + } + + // Deallocates storage, including allocatable and automatic + // components. Optionally invokes FINAL subroutines. + RT_API_ATTRS int Destroy(bool finalize = false, bool destroyPointers = false, + Terminator * = nullptr); + + RT_API_ATTRS bool IsContiguous(int leadingDimensions = maxRank) const { + auto bytes{static_cast<SubscriptValue>(ElementBytes())}; + if (leadingDimensions > raw_.rank) { + leadingDimensions = raw_.rank; + } + bool stridesAreContiguous{true}; + for (int j{0}; j < leadingDimensions; ++j) { + const Dimension &dim{GetDimension(j)}; + stridesAreContiguous &= bytes == dim.ByteStride() || dim.Extent() == 1; + bytes *= dim.Extent(); + } + // One and zero element arrays are contiguous even if the descriptor + // byte strides are not perfect multiples. + // Arrays with more than 2 elements may also be contiguous even if a + // byte stride in one dimension is not a perfect multiple, as long as + // this is the last dimension, or if the dimension has one extent and + // the following dimension have either one extents or contiguous byte + // strides. + return stridesAreContiguous || bytes == 0; + } + + // The result, if any, is a fixed stride value that can be used to + // address all elements. It generalizes contiguity by also allowing + // the case of an array with extent 1 on all but one dimension. + RT_API_ATTRS common::optional<SubscriptValue> FixedStride() const { + auto rank{static_cast<std::size_t>(raw_.rank)}; + common::optional<SubscriptValue> stride; + for (std::size_t j{0}; j < rank; ++j) { + const Dimension &dim{GetDimension(j)}; + auto extent{dim.Extent()}; + if (extent == 0) { + break; // empty array + } else if (extent == 1) { // ok + } else if (stride) { + // Extent > 1 on multiple dimensions + if (IsContiguous()) { + return ElementBytes(); + } else { + return common::nullopt; + } + } else { + stride = dim.ByteStride(); + } + } + return stride.value_or(0); // 0 for scalars and empty arrays + } + + // Establishes a pointer to a section or element. + RT_API_ATTRS bool EstablishPointerSection(const Descriptor &source, + const SubscriptValue *lower = nullptr, + const SubscriptValue *upper = nullptr, + const SubscriptValue *stride = nullptr); + + RT_API_ATTRS void ApplyMold(const Descriptor &, int rank); + + RT_API_ATTRS void Check() const; + + void Dump(FILE * = stdout) const; + + RT_API_ATTRS inline bool HasAddendum() const { + return raw_.extra & _CFI_ADDENDUM_FLAG; + } + RT_API_ATTRS inline void SetHasAddendum() { + raw_.extra |= _CFI_ADDENDUM_FLAG; + } + RT_API_ATTRS inline int GetAllocIdx() const { + return (raw_.extra & _CFI_ALLOCATOR_IDX_MASK) >> _CFI_ALLOCATOR_IDX_SHIFT; + } + RT_API_ATTRS int MapAllocIdx() const { +#ifdef RT_DEVICE_COMPILATION + // Force default allocator in device code. + return kDefaultAllocator; +#else + return GetAllocIdx(); +#endif + } + RT_API_ATTRS inline void SetAllocIdx(int pos) { + raw_.extra &= ~_CFI_ALLOCATOR_IDX_MASK; // Clear the allocator index bits. + raw_.extra |= pos << _CFI_ALLOCATOR_IDX_SHIFT; + } + +private: + ISO::CFI_cdesc_t raw_; +}; +static_assert(sizeof(Descriptor) == sizeof(ISO::CFI_cdesc_t)); + +// Lightweight iterator-like API to simplify specialising Descriptor indexing +// in cases where it can improve application performance. On account of the +// purpose of this API being performance optimisation, it is up to the user to +// do all the necessary checks to make sure the specialised variants can be used +// safely and that Advance() is not called more times than the number of +// elements in the Descriptor allows for. +// Default RANK=-1 supports aray descriptors of any rank up to maxRank. +template <int RANK = -1> class DescriptorIterator { +private: + const Descriptor &descriptor; + SubscriptValue subscripts[maxRank]; + std::size_t elementOffset{0}; + +public: + RT_API_ATTRS DescriptorIterator(const Descriptor &descriptor) + : descriptor(descriptor) { + // We do not need the subscripts to iterate over a rank-1 array + if constexpr (RANK != 1) { + descriptor.GetLowerBounds(subscripts); + } + }; + + template <typename A> RT_API_ATTRS A *Get() { + std::size_t offset{0}; + // The rank-1 case doesn't require looping at all + if constexpr (RANK == 1) { + offset = elementOffset; + // The compiler might be able to optimise this better if we know the rank + // at compile time + } else if constexpr (RANK != -1) { + for (int j{0}; j < RANK; ++j) { + offset += descriptor.SubscriptByteOffset(j, subscripts[j]); + } + // General fallback + } else { + offset = descriptor.SubscriptsToByteOffset(subscripts); + } + + return descriptor.OffsetElement<A>(offset); + } + + RT_API_ATTRS void Advance() { + if constexpr (RANK == 1) { + elementOffset += descriptor.GetDimension(0).ByteStride(); + } else if constexpr (RANK != -1) { + for (int j{0}; j < RANK; ++j) { + const Dimension &dim{descriptor.GetDimension(j)}; + if (subscripts[j]++ < dim.UpperBound()) { + break; + } + subscripts[j] = dim.LowerBound(); + } + } else { + descriptor.IncrementSubscripts(subscripts); + } + } +}; + +// Properly configured instances of StaticDescriptor will occupy the +// exact amount of storage required for the descriptor, its dimensional +// information, and possible addendum. To build such a static descriptor, +// declare an instance of StaticDescriptor<>, extract a reference to its +// descriptor via the descriptor() accessor, and then built a Descriptor +// therein via descriptor.Establish(), e.g.: +// StaticDescriptor<R,A,LP> statDesc; +// Descriptor &descriptor{statDesc.descriptor()}; +// descriptor.Establish( ... ); +template <int MAX_RANK = maxRank, bool ADDENDUM = false, int MAX_LEN_PARMS = 0> +class alignas(Descriptor) StaticDescriptor { +public: + RT_OFFLOAD_VAR_GROUP_BEGIN + static constexpr int maxRank{MAX_RANK}; + static constexpr int maxLengthTypeParameters{MAX_LEN_PARMS}; + static constexpr bool hasAddendum{ADDENDUM || MAX_LEN_PARMS > 0}; + static constexpr std::size_t byteSize{ + Descriptor::SizeInBytes(maxRank, hasAddendum, maxLengthTypeParameters)}; + static_assert(byteSize <= + MaxDescriptorSizeInBytes(maxRank, hasAddendum, maxLengthTypeParameters)); + RT_OFFLOAD_VAR_GROUP_END + + RT_API_ATTRS Descriptor &descriptor() { + return *reinterpret_cast<Descriptor *>(storage_); + } + RT_API_ATTRS const Descriptor &descriptor() const { + return *reinterpret_cast<const Descriptor *>(storage_); + } + + RT_API_ATTRS void Check() { + assert(descriptor().rank() <= maxRank); + assert(descriptor().SizeInBytes() <= byteSize); + if (DescriptorAddendum * addendum{descriptor().Addendum()}) { + (void)addendum; + assert(hasAddendum); + assert(addendum->LenParameters() <= maxLengthTypeParameters); + } else { + assert(!hasAddendum); + assert(maxLengthTypeParameters == 0); + } + descriptor().Check(); + } + +private: + char storage_[byteSize]{}; +}; + +// Deduction guide to avoid warnings from older versions of clang. +StaticDescriptor() -> StaticDescriptor<maxRank, false, 0>; + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_DESCRIPTOR_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/emit-encoded.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/emit-encoded.h new file mode 100644 index 00000000000..ea83901fcc8 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/emit-encoded.h @@ -0,0 +1,117 @@ +//===-- include/flang-rt/runtime/emit-encoded.h -----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Templates for emitting CHARACTER values with conversion + +#ifndef FLANG_RT_RUNTIME_EMIT_ENCODED_H_ +#define FLANG_RT_RUNTIME_EMIT_ENCODED_H_ + +#include "connection.h" +#include "environment.h" +#include "tools.h" +#include "utf.h" + +namespace Fortran::runtime::io { + +template <typename CONTEXT, typename CHAR, bool NL_ADVANCES_RECORD = true> +RT_API_ATTRS bool EmitEncoded( + CONTEXT &to, const CHAR *data, std::size_t chars) { + ConnectionState &connection{to.GetConnectionState()}; + if constexpr (NL_ADVANCES_RECORD) { + if (connection.access == Access::Stream && + connection.internalIoCharKind == 0) { + // Stream output: treat newlines as record advancements so that the left + // tab limit is correctly managed + while (const CHAR * nl{FindCharacter(data, CHAR{'\n'}, chars)}) { + auto pos{static_cast<std::size_t>(nl - data)}; + // The [data, data + pos) does not contain the newline, + // so we can avoid the recursion by calling proper specialization. + if (!EmitEncoded<CONTEXT, CHAR, false>(to, data, pos)) { + return false; + } + data += pos + 1; + chars -= pos + 1; + to.AdvanceRecord(); + } + } + } + if (connection.useUTF8<CHAR>()) { + using UnsignedChar = std::make_unsigned_t<CHAR>; + const UnsignedChar *uData{reinterpret_cast<const UnsignedChar *>(data)}; + char buffer[256]; + std::size_t at{0}; + while (chars-- > 0) { + auto len{EncodeUTF8(buffer + at, *uData++)}; + at += len; + if (at + maxUTF8Bytes > sizeof buffer) { + if (!to.Emit(buffer, at)) { + return false; + } + at = 0; + } + } + return at == 0 || to.Emit(buffer, at); + } else { + std::size_t internalKind = connection.internalIoCharKind; + if (internalKind == 0 || internalKind == sizeof(CHAR)) { + const char *rawData{reinterpret_cast<const char *>(data)}; + return to.Emit(rawData, chars * sizeof(CHAR), sizeof(CHAR)); + } else { + // CHARACTER kind conversion for internal output + while (chars-- > 0) { + char32_t buffer = static_cast<char32_t>(*data++); + char *p{reinterpret_cast<char *>(&buffer)}; + if constexpr (!isHostLittleEndian) { + p += sizeof(buffer) - internalKind; + } + if (!to.Emit(p, internalKind)) { + return false; + } + } + return true; + } + } +} + +template <typename CONTEXT> +RT_API_ATTRS bool EmitAscii(CONTEXT &to, const char *data, std::size_t chars) { + ConnectionState &connection{to.GetConnectionState()}; + if (connection.internalIoCharKind <= 1 && + connection.access != Access::Stream) { + return to.Emit(data, chars); + } else { + return EmitEncoded(to, data, chars); + } +} + +template <typename CONTEXT> +RT_API_ATTRS bool EmitRepeated(CONTEXT &to, char ch, std::size_t n) { + if (n <= 0) { + return true; + } + ConnectionState &connection{to.GetConnectionState()}; + if (connection.internalIoCharKind <= 1 && + connection.access != Access::Stream) { + // faster path, no encoding needed + while (n-- > 0) { + if (!to.Emit(&ch, 1)) { + return false; + } + } + } else { + while (n-- > 0) { + if (!EmitEncoded(to, &ch, 1)) { + return false; + } + } + } + return true; +} + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_EMIT_ENCODED_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/environment.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/environment.h new file mode 100644 index 00000000000..e579f6012ce --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/environment.h @@ -0,0 +1,81 @@ +//===-- include/flang-rt/runtime/environment.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_ENVIRONMENT_H_ +#define FLANG_RT_RUNTIME_ENVIRONMENT_H_ + +#include "flang/Common/optional.h" +#include "flang/Decimal/decimal.h" + +struct EnvironmentDefaultList; + +namespace Fortran::runtime { + +class Terminator; + +RT_OFFLOAD_VAR_GROUP_BEGIN +#if FLANG_BIG_ENDIAN +constexpr bool isHostLittleEndian{false}; +#elif FLANG_LITTLE_ENDIAN +constexpr bool isHostLittleEndian{true}; +#else +#error host endianness is not known +#endif +RT_OFFLOAD_VAR_GROUP_END + +// External unformatted I/O data conversions +enum class Convert { Unknown, Native, LittleEndian, BigEndian, Swap }; + +RT_API_ATTRS Fortran::common::optional<Convert> GetConvertFromString( + const char *, std::size_t); + +struct ExecutionEnvironment { +#if !defined(_OPENMP) + // FIXME: https://github.com/llvm/llvm-project/issues/84942 + constexpr +#endif + ExecutionEnvironment(){}; + void Configure(int argc, const char *argv[], const char *envp[], + const EnvironmentDefaultList *envDefaults); + const char *GetEnv( + const char *name, std::size_t name_length, const Terminator &terminator); + + std::int32_t SetEnv(const char *name, std::size_t name_length, + const char *value, std::size_t value_length, + const Terminator &terminator); + + std::int32_t UnsetEnv( + const char *name, std::size_t name_length, const Terminator &terminator); + + int argc{0}; + const char **argv{nullptr}; + char **envp{nullptr}; + + int listDirectedOutputLineLengthLimit{79}; // FORT_FMT_RECL + enum decimal::FortranRounding defaultOutputRoundingMode{ + decimal::FortranRounding::RoundNearest}; // RP(==PN) + Convert conversion{Convert::Unknown}; // FORT_CONVERT + bool noStopMessage{false}; // NO_STOP_MESSAGE=1 inhibits "Fortran STOP" + bool defaultUTF8{false}; // DEFAULT_UTF8 + bool checkPointerDeallocation{true}; // FORT_CHECK_POINTER_DEALLOCATION + + enum InternalDebugging { WorkQueue = 1 }; + int internalDebugging{0}; // FLANG_RT_DEBUG + + // CUDA related variables + std::size_t cudaStackLimit{0}; // ACC_OFFLOAD_STACK_SIZE + bool cudaDeviceIsManaged{false}; // NV_CUDAFOR_DEVICE_IS_MANAGED +}; + +RT_OFFLOAD_VAR_GROUP_BEGIN +extern RT_VAR_ATTRS ExecutionEnvironment executionEnvironment; +RT_OFFLOAD_VAR_GROUP_END + +} // namespace Fortran::runtime + +#endif // FLANG_RT_RUNTIME_ENVIRONMENT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/file.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/file.h new file mode 100644 index 00000000000..3bba29722b3 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/file.h @@ -0,0 +1,116 @@ +//===-- include/flang-rt/runtime/file.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Raw system I/O wrappers + +#ifndef FLANG_RT_RUNTIME_FILE_H_ +#define FLANG_RT_RUNTIME_FILE_H_ + +#include "io-error.h" +#include "memory.h" +#include "flang/Common/optional.h" +#include <cinttypes> + +namespace Fortran::runtime::io { + +enum class OpenStatus { Old, New, Scratch, Replace, Unknown }; +enum class CloseStatus { Keep, Delete }; +enum class Position { AsIs, Rewind, Append }; +enum class Action { Read, Write, ReadWrite }; + +class OpenFile { +public: + using FileOffset = std::int64_t; + + const char *path() const { return path_.get(); } + std::size_t pathLength() const { return pathLength_; } + void set_path(OwningPtr<char> &&, std::size_t bytes); + bool mayRead() const { return mayRead_; } + bool mayWrite() const { return mayWrite_; } + bool mayPosition() const { return mayPosition_; } + bool mayAsynchronous() const { return mayAsynchronous_; } + void set_mayAsynchronous(bool yes) { mayAsynchronous_ = yes; } + bool isTerminal() const { return isTerminal_; } + bool isWindowsTextFile() const { return isWindowsTextFile_; } + Fortran::common::optional<FileOffset> knownSize() const { return knownSize_; } + + bool IsConnected() const { return fd_ >= 0; } + void Open(OpenStatus, Fortran::common::optional<Action>, Position, + IoErrorHandler &); + void Predefine(int fd); + void Close(CloseStatus, IoErrorHandler &); + + // Reads data into memory; returns amount acquired. Synchronous. + // Partial reads (less than minBytes) signify end-of-file. If the + // buffer is larger than minBytes, and extra returned data will be + // preserved for future consumption, set maxBytes larger than minBytes + // to reduce system calls This routine handles EAGAIN/EWOULDBLOCK and EINTR. + std::size_t Read(FileOffset, char *, std::size_t minBytes, + std::size_t maxBytes, IoErrorHandler &); + + // Writes data. Synchronous. Partial writes indicate program-handled + // error conditions. + std::size_t Write(FileOffset, const char *, std::size_t, IoErrorHandler &); + + // Truncates the file + void Truncate(FileOffset, IoErrorHandler &); + + // Asynchronous transfers + int ReadAsynchronously(FileOffset, char *, std::size_t, IoErrorHandler &); + int WriteAsynchronously( + FileOffset, const char *, std::size_t, IoErrorHandler &); + void Wait(int id, IoErrorHandler &); + void WaitAll(IoErrorHandler &); + + // INQUIRE(POSITION=) + Position InquirePosition() const; + +private: + struct Pending { + int id; + int ioStat{0}; + OwningPtr<Pending> next; + }; + + void CheckOpen(const Terminator &); + bool Seek(FileOffset, IoErrorHandler &); + bool RawSeek(FileOffset); + bool RawSeekToEnd(); + int PendingResult(const Terminator &, int); + void SetPosition(FileOffset pos) { + position_ = pos; + openPosition_.reset(); + } + void CloseFd(IoErrorHandler &); + + int fd_{-1}; + OwningPtr<char> path_; + std::size_t pathLength_; + bool mayRead_{false}; + bool mayWrite_{false}; + bool mayPosition_{false}; + bool mayAsynchronous_{false}; + Fortran::common::optional<Position> + openPosition_; // from Open(); reset after positioning + FileOffset position_{0}; + Fortran::common::optional<FileOffset> knownSize_; + bool isTerminal_{false}; + bool isWindowsTextFile_{false}; // expands LF to CR+LF on write + + int nextId_; + OwningPtr<Pending> pending_; +}; + +RT_API_ATTRS bool IsATerminal(int fd); +RT_API_ATTRS bool IsExtant(const char *path); +RT_API_ATTRS bool MayRead(const char *path); +RT_API_ATTRS bool MayWrite(const char *path); +RT_API_ATTRS bool MayReadAndWrite(const char *path); +RT_API_ATTRS std::int64_t SizeInBytes(const char *path); +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_FILE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/format-implementation.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/format-implementation.h new file mode 100644 index 00000000000..85dc922bc31 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/format-implementation.h @@ -0,0 +1,613 @@ +//===-- include/flang-rt/runtime/format-implementation.h --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements out-of-line member functions of template class FormatControl + +#ifndef FLANG_RT_RUNTIME_FORMAT_IMPLEMENTATION_H_ +#define FLANG_RT_RUNTIME_FORMAT_IMPLEMENTATION_H_ + +#include "emit-encoded.h" +#include "format.h" +#include "io-stmt.h" +#include "memory.h" +#include "flang/Common/format.h" +#include "flang/Decimal/decimal.h" +#include "flang/Runtime/main.h" +#include <algorithm> +#include <cstring> +#include <limits> + +namespace Fortran::runtime::io { + +template <typename CONTEXT> +RT_API_ATTRS FormatControl<CONTEXT>::FormatControl(const Terminator &terminator, + const CharType *format, std::size_t formatLength, + const Descriptor *formatDescriptor, int maxHeight) + : maxHeight_{static_cast<std::uint8_t>(maxHeight)}, format_{format}, + formatLength_{static_cast<int>(formatLength)} { + RUNTIME_CHECK(terminator, maxHeight == maxHeight_); + if (!format && formatDescriptor) { + // The format is a character array passed via a descriptor. + std::size_t elements{formatDescriptor->Elements()}; + std::size_t elementBytes{formatDescriptor->ElementBytes()}; + formatLength = elements * elementBytes / sizeof(CharType); + formatLength_ = static_cast<int>(formatLength); + if (formatDescriptor->IsContiguous()) { + // Treat the contiguous array as a single character value. + format_ = const_cast<const CharType *>( + reinterpret_cast<CharType *>(formatDescriptor->raw().base_addr)); + } else { + // Concatenate its elements into a temporary array. + char *p{reinterpret_cast<char *>( + AllocateMemoryOrCrash(terminator, formatLength * sizeof(CharType)))}; + format_ = p; + SubscriptValue at[maxRank]; + formatDescriptor->GetLowerBounds(at); + for (std::size_t j{0}; j < elements; ++j) { + std::memcpy(p, formatDescriptor->Element<char>(at), elementBytes); + p += elementBytes; + formatDescriptor->IncrementSubscripts(at); + } + freeFormat_ = true; + } + } + RUNTIME_CHECK( + terminator, formatLength == static_cast<std::size_t>(formatLength_)); + stack_[0].start = offset_; + stack_[0].remaining = Iteration::unlimited; // 13.4(8) +} + +template <typename CONTEXT> +RT_API_ATTRS int FormatControl<CONTEXT>::GetIntField( + IoErrorHandler &handler, CharType firstCh, bool *hadError) { + CharType ch{firstCh ? firstCh : PeekNext()}; + bool negate{ch == '-'}; + if (negate || ch == '+') { + if (firstCh) { + firstCh = '\0'; + } else { + ++offset_; + } + ch = PeekNext(); + } + if (ch < '0' || ch > '9') { + handler.SignalError(IostatErrorInFormat, + "Invalid FORMAT: integer expected at '%c'", static_cast<char>(ch)); + if (hadError) { + *hadError = true; + } + return 0; + } + int result{0}; + while (ch >= '0' && ch <= '9') { + constexpr int tenth{std::numeric_limits<int>::max() / 10}; + if (result > tenth || + ch - '0' > std::numeric_limits<int>::max() - 10 * result) { + handler.SignalError( + IostatErrorInFormat, "FORMAT integer field out of range"); + if (hadError) { + *hadError = true; + } + return result; + } + result = 10 * result + ch - '0'; + if (firstCh) { + firstCh = '\0'; + } else { + ++offset_; + } + ch = PeekNext(); + } + if (negate && (result *= -1) > 0) { + handler.SignalError( + IostatErrorInFormat, "FORMAT integer field out of range"); + if (hadError) { + *hadError = true; + } + } + return result; +} + +// Xn, TRn, TLn +template <typename CONTEXT> +static RT_API_ATTRS bool RelativeTabbing(CONTEXT &context, int n) { + ConnectionState &connection{context.GetConnectionState()}; + if constexpr (std::is_same_v<CONTEXT, + ExternalFormattedIoStatementState<Direction::Input>> || + std::is_same_v<CONTEXT, + ExternalFormattedIoStatementState<Direction::Output>>) { + if (n != 0 && connection.isUTF8) { + const char *p{}; + if (n > 0) { // Xn or TRn + // Skip 'n' multi-byte characters. If that's more than are in the + // current record, that's valid -- the program can position past the + // end and then reposition back with Tn or TLn. + std::size_t bytesLeft{context.ViewBytesInRecord(p, true)}; + for (; n > 0 && bytesLeft && p; --n) { + std::size_t byteCount{MeasureUTF8Bytes(*p)}; + if (byteCount > bytesLeft) { + break; + } + context.HandleRelativePosition(byteCount); + bytesLeft -= byteCount; + // Don't call GotChar(byteCount), these don't count towards SIZE= + p += byteCount; + } + } else { // n < 0: TLn + n = -n; + if (std::int64_t excess{connection.positionInRecord - + connection.recordLength.value_or(connection.positionInRecord)}; + excess > 0) { + // Have tabbed past the end of the record + if (excess >= n) { + context.HandleRelativePosition(-n); + return true; + } + context.HandleRelativePosition(-excess); + n -= excess; + } + std::size_t bytesLeft{context.ViewBytesInRecord(p, false)}; + // Go back 'n' multi-byte characters. + for (; n > 0 && bytesLeft && p; --n) { + std::size_t byteCount{MeasurePreviousUTF8Bytes(p, bytesLeft)}; + context.HandleRelativePosition(-byteCount); + bytesLeft -= byteCount; + p -= byteCount; + } + } + } + } + if (connection.internalIoCharKind > 1) { + n *= connection.internalIoCharKind; + } + context.HandleRelativePosition(n); + return true; +} + +// Tn +template <typename CONTEXT> +static RT_API_ATTRS bool AbsoluteTabbing(CONTEXT &context, int n) { + ConnectionState &connection{context.GetConnectionState()}; + n = n > 0 ? n - 1 : 0; // convert 1-based position to 0-based offset + if constexpr (std::is_same_v<CONTEXT, + ExternalFormattedIoStatementState<Direction::Input>> || + std::is_same_v<CONTEXT, + ExternalFormattedIoStatementState<Direction::Output>>) { + if (connection.isUTF8) { + // Reset to the beginning of the record, then TR(n-1) + connection.HandleAbsolutePosition(0); + return RelativeTabbing(context, n); + } + } + if (connection.internalIoCharKind > 1) { + n *= connection.internalIoCharKind; + } + context.HandleAbsolutePosition(n); + return true; +} + +template <typename CONTEXT> +static RT_API_ATTRS void HandleControl( + CONTEXT &context, char ch, char next, int n) { + MutableModes &modes{context.mutableModes()}; + switch (ch) { + case 'B': + if (next == 'Z') { + modes.editingFlags |= blankZero; + return; + } + if (next == 'N') { + modes.editingFlags &= ~blankZero; + return; + } + break; + case 'D': + if (next == 'C') { + modes.editingFlags |= decimalComma; + return; + } + if (next == 'P') { + modes.editingFlags &= ~decimalComma; + return; + } + break; + case 'P': + if (!next) { + modes.scale = n; // kP - decimal scaling by 10**k + return; + } + break; + case 'R': + switch (next) { + case 'N': + modes.round = decimal::RoundNearest; + return; + case 'Z': + modes.round = decimal::RoundToZero; + return; + case 'U': + modes.round = decimal::RoundUp; + return; + case 'D': + modes.round = decimal::RoundDown; + return; + case 'C': + modes.round = decimal::RoundCompatible; + return; + case 'P': + modes.round = executionEnvironment.defaultOutputRoundingMode; + return; + default: + break; + } + break; + case 'X': + if (!next && RelativeTabbing(context, n)) { + return; + } + break; + case 'S': + if (next == 'P') { + modes.editingFlags |= signPlus; + return; + } + if (!next || next == 'S') { + modes.editingFlags &= ~signPlus; + return; + } + break; + case 'T': { + if (!next) { // Tn + if (AbsoluteTabbing(context, n)) { + return; + } + } else if (next == 'R' || next == 'L') { // TRn / TLn + if (RelativeTabbing(context, next == 'L' ? -n : n)) { + return; + } + } + } break; + default: + break; + } + if (next) { + context.SignalError(IostatErrorInFormat, + "Unknown '%c%c' edit descriptor in FORMAT", ch, next); + } else { + context.SignalError( + IostatErrorInFormat, "Unknown '%c' edit descriptor in FORMAT", ch); + } +} + +// Locates the next data edit descriptor in the format. +// Handles all repetition counts and control edit descriptors. +// Generally assumes that the format string has survived the common +// format validator gauntlet. +template <typename CONTEXT> +RT_API_ATTRS int FormatControl<CONTEXT>::CueUpNextDataEdit( + Context &context, bool stop) { + bool hitUnlimitedLoopEnd{false}; + // Do repetitions remain on an unparenthesized data edit? + while (height_ > 1 && format_[stack_[height_ - 1].start] != '(') { + offset_ = stack_[height_ - 1].start; + int repeat{stack_[height_ - 1].remaining}; + --height_; + if (repeat > 0) { + return repeat; + } + } + while (true) { + Fortran::common::optional<int> repeat; + bool unlimited{false}; + auto maybeReversionPoint{offset_}; + CharType ch{GetNextChar(context)}; + while (ch == ',' || ch == ':') { + // Skip commas, and don't complain if they're missing; the format + // validator does that. + if (stop && ch == ':') { + return 0; + } + ch = GetNextChar(context); + } + if (ch == '-' || ch == '+' || (ch >= '0' && ch <= '9')) { + bool hadSign{ch == '-' || ch == '+'}; + repeat = GetIntField(context, ch); + ch = GetNextChar(context); + if (hadSign && ch != 'p' && ch != 'P') { + ReportBadFormat(context, + "Invalid FORMAT: signed integer may appear only before 'P", + maybeReversionPoint); + return 0; + } + } else if (ch == '*') { + unlimited = true; + ch = GetNextChar(context); + if (ch != '(') { + ReportBadFormat(context, + "Invalid FORMAT: '*' may appear only before '('", + maybeReversionPoint); + return 0; + } + if (height_ != 1) { + ReportBadFormat(context, + "Invalid FORMAT: '*' must be nested in exactly one set of " + "parentheses", + maybeReversionPoint); + return 0; + } + } + ch = Capitalize(ch); + if (ch == '(') { + if (height_ >= maxHeight_) { + ReportBadFormat(context, + "FORMAT stack overflow: too many nested parentheses", + maybeReversionPoint); + return 0; + } + stack_[height_].start = offset_ - 1; // the '(' + RUNTIME_CHECK(context, format_[stack_[height_].start] == '('); + if (unlimited || height_ == 0) { + stack_[height_].remaining = Iteration::unlimited; + } else if (repeat) { + if (*repeat <= 0) { + *repeat = 1; // error recovery + } + stack_[height_].remaining = *repeat - 1; + } else { + stack_[height_].remaining = 0; + } + if (height_ == 1 && !hitEnd_) { + // Subtle point (F'2018 13.4 para 9): the last parenthesized group + // at height 1 becomes the restart point after control reaches the + // end of the format, including its repeat count. + stack_[0].start = maybeReversionPoint; + } + ++height_; + } else if (height_ == 0) { + ReportBadFormat(context, "FORMAT lacks initial '('", maybeReversionPoint); + return 0; + } else if (ch == ')') { + if (height_ == 1) { + hitEnd_ = true; + if (stop) { + return 0; // end of FORMAT and no data items remain + } + context.AdvanceRecord(); // implied / before rightmost ) + } + auto restart{stack_[height_ - 1].start}; + if (format_[restart] == '(') { + ++restart; + } + if (stack_[height_ - 1].remaining == Iteration::unlimited) { + if (height_ > 1 && GetNextChar(context) != ')') { + ReportBadFormat(context, + "Unlimited repetition in FORMAT may not be followed by more " + "items", + restart); + return 0; + } + if (hitUnlimitedLoopEnd) { + ReportBadFormat(context, + "Unlimited repetition in FORMAT lacks data edit descriptors", + restart); + return 0; + } + hitUnlimitedLoopEnd = true; + offset_ = restart; + } else if (stack_[height_ - 1].remaining-- > 0) { + offset_ = restart; + } else { + --height_; + } + } else if (ch == '\'' || ch == '"') { + // Quoted 'character literal' + CharType quote{ch}; + auto start{offset_}; + while (offset_ < formatLength_ && format_[offset_] != quote) { + ++offset_; + } + if (offset_ >= formatLength_) { + ReportBadFormat(context, + "FORMAT missing closing quote on character literal", + maybeReversionPoint); + return 0; + } + ++offset_; + std::size_t chars{ + static_cast<std::size_t>(&format_[offset_] - &format_[start])}; + if (offset_ < formatLength_ && format_[offset_] == quote) { + // subtle: handle doubled quote character in a literal by including + // the first in the output, then treating the second as the start + // of another character literal. + } else { + --chars; + } + if constexpr (std::is_base_of_v<InputStatementState, CONTEXT>) { + context.HandleRelativePosition(chars); + } else { + EmitAscii(context, format_ + start, chars); + } + } else if (ch == 'H') { + // 9HHOLLERITH + if (!repeat || *repeat < 1 || offset_ + *repeat > formatLength_) { + ReportBadFormat(context, "Invalid width on Hollerith in FORMAT", + maybeReversionPoint); + return 0; + } + if constexpr (std::is_base_of_v<InputStatementState, CONTEXT>) { + context.HandleRelativePosition(static_cast<std::size_t>(*repeat)); + } else { + EmitAscii( + context, format_ + offset_, static_cast<std::size_t>(*repeat)); + } + offset_ += *repeat; + } else if (ch >= 'A' && ch <= 'Z') { + int start{offset_ - 1}; + CharType next{'\0'}; + if (ch != 'P') { // 1PE5.2 - comma not required (C1302) + CharType peek{Capitalize(PeekNext())}; + if (peek >= 'A' && peek <= 'Z') { + if ((ch == 'A' && peek == 'T' /* anticipate F'202X AT editing */) || + ch == 'B' || ch == 'D' || ch == 'E' || ch == 'R' || ch == 'S' || + ch == 'T') { + // Assume a two-letter edit descriptor + next = peek; + ++offset_; + } else { + // extension: assume a comma between 'ch' and 'peek' + } + } + } + if ((!next && + (ch == 'A' || ch == 'I' || ch == 'B' || ch == 'E' || ch == 'D' || + ch == 'O' || ch == 'Z' || ch == 'F' || ch == 'G' || + ch == 'L')) || + (ch == 'E' && (next == 'N' || next == 'S' || next == 'X')) || + (ch == 'D' && next == 'T')) { + // Data edit descriptor found + offset_ = start; + return repeat && *repeat > 0 ? *repeat : 1; + } else { + // Control edit descriptor + if (ch == 'T') { // Tn, TLn, TRn + repeat = GetIntField(context); + } + HandleControl(context, static_cast<char>(ch), static_cast<char>(next), + repeat ? *repeat : 1); + } + } else if (ch == '/') { + context.AdvanceRecord(repeat && *repeat > 0 ? *repeat : 1); + } else if (ch == '$' || ch == '\\') { + context.mutableModes().nonAdvancing = true; + } else if (ch == '\t' || ch == '\v') { + // Tabs (extension) + // TODO: any other raw characters? + EmitAscii(context, format_ + offset_ - 1, 1); + } else { + ReportBadFormat( + context, "Invalid character in FORMAT", maybeReversionPoint); + return 0; + } + } +} + +// Returns the next data edit descriptor +template <typename CONTEXT> +RT_API_ATTRS Fortran::common::optional<DataEdit> +FormatControl<CONTEXT>::GetNextDataEdit(Context &context, int maxRepeat) { + int repeat{CueUpNextDataEdit(context)}; + auto start{offset_}; + DataEdit edit; + edit.modes = context.mutableModes(); + // Handle repeated nonparenthesized edit descriptors + edit.repeat = std::min(repeat, maxRepeat); // 0 if maxRepeat==0 + if (repeat > maxRepeat) { + stack_[height_].start = start; // after repeat count + stack_[height_].remaining = repeat - edit.repeat; + ++height_; + } + edit.descriptor = static_cast<char>(Capitalize(GetNextChar(context))); + if (edit.descriptor == 'D' && Capitalize(PeekNext()) == 'T') { + // DT['iotype'][(v_list)] defined I/O + edit.descriptor = DataEdit::DefinedDerivedType; + ++offset_; + if (auto quote{static_cast<char>(PeekNext())}; + quote == '\'' || quote == '"') { + // Capture the quoted 'iotype' + bool ok{false}; + for (++offset_; offset_ < formatLength_;) { + auto ch{static_cast<char>(format_[offset_++])}; + if (ch == quote && + (offset_ == formatLength_ || + static_cast<char>(format_[offset_]) != quote)) { + ok = true; + break; // that was terminating quote + } + if (edit.ioTypeChars >= edit.maxIoTypeChars) { + ReportBadFormat(context, "Excessive DT'iotype' in FORMAT", start); + return Fortran::common::nullopt; + } + edit.ioType[edit.ioTypeChars++] = ch; + if (ch == quote) { + ++offset_; + } + } + if (!ok) { + ReportBadFormat(context, "Unclosed DT'iotype' in FORMAT", start); + return Fortran::common::nullopt; + } + } + if (PeekNext() == '(') { + // Capture the v_list arguments + bool ok{false}; + for (++offset_; offset_ < formatLength_;) { + bool hadError{false}; + int n{GetIntField(context, '\0', &hadError)}; + if (hadError) { + ok = false; + break; + } + if (edit.vListEntries >= edit.maxVListEntries) { + ReportBadFormat(context, "Excessive DT(v_list) in FORMAT", start); + return Fortran::common::nullopt; + } + edit.vList[edit.vListEntries++] = n; + auto ch{static_cast<char>(GetNextChar(context))}; + if (ch != ',') { + ok = ch == ')'; + break; + } + } + if (!ok) { + ReportBadFormat(context, "Unclosed DT(v_list) in FORMAT", start); + return Fortran::common::nullopt; + } + } + } else { // not DT'iotype' + if (edit.descriptor == 'E') { + if (auto next{static_cast<char>(Capitalize(PeekNext()))}; + next == 'N' || next == 'S' || next == 'X') { + edit.variation = next; + ++offset_; + } + } + // Width is optional for A[w] in the standard and optional + // for Lw in most compilers. + // Intel & (presumably, from bug report) Fujitsu allow + // a missing 'w' & 'd'/'m' for other edit descriptors -- but not + // 'd'/'m' with a missing 'w' -- and so interpret "(E)" as "(E0)". + if (CharType ch{PeekNext()}; (ch >= '0' && ch <= '9') || ch == '.') { + edit.width = GetIntField(context); + if constexpr (std::is_base_of_v<InputStatementState, CONTEXT>) { + if (edit.width.value_or(-1) == 0) { + ReportBadFormat(context, "Input field width is zero", start); + } + } + if (PeekNext() == '.') { + ++offset_; + edit.digits = GetIntField(context); + if (CharType ch{PeekNext()}; + ch == 'e' || ch == 'E' || ch == 'd' || ch == 'D') { + ++offset_; + edit.expoDigits = GetIntField(context); + } + } + } + } + return edit; +} + +template <typename CONTEXT> +RT_API_ATTRS void FormatControl<CONTEXT>::Finish(Context &context) { + CueUpNextDataEdit(context, true /* stop at colon or end of FORMAT */); + if (freeFormat_) { + FreeMemory(const_cast<CharType *>(format_)); + } +} +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_FORMAT_IMPLEMENTATION_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/format.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/format.h new file mode 100644 index 00000000000..9469cb0ee9a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/format.h @@ -0,0 +1,209 @@ +//===-- include/flang-rt/runtime/format.h -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// FORMAT string processing + +#ifndef FLANG_RT_RUNTIME_FORMAT_H_ +#define FLANG_RT_RUNTIME_FORMAT_H_ + +#include "environment.h" +#include "io-error.h" +#include "flang/Common/Fortran-consts.h" +#include "flang/Common/optional.h" +#include "flang/Decimal/decimal.h" +#include "flang/Runtime/freestanding-tools.h" +#include <cinttypes> + +namespace Fortran::runtime { +class Descriptor; +} // namespace Fortran::runtime + +namespace Fortran::runtime::io { + +RT_OFFLOAD_API_GROUP_BEGIN + +class IoStatementState; + +enum EditingFlags { + blankZero = 1, // BLANK=ZERO or BZ edit + decimalComma = 2, // DECIMAL=COMMA or DC edit + signPlus = 4, // SIGN=PLUS or SP edit +}; + +struct MutableModes { + std::uint8_t editingFlags{0}; // BN, DP, SS + enum decimal::FortranRounding round{ + executionEnvironment + .defaultOutputRoundingMode}; // RP/ROUND='PROCESSOR_DEFAULT' + bool pad{true}; // PAD= mode on READ + char delim{'\0'}; // DELIM= + short scale{0}; // kP + bool inNamelist{false}; // skip ! comments + bool nonAdvancing{false}; // ADVANCE='NO', or $ or \ in FORMAT +}; + +// A single edit descriptor extracted from a FORMAT +struct DataEdit { + char descriptor; // capitalized: one of A, I, B, O, Z, F, E(N/S/X), D, G + + // Special internal data edit descriptors for list-directed & NAMELIST I/O + RT_OFFLOAD_VAR_GROUP_BEGIN + static constexpr char ListDirected{'g'}; // non-COMPLEX list-directed + static constexpr char ListDirectedRealPart{'r'}; // emit "(r," or "(r;" + static constexpr char ListDirectedImaginaryPart{'z'}; // emit "z)" + static constexpr char ListDirectedNullValue{'n'}; // see 13.10.3.2 + static constexpr char DefinedDerivedType{'d'}; // DT defined I/O + RT_OFFLOAD_VAR_GROUP_END + constexpr RT_API_ATTRS bool IsListDirected() const { + return descriptor == ListDirected || descriptor == ListDirectedRealPart || + descriptor == ListDirectedImaginaryPart; + } + constexpr RT_API_ATTRS bool IsNamelist() const { + return IsListDirected() && modes.inNamelist; + } + + char variation{'\0'}; // N, S, or X for EN, ES, EX; G/l for original G/list + Fortran::common::optional<int> width; // the 'w' field; optional for A + Fortran::common::optional<int> digits; // the 'm' or 'd' field + Fortran::common::optional<int> expoDigits; // 'Ee' field + MutableModes modes; + int repeat{1}; + + // "iotype" &/or "v_list" values for a DT'iotype'(v_list) + // defined I/O data edit descriptor + RT_OFFLOAD_VAR_GROUP_BEGIN + static constexpr std::size_t maxIoTypeChars{32}; + static constexpr std::size_t maxVListEntries{4}; + RT_OFFLOAD_VAR_GROUP_END + std::uint8_t ioTypeChars{0}; + std::uint8_t vListEntries{0}; + char ioType[maxIoTypeChars]; + int vList[maxVListEntries]; +}; + +// Generates a sequence of DataEdits from a FORMAT statement or +// default-CHARACTER string. Driven by I/O item list processing. +// Errors are fatal. See subclause 13.4 in Fortran 2018 for background. +template <typename CONTEXT> class FormatControl { +public: + using Context = CONTEXT; + using CharType = char; // formats are always default kind CHARACTER + + RT_API_ATTRS FormatControl() {} + RT_API_ATTRS FormatControl(const Terminator &, const CharType *format, + std::size_t formatLength, const Descriptor *formatDescriptor = nullptr, + int maxHeight = maxMaxHeight); + + // For attempting to allocate in a user-supplied stack area + static RT_API_ATTRS std::size_t GetNeededSize(int maxHeight) { + return sizeof(FormatControl) - + sizeof(Iteration) * (maxMaxHeight - maxHeight); + } + + // Extracts the next data edit descriptor, handling control edit descriptors + // along the way. If maxRepeat==0, this is a peek at the next data edit + // descriptor. + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + Context &, int maxRepeat = 1); + + // Emit any remaining character literals after the last data item (on output) + // and perform remaining record positioning actions. + RT_API_ATTRS void Finish(Context &); + +private: + RT_OFFLOAD_VAR_GROUP_BEGIN + static constexpr std::uint8_t maxMaxHeight{100}; + + struct Iteration { + static constexpr int unlimited{-1}; + int start{0}; // offset in format_ of '(' or a repeated edit descriptor + int remaining{0}; // while >0, decrement and iterate + }; + RT_OFFLOAD_VAR_GROUP_END + + RT_API_ATTRS void SkipBlanks() { + while (offset_ < formatLength_ && + (format_[offset_] == ' ' || format_[offset_] == '\t' || + format_[offset_] == '\v')) { + ++offset_; + } + } + RT_API_ATTRS CharType PeekNext() { + SkipBlanks(); + return offset_ < formatLength_ ? format_[offset_] : '\0'; + } + RT_API_ATTRS CharType GetNextChar(IoErrorHandler &handler) { + SkipBlanks(); + if (offset_ >= formatLength_) { + if (formatLength_ == 0) { + handler.SignalError( + IostatErrorInFormat, "Empty or badly assigned FORMAT"); + } else { + handler.SignalError( + IostatErrorInFormat, "FORMAT missing at least one ')'"); + } + return '\n'; + } + return format_[offset_++]; + } + RT_API_ATTRS int GetIntField( + IoErrorHandler &, CharType firstCh = '\0', bool *hadError = nullptr); + + // Advances through the FORMAT until the next data edit + // descriptor has been found; handles control edit descriptors + // along the way. Returns the repeat count that appeared + // before the descriptor (defaulting to 1) and leaves offset_ + // pointing to the data edit. + RT_API_ATTRS int CueUpNextDataEdit(Context &, bool stop = false); + + static constexpr RT_API_ATTRS CharType Capitalize(CharType ch) { + return ch >= 'a' && ch <= 'z' ? ch + 'A' - 'a' : ch; + } + + RT_API_ATTRS void ReportBadFormat( + Context &context, const char *msg, int offset) const { + if constexpr (std::is_same_v<CharType, char>) { + // Echo the bad format in the error message, but trim any leading or + // trailing spaces. + int firstNonBlank{0}; + while (firstNonBlank < formatLength_ && format_[firstNonBlank] == ' ') { + ++firstNonBlank; + } + int lastNonBlank{formatLength_ - 1}; + while (lastNonBlank > firstNonBlank && format_[lastNonBlank] == ' ') { + --lastNonBlank; + } + if (firstNonBlank <= lastNonBlank) { + context.SignalError(IostatErrorInFormat, + "%s; at offset %d in format '%.*s'", msg, offset, + lastNonBlank - firstNonBlank + 1, format_ + firstNonBlank); + return; + } + } + context.SignalError(IostatErrorInFormat, "%s; at offset %d", msg, offset); + } + + // Data members are arranged and typed so as to reduce size. + // This structure may be allocated in stack space loaned by the + // user program for internal I/O. + const std::uint8_t maxHeight_{maxMaxHeight}; + std::uint8_t height_{0}; + bool freeFormat_{false}; + bool hitEnd_{false}; + const CharType *format_{nullptr}; + int formatLength_{0}; // in units of characters + int offset_{0}; // next item is at format_[offset_] + + // must be last, may be incomplete + Iteration stack_[maxMaxHeight]; +}; + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_FORMAT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/internal-unit.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/internal-unit.h new file mode 100644 index 00000000000..a046764153a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/internal-unit.h @@ -0,0 +1,64 @@ +//===-- include/flang-rt/runtime/internal-unit.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Fortran internal I/O "units" + +#ifndef FLANG_RT_RUNTIME_INTERNAL_UNIT_H_ +#define FLANG_RT_RUNTIME_INTERNAL_UNIT_H_ + +#include "connection.h" +#include "descriptor.h" +#include <cinttypes> +#include <type_traits> + +namespace Fortran::runtime::io { + +RT_OFFLOAD_API_GROUP_BEGIN + +class IoErrorHandler; + +// Points to (but does not own) a CHARACTER scalar or array for internal I/O. +// Does not buffer. +template <Direction DIR> class InternalDescriptorUnit : public ConnectionState { +public: + using Scalar = + std::conditional_t<DIR == Direction::Input, const char *, char *>; + RT_API_ATTRS InternalDescriptorUnit(Scalar, std::size_t chars, int kind); + RT_API_ATTRS InternalDescriptorUnit(const Descriptor &, const Terminator &); + + RT_API_ATTRS bool Emit(const char *, std::size_t, IoErrorHandler &); + RT_API_ATTRS std::size_t GetNextInputBytes(const char *&, IoErrorHandler &); + RT_API_ATTRS std::size_t ViewBytesInRecord(const char *&, bool forward) const; + RT_API_ATTRS bool AdvanceRecord(IoErrorHandler &); + RT_API_ATTRS void BackspaceRecord(IoErrorHandler &); + RT_API_ATTRS std::int64_t InquirePos(); + +private: + RT_API_ATTRS Descriptor &descriptor() { + return staticDescriptor_.descriptor(); + } + RT_API_ATTRS const Descriptor &descriptor() const { + return staticDescriptor_.descriptor(); + } + RT_API_ATTRS Scalar CurrentRecord() const { + return descriptor().template ZeroBasedIndexedElement<char>( + currentRecordNumber - 1); + } + RT_API_ATTRS void BlankFill(char *, std::size_t); + RT_API_ATTRS void BlankFillOutputRecord(); + + StaticDescriptor<maxRank, true /*addendum*/> staticDescriptor_; +}; + +extern template class InternalDescriptorUnit<Direction::Output>; +extern template class InternalDescriptorUnit<Direction::Input>; + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_INTERNAL_UNIT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/io-error.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/io-error.h new file mode 100644 index 00000000000..1cef6a208f3 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/io-error.h @@ -0,0 +1,83 @@ +//===-- include/flang-rt/runtime/io-error.h ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Distinguishes I/O error conditions; fatal ones lead to termination, +// and those that the user program has chosen to handle are recorded +// so that the highest-priority one can be returned as IOSTAT=. +// IOSTAT error codes are raw errno values augmented with values for +// Fortran-specific errors. + +#ifndef FLANG_RT_RUNTIME_IO_ERROR_H_ +#define FLANG_RT_RUNTIME_IO_ERROR_H_ + +#include "memory.h" +#include "terminator.h" +#include "flang/Runtime/iostat.h" +#include <cinttypes> + +namespace Fortran::runtime::io { + +// See 12.11 in Fortran 2018 +class IoErrorHandler : public Terminator { +public: + using Terminator::Terminator; + explicit RT_API_ATTRS IoErrorHandler(const Terminator &that) + : Terminator{that} {} + RT_API_ATTRS void HasIoStat() { flags_ |= hasIoStat; } + RT_API_ATTRS void HasErrLabel() { flags_ |= hasErr; } + RT_API_ATTRS void HasEndLabel() { flags_ |= hasEnd; } + RT_API_ATTRS void HasEorLabel() { flags_ |= hasEor; } + RT_API_ATTRS void HasIoMsg() { flags_ |= hasIoMsg; } + RT_API_ATTRS void HasRec() { flags_ |= hasRec; } + + RT_API_ATTRS bool InError() const { + return ioStat_ != IostatOk || pendingError_ != IostatOk; + } + + // For I/O statements that detect fatal errors in their + // Begin...() API routines before it is known whether they + // have error handling control list items. Such statements + // have an ErroneousIoStatementState with a pending error. + RT_API_ATTRS void SetPendingError(int iostat) { pendingError_ = iostat; } + + RT_API_ATTRS void SignalError(int iostatOrErrno, const char *msg, ...); + RT_API_ATTRS void SignalError(int iostatOrErrno); + template <typename... X> + RT_API_ATTRS void SignalError(const char *msg, X &&...xs) { + SignalError(IostatGenericError, msg, std::forward<X>(xs)...); + } + + RT_API_ATTRS void Forward(int iostatOrErrno, const char *, std::size_t); + + void SignalErrno(); // SignalError(errno) + RT_API_ATTRS void + SignalEnd(); // input only; EOF on internal write is an error + RT_API_ATTRS void + SignalEor(); // non-advancing input only; EOR on write is an error + RT_API_ATTRS void SignalPendingError(); + + RT_API_ATTRS int GetIoStat() const { return ioStat_; } + RT_API_ATTRS bool GetIoMsg(char *, std::size_t); + +private: + enum Flag : std::uint8_t { + hasIoStat = 1, // IOSTAT= + hasErr = 2, // ERR= + hasEnd = 4, // END= + hasEor = 8, // EOR= + hasIoMsg = 16, // IOMSG= + hasRec = 32, // REC= + }; + std::uint8_t flags_{0}; + int ioStat_{IostatOk}; + OwningPtr<char> ioMsg_; + int pendingError_{IostatOk}; +}; + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_IO_ERROR_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/io-stmt.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/io-stmt.h new file mode 100644 index 00000000000..bfd5f69c763 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/io-stmt.h @@ -0,0 +1,888 @@ +//===-- include/flang-rt/runtime/io-stmt.h ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Representations of the state of an I/O statement in progress + +#ifndef FLANG_RT_RUNTIME_IO_STMT_H_ +#define FLANG_RT_RUNTIME_IO_STMT_H_ + +#include "connection.h" +#include "descriptor.h" +#include "file.h" +#include "format.h" +#include "internal-unit.h" +#include "io-error.h" +#include "flang/Common/optional.h" +#include "flang/Common/reference-wrapper.h" +#include "flang/Common/visit.h" +#include "flang/Runtime/freestanding-tools.h" +#include "flang/Runtime/io-api.h" +#include <flang/Common/variant.h> +#include <functional> +#include <type_traits> + +namespace Fortran::runtime::io { + +RT_OFFLOAD_API_GROUP_BEGIN + +class ExternalFileUnit; +class ChildIo; + +class OpenStatementState; +class InquireUnitState; +class InquireNoUnitState; +class InquireUnconnectedFileState; +class InquireIOLengthState; +class ExternalMiscIoStatementState; +class CloseStatementState; +class NoopStatementState; // CLOSE or FLUSH on unknown unit +class ErroneousIoStatementState; + +template <Direction, typename CHAR = char> +class InternalFormattedIoStatementState; +template <Direction> class InternalListIoStatementState; +template <Direction, typename CHAR = char> +class ExternalFormattedIoStatementState; +template <Direction> class ExternalListIoStatementState; +template <Direction> class ExternalUnformattedIoStatementState; +template <Direction, typename CHAR = char> class ChildFormattedIoStatementState; +template <Direction> class ChildListIoStatementState; +template <Direction> class ChildUnformattedIoStatementState; + +struct InputStatementState {}; +struct OutputStatementState {}; +template <Direction D> +using IoDirectionState = std::conditional_t<D == Direction::Input, + InputStatementState, OutputStatementState>; + +// Common state for all kinds of formatted I/O +template <Direction D> class FormattedIoStatementState {}; +template <> class FormattedIoStatementState<Direction::Input> { +public: + RT_API_ATTRS std::size_t GetEditDescriptorChars() const; + RT_API_ATTRS void GotChar(int); + +private: + // Account of characters read for edit descriptors (i.e., formatted I/O + // with a FORMAT, not list-directed or NAMELIST), not including padding. + std::size_t chars_{0}; // for READ(SIZE=) +}; + +// The Cookie type in the I/O API is a pointer (for C) to this class. +class IoStatementState { +public: + template <typename A> explicit RT_API_ATTRS IoStatementState(A &x) : u_{x} {} + + // These member functions each project themselves into the active alternative. + // They're used by per-data-item routines in the I/O API (e.g., OutputReal64) + // to interact with the state of the I/O statement in progress. + // This design avoids virtual member functions and function pointers, + // which may not have good support in some runtime environments. + + // CompleteOperation() is the last opportunity to raise an I/O error. + // It is called by EndIoStatement(), but it can be invoked earlier to + // catch errors for (e.g.) GetIoMsg() and GetNewUnit(). If called + // more than once, it is a no-op. + RT_API_ATTRS void CompleteOperation(); + // Completes an I/O statement and reclaims storage. + RT_API_ATTRS int EndIoStatement(); + + RT_API_ATTRS bool Emit( + const char *, std::size_t bytes, std::size_t elementBytes = 0); + RT_API_ATTRS bool Receive(char *, std::size_t, std::size_t elementBytes = 0); + RT_API_ATTRS std::size_t GetNextInputBytes(const char *&); + RT_API_ATTRS std::size_t ViewBytesInRecord(const char *&, bool forward) const; + RT_API_ATTRS bool AdvanceRecord(int = 1); + RT_API_ATTRS void BackspaceRecord(); + RT_API_ATTRS void HandleRelativePosition(std::int64_t byteOffset); + RT_API_ATTRS void HandleAbsolutePosition( + std::int64_t byteOffset); // for r* in list I/O + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + int maxRepeat = 1); + RT_API_ATTRS ExternalFileUnit * + GetExternalFileUnit() const; // null if internal unit + RT_API_ATTRS bool BeginReadingRecord(); + RT_API_ATTRS void FinishReadingRecord(); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, char *, std::size_t); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, bool &); + RT_API_ATTRS bool Inquire( + InquiryKeywordHash, std::int64_t, bool &); // PENDING= + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t &); + RT_API_ATTRS std::int64_t InquirePos(); + RT_API_ATTRS void GotChar(signed int = 1); // for READ(SIZE=); can be <0 + + RT_API_ATTRS MutableModes &mutableModes(); + RT_API_ATTRS ConnectionState &GetConnectionState(); + RT_API_ATTRS IoErrorHandler &GetIoErrorHandler() const; + + // N.B.: this also works with base classes + template <typename A> RT_API_ATTRS A *get_if() const { + return common::visit( + [](auto &x) -> A * { + if constexpr (std::is_convertible_v<decltype(x.get()), A &>) { + return &x.get(); + } + return nullptr; + }, + u_); + } + + // Vacant after the end of the current record + RT_API_ATTRS Fortran::common::optional<char32_t> GetCurrentCharSlow( + std::size_t &byteCount); + + // For faster formatted input editing, this structure can be built by + // GetUpcomingFastAsciiField() and used to save significant time in + // GetCurrentChar, NextInField() and other input utilities when the input + // is buffered, does not require UTF-8 conversion, and comprises only + // single byte characters. + class FastAsciiField { + public: + RT_API_ATTRS FastAsciiField(ConnectionState &connection) + : connection_{connection} {} + RT_API_ATTRS FastAsciiField( + ConnectionState &connection, const char *start, std::size_t bytes) + : connection_{connection}, at_{start}, limit_{start + bytes} { + CheckForAsterisk(); + } + RT_API_ATTRS ConnectionState &connection() { return connection_; } + RT_API_ATTRS std::size_t got() const { return got_; } + + RT_API_ATTRS bool MustUseSlowPath() const { return at_ == nullptr; } + + RT_API_ATTRS Fortran::common::optional<char32_t> Next() const { + if (at_ && at_ < limit_) { + return *at_; + } else { + return Fortran::common::nullopt; + } + } + RT_API_ATTRS void NextRecord(IoStatementState &io) { + if (at_) { + if (std::size_t bytes{io.GetNextInputBytes(at_)}) { + limit_ = at_ + bytes; + CheckForAsterisk(); + } else { + at_ = limit_ = nullptr; + } + } + } + RT_API_ATTRS void Advance(int gotten, std::size_t bytes) { + if (at_ && at_ < limit_) { + ++at_; + got_ += gotten; + } + connection_.HandleRelativePosition(bytes); + } + RT_API_ATTRS bool MightHaveAsterisk() const { return !at_ || hasAsterisk_; } + + private: + RT_API_ATTRS void CheckForAsterisk() { + hasAsterisk_ = at_ && at_ < limit_ && + runtime::memchr(at_, '*', limit_ - at_) != nullptr; + } + + ConnectionState &connection_; + const char *at_{nullptr}; + const char *limit_{nullptr}; + std::size_t got_{0}; // for READ(..., SIZE=) + bool hasAsterisk_{false}; + }; + + RT_API_ATTRS FastAsciiField GetUpcomingFastAsciiField(); + + RT_API_ATTRS Fortran::common::optional<char32_t> GetCurrentChar( + std::size_t &byteCount, FastAsciiField *field = nullptr) { + if (field) { + if (auto ch{field->Next()}) { + byteCount = ch ? 1 : 0; + return ch; + } else if (!field->MustUseSlowPath()) { + return Fortran::common::nullopt; + } + } + return GetCurrentCharSlow(byteCount); + } + + // The result of CueUpInput() and the "remaining" arguments to SkipSpaces() + // and NextInField() are always in units of bytes, not characters; the + // distinction matters for internal input from CHARACTER(KIND=2 and 4). + + // For fixed-width fields, return the number of remaining bytes. + // Skip over leading blanks. + RT_API_ATTRS Fortran::common::optional<int> CueUpInput( + const DataEdit &edit, FastAsciiField *fastField = nullptr) { + Fortran::common::optional<int> remaining; + if (edit.IsListDirected()) { + std::size_t byteCount{0}; + GetNextNonBlank(byteCount, fastField); + } else { + if (edit.width.value_or(0) > 0) { + remaining = *edit.width; + if (int bytesPerChar{GetConnectionState().internalIoCharKind}; + bytesPerChar > 1) { + *remaining *= bytesPerChar; + } + } + SkipSpaces(remaining, fastField); + } + return remaining; + } + + RT_API_ATTRS Fortran::common::optional<char32_t> SkipSpaces( + Fortran::common::optional<int> &remaining, + FastAsciiField *fastField = nullptr) { + while (!remaining || *remaining > 0) { + std::size_t byteCount{0}; + if (auto ch{GetCurrentChar(byteCount, fastField)}) { + if (*ch != ' ' && *ch != '\t') { + return ch; + } + if (remaining) { + if (static_cast<std::size_t>(*remaining) < byteCount) { + break; + } + GotChar(byteCount); + *remaining -= byteCount; + } + if (fastField) { + fastField->Advance(0, byteCount); + } else { + HandleRelativePosition(byteCount); + } + } else { + break; + } + } + return Fortran::common::nullopt; + } + + // Acquires the next input character, respecting any applicable field width + // or separator character. + RT_API_ATTRS Fortran::common::optional<char32_t> NextInField( + Fortran::common::optional<int> &remaining, const DataEdit &, + FastAsciiField *field = nullptr); + + // Detect and signal any end-of-record condition after input. + // Returns true if at EOR and remaining input should be padded with blanks. + RT_API_ATTRS bool CheckForEndOfRecord( + std::size_t afterReading, const ConnectionState &); + + // Skips spaces, advances records, and ignores NAMELIST comments + RT_API_ATTRS Fortran::common::optional<char32_t> GetNextNonBlank( + std::size_t &byteCount, FastAsciiField *fastField = nullptr) { + auto ch{GetCurrentChar(byteCount, fastField)}; + bool inNamelist{mutableModes().inNamelist}; + while (!ch || *ch == ' ' || *ch == '\t' || *ch == '\n' || + (inNamelist && *ch == '!')) { + if (ch && (*ch == ' ' || *ch == '\t' || *ch == '\n')) { + if (fastField) { + fastField->Advance(0, byteCount); + } else { + HandleRelativePosition(byteCount); + } + } else if (AdvanceRecord()) { + if (fastField) { + fastField->NextRecord(*this); + } + } else { + return Fortran::common::nullopt; + } + ch = GetCurrentChar(byteCount, fastField); + } + return ch; + } + + template <Direction D> + RT_API_ATTRS bool CheckFormattedStmtType(const char *name) { + if (get_if<FormattedIoStatementState<D>>()) { + return true; + } else { + auto &handler{GetIoErrorHandler()}; + if (!handler.InError()) { + handler.Crash("%s called for I/O statement that is not formatted %s", + name, D == Direction::Output ? "output" : "input"); + } + return false; + } + } + +private: + std::variant<Fortran::common::reference_wrapper<OpenStatementState>, + Fortran::common::reference_wrapper<CloseStatementState>, + Fortran::common::reference_wrapper<NoopStatementState>, + Fortran::common::reference_wrapper< + InternalFormattedIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + InternalFormattedIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper< + InternalListIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + InternalListIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper< + ExternalFormattedIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + ExternalFormattedIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper< + ExternalListIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + ExternalListIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper< + ExternalUnformattedIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + ExternalUnformattedIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper< + ChildFormattedIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + ChildFormattedIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper< + ChildListIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + ChildListIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper< + ChildUnformattedIoStatementState<Direction::Output>>, + Fortran::common::reference_wrapper< + ChildUnformattedIoStatementState<Direction::Input>>, + Fortran::common::reference_wrapper<InquireUnitState>, + Fortran::common::reference_wrapper<InquireNoUnitState>, + Fortran::common::reference_wrapper<InquireUnconnectedFileState>, + Fortran::common::reference_wrapper<InquireIOLengthState>, + Fortran::common::reference_wrapper<ExternalMiscIoStatementState>, + Fortran::common::reference_wrapper<ErroneousIoStatementState>> + u_; +}; + +// Base class for all per-I/O statement state classes. +class IoStatementBase : public IoErrorHandler { +public: + using IoErrorHandler::IoErrorHandler; + + RT_API_ATTRS bool completedOperation() const { return completedOperation_; } + + RT_API_ATTRS void CompleteOperation() { completedOperation_ = true; } + RT_API_ATTRS int EndIoStatement() { return GetIoStat(); } + + // These are default no-op backstops that can be overridden by descendants. + RT_API_ATTRS bool Emit( + const char *, std::size_t bytes, std::size_t elementBytes = 0); + RT_API_ATTRS bool Receive( + char *, std::size_t bytes, std::size_t elementBytes = 0); + RT_API_ATTRS std::size_t GetNextInputBytes(const char *&); + RT_API_ATTRS std::size_t ViewBytesInRecord(const char *&, bool forward) const; + RT_API_ATTRS bool AdvanceRecord(int); + RT_API_ATTRS void BackspaceRecord(); + RT_API_ATTRS void HandleRelativePosition(std::int64_t); + RT_API_ATTRS void HandleAbsolutePosition(std::int64_t); + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + IoStatementState &, int maxRepeat = 1); + RT_API_ATTRS ExternalFileUnit *GetExternalFileUnit() const; + RT_API_ATTRS bool BeginReadingRecord(); + RT_API_ATTRS void FinishReadingRecord(); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, char *, std::size_t); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t &); + RT_API_ATTRS std::int64_t InquirePos(); + + RT_API_ATTRS void BadInquiryKeywordHashCrash(InquiryKeywordHash); + + RT_API_ATTRS void ReportUnsupportedChildIo() const { + Crash("not yet implemented: child IO"); + } + +protected: + bool completedOperation_{false}; +}; + +// Common state for list-directed & NAMELIST I/O, both internal & external +template <Direction> class ListDirectedStatementState; +template <> +class ListDirectedStatementState<Direction::Output> + : public FormattedIoStatementState<Direction::Output> { +public: + RT_API_ATTRS bool EmitLeadingSpaceOrAdvance( + IoStatementState &, std::size_t = 1, bool isCharacter = false); + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + IoStatementState &, int maxRepeat = 1); + RT_API_ATTRS bool lastWasUndelimitedCharacter() const { + return lastWasUndelimitedCharacter_; + } + RT_API_ATTRS void set_lastWasUndelimitedCharacter(bool yes = true) { + lastWasUndelimitedCharacter_ = yes; + } + +private: + bool lastWasUndelimitedCharacter_{false}; +}; +template <> +class ListDirectedStatementState<Direction::Input> + : public FormattedIoStatementState<Direction::Input> { +public: + RT_API_ATTRS bool inNamelistSequence() const { return inNamelistSequence_; } + RT_API_ATTRS int EndIoStatement(); + + // Skips value separators, handles repetition and null values. + // Vacant when '/' appears; present with descriptor == ListDirectedNullValue + // when a null value appears. + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + IoStatementState &, int maxRepeat = 1); + + // Each NAMELIST input item is treated like a distinct list-directed + // input statement. This member function resets some state so that + // repetition and null values work correctly for each successive + // NAMELIST input item. + RT_API_ATTRS void ResetForNextNamelistItem(bool inNamelistSequence) { + remaining_ = 0; + if (repeatPosition_) { + repeatPosition_->Cancel(); + } + eatComma_ = false; + realPart_ = imaginaryPart_ = false; + inNamelistSequence_ = inNamelistSequence; + } + +private: + int remaining_{0}; // for "r*" repetition + Fortran::common::optional<SavedPosition> repeatPosition_; + bool eatComma_{false}; // consume comma after previously read item + bool hitSlash_{false}; // once '/' is seen, nullify further items + bool realPart_{false}; + bool imaginaryPart_{false}; + bool inNamelistSequence_{false}; +}; + +template <Direction DIR> +class InternalIoStatementState : public IoStatementBase, + public IoDirectionState<DIR> { +public: + using Buffer = + std::conditional_t<DIR == Direction::Input, const char *, char *>; + RT_API_ATTRS InternalIoStatementState(Buffer, std::size_t, + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS InternalIoStatementState( + const Descriptor &, const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS int EndIoStatement(); + + RT_API_ATTRS bool Emit( + const char *data, std::size_t bytes, std::size_t elementBytes = 0); + RT_API_ATTRS std::size_t GetNextInputBytes(const char *&); + RT_API_ATTRS bool AdvanceRecord(int = 1); + RT_API_ATTRS void BackspaceRecord(); + RT_API_ATTRS ConnectionState &GetConnectionState() { return unit_; } + RT_API_ATTRS MutableModes &mutableModes() { return unit_.modes; } + RT_API_ATTRS void HandleRelativePosition(std::int64_t); + RT_API_ATTRS void HandleAbsolutePosition(std::int64_t); + RT_API_ATTRS std::int64_t InquirePos(); + +protected: + bool free_{true}; + InternalDescriptorUnit<DIR> unit_; +}; + +template <Direction DIR, typename CHAR> +class InternalFormattedIoStatementState + : public InternalIoStatementState<DIR>, + public FormattedIoStatementState<DIR> { +public: + using CharType = CHAR; + using typename InternalIoStatementState<DIR>::Buffer; + RT_API_ATTRS InternalFormattedIoStatementState(Buffer internal, + std::size_t internalLength, const CharType *format, + std::size_t formatLength, const Descriptor *formatDescriptor = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS InternalFormattedIoStatementState(const Descriptor &, + const CharType *format, std::size_t formatLength, + const Descriptor *formatDescriptor = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS IoStatementState &ioStatementState() { + return ioStatementState_; + } + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + IoStatementState &, int maxRepeat = 1) { + return format_.GetNextDataEdit(*this, maxRepeat); + } + +private: + IoStatementState ioStatementState_; // points to *this + using InternalIoStatementState<DIR>::unit_; + // format_ *must* be last; it may be partial someday + FormatControl<InternalFormattedIoStatementState> format_; +}; + +template <Direction DIR> +class InternalListIoStatementState : public InternalIoStatementState<DIR>, + public ListDirectedStatementState<DIR> { +public: + using typename InternalIoStatementState<DIR>::Buffer; + RT_API_ATTRS InternalListIoStatementState(Buffer internal, + std::size_t internalLength, const char *sourceFile = nullptr, + int sourceLine = 0); + RT_API_ATTRS InternalListIoStatementState( + const Descriptor &, const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS IoStatementState &ioStatementState() { + return ioStatementState_; + } + using ListDirectedStatementState<DIR>::GetNextDataEdit; + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + +private: + IoStatementState ioStatementState_; // points to *this + using InternalIoStatementState<DIR>::unit_; +}; + +class ExternalIoStatementBase : public IoStatementBase { +public: + RT_API_ATTRS ExternalIoStatementBase( + ExternalFileUnit &, const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS ExternalFileUnit &unit() { return unit_; } + RT_API_ATTRS const ExternalFileUnit &unit() const { return unit_; } + RT_API_ATTRS MutableModes &mutableModes(); + RT_API_ATTRS ConnectionState &GetConnectionState(); + RT_API_ATTRS int asynchronousID() const { return asynchronousID_; } + RT_API_ATTRS void set_destroy(bool yes = true) { destroy_ = yes; } + RT_API_ATTRS int EndIoStatement(); + RT_API_ATTRS ExternalFileUnit *GetExternalFileUnit() const { return &unit_; } + RT_API_ATTRS void SetAsynchronous(); + RT_API_ATTRS std::int64_t InquirePos(); + +private: + ExternalFileUnit &unit_; + int asynchronousID_{-1}; + bool destroy_{false}; +}; + +template <Direction DIR> +class ExternalIoStatementState : public ExternalIoStatementBase, + public IoDirectionState<DIR> { +public: + RT_API_ATTRS ExternalIoStatementState( + ExternalFileUnit &, const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS MutableModes &mutableModes() { return mutableModes_; } + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + RT_API_ATTRS bool Emit( + const char *, std::size_t bytes, std::size_t elementBytes = 0); + RT_API_ATTRS std::size_t GetNextInputBytes(const char *&); + RT_API_ATTRS std::size_t ViewBytesInRecord(const char *&, bool forward) const; + RT_API_ATTRS bool AdvanceRecord(int = 1); + RT_API_ATTRS void BackspaceRecord(); + RT_API_ATTRS void HandleRelativePosition(std::int64_t); + RT_API_ATTRS void HandleAbsolutePosition(std::int64_t); + RT_API_ATTRS bool BeginReadingRecord(); + RT_API_ATTRS void FinishReadingRecord(); + +private: + // These are forked from ConnectionState's modes at the beginning + // of each formatted I/O statement so they may be overridden by control + // edit descriptors during the statement. + MutableModes mutableModes_; +}; + +template <Direction DIR, typename CHAR> +class ExternalFormattedIoStatementState + : public ExternalIoStatementState<DIR>, + public FormattedIoStatementState<DIR> { +public: + using CharType = CHAR; + RT_API_ATTRS ExternalFormattedIoStatementState(ExternalFileUnit &, + const CharType *format, std::size_t formatLength, + const Descriptor *formatDescriptor = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + IoStatementState &, int maxRepeat = 1) { + return format_.GetNextDataEdit(*this, maxRepeat); + } + +private: + FormatControl<ExternalFormattedIoStatementState> format_; +}; + +template <Direction DIR> +class ExternalListIoStatementState : public ExternalIoStatementState<DIR>, + public ListDirectedStatementState<DIR> { +public: + using ExternalIoStatementState<DIR>::ExternalIoStatementState; + using ListDirectedStatementState<DIR>::GetNextDataEdit; + RT_API_ATTRS int EndIoStatement(); +}; + +template <Direction DIR> +class ExternalUnformattedIoStatementState + : public ExternalIoStatementState<DIR> { +public: + using ExternalIoStatementState<DIR>::ExternalIoStatementState; + RT_API_ATTRS bool Receive(char *, std::size_t, std::size_t elementBytes = 0); +}; + +template <Direction DIR> +class ChildIoStatementState : public IoStatementBase, + public IoDirectionState<DIR> { +public: + RT_API_ATTRS ChildIoStatementState( + ChildIo &, const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS ChildIo &child() { return child_; } + RT_API_ATTRS MutableModes &mutableModes(); + RT_API_ATTRS ConnectionState &GetConnectionState(); + RT_API_ATTRS ExternalFileUnit *GetExternalFileUnit() const; + RT_API_ATTRS int EndIoStatement(); + RT_API_ATTRS bool Emit( + const char *, std::size_t bytes, std::size_t elementBytes = 0); + RT_API_ATTRS std::size_t GetNextInputBytes(const char *&); + RT_API_ATTRS std::size_t ViewBytesInRecord(const char *&, bool forward) const; + RT_API_ATTRS void HandleRelativePosition(std::int64_t); + RT_API_ATTRS void HandleAbsolutePosition(std::int64_t); + +private: + ChildIo &child_; +}; + +template <Direction DIR, typename CHAR> +class ChildFormattedIoStatementState : public ChildIoStatementState<DIR>, + public FormattedIoStatementState<DIR> { +public: + using CharType = CHAR; + RT_API_ATTRS ChildFormattedIoStatementState(ChildIo &, const CharType *format, + std::size_t formatLength, const Descriptor *formatDescriptor = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS MutableModes &mutableModes() { return mutableModes_; } + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + RT_API_ATTRS bool AdvanceRecord(int = 1); + RT_API_ATTRS Fortran::common::optional<DataEdit> GetNextDataEdit( + IoStatementState &, int maxRepeat = 1) { + return format_.GetNextDataEdit(*this, maxRepeat); + } + +private: + MutableModes mutableModes_; + FormatControl<ChildFormattedIoStatementState> format_; +}; + +template <Direction DIR> +class ChildListIoStatementState : public ChildIoStatementState<DIR>, + public ListDirectedStatementState<DIR> { +public: + using ChildIoStatementState<DIR>::ChildIoStatementState; + using ListDirectedStatementState<DIR>::GetNextDataEdit; + RT_API_ATTRS int EndIoStatement(); +}; + +template <Direction DIR> +class ChildUnformattedIoStatementState : public ChildIoStatementState<DIR> { +public: + using ChildIoStatementState<DIR>::ChildIoStatementState; + RT_API_ATTRS bool Receive(char *, std::size_t, std::size_t elementBytes = 0); +}; + +// OPEN +class OpenStatementState : public ExternalIoStatementBase { +public: + RT_API_ATTRS OpenStatementState(ExternalFileUnit &unit, bool wasExtant, + bool isNewUnit, const char *sourceFile = nullptr, int sourceLine = 0) + : ExternalIoStatementBase{unit, sourceFile, sourceLine}, + wasExtant_{wasExtant}, isNewUnit_{isNewUnit} {} + RT_API_ATTRS bool wasExtant() const { return wasExtant_; } + RT_API_ATTRS void set_status(OpenStatus status) { + status_ = status; + } // STATUS= + RT_API_ATTRS void set_path(const char *, std::size_t); // FILE= + RT_API_ATTRS void set_position(Position position) { + position_ = position; + } // POSITION= + RT_API_ATTRS void set_action(Action action) { action_ = action; } // ACTION= + RT_API_ATTRS void set_convert(Convert convert) { + convert_ = convert; + } // CONVERT= + RT_API_ATTRS void set_access(Access access) { access_ = access; } // ACCESS= + RT_API_ATTRS void set_isUnformatted(bool yes = true) { + isUnformatted_ = yes; + } // FORM= + + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + +private: + bool wasExtant_; + bool isNewUnit_; + Fortran::common::optional<OpenStatus> status_; + Fortran::common::optional<Position> position_; + Fortran::common::optional<Action> action_; + Convert convert_{Convert::Unknown}; + OwningPtr<char> path_; + std::size_t pathLength_{}; + Fortran::common::optional<bool> isUnformatted_; + Fortran::common::optional<Access> access_; +}; + +class CloseStatementState : public ExternalIoStatementBase { +public: + RT_API_ATTRS CloseStatementState(ExternalFileUnit &unit, + const char *sourceFile = nullptr, int sourceLine = 0) + : ExternalIoStatementBase{unit, sourceFile, sourceLine} {} + RT_API_ATTRS void set_status(CloseStatus status) { status_ = status; } + RT_API_ATTRS int EndIoStatement(); + +private: + CloseStatus status_{CloseStatus::Keep}; +}; + +// For CLOSE(bad unit), WAIT(bad unit, ID=nonzero), INQUIRE(unconnected unit), +// and recoverable BACKSPACE(bad unit) +class NoUnitIoStatementState : public IoStatementBase { +public: + RT_API_ATTRS IoStatementState &ioStatementState() { + return ioStatementState_; + } + RT_API_ATTRS MutableModes &mutableModes() { return connection_.modes; } + RT_API_ATTRS ConnectionState &GetConnectionState() { return connection_; } + RT_API_ATTRS int badUnitNumber() const { return badUnitNumber_; } + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + +protected: + template <typename A> + RT_API_ATTRS NoUnitIoStatementState(A &stmt, const char *sourceFile = nullptr, + int sourceLine = 0, int badUnitNumber = -1) + : IoStatementBase{sourceFile, sourceLine}, ioStatementState_{stmt}, + badUnitNumber_{badUnitNumber} {} + +private: + IoStatementState ioStatementState_; // points to *this + ConnectionState connection_; + int badUnitNumber_; +}; + +class NoopStatementState : public NoUnitIoStatementState { +public: + RT_API_ATTRS NoopStatementState( + const char *sourceFile = nullptr, int sourceLine = 0, int unitNumber = -1) + : NoUnitIoStatementState{*this, sourceFile, sourceLine, unitNumber} {} + RT_API_ATTRS void set_status(CloseStatus) {} // discards +}; + +extern template class InternalIoStatementState<Direction::Output>; +extern template class InternalIoStatementState<Direction::Input>; +extern template class InternalFormattedIoStatementState<Direction::Output>; +extern template class InternalFormattedIoStatementState<Direction::Input>; +extern template class InternalListIoStatementState<Direction::Output>; +extern template class InternalListIoStatementState<Direction::Input>; +extern template class ExternalIoStatementState<Direction::Output>; +extern template class ExternalIoStatementState<Direction::Input>; +extern template class ExternalFormattedIoStatementState<Direction::Output>; +extern template class ExternalFormattedIoStatementState<Direction::Input>; +extern template class ExternalListIoStatementState<Direction::Output>; +extern template class ExternalListIoStatementState<Direction::Input>; +extern template class ExternalUnformattedIoStatementState<Direction::Output>; +extern template class ExternalUnformattedIoStatementState<Direction::Input>; +extern template class ChildIoStatementState<Direction::Output>; +extern template class ChildIoStatementState<Direction::Input>; +extern template class ChildFormattedIoStatementState<Direction::Output>; +extern template class ChildFormattedIoStatementState<Direction::Input>; +extern template class ChildListIoStatementState<Direction::Output>; +extern template class ChildListIoStatementState<Direction::Input>; +extern template class ChildUnformattedIoStatementState<Direction::Output>; +extern template class ChildUnformattedIoStatementState<Direction::Input>; + +extern template class FormatControl< + InternalFormattedIoStatementState<Direction::Output>>; +extern template class FormatControl< + InternalFormattedIoStatementState<Direction::Input>>; +extern template class FormatControl< + ExternalFormattedIoStatementState<Direction::Output>>; +extern template class FormatControl< + ExternalFormattedIoStatementState<Direction::Input>>; +extern template class FormatControl< + ChildFormattedIoStatementState<Direction::Output>>; +extern template class FormatControl< + ChildFormattedIoStatementState<Direction::Input>>; + +class InquireUnitState : public ExternalIoStatementBase { +public: + RT_API_ATTRS InquireUnitState(ExternalFileUnit &unit, + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, char *, std::size_t); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t &); +}; + +class InquireNoUnitState : public NoUnitIoStatementState { +public: + RT_API_ATTRS InquireNoUnitState(const char *sourceFile = nullptr, + int sourceLine = 0, int badUnitNumber = -1); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, char *, std::size_t); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t &); +}; + +class InquireUnconnectedFileState : public NoUnitIoStatementState { +public: + RT_API_ATTRS InquireUnconnectedFileState(OwningPtr<char> &&path, + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, char *, std::size_t); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t, bool &); + RT_API_ATTRS bool Inquire(InquiryKeywordHash, std::int64_t &); + +private: + OwningPtr<char> path_; // trimmed and NUL terminated +}; + +class InquireIOLengthState : public NoUnitIoStatementState, + public OutputStatementState { +public: + RT_API_ATTRS InquireIOLengthState( + const char *sourceFile = nullptr, int sourceLine = 0); + RT_API_ATTRS std::size_t bytes() const { return bytes_; } + RT_API_ATTRS bool Emit( + const char *, std::size_t bytes, std::size_t elementBytes = 0); + +private: + std::size_t bytes_{0}; +}; + +class ExternalMiscIoStatementState : public ExternalIoStatementBase { +public: + enum Which { Flush, Backspace, Endfile, Rewind, Wait }; + RT_API_ATTRS ExternalMiscIoStatementState(ExternalFileUnit &unit, Which which, + const char *sourceFile = nullptr, int sourceLine = 0) + : ExternalIoStatementBase{unit, sourceFile, sourceLine}, which_{which} {} + RT_API_ATTRS void CompleteOperation(); + RT_API_ATTRS int EndIoStatement(); + +private: + Which which_; +}; + +class ErroneousIoStatementState : public IoStatementBase { +public: + explicit RT_API_ATTRS ErroneousIoStatementState(Iostat iostat, + ExternalFileUnit *unit = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0) + : IoStatementBase{sourceFile, sourceLine}, unit_{unit} { + SetPendingError(iostat); + } + RT_API_ATTRS int EndIoStatement(); + RT_API_ATTRS ConnectionState &GetConnectionState() { return connection_; } + RT_API_ATTRS MutableModes &mutableModes() { return connection_.modes; } + +private: + ConnectionState connection_; + ExternalFileUnit *unit_{nullptr}; +}; + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_IO_STMT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/lock.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/lock.h new file mode 100644 index 00000000000..7c885342457 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/lock.h @@ -0,0 +1,116 @@ +//===-- include/flang-rt/runtime/lock.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Wraps a mutex + +#ifndef FLANG_RT_RUNTIME_LOCK_H_ +#define FLANG_RT_RUNTIME_LOCK_H_ + +#include "terminator.h" +#include "tools.h" + +// Avoid <mutex> if possible to avoid introduction of C++ runtime +// library dependence. +#ifndef _WIN32 +#define USE_PTHREADS 1 +#else +#undef USE_PTHREADS +#endif + +#if USE_PTHREADS +#include <pthread.h> +#elif defined(_WIN32) +#include "flang/Common/windows-include.h" +#else +#include <mutex> +#endif + +namespace Fortran::runtime { + +class Lock { +public: +#if RT_USE_PSEUDO_LOCK + // No lock implementation, e.g. for using together + // with RT_USE_PSEUDO_FILE_UNIT. + // The users of Lock class may use it under + // USE_PTHREADS and otherwise, so it has to provide + // all the interfaces. + RT_API_ATTRS void Take() {} + RT_API_ATTRS bool Try() { return true; } + RT_API_ATTRS void Drop() {} + RT_API_ATTRS bool TakeIfNoDeadlock() { return true; } +#elif USE_PTHREADS + Lock() { pthread_mutex_init(&mutex_, nullptr); } + ~Lock() { pthread_mutex_destroy(&mutex_); } + void Take() { + while (pthread_mutex_lock(&mutex_)) { + } + holder_ = pthread_self(); + isBusy_ = true; + } + bool TakeIfNoDeadlock() { + if (isBusy_) { + auto thisThread{pthread_self()}; + if (pthread_equal(thisThread, holder_)) { + return false; + } + } + Take(); + return true; + } + bool Try() { return pthread_mutex_trylock(&mutex_) == 0; } + void Drop() { + isBusy_ = false; + pthread_mutex_unlock(&mutex_); + } +#elif defined(_WIN32) + Lock() { InitializeCriticalSection(&cs_); } + ~Lock() { DeleteCriticalSection(&cs_); } + void Take() { EnterCriticalSection(&cs_); } + bool Try() { return TryEnterCriticalSection(&cs_); } + void Drop() { LeaveCriticalSection(&cs_); } +#else + void Take() { mutex_.lock(); } + bool Try() { return mutex_.try_lock(); } + void Drop() { mutex_.unlock(); } +#endif + + void CheckLocked(const Terminator &terminator) { + if (Try()) { + Drop(); + terminator.Crash("Lock::CheckLocked() failed"); + } + } + +private: +#if RT_USE_PSEUDO_FILE_UNIT + // No state. +#elif USE_PTHREADS + pthread_mutex_t mutex_{}; + volatile bool isBusy_{false}; + volatile pthread_t holder_; +#elif defined(_WIN32) + CRITICAL_SECTION cs_; +#else + std::mutex mutex_; +#endif +}; + +class CriticalSection { +public: + explicit RT_API_ATTRS CriticalSection(Lock &lock) : lock_{lock} { + lock_.Take(); + } + RT_API_ATTRS ~CriticalSection() { lock_.Drop(); } + +private: + Lock &lock_; +}; +} // namespace Fortran::runtime + +#endif // FLANG_RT_RUNTIME_LOCK_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/memory.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/memory.h new file mode 100644 index 00000000000..93b477afa98 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/memory.h @@ -0,0 +1,173 @@ +//===-- include/flang-rt/runtime/memory.h -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Thin wrapper around malloc()/free() to isolate the dependency, +// ease porting, and provide an owning pointer. + +#ifndef FLANG_RT_RUNTIME_MEMORY_H_ +#define FLANG_RT_RUNTIME_MEMORY_H_ + +#include "flang/Common/api-attrs.h" +#include <cassert> +#include <memory> +#include <type_traits> + +namespace Fortran::runtime { + +class Terminator; + +[[nodiscard]] RT_API_ATTRS void *AllocateMemoryOrCrash( + const Terminator &, std::size_t bytes); +template <typename A> +[[nodiscard]] RT_API_ATTRS A &AllocateOrCrash(const Terminator &t) { + return *reinterpret_cast<A *>(AllocateMemoryOrCrash(t, sizeof(A))); +} +RT_API_ATTRS void *ReallocateMemoryOrCrash( + const Terminator &, void *ptr, std::size_t newByteSize); +RT_API_ATTRS void FreeMemory(void *); +template <typename A> RT_API_ATTRS void FreeMemory(A *p) { + FreeMemory(reinterpret_cast<void *>(p)); +} +template <typename A> RT_API_ATTRS void FreeMemoryAndNullify(A *&p) { + FreeMemory(p); + p = nullptr; +} + +// Very basic implementation mimicking std::unique_ptr. +// It should work for any offload device compiler. +// It uses a fixed memory deleter based on FreeMemory(), +// and does not support array objects with runtime length. +template <typename A> class OwningPtr { +public: + using pointer_type = A *; + + OwningPtr() = default; + RT_API_ATTRS explicit OwningPtr(pointer_type p) : ptr_(p) {} + RT_API_ATTRS OwningPtr(const OwningPtr &) = delete; + RT_API_ATTRS OwningPtr &operator=(const OwningPtr &) = delete; + RT_API_ATTRS OwningPtr(OwningPtr &&other) { + ptr_ = other.ptr_; + other.ptr_ = pointer_type{}; + } + RT_API_ATTRS OwningPtr &operator=(OwningPtr &&other) { + if (this != &other) { + delete_ptr(ptr_); + ptr_ = other.ptr_; + other.ptr_ = pointer_type{}; + } + return *this; + } + constexpr RT_API_ATTRS OwningPtr(std::nullptr_t) : OwningPtr() {} + + // Delete the pointer, if owns one. + RT_API_ATTRS ~OwningPtr() { + if (ptr_ != pointer_type{}) { + delete_ptr(ptr_); + ptr_ = pointer_type{}; + } + } + + // Release the ownership. + RT_API_ATTRS pointer_type release() { + pointer_type p = ptr_; + ptr_ = pointer_type{}; + return p; + } + + RT_DIAG_PUSH + RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN + // Replace the pointer. + RT_API_ATTRS void reset(pointer_type p = pointer_type{}) { + std::swap(ptr_, p); + if (p != pointer_type{}) { + // Delete the owned pointer. + delete_ptr(p); + } + } + + // Exchange the pointer with another object. + RT_API_ATTRS void swap(OwningPtr &other) { std::swap(ptr_, other.ptr_); } + RT_DIAG_POP + + // Get the stored pointer. + RT_API_ATTRS pointer_type get() const { return ptr_; } + + RT_API_ATTRS explicit operator bool() const { + return get() != pointer_type{}; + } + + RT_API_ATTRS typename std::add_lvalue_reference<A>::type operator*() const { + assert(get() != pointer_type{}); + return *get(); + } + + RT_API_ATTRS pointer_type operator->() const { return get(); } + +private: + RT_API_ATTRS void delete_ptr(pointer_type p) { FreeMemory(p); } + pointer_type ptr_{}; +}; + +template <typename X, typename Y> +inline RT_API_ATTRS bool operator!=( + const OwningPtr<X> &x, const OwningPtr<Y> &y) { + return x.get() != y.get(); +} + +template <typename X> +inline RT_API_ATTRS bool operator!=(const OwningPtr<X> &x, std::nullptr_t) { + return (bool)x; +} + +template <typename X> +inline RT_API_ATTRS bool operator!=(std::nullptr_t, const OwningPtr<X> &x) { + return (bool)x; +} + +template <typename A> class SizedNew { +public: + explicit RT_API_ATTRS SizedNew(const Terminator &terminator) + : terminator_{terminator} {} + + template <typename... X> + [[nodiscard]] RT_API_ATTRS OwningPtr<A> operator()( + std::size_t bytes, X &&...x) { + return OwningPtr<A>{new (AllocateMemoryOrCrash(terminator_, bytes)) + A{std::forward<X>(x)...}}; + } + +private: + const Terminator &terminator_; +}; + +template <typename A> struct New : public SizedNew<A> { + using SizedNew<A>::SizedNew; + template <typename... X> + [[nodiscard]] RT_API_ATTRS OwningPtr<A> operator()(X &&...x) { + return SizedNew<A>::operator()(sizeof(A), std::forward<X>(x)...); + } +}; + +template <typename A> struct Allocator { + using value_type = A; + explicit Allocator(const Terminator &t) : terminator{t} {} + template <typename B> + explicit constexpr Allocator(const Allocator<B> &that) noexcept + : terminator{that.terminator} {} + Allocator(const Allocator &) = default; + Allocator(Allocator &&) = default; + [[nodiscard]] constexpr A *allocate(std::size_t n) { + return reinterpret_cast<A *>( + AllocateMemoryOrCrash(terminator, n * sizeof(A))); + } + constexpr void deallocate(A *p, std::size_t) { FreeMemory(p); } + const Terminator &terminator; +}; +} // namespace Fortran::runtime + +#endif // FLANG_RT_RUNTIME_MEMORY_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/namelist.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/namelist.h new file mode 100644 index 00000000000..17d7bf310cc --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/namelist.h @@ -0,0 +1,54 @@ +//===-- include/flang-rt/runtime/namelist.h ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the data structure used for NAMELIST I/O + +#ifndef FLANG_RT_RUNTIME_NAMELIST_H_ +#define FLANG_RT_RUNTIME_NAMELIST_H_ + +#include "non-tbp-dio.h" +#include "flang/Common/api-attrs.h" + +#include <cstddef> + +namespace Fortran::runtime { +class Descriptor; +class IoStatementState; +} // namespace Fortran::runtime + +namespace Fortran::runtime::io { + +// A NAMELIST group is a named ordered collection of distinct variable names. +// It is packaged by lowering into an instance of this class. +// If all the items are variables with fixed addresses, the NAMELIST group +// description can be in a read-only section. +class NamelistGroup { +public: + struct Item { + const char *name; // NUL-terminated lower-case + const Descriptor &descriptor; + }; + const char *groupName{nullptr}; // NUL-terminated lower-case + std::size_t items{0}; + const Item *item{nullptr}; // in original declaration order + + // When the uses of a namelist group appear in scopes with distinct sets + // of non-type-bound defined formatted I/O interfaces, they require the + // use of distinct NamelistGroups pointing to distinct NonTbpDefinedIoTables. + // Multiple NamelistGroup instances may share a NonTbpDefinedIoTable.. + const NonTbpDefinedIoTable *nonTbpDefinedIo{nullptr}; +}; + +// Look ahead on input for a '/' or an identifier followed by a '=', '(', or '%' +// character; for use in disambiguating a name-like value (e.g. F or T) from a +// NAMELIST group item name and for coping with short arrays. Always false +// when not reading a NAMELIST. +RT_API_ATTRS bool IsNamelistNameOrSlash(IoStatementState &); + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_NAMELIST_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/non-tbp-dio.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/non-tbp-dio.h new file mode 100644 index 00000000000..99d4113b6c7 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/non-tbp-dio.h @@ -0,0 +1,60 @@ +//===-- include/flang-rt/runtime/non-tbp-dio.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines a structure used to identify the non-type-bound defined I/O +// generic interfaces that are accessible in a particular scope. This +// table is used by some I/O APIs and is also part of the NAMELIST +// group table. +// +// A specific procedure for a particular derived type must appear in +// this table if it (a) is a dummy procedure or procedure pointer, +// (b) is part of the defined I/O generic definition in a scope other +// than the one that contains the derived type definition, or (c) +// is a null pointer signifying that some specific procedure from +// a containing scope has become inaccessible in a nested scope due +// to the use of "IMPORT, NONE" or "IMPORT, ONLY:". + +#ifndef FLANG_RT_RUNTIME_NON_TBP_DIO_H_ +#define FLANG_RT_RUNTIME_NON_TBP_DIO_H_ + +#include "flang/Common/Fortran-consts.h" +#include "flang/Common/api-attrs.h" +#include <cstddef> + +namespace Fortran::runtime::typeInfo { +class DerivedType; +} // namespace Fortran::runtime::typeInfo + +namespace Fortran::runtime::io { + +RT_OFFLOAD_API_GROUP_BEGIN + +struct NonTbpDefinedIo { + const typeInfo::DerivedType &derivedType; + void (*subroutine)(); // null means no non-TBP defined I/O here + common::DefinedIo definedIo; + bool isDtvArgPolymorphic; // first dummy arg is CLASS(T) +}; + +struct NonTbpDefinedIoTable { + RT_API_ATTRS const NonTbpDefinedIo *Find( + const typeInfo::DerivedType &, common::DefinedIo) const; + std::size_t items{0}; + const NonTbpDefinedIo *item{nullptr}; + // True when the only procedures to be used are the type-bound special + // procedures in the type information tables and any non-null procedures + // in this table. When false, the entries in this table override whatever + // non-type-bound specific procedures might be in the type information, + // but the remaining specifics remain visible. + bool ignoreNonTbpEntries{false}; +}; + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_NON_TBP_DIO_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/numeric-templates.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/numeric-templates.h new file mode 100644 index 00000000000..1253d56f3c0 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/numeric-templates.h @@ -0,0 +1,371 @@ +//===-- include/flang-rt/runtime/numeric-templates.h ------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Generic class and function templates used for implementing +// various numeric intrinsics (EXPONENT, FRACTION, etc.). +// +// This header file also defines generic templates for "basic" +// math operations like abs, isnan, etc. The Float128Math +// library provides specializations for these templates +// for the data type corresponding to CppTypeFor<TypeCategory::Real, 16> +// on the target. + +#ifndef FLANG_RT_RUNTIME_NUMERIC_TEMPLATES_H_ +#define FLANG_RT_RUNTIME_NUMERIC_TEMPLATES_H_ + +#include "terminator.h" +#include "tools.h" +#include "flang/Common/api-attrs.h" +#include "flang/Common/erfc-scaled.h" +#include "flang/Common/float128.h" +#include <cstdint> +#include <limits> + +namespace Fortran::runtime { + +// MAX/MIN/LOWEST values for different data types. + +// MaxOrMinIdentity returns MAX or LOWEST value of the given type. +template <TypeCategory CAT, int KIND, bool IS_MAXVAL, typename Enable = void> +struct MaxOrMinIdentity { + using Type = CppTypeFor<CAT, KIND>; + static constexpr RT_API_ATTRS Type Value() { + return IS_MAXVAL ? std::numeric_limits<Type>::lowest() + : std::numeric_limits<Type>::max(); + } +}; + +// std::numeric_limits<> may not know int128_t +template <bool IS_MAXVAL> +struct MaxOrMinIdentity<TypeCategory::Integer, 16, IS_MAXVAL> { + using Type = CppTypeFor<TypeCategory::Integer, 16>; + static constexpr RT_API_ATTRS Type Value() { + return IS_MAXVAL ? Type{1} << 127 : ~Type{0} >> 1; + } +}; + +#if HAS_FLOAT128 +// std::numeric_limits<> may not support __float128. +// +// Usage of GCC quadmath.h's FLT128_MAX is complicated by the fact that +// even GCC complains about 'Q' literal suffix under -Wpedantic. +// We just recreate FLT128_MAX ourselves. +// +// This specialization must engage only when +// CppTypeFor<TypeCategory::Real, 16> is __float128. +template <bool IS_MAXVAL> +struct MaxOrMinIdentity<TypeCategory::Real, 16, IS_MAXVAL, + typename std::enable_if_t< + std::is_same_v<CppTypeFor<TypeCategory::Real, 16>, __float128>>> { + using Type = __float128; + static RT_API_ATTRS Type Value() { + // Create a buffer to store binary representation of __float128 constant. + constexpr std::size_t alignment = + std::max(alignof(Type), alignof(std::uint64_t)); + alignas(alignment) char data[sizeof(Type)]; + + // First, verify that our interpretation of __float128 format is correct, + // e.g. by checking at least one known constant. + *reinterpret_cast<Type *>(data) = Type(1.0); + if (*reinterpret_cast<std::uint64_t *>(data) != 0 || + *(reinterpret_cast<std::uint64_t *>(data) + 1) != 0x3FFF000000000000) { + Terminator terminator{__FILE__, __LINE__}; + terminator.Crash("not yet implemented: no full support for __float128"); + } + + // Recreate FLT128_MAX. + *reinterpret_cast<std::uint64_t *>(data) = 0xFFFFFFFFFFFFFFFF; + *(reinterpret_cast<std::uint64_t *>(data) + 1) = 0x7FFEFFFFFFFFFFFF; + Type max = *reinterpret_cast<Type *>(data); + return IS_MAXVAL ? -max : max; + } +}; +#endif // HAS_FLOAT128 + +// Minimum finite representable value. +// For floating-point types, returns minimum positive normalized value. +template <int PREC, typename T> struct MinValue { + static RT_API_ATTRS T get() { return std::numeric_limits<T>::min(); } +}; +template <typename T> struct MinValue<11, T> { + // TINY(0._2) + static constexpr RT_API_ATTRS T get() { return 0.00006103515625E-04; } +}; + +#if HAS_FLOAT128 +template <> struct MinValue<113, CppTypeFor<TypeCategory::Real, 16>> { + using Type = CppTypeFor<TypeCategory::Real, 16>; + static RT_API_ATTRS Type get() { + // Create a buffer to store binary representation of __float128 constant. + constexpr std::size_t alignment = + std::max(alignof(Type), alignof(std::uint64_t)); + alignas(alignment) char data[sizeof(Type)]; + + // First, verify that our interpretation of __float128 format is correct, + // e.g. by checking at least one known constant. + *reinterpret_cast<Type *>(data) = Type(1.0); + if (*reinterpret_cast<std::uint64_t *>(data) != 0 || + *(reinterpret_cast<std::uint64_t *>(data) + 1) != 0x3FFF000000000000) { + Terminator terminator{__FILE__, __LINE__}; + terminator.Crash("not yet implemented: no full support for __float128"); + } + + // Recreate FLT128_MIN. + *reinterpret_cast<std::uint64_t *>(data) = 0; + *(reinterpret_cast<std::uint64_t *>(data) + 1) = 0x1000000000000; + return *reinterpret_cast<Type *>(data); + } +}; +#endif // HAS_FLOAT128 + +template <typename T> struct ABSTy { + static constexpr RT_API_ATTRS T compute(T x) { return std::abs(x); } +}; + +// Suppress the warnings about calling __host__-only +// 'long double' std::frexp, from __device__ code. +RT_DIAG_PUSH +RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN + +template <typename T> struct FREXPTy { + static constexpr RT_API_ATTRS T compute(T x, int *e) { + return std::frexp(x, e); + } +}; + +RT_DIAG_POP + +template <typename T> struct ILOGBTy { + static constexpr RT_API_ATTRS int compute(T x) { return std::ilogb(x); } +}; + +template <typename T> struct ISINFTy { + static constexpr RT_API_ATTRS bool compute(T x) { return std::isinf(x); } +}; + +template <typename T> struct ISNANTy { + static constexpr RT_API_ATTRS bool compute(T x) { return std::isnan(x); } +}; + +template <typename T> struct LDEXPTy { + template <typename ET> static constexpr RT_API_ATTRS T compute(T x, ET e) { + return std::ldexp(x, e); + } +}; + +template <typename T> struct MAXTy { + static constexpr RT_API_ATTRS T compute() { + return std::numeric_limits<T>::max(); + } +}; + +#if HAS_LDBL128 || HAS_FLOAT128 +template <> struct MAXTy<CppTypeFor<TypeCategory::Real, 16>> { + static CppTypeFor<TypeCategory::Real, 16> compute() { + return MaxOrMinIdentity<TypeCategory::Real, 16, true>::Value(); + } +}; +#endif + +template <int PREC, typename T> struct MINTy { + static constexpr RT_API_ATTRS T compute() { return MinValue<PREC, T>::get(); } +}; + +template <typename T> struct QNANTy { + static constexpr RT_API_ATTRS T compute() { + return std::numeric_limits<T>::quiet_NaN(); + } +}; + +template <typename T> struct SQRTTy { + static constexpr RT_API_ATTRS T compute(T x) { return std::sqrt(x); } +}; + +// EXPONENT (16.9.75) +template <typename RESULT, typename ARG> +inline RT_API_ATTRS RESULT Exponent(ARG x) { + if (ISINFTy<ARG>::compute(x) || ISNANTy<ARG>::compute(x)) { + return MAXTy<RESULT>::compute(); // +/-Inf, NaN -> HUGE(0) + } else if (x == 0) { + return 0; // 0 -> 0 + } else { + return ILOGBTy<ARG>::compute(x) + 1; + } +} + +// FRACTION (16.9.80) +template <typename T> inline RT_API_ATTRS T Fraction(T x) { + if (ISNANTy<T>::compute(x)) { + return x; // NaN -> same NaN + } else if (ISINFTy<T>::compute(x)) { + return QNANTy<T>::compute(); // +/-Inf -> NaN + } else if (x == 0) { + return x; // 0 -> same 0 + } else { + int ignoredExp; + return FREXPTy<T>::compute(x, &ignoredExp); + } +} + +// SET_EXPONENT (16.9.171) +template <typename T> inline RT_API_ATTRS T SetExponent(T x, std::int64_t p) { + if (ISNANTy<T>::compute(x)) { + return x; // NaN -> same NaN + } else if (ISINFTy<T>::compute(x)) { + return QNANTy<T>::compute(); // +/-Inf -> NaN + } else if (x == 0) { + return x; // return negative zero if x is negative zero + } else { + int expo{ILOGBTy<T>::compute(x) + 1}; + auto ip{static_cast<int>(p - expo)}; + if (ip != p - expo) { + ip = p < 0 ? std::numeric_limits<int>::min() + : std::numeric_limits<int>::max(); + } + return LDEXPTy<T>::compute(x, ip); // x*2**(p-e) + } +} + +// MOD & MODULO (16.9.135, .136) +template <bool IS_MODULO, typename T> +inline RT_API_ATTRS T RealMod( + T a, T p, const char *sourceFile, int sourceLine) { + if (p == 0) { + Terminator{sourceFile, sourceLine}.Crash( + IS_MODULO ? "MODULO with P==0" : "MOD with P==0"); + } + if (ISNANTy<T>::compute(a) || ISNANTy<T>::compute(p) || + ISINFTy<T>::compute(a)) { + return QNANTy<T>::compute(); + } else if (IS_MODULO && ISINFTy<T>::compute(p)) { + // Other compilers behave consistently for MOD(x, +/-INF) + // and always return x. This is probably related to + // implementation of std::fmod(). Stick to this behavior + // for MOD, but return NaN for MODULO(x, +/-INF). + return QNANTy<T>::compute(); + } + T aAbs{ABSTy<T>::compute(a)}; + T pAbs{ABSTy<T>::compute(p)}; + if (aAbs <= static_cast<T>(std::numeric_limits<std::int64_t>::max()) && + pAbs <= static_cast<T>(std::numeric_limits<std::int64_t>::max())) { + if (auto aInt{static_cast<std::int64_t>(a)}; a == aInt) { + if (auto pInt{static_cast<std::int64_t>(p)}; p == pInt) { + // Fast exact case for integer operands + auto mod{aInt - (aInt / pInt) * pInt}; + if constexpr (IS_MODULO) { + if (mod == 0) { + // Return properly signed zero. + return pInt > 0 ? T{0} : -T{0}; + } + if ((aInt > 0) != (pInt > 0)) { + mod += pInt; + } + } else { + if (mod == 0) { + // Return properly signed zero. + return aInt > 0 ? T{0} : -T{0}; + } + } + return static_cast<T>(mod); + } + } + } + if constexpr (std::is_same_v<T, float> || std::is_same_v<T, double> || + std::is_same_v<T, long double>) { + // std::fmod() semantics on signed operands seems to match + // the requirements of MOD(). MODULO() needs adjustment. + T result{std::fmod(a, p)}; + if constexpr (IS_MODULO) { + if ((a < 0) != (p < 0)) { + if (result == 0.) { + result = -result; + } else { + result += p; + } + } + } + return result; + } else { + // The standard defines MOD(a,p)=a-AINT(a/p)*p and + // MODULO(a,p)=a-FLOOR(a/p)*p, but those definitions lose + // precision badly due to cancellation when ABS(a) is + // much larger than ABS(p). + // Insights: + // - MOD(a,p)=MOD(a-n*p,p) when a>0, p>0, integer n>0, and a>=n*p + // - when n is a power of two, n*p is exact + // - as a>=n*p, a-n*p does not round. + // So repeatedly reduce a by all n*p in decreasing order of n; + // what's left is the desired remainder. This is basically + // the same algorithm as arbitrary precision binary long division, + // discarding the quotient. + T tmp{aAbs}; + for (T adj{SetExponent(pAbs, Exponent<int>(aAbs))}; tmp >= pAbs; adj /= 2) { + if (tmp >= adj) { + tmp -= adj; + if (tmp == 0) { + break; + } + } + } + if (a < 0) { + tmp = -tmp; + } + if constexpr (IS_MODULO) { + if ((a < 0) != (p < 0)) { + if (tmp == 0.) { + tmp = -tmp; + } else { + tmp += p; + } + } + } + return tmp; + } +} + +// RRSPACING (16.9.164) +template <int PREC, typename T> inline RT_API_ATTRS T RRSpacing(T x) { + if (ISNANTy<T>::compute(x)) { + return x; // NaN -> same NaN + } else if (ISINFTy<T>::compute(x)) { + return QNANTy<T>::compute(); // +/-Inf -> NaN + } else if (x == 0) { + return 0; // 0 -> 0 + } else { + return LDEXPTy<T>::compute( + ABSTy<T>::compute(x), PREC - (ILOGBTy<T>::compute(x) + 1)); + } +} + +// SPACING (16.9.180) +template <int PREC, typename T> inline RT_API_ATTRS T Spacing(T x) { + T tiny{MINTy<PREC, T>::compute()}; + if (ISNANTy<T>::compute(x)) { + return x; // NaN -> same NaN + } else if (ISINFTy<T>::compute(x)) { + return QNANTy<T>::compute(); // +/-Inf -> NaN + } else if (x == 0) { // 0 -> TINY(x) + return tiny; + } else { + T result{LDEXPTy<T>::compute( + static_cast<T>(1.0), ILOGBTy<T>::compute(x) + 1 - PREC)}; // 2**(e-p) + // All compilers return TINY(x) for |x| <= TINY(x), but differ over whether + // SPACING(x) can be < TINY(x) for |x| > TINY(x). The most common precedent + // is to never return a value < TINY(x). + return result <= tiny ? tiny : result; + } +} + +// ERFC_SCALED (16.9.71) +template <typename T> inline RT_API_ATTRS T ErfcScaled(T arg) { + return common::ErfcScaled(arg); +} + +} // namespace Fortran::runtime + +#endif // FLANG_RT_RUNTIME_NUMERIC_TEMPLATES_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/random-templates.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/random-templates.h new file mode 100644 index 00000000000..895c5ad4fc8 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/random-templates.h @@ -0,0 +1,111 @@ +//===-- include/flang-rt/runtime/random-templates.h -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_RANDOM_TEMPLATES_H_ +#define FLANG_RT_RUNTIME_RANDOM_TEMPLATES_H_ + +#include "descriptor.h" +#include "lock.h" +#include "numeric-templates.h" +#include "flang/Common/optional.h" +#include <algorithm> +#include <random> + +namespace Fortran::runtime::random { + +// Newer "Minimum standard", recommended by Park, Miller, and Stockmeyer in +// 1993. Same as C++17 std::minstd_rand, but explicitly instantiated for +// permanence. +using Generator = + std::linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647>; + +using GeneratedWord = typename Generator::result_type; +static constexpr std::uint64_t range{ + static_cast<std::uint64_t>(Generator::max() - Generator::min() + 1)}; +static constexpr bool rangeIsPowerOfTwo{(range & (range - 1)) == 0}; +static constexpr int rangeBits{ + 64 - common::LeadingZeroBitCount(range) - !rangeIsPowerOfTwo}; + +extern Lock lock; +extern Generator generator; +extern Fortran::common::optional<GeneratedWord> nextValue; + +// Call only with lock held +static GeneratedWord GetNextValue() { + GeneratedWord result; + if (nextValue.has_value()) { + result = *nextValue; + nextValue.reset(); + } else { + result = generator(); + } + return result; +} + +template <typename REAL, int PREC> +inline void GenerateReal(const Descriptor &harvest) { + static constexpr std::size_t minBits{ + std::max<std::size_t>(PREC, 8 * sizeof(GeneratedWord))}; + using Int = common::HostUnsignedIntType<minBits>; + static constexpr std::size_t words{ + static_cast<std::size_t>(PREC + rangeBits - 1) / rangeBits}; + std::size_t elements{harvest.Elements()}; + SubscriptValue at[maxRank]; + harvest.GetLowerBounds(at); + { + CriticalSection critical{lock}; + for (std::size_t j{0}; j < elements; ++j) { + while (true) { + Int fraction{GetNextValue()}; + if constexpr (words > 1) { + for (std::size_t k{1}; k < words; ++k) { + static constexpr auto rangeMask{ + (GeneratedWord{1} << rangeBits) - 1}; + GeneratedWord word{(GetNextValue() - generator.min()) & rangeMask}; + fraction = (fraction << rangeBits) | word; + } + } + fraction >>= words * rangeBits - PREC; + REAL next{ + LDEXPTy<REAL>::compute(static_cast<REAL>(fraction), -(PREC + 1))}; + if (next >= 0.0 && next < 1.0) { + *harvest.Element<REAL>(at) = next; + break; + } + } + harvest.IncrementSubscripts(at); + } + } +} + +template <typename UINT> +inline void GenerateUnsigned(const Descriptor &harvest) { + static constexpr std::size_t words{ + (8 * sizeof(UINT) + rangeBits - 1) / rangeBits}; + std::size_t elements{harvest.Elements()}; + SubscriptValue at[maxRank]; + harvest.GetLowerBounds(at); + { + CriticalSection critical{lock}; + for (std::size_t j{0}; j < elements; ++j) { + UINT next{static_cast<UINT>(GetNextValue())}; + if constexpr (words > 1) { + for (std::size_t k{1}; k < words; ++k) { + next <<= rangeBits; + next |= GetNextValue(); + } + } + *harvest.Element<UINT>(at) = next; + harvest.IncrementSubscripts(at); + } + } +} + +} // namespace Fortran::runtime::random + +#endif // FLANG_RT_RUNTIME_RANDOM_TEMPLATES_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/reduction-templates.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/reduction-templates.h new file mode 100644 index 00000000000..18412708b02 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/reduction-templates.h @@ -0,0 +1,419 @@ +//===-- include/flang-rt/runtime/reduction-templates.h ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Generic function templates used by various reduction transformation +// intrinsic functions (SUM, PRODUCT, &c.) +// +// * Partial reductions (i.e., those with DIM= arguments that are not +// required to be 1 by the rank of the argument) return arrays that +// are dynamically allocated in a caller-supplied descriptor. +// * Total reductions (i.e., no DIM= argument) with FINDLOC, MAXLOC, & MINLOC +// return integer vectors of some kind, not scalars; a caller-supplied +// descriptor is used +// * Character-valued reductions (MAXVAL & MINVAL) return arbitrary +// length results, dynamically allocated in a caller-supplied descriptor + +#ifndef FLANG_RT_RUNTIME_REDUCTION_TEMPLATES_H_ +#define FLANG_RT_RUNTIME_REDUCTION_TEMPLATES_H_ + +#include "descriptor.h" +#include "numeric-templates.h" +#include "terminator.h" +#include "tools.h" +#include "flang/Runtime/cpp-type.h" +#include <algorithm> + +namespace Fortran::runtime { + +// Reductions are implemented with *accumulators*, which are instances of +// classes that incrementally build up the result (or an element thereof) during +// a traversal of the unmasked elements of an array. Each accumulator class +// supports a constructor (which captures a reference to the array), an +// AccumulateAt() member function that applies supplied subscripts to the +// array and does something with a scalar element, and a GetResult() +// member function that copies a final result into its destination. + +// Total reduction of the array argument to a scalar (or to a vector in the +// cases of FINDLOC, MAXLOC, & MINLOC). These are the cases without DIM= or +// cases where the argument has rank 1 and DIM=, if present, must be 1. +template <typename TYPE, typename ACCUMULATOR> +inline RT_API_ATTRS void DoTotalReduction(const Descriptor &x, int dim, + const Descriptor *mask, ACCUMULATOR &accumulator, const char *intrinsic, + Terminator &terminator) { + if (dim < 0 || dim > 1) { + terminator.Crash("%s: bad DIM=%d for ARRAY argument with rank %d", + intrinsic, dim, x.rank()); + } + SubscriptValue xAt[maxRank]; + x.GetLowerBounds(xAt); + if (mask) { + CheckConformability(x, *mask, terminator, intrinsic, "ARRAY", "MASK"); + if (mask->rank() > 0) { + SubscriptValue maskAt[maxRank]; + mask->GetLowerBounds(maskAt); + for (auto elements{x.Elements()}; elements--; + x.IncrementSubscripts(xAt), mask->IncrementSubscripts(maskAt)) { + if (IsLogicalElementTrue(*mask, maskAt)) { + if (!accumulator.template AccumulateAt<TYPE>(xAt)) { + break; + } + } + } + return; + } else if (!IsLogicalScalarTrue(*mask)) { + // scalar MASK=.FALSE.: return identity value + return; + } + } + // No MASK=, or scalar MASK=.TRUE. + for (auto elements{x.Elements()}; elements--; x.IncrementSubscripts(xAt)) { + if (!accumulator.template AccumulateAt<TYPE>(xAt)) { + break; // cut short, result is known + } + } +} + +template <TypeCategory CAT, int KIND, typename ACCUMULATOR> +inline RT_API_ATTRS CppTypeFor<CAT, KIND> GetTotalReduction(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask, + ACCUMULATOR &&accumulator, const char *intrinsic, + bool allowUnsignedForInteger = false) { + Terminator terminator{source, line}; + RUNTIME_CHECK(terminator, + TypeCode(CAT, KIND) == x.type() || + (CAT == TypeCategory::Integer && allowUnsignedForInteger && + TypeCode(TypeCategory::Unsigned, KIND) == x.type())); + using CppType = CppTypeFor<CAT, KIND>; + DoTotalReduction<CppType>(x, dim, mask, accumulator, intrinsic, terminator); + if constexpr (std::is_void_v<CppType>) { + // Result is returned from accumulator, as in REDUCE() for derived type +#ifdef _MSC_VER // work around MSVC spurious error + accumulator.GetResult(); +#else + accumulator.template GetResult<CppType>(); +#endif + } else { + CppType result; +#ifdef _MSC_VER // work around MSVC spurious error + accumulator.GetResult(&result); +#else + accumulator.template GetResult<CppType>(&result); +#endif + return result; + } +} + +// For reductions on a dimension, e.g. SUM(array,DIM=2) where the shape +// of the array is [2,3,5], the shape of the result is [2,5] and +// result(j,k) = SUM(array(j,:,k)), possibly modified if the array has +// lower bounds other than one. This utility subroutine creates an +// array of subscripts [j,_,k] for result subscripts [j,k] so that the +// elements of array(j,:,k) can be reduced. +inline RT_API_ATTRS void GetExpandedSubscripts(SubscriptValue at[], + const Descriptor &descriptor, int zeroBasedDim, + const SubscriptValue from[]) { + descriptor.GetLowerBounds(at); + int rank{descriptor.rank()}; + int j{0}; + for (; j < zeroBasedDim; ++j) { + at[j] += from[j] - 1 /*lower bound*/; + } + for (++j; j < rank; ++j) { + at[j] += from[j - 1] - 1; + } +} + +template <typename TYPE, typename ACCUMULATOR> +inline RT_API_ATTRS void ReduceDimToScalar(const Descriptor &x, + int zeroBasedDim, SubscriptValue subscripts[], TYPE *result, + ACCUMULATOR &accumulator) { + SubscriptValue xAt[maxRank]; + GetExpandedSubscripts(xAt, x, zeroBasedDim, subscripts); + const auto &dim{x.GetDimension(zeroBasedDim)}; + SubscriptValue at{dim.LowerBound()}; + for (auto n{dim.Extent()}; n-- > 0; ++at) { + xAt[zeroBasedDim] = at; + if (!accumulator.template AccumulateAt<TYPE>(xAt)) { + break; + } + } +#ifdef _MSC_VER // work around MSVC spurious error + accumulator.GetResult(result, zeroBasedDim); +#else + accumulator.template GetResult<TYPE>(result, zeroBasedDim); +#endif +} + +template <typename TYPE, typename ACCUMULATOR> +inline RT_API_ATTRS void ReduceDimMaskToScalar(const Descriptor &x, + int zeroBasedDim, SubscriptValue subscripts[], const Descriptor &mask, + TYPE *result, ACCUMULATOR &accumulator) { + SubscriptValue xAt[maxRank], maskAt[maxRank]; + GetExpandedSubscripts(xAt, x, zeroBasedDim, subscripts); + GetExpandedSubscripts(maskAt, mask, zeroBasedDim, subscripts); + const auto &xDim{x.GetDimension(zeroBasedDim)}; + SubscriptValue xPos{xDim.LowerBound()}; + const auto &maskDim{mask.GetDimension(zeroBasedDim)}; + SubscriptValue maskPos{maskDim.LowerBound()}; + for (auto n{x.GetDimension(zeroBasedDim).Extent()}; n-- > 0; + ++xPos, ++maskPos) { + maskAt[zeroBasedDim] = maskPos; + if (IsLogicalElementTrue(mask, maskAt)) { + xAt[zeroBasedDim] = xPos; + if (!accumulator.template AccumulateAt<TYPE>(xAt)) { + break; + } + } + } +#ifdef _MSC_VER // work around MSVC spurious error + accumulator.GetResult(result, zeroBasedDim); +#else + accumulator.template GetResult<TYPE>(result, zeroBasedDim); +#endif +} + +// Partial reductions with DIM= + +template <typename ACCUMULATOR, TypeCategory CAT, int KIND> +inline RT_API_ATTRS void PartialReduction(Descriptor &result, + const Descriptor &x, std::size_t resultElementSize, int dim, + const Descriptor *mask, Terminator &terminator, const char *intrinsic, + ACCUMULATOR &accumulator) { + CreatePartialReductionResult(result, x, resultElementSize, dim, terminator, + intrinsic, TypeCode{CAT, KIND}); + SubscriptValue at[maxRank]; + result.GetLowerBounds(at); + INTERNAL_CHECK(result.rank() == 0 || at[0] == 1); + using CppType = CppTypeFor<CAT, KIND>; + if (mask) { + CheckConformability(x, *mask, terminator, intrinsic, "ARRAY", "MASK"); + if (mask->rank() > 0) { + for (auto n{result.Elements()}; n-- > 0; result.IncrementSubscripts(at)) { + accumulator.Reinitialize(); + ReduceDimMaskToScalar<CppType, ACCUMULATOR>( + x, dim - 1, at, *mask, result.Element<CppType>(at), accumulator); + } + return; + } else if (!IsLogicalScalarTrue(*mask)) { + // scalar MASK=.FALSE. + accumulator.Reinitialize(); + for (auto n{result.Elements()}; n-- > 0; result.IncrementSubscripts(at)) { + accumulator.GetResult(result.Element<CppType>(at)); + } + return; + } + } + // No MASK= or scalar MASK=.TRUE. + for (auto n{result.Elements()}; n-- > 0; result.IncrementSubscripts(at)) { + accumulator.Reinitialize(); + ReduceDimToScalar<CppType, ACCUMULATOR>( + x, dim - 1, at, result.Element<CppType>(at), accumulator); + } +} + +template <template <typename> class ACCUM> +struct PartialIntegerReductionHelper { + template <int KIND> struct Functor { + static constexpr int Intermediate{ + std::max(KIND, 4)}; // use at least "int" for intermediate results + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + int dim, const Descriptor *mask, Terminator &terminator, + const char *intrinsic) const { + using Accumulator = + ACCUM<CppTypeFor<TypeCategory::Integer, Intermediate>>; + Accumulator accumulator{x}; + // Element size of the destination descriptor is the same + // as the element size of the source. + PartialReduction<Accumulator, TypeCategory::Integer, KIND>(result, x, + x.ElementBytes(), dim, mask, terminator, intrinsic, accumulator); + } + }; +}; + +template <template <typename> class INTEGER_ACCUM> +inline RT_API_ATTRS void PartialIntegerReduction(Descriptor &result, + const Descriptor &x, int dim, int kind, const Descriptor *mask, + const char *intrinsic, Terminator &terminator) { + ApplyIntegerKind< + PartialIntegerReductionHelper<INTEGER_ACCUM>::template Functor, void>( + kind, terminator, result, x, dim, mask, terminator, intrinsic); +} + +template <TypeCategory CAT, template <typename> class ACCUM, int MIN_KIND> +struct PartialFloatingReductionHelper { + template <int KIND> struct Functor { + static constexpr int Intermediate{std::max(KIND, MIN_KIND)}; + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + int dim, const Descriptor *mask, Terminator &terminator, + const char *intrinsic) const { + using Accumulator = ACCUM<CppTypeFor<TypeCategory::Real, Intermediate>>; + Accumulator accumulator{x}; + // Element size of the destination descriptor is the same + // as the element size of the source. + PartialReduction<Accumulator, CAT, KIND>(result, x, x.ElementBytes(), dim, + mask, terminator, intrinsic, accumulator); + } + }; +}; + +template <template <typename> class INTEGER_ACCUM, + template <typename> class REAL_ACCUM, + template <typename> class COMPLEX_ACCUM, int MIN_REAL_KIND> +inline RT_API_ATTRS void TypedPartialNumericReduction(Descriptor &result, + const Descriptor &x, int dim, const char *source, int line, + const Descriptor *mask, const char *intrinsic) { + Terminator terminator{source, line}; + auto catKind{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, catKind.has_value()); + switch (catKind->first) { + case TypeCategory::Integer: + PartialIntegerReduction<INTEGER_ACCUM>( + result, x, dim, catKind->second, mask, intrinsic, terminator); + break; + case TypeCategory::Real: + ApplyFloatingPointKind<PartialFloatingReductionHelper<TypeCategory::Real, + REAL_ACCUM, MIN_REAL_KIND>::template Functor, + void>(catKind->second, terminator, result, x, dim, mask, terminator, + intrinsic); + break; + case TypeCategory::Complex: + ApplyFloatingPointKind<PartialFloatingReductionHelper<TypeCategory::Complex, + COMPLEX_ACCUM, MIN_REAL_KIND>::template Functor, + void>(catKind->second, terminator, result, x, dim, mask, terminator, + intrinsic); + break; + default: + terminator.Crash("%s: bad type code %d", intrinsic, x.type().raw()); + } +} + +template <typename ACCUMULATOR> struct LocationResultHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()( + ACCUMULATOR &accumulator, const Descriptor &result) const { + accumulator.GetResult( + result.OffsetElement<CppTypeFor<TypeCategory::Integer, KIND>>()); + } + }; +}; + +template <typename ACCUMULATOR> struct PartialLocationHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + int dim, const Descriptor *mask, Terminator &terminator, + const char *intrinsic, ACCUMULATOR &accumulator) const { + // Element size of the destination descriptor is the size + // of {TypeCategory::Integer, KIND}. + PartialReduction<ACCUMULATOR, TypeCategory::Integer, KIND>(result, x, + Descriptor::BytesFor(TypeCategory::Integer, KIND), dim, mask, + terminator, intrinsic, accumulator); + } + }; +}; + +// NORM2 templates + +RT_VAR_GROUP_BEGIN + +// Use at least double precision for accumulators. +// Don't use __float128, it doesn't work with abs() or sqrt() yet. +static constexpr RT_CONST_VAR_ATTRS int Norm2LargestLDKind{ +#if HAS_LDBL128 || HAS_FLOAT128 + 16 +#elif HAS_FLOAT80 + 10 +#else + 8 +#endif +}; + +RT_VAR_GROUP_END + +template <TypeCategory CAT, int KIND, typename ACCUMULATOR> +inline RT_API_ATTRS void DoMaxMinNorm2(Descriptor &result, const Descriptor &x, + int dim, const Descriptor *mask, const char *intrinsic, + Terminator &terminator) { + using Type = CppTypeFor<CAT, KIND>; + ACCUMULATOR accumulator{x}; + if (dim == 0 || x.rank() == 1) { + // Total reduction + + // Element size of the destination descriptor is the same + // as the element size of the source. + result.Establish(x.type(), x.ElementBytes(), nullptr, 0, nullptr, + CFI_attribute_allocatable); + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "%s: could not allocate memory for result; STAT=%d", intrinsic, stat); + } + DoTotalReduction<Type>(x, dim, mask, accumulator, intrinsic, terminator); + accumulator.GetResult(result.OffsetElement<Type>()); + } else { + // Partial reduction + + // Element size of the destination descriptor is the same + // as the element size of the source. + PartialReduction<ACCUMULATOR, CAT, KIND>(result, x, x.ElementBytes(), dim, + mask, terminator, intrinsic, accumulator); + } +} + +// The data type used by Norm2Accumulator. +template <int KIND> +using Norm2AccumType = + CppTypeFor<TypeCategory::Real, std::clamp(KIND, 8, Norm2LargestLDKind)>; + +template <int KIND> class Norm2Accumulator { +public: + using Type = CppTypeFor<TypeCategory::Real, KIND>; + using AccumType = Norm2AccumType<KIND>; + explicit RT_API_ATTRS Norm2Accumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { max_ = sum_ = 0; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + // m * sqrt(1 + sum((others(:)/m)**2)) + *p = static_cast<Type>(max_ * SQRTTy<AccumType>::compute(1 + sum_)); + } + RT_API_ATTRS bool Accumulate(Type x) { + auto absX{ABSTy<AccumType>::compute(static_cast<AccumType>(x))}; + if (!max_) { + max_ = absX; + } else if (absX > max_) { + auto t{max_ / absX}; // < 1.0 + auto tsq{t * t}; + sum_ *= tsq; // scale sum to reflect change to the max + sum_ += tsq; // include a term for the previous max + max_ = absX; + } else { // absX <= max_ + auto t{absX / max_}; + sum_ += t * t; + } + return true; + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + return Accumulate(*array_.Element<A>(at)); + } + +private: + const Descriptor &array_; + AccumType max_{0}; // value (m) with largest magnitude + AccumType sum_{0}; // sum((others(:)/m)**2) +}; + +template <int KIND> struct Norm2Helper { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, int dim, + const Descriptor *mask, Terminator &terminator) const { + DoMaxMinNorm2<TypeCategory::Real, KIND, Norm2Accumulator<KIND>>( + result, x, dim, mask, "NORM2", terminator); + } +}; + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_REDUCTION_TEMPLATES_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/stat.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/stat.h new file mode 100644 index 00000000000..dc372de5350 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/stat.h @@ -0,0 +1,67 @@ +//===-- include/flang-rt/runtime/stat.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the values returned by the runtime for STAT= specifiers +// on executable statements. + +#ifndef FLANG_RT_RUNTIME_STAT_H_ +#define FLANG_RT_RUNTIME_STAT_H_ +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Common/api-attrs.h" +#include "flang/Runtime/magic-numbers.h" +namespace Fortran::runtime { + +class Descriptor; +class Terminator; + +// The value of STAT= is zero when no error condition has arisen. + +enum Stat { + StatOk = 0, // required to be zero by Fortran + + // Interoperable STAT= codes (>= 11) + StatBaseNull = CFI_ERROR_BASE_ADDR_NULL, + StatBaseNotNull = CFI_ERROR_BASE_ADDR_NOT_NULL, + StatInvalidElemLen = CFI_INVALID_ELEM_LEN, + StatInvalidRank = CFI_INVALID_RANK, + StatInvalidType = CFI_INVALID_TYPE, + StatInvalidAttribute = CFI_INVALID_ATTRIBUTE, + StatInvalidExtent = CFI_INVALID_EXTENT, + StatInvalidDescriptor = CFI_INVALID_DESCRIPTOR, + StatMemAllocation = CFI_ERROR_MEM_ALLOCATION, + StatOutOfBounds = CFI_ERROR_OUT_OF_BOUNDS, + + // Standard STAT= values (>= 101) + StatFailedImage = FORTRAN_RUNTIME_STAT_FAILED_IMAGE, + StatLocked = FORTRAN_RUNTIME_STAT_LOCKED, + StatLockedOtherImage = FORTRAN_RUNTIME_STAT_LOCKED_OTHER_IMAGE, + StatMissingEnvVariable = FORTRAN_RUNTIME_STAT_MISSING_ENV_VAR, + StatMissingCurrentWorkDirectory = FORTRAN_RUNTIME_STAT_MISSING_CWD, + StatStoppedImage = FORTRAN_RUNTIME_STAT_STOPPED_IMAGE, + StatUnlocked = FORTRAN_RUNTIME_STAT_UNLOCKED, + StatUnlockedFailedImage = FORTRAN_RUNTIME_STAT_UNLOCKED_FAILED_IMAGE, + + // Additional "processor-defined" STAT= values + StatInvalidArgumentNumber = FORTRAN_RUNTIME_STAT_INVALID_ARG_NUMBER, + StatMissingArgument = FORTRAN_RUNTIME_STAT_MISSING_ARG, + StatValueTooShort = FORTRAN_RUNTIME_STAT_VALUE_TOO_SHORT, // -1 + StatMoveAllocSameAllocatable = + FORTRAN_RUNTIME_STAT_MOVE_ALLOC_SAME_ALLOCATABLE, + StatBadPointerDeallocation = FORTRAN_RUNTIME_STAT_BAD_POINTER_DEALLOCATION, + + // Dummy status for work queue continuation, declared here to perhaps + // avoid collisions + StatContinue = 201 +}; + +RT_API_ATTRS const char *StatErrorString(int); +RT_API_ATTRS int ToErrmsg(const Descriptor *errmsg, int stat); // returns stat +RT_API_ATTRS int ReturnError(Terminator &, int stat, + const Descriptor *errmsg = nullptr, bool hasStat = false); +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_STAT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/terminator.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/terminator.h new file mode 100644 index 00000000000..047b576be4b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/terminator.h @@ -0,0 +1,139 @@ +//===-- include/flang-rt/runtime/terminator.h -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Termination of the image + +#ifndef FLANG_RT_RUNTIME_TERMINATOR_H_ +#define FLANG_RT_RUNTIME_TERMINATOR_H_ + +#include "flang/Common/api-attrs.h" +#include <cstdarg> +#include <cstdio> +#include <cstdlib> + +namespace Fortran::runtime { + +// A mixin class for statement-specific image error termination +// for errors detected in the runtime library +class Terminator { +public: + RT_API_ATTRS Terminator() {} + Terminator(const Terminator &) = default; + explicit RT_API_ATTRS Terminator( + const char *sourceFileName, int sourceLine = 0) + : sourceFileName_{sourceFileName}, sourceLine_{sourceLine} {} + + RT_API_ATTRS const char *sourceFileName() const { return sourceFileName_; } + RT_API_ATTRS int sourceLine() const { return sourceLine_; } + + RT_API_ATTRS void SetLocation( + const char *sourceFileName = nullptr, int sourceLine = 0) { + sourceFileName_ = sourceFileName; + sourceLine_ = sourceLine; + } + + // Silence compiler warnings about the format string being + // non-literal. A more precise control would be + // __attribute__((format_arg(2))), but it requires the function + // to return 'char *', which does not work well with noreturn. +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wformat-security" +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-security" +#endif + + // Device offload compilers do not normally support varargs and va_list, + // so use C++ variadic templates to forward the crash arguments + // to regular printf for the device compilation. + // Try to keep the inline implementations as small as possible. + template <typename... Args> + [[noreturn]] RT_DEVICE_NOINLINE RT_API_ATTRS const char *Crash( + const char *message, Args... args) const { +#if !defined(RT_DEVICE_COMPILATION) + // Invoke handler set up by the test harness. + InvokeCrashHandler(message, args...); +#endif + CrashHeader(); + PrintCrashArgs(message, args...); + CrashFooter(); + } + + template <typename... Args> + RT_API_ATTRS void PrintCrashArgs(const char *message, Args... args) const { +#if defined(RT_DEVICE_COMPILATION) + std::printf(message, args...); +#else + std::fprintf(stderr, message, args...); +#endif + } + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + + RT_API_ATTRS void CrashHeader() const; + [[noreturn]] RT_API_ATTRS void CrashFooter() const; +#if !defined(RT_DEVICE_COMPILATION) + void InvokeCrashHandler(const char *message, ...) const; + [[noreturn]] void CrashArgs(const char *message, va_list &) const; +#endif + [[noreturn]] RT_API_ATTRS void CheckFailed( + const char *predicate, const char *file, int line) const; + [[noreturn]] RT_API_ATTRS void CheckFailed(const char *predicate) const; + + // For test harnessing - overrides CrashArgs(). + static void RegisterCrashHandler(void (*)(const char *sourceFile, + int sourceLine, const char *message, va_list &ap)); + +private: + const char *sourceFileName_{nullptr}; + int sourceLine_{0}; +}; + +// RUNTIME_CHECK() guarantees evaluation of its predicate. +#define RUNTIME_CHECK(terminator, pred) \ + if (pred) \ + ; \ + else \ + (terminator).CheckFailed(#pred, __FILE__, __LINE__) + +#define INTERNAL_CHECK(pred) \ + if (pred) \ + ; \ + else \ + Terminator{__FILE__, __LINE__}.CheckFailed(#pred) + +RT_API_ATTRS void NotifyOtherImagesOfNormalEnd(); +RT_API_ATTRS void NotifyOtherImagesOfFailImageStatement(); +RT_API_ATTRS void NotifyOtherImagesOfErrorTermination(); + +#if defined(RT_DEVICE_COMPILATION) +/// Trap the execution on the device. +[[noreturn]] static inline void RT_API_ATTRS DeviceTrap() { +#if defined(__CUDACC__) + // NVCC supports __trap(). + __trap(); +#elif defined(__clang__) + // Clang supports __builtin_trap(). + __builtin_trap(); +#else +#error "unsupported compiler" +#endif +} +#endif +} // namespace Fortran::runtime + +namespace Fortran::runtime::io { +RT_API_ATTRS void FlushOutputOnCrash(const Terminator &); +} + +#endif // FLANG_RT_RUNTIME_TERMINATOR_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/tools.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/tools.h new file mode 100644 index 00000000000..a1b96f41f49 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/tools.h @@ -0,0 +1,576 @@ +//===-- include/flang-rt/runtime/tools.h ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_TOOLS_H_ +#define FLANG_RT_RUNTIME_TOOLS_H_ + +#include "descriptor.h" +#include "memory.h" +#include "stat.h" +#include "terminator.h" +#include "flang/Common/optional.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/freestanding-tools.h" +#include <cstring> +#include <functional> +#include <map> +#include <type_traits> + +/// \macro RT_PRETTY_FUNCTION +/// Gets a user-friendly looking function signature for the current scope +/// using the best available method on each platform. The exact format of the +/// resulting string is implementation specific and non-portable, so this should +/// only be used, for example, for logging or diagnostics. +/// Copy of LLVM_PRETTY_FUNCTION +#if defined(_MSC_VER) +#define RT_PRETTY_FUNCTION __FUNCSIG__ +#elif defined(__GNUC__) || defined(__clang__) +#define RT_PRETTY_FUNCTION __PRETTY_FUNCTION__ +#else +#define RT_PRETTY_FUNCTION __func__ +#endif + +#if defined(RT_DEVICE_COMPILATION) +// Use the pseudo lock and pseudo file unit implementations +// for the device. +#define RT_USE_PSEUDO_LOCK 1 +#define RT_USE_PSEUDO_FILE_UNIT 1 +#endif + +namespace Fortran::runtime { + +class Terminator; + +RT_API_ATTRS std::size_t TrimTrailingSpaces(const char *, std::size_t); + +RT_API_ATTRS OwningPtr<char> SaveDefaultCharacter( + const char *, std::size_t, const Terminator &); + +// For validating and recognizing default CHARACTER values in a +// case-insensitive manner. Returns the zero-based index into the +// null-terminated array of upper-case possibilities when the value is valid, +// or -1 when it has no match. +RT_API_ATTRS int IdentifyValue( + const char *value, std::size_t length, const char *possibilities[]); + +// Truncates or pads as necessary +RT_API_ATTRS void ToFortranDefaultCharacter( + char *to, std::size_t toLength, const char *from); + +// Utilities for dealing with elemental LOGICAL arguments +inline RT_API_ATTRS bool IsLogicalElementTrue( + const Descriptor &logical, const SubscriptValue at[]) { + // A LOGICAL value is false if and only if all of its bytes are zero. + const char *p{logical.Element<char>(at)}; + for (std::size_t j{logical.ElementBytes()}; j-- > 0; ++p) { + if (*p) { + return true; + } + } + return false; +} +inline RT_API_ATTRS bool IsLogicalScalarTrue(const Descriptor &logical) { + // A LOGICAL value is false if and only if all of its bytes are zero. + const char *p{logical.OffsetElement<char>()}; + for (std::size_t j{logical.ElementBytes()}; j-- > 0; ++p) { + if (*p) { + return true; + } + } + return false; +} + +// Check array conformability; a scalar 'x' conforms. Crashes on error. +RT_API_ATTRS void CheckConformability(const Descriptor &to, const Descriptor &x, + Terminator &, const char *funcName, const char *toName, + const char *fromName); + +// Helper to store integer value in result[at]. +template <int KIND> struct StoreIntegerAt { + RT_API_ATTRS void operator()(const Fortran::runtime::Descriptor &result, + std::size_t at, std::int64_t value) const { + *result.ZeroBasedIndexedElement<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Integer, KIND>>(at) = value; + } +}; + +// Helper to store floating value in result[at]. +template <int KIND> struct StoreFloatingPointAt { + RT_API_ATTRS void operator()(const Fortran::runtime::Descriptor &result, + std::size_t at, std::double_t value) const { + *result.ZeroBasedIndexedElement<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Real, KIND>>(at) = value; + } +}; + +// Validate a KIND= argument +RT_API_ATTRS void CheckIntegerKind( + Terminator &, int kind, const char *intrinsic); + +template <typename TO, typename FROM> +inline RT_API_ATTRS void PutContiguousConverted( + TO *to, FROM *from, std::size_t count) { + while (count-- > 0) { + *to++ = *from++; + } +} + +static inline RT_API_ATTRS std::int64_t GetInt64( + const char *p, std::size_t bytes, Terminator &terminator) { + switch (bytes) { + case 1: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 1> *>(p); + case 2: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 2> *>(p); + case 4: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 4> *>(p); + case 8: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 8> *>(p); + default: + terminator.Crash("GetInt64: no case for %zd bytes", bytes); + } +} + +static inline RT_API_ATTRS Fortran::common::optional<std::int64_t> GetInt64Safe( + const char *p, std::size_t bytes, Terminator &terminator) { + switch (bytes) { + case 1: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 1> *>(p); + case 2: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 2> *>(p); + case 4: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 4> *>(p); + case 8: + return *reinterpret_cast<const CppTypeFor<TypeCategory::Integer, 8> *>(p); + case 16: { + using Int128 = CppTypeFor<TypeCategory::Integer, 16>; + auto n{*reinterpret_cast<const Int128 *>(p)}; + std::int64_t result{static_cast<std::int64_t>(n)}; + if (static_cast<Int128>(result) == n) { + return result; + } + return Fortran::common::nullopt; + } + default: + terminator.Crash("GetInt64Safe: no case for %zd bytes", bytes); + } +} + +template <typename INT> +inline RT_API_ATTRS bool SetInteger(INT &x, int kind, std::int64_t value) { + switch (kind) { + case 1: + reinterpret_cast<CppTypeFor<TypeCategory::Integer, 1> &>(x) = value; + return value == reinterpret_cast<CppTypeFor<TypeCategory::Integer, 1> &>(x); + case 2: + reinterpret_cast<CppTypeFor<TypeCategory::Integer, 2> &>(x) = value; + return value == reinterpret_cast<CppTypeFor<TypeCategory::Integer, 2> &>(x); + case 4: + reinterpret_cast<CppTypeFor<TypeCategory::Integer, 4> &>(x) = value; + return value == reinterpret_cast<CppTypeFor<TypeCategory::Integer, 4> &>(x); + case 8: + reinterpret_cast<CppTypeFor<TypeCategory::Integer, 8> &>(x) = value; + return value == reinterpret_cast<CppTypeFor<TypeCategory::Integer, 8> &>(x); + default: + return false; + } +} + +// Maps intrinsic runtime type category and kind values to the appropriate +// instantiation of a function object template and calls it with the supplied +// arguments. +template <template <TypeCategory, int> class FUNC, typename RESULT, + typename... A> +inline RT_API_ATTRS RESULT ApplyType( + TypeCategory cat, int kind, Terminator &terminator, A &&...x) { + switch (cat) { + case TypeCategory::Integer: + switch (kind) { + case 1: + return FUNC<TypeCategory::Integer, 1>{}(std::forward<A>(x)...); + case 2: + return FUNC<TypeCategory::Integer, 2>{}(std::forward<A>(x)...); + case 4: + return FUNC<TypeCategory::Integer, 4>{}(std::forward<A>(x)...); + case 8: + return FUNC<TypeCategory::Integer, 8>{}(std::forward<A>(x)...); +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T + case 16: + return FUNC<TypeCategory::Integer, 16>{}(std::forward<A>(x)...); +#endif + default: + terminator.Crash("not yet implemented: INTEGER(KIND=%d)", kind); + } + case TypeCategory::Unsigned: + switch (kind) { + case 1: + return FUNC<TypeCategory::Unsigned, 1>{}(std::forward<A>(x)...); + case 2: + return FUNC<TypeCategory::Unsigned, 2>{}(std::forward<A>(x)...); + case 4: + return FUNC<TypeCategory::Unsigned, 4>{}(std::forward<A>(x)...); + case 8: + return FUNC<TypeCategory::Unsigned, 8>{}(std::forward<A>(x)...); +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T + case 16: + return FUNC<TypeCategory::Unsigned, 16>{}(std::forward<A>(x)...); +#endif + default: + terminator.Crash("not yet implemented: UNSIGNED(KIND=%d)", kind); + } + case TypeCategory::Real: + switch (kind) { +#if 0 // TODO: REAL(2 & 3) + case 2: + return FUNC<TypeCategory::Real, 2>{}(std::forward<A>(x)...); + case 3: + return FUNC<TypeCategory::Real, 3>{}(std::forward<A>(x)...); +#endif + case 4: + return FUNC<TypeCategory::Real, 4>{}(std::forward<A>(x)...); + case 8: + return FUNC<TypeCategory::Real, 8>{}(std::forward<A>(x)...); + case 10: + if constexpr (HasCppTypeFor<TypeCategory::Real, 10>) { + return FUNC<TypeCategory::Real, 10>{}(std::forward<A>(x)...); + } + break; + case 16: + if constexpr (HasCppTypeFor<TypeCategory::Real, 16>) { + return FUNC<TypeCategory::Real, 16>{}(std::forward<A>(x)...); + } + break; + } + terminator.Crash("not yet implemented: REAL(KIND=%d)", kind); + case TypeCategory::Complex: + switch (kind) { +#if 0 // TODO: COMPLEX(2 & 3) + case 2: + return FUNC<TypeCategory::Complex, 2>{}(std::forward<A>(x)...); + case 3: + return FUNC<TypeCategory::Complex, 3>{}(std::forward<A>(x)...); +#endif + case 4: + return FUNC<TypeCategory::Complex, 4>{}(std::forward<A>(x)...); + case 8: + return FUNC<TypeCategory::Complex, 8>{}(std::forward<A>(x)...); + case 10: + if constexpr (HasCppTypeFor<TypeCategory::Real, 10>) { + return FUNC<TypeCategory::Complex, 10>{}(std::forward<A>(x)...); + } + break; + case 16: + if constexpr (HasCppTypeFor<TypeCategory::Real, 16>) { + return FUNC<TypeCategory::Complex, 16>{}(std::forward<A>(x)...); + } + break; + } + terminator.Crash("not yet implemented: COMPLEX(KIND=%d)", kind); + case TypeCategory::Character: + switch (kind) { + case 1: + return FUNC<TypeCategory::Character, 1>{}(std::forward<A>(x)...); + case 2: + return FUNC<TypeCategory::Character, 2>{}(std::forward<A>(x)...); + case 4: + return FUNC<TypeCategory::Character, 4>{}(std::forward<A>(x)...); + default: + terminator.Crash("not yet implemented: CHARACTER(KIND=%d)", kind); + } + case TypeCategory::Logical: + switch (kind) { + case 1: + return FUNC<TypeCategory::Logical, 1>{}(std::forward<A>(x)...); + case 2: + return FUNC<TypeCategory::Logical, 2>{}(std::forward<A>(x)...); + case 4: + return FUNC<TypeCategory::Logical, 4>{}(std::forward<A>(x)...); + case 8: + return FUNC<TypeCategory::Logical, 8>{}(std::forward<A>(x)...); + default: + terminator.Crash("not yet implemented: LOGICAL(KIND=%d)", kind); + } + default: + terminator.Crash( + "not yet implemented: type category(%d)", static_cast<int>(cat)); + } +} + +// Maps a runtime INTEGER kind value to the appropriate instantiation of +// a function object template and calls it with the supplied arguments. +template <template <int KIND> class FUNC, typename RESULT, typename... A> +inline RT_API_ATTRS RESULT ApplyIntegerKind( + int kind, Terminator &terminator, A &&...x) { + switch (kind) { + case 1: + return FUNC<1>{}(std::forward<A>(x)...); + case 2: + return FUNC<2>{}(std::forward<A>(x)...); + case 4: + return FUNC<4>{}(std::forward<A>(x)...); + case 8: + return FUNC<8>{}(std::forward<A>(x)...); +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T + case 16: + return FUNC<16>{}(std::forward<A>(x)...); +#endif + default: + terminator.Crash("not yet implemented: INTEGER/UNSIGNED(KIND=%d)", kind); + } +} + +template <template <int KIND> class FUNC, typename RESULT, + bool NEEDSMATH = false, typename... A> +inline RT_API_ATTRS RESULT ApplyFloatingPointKind( + int kind, Terminator &terminator, A &&...x) { + switch (kind) { +#if 0 // TODO: REAL/COMPLEX (2 & 3) + case 2: + return FUNC<2>{}(std::forward<A>(x)...); + case 3: + return FUNC<3>{}(std::forward<A>(x)...); +#endif + case 4: + return FUNC<4>{}(std::forward<A>(x)...); + case 8: + return FUNC<8>{}(std::forward<A>(x)...); + case 10: + if constexpr (HasCppTypeFor<TypeCategory::Real, 10>) { + return FUNC<10>{}(std::forward<A>(x)...); + } + break; + case 16: + if constexpr (HasCppTypeFor<TypeCategory::Real, 16>) { + // If FUNC implemenation relies on FP math functions, + // then we should not be here. The compiler should have + // generated a call to an entry in the libflang_rt.quadmath + // library. + if constexpr (!NEEDSMATH) { + return FUNC<16>{}(std::forward<A>(x)...); + } + } + break; + } + terminator.Crash("not yet implemented: REAL/COMPLEX(KIND=%d)", kind); +} + +template <template <int KIND> class FUNC, typename RESULT, typename... A> +inline RT_API_ATTRS RESULT ApplyCharacterKind( + int kind, Terminator &terminator, A &&...x) { + switch (kind) { + case 1: + return FUNC<1>{}(std::forward<A>(x)...); + case 2: + return FUNC<2>{}(std::forward<A>(x)...); + case 4: + return FUNC<4>{}(std::forward<A>(x)...); + default: + terminator.Crash("not yet implemented: CHARACTER(KIND=%d)", kind); + } +} + +template <template <int KIND> class FUNC, typename RESULT, typename... A> +inline RT_API_ATTRS RESULT ApplyLogicalKind( + int kind, Terminator &terminator, A &&...x) { + switch (kind) { + case 1: + return FUNC<1>{}(std::forward<A>(x)...); + case 2: + return FUNC<2>{}(std::forward<A>(x)...); + case 4: + return FUNC<4>{}(std::forward<A>(x)...); + case 8: + return FUNC<8>{}(std::forward<A>(x)...); + default: + terminator.Crash("not yet implemented: LOGICAL(KIND=%d)", kind); + } +} + +// Calculate result type of (X op Y) for *, //, DOT_PRODUCT, &c. +Fortran::common::optional< + std::pair<TypeCategory, int>> inline constexpr RT_API_ATTRS +GetResultType(TypeCategory xCat, int xKind, TypeCategory yCat, int yKind) { + int maxKind{std::max(xKind, yKind)}; + switch (xCat) { + case TypeCategory::Integer: + switch (yCat) { + case TypeCategory::Integer: + return std::make_pair(TypeCategory::Integer, maxKind); + case TypeCategory::Real: + case TypeCategory::Complex: +#if !(defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T) + if (xKind == 16) { + break; + } +#endif + return std::make_pair(yCat, yKind); + default: + break; + } + break; + case TypeCategory::Unsigned: + switch (yCat) { + case TypeCategory::Unsigned: + return std::make_pair(TypeCategory::Unsigned, maxKind); + case TypeCategory::Real: + case TypeCategory::Complex: +#if !(defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T) + if (xKind == 16) { + break; + } +#endif + return std::make_pair(yCat, yKind); + default: + break; + } + break; + case TypeCategory::Real: + switch (yCat) { + case TypeCategory::Integer: + case TypeCategory::Unsigned: +#if !(defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T) + if (yKind == 16) { + break; + } +#endif + return std::make_pair(TypeCategory::Real, xKind); + case TypeCategory::Real: + case TypeCategory::Complex: + return std::make_pair(yCat, maxKind); + default: + break; + } + break; + case TypeCategory::Complex: + switch (yCat) { + case TypeCategory::Integer: + case TypeCategory::Unsigned: +#if !(defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T) + if (yKind == 16) { + break; + } +#endif + return std::make_pair(TypeCategory::Complex, xKind); + case TypeCategory::Real: + case TypeCategory::Complex: + return std::make_pair(TypeCategory::Complex, maxKind); + default: + break; + } + break; + case TypeCategory::Character: + if (yCat == TypeCategory::Character) { + return std::make_pair(TypeCategory::Character, maxKind); + } else { + return Fortran::common::nullopt; + } + case TypeCategory::Logical: + if (yCat == TypeCategory::Logical) { + return std::make_pair(TypeCategory::Logical, maxKind); + } else { + return Fortran::common::nullopt; + } + default: + break; + } + return Fortran::common::nullopt; +} + +// Accumulate floating-point results in (at least) double precision +template <TypeCategory CAT, int KIND> +using AccumulationType = CppTypeFor<CAT, + CAT == TypeCategory::Real || CAT == TypeCategory::Complex + ? std::max(KIND, static_cast<int>(sizeof(double))) + : KIND>; + +// memchr() for any character type +template <typename CHAR> +static inline RT_API_ATTRS const CHAR *FindCharacter( + const CHAR *data, CHAR ch, std::size_t chars) { + const CHAR *end{data + chars}; + for (const CHAR *p{data}; p < end; ++p) { + if (*p == ch) { + return p; + } + } + return nullptr; +} + +template <> +inline RT_API_ATTRS const char *FindCharacter( + const char *data, char ch, std::size_t chars) { + return reinterpret_cast<const char *>( + runtime::memchr(data, static_cast<int>(ch), chars)); +} + +// Copy payload data from one allocated descriptor to another. +// Assumes element counts and element sizes match, and that both +// descriptors are allocated. +template <typename P = char, int RANK = -1> +RT_API_ATTRS void ShallowCopyDiscontiguousToDiscontiguous( + const Descriptor &to, const Descriptor &from); +template <typename P = char, int RANK = -1> +RT_API_ATTRS void ShallowCopyDiscontiguousToContiguous( + const Descriptor &to, const Descriptor &from); +template <typename P = char, int RANK = -1> +RT_API_ATTRS void ShallowCopyContiguousToDiscontiguous( + const Descriptor &to, const Descriptor &from); +RT_API_ATTRS void ShallowCopy(const Descriptor &to, const Descriptor &from, + bool toIsContiguous, bool fromIsContiguous); +RT_API_ATTRS void ShallowCopy(const Descriptor &to, const Descriptor &from); + +// Ensures that a character string is null-terminated, allocating a /p length +1 +// size memory for null-terminator if necessary. Returns the original or a newly +// allocated null-terminated string (responsibility for deallocation is on the +// caller). +RT_API_ATTRS char *EnsureNullTerminated( + char *str, std::size_t length, Terminator &terminator); + +RT_API_ATTRS bool IsValidCharDescriptor(const Descriptor *value); + +RT_API_ATTRS bool IsValidIntDescriptor(const Descriptor *intVal); + +// Copy a null-terminated character array \p rawValue to descriptor \p value. +// The copy starts at the given \p offset, if not present then start at 0. +// If descriptor `errmsg` is provided, error messages will be stored to it. +// Returns stats specified in standard. +RT_API_ATTRS std::int32_t CopyCharsToDescriptor(const Descriptor &value, + const char *rawValue, std::size_t rawValueLength, + const Descriptor *errmsg = nullptr, std::size_t offset = 0); + +RT_API_ATTRS void StoreIntToDescriptor( + const Descriptor *length, std::int64_t value, Terminator &terminator); + +// Defines a utility function for copying and padding characters +template <typename TO, typename FROM> +RT_API_ATTRS void CopyAndPad( + TO *to, const FROM *from, std::size_t toChars, std::size_t fromChars) { + if constexpr (sizeof(TO) != sizeof(FROM)) { + std::size_t copyChars{std::min(toChars, fromChars)}; + for (std::size_t j{0}; j < copyChars; ++j) { + to[j] = from[j]; + } + for (std::size_t j{copyChars}; j < toChars; ++j) { + to[j] = static_cast<TO>(' '); + } + } else if (toChars <= fromChars) { + std::memcpy(to, from, toChars * sizeof(TO)); + } else { + std::memcpy(to, from, std::min(toChars, fromChars) * sizeof(TO)); + for (std::size_t j{fromChars}; j < toChars; ++j) { + to[j] = static_cast<TO>(' '); + } + } +} + +RT_API_ATTRS void CreatePartialReductionResult(Descriptor &result, + const Descriptor &x, std::size_t resultElementSize, int dim, Terminator &, + const char *intrinsic, TypeCode); + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_TOOLS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/type-code.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/type-code.h new file mode 100644 index 00000000000..9416a2816fd --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/type-code.h @@ -0,0 +1,78 @@ +//===-- include/flang-rt/runtime/type-code.h --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_TYPE_CODE_H_ +#define FLANG_RT_RUNTIME_TYPE_CODE_H_ + +#include "flang/Common/Fortran-consts.h" +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Common/optional.h" +#include <utility> + +namespace Fortran::runtime { + +using common::TypeCategory; + +class TypeCode { +public: + TypeCode() {} + explicit RT_API_ATTRS TypeCode(ISO::CFI_type_t t) : raw_{t} {} + RT_API_ATTRS TypeCode(TypeCategory, int kind); + + RT_API_ATTRS int raw() const { return raw_; } + + constexpr RT_API_ATTRS bool IsValid() const { + return raw_ >= CFI_type_signed_char && raw_ <= CFI_TYPE_LAST; + } + constexpr RT_API_ATTRS bool IsInteger() const { + return raw_ >= CFI_type_signed_char && raw_ <= CFI_type_ptrdiff_t; + } + constexpr RT_API_ATTRS bool IsReal() const { + return raw_ >= CFI_type_half_float && raw_ <= CFI_type_float128; + } + constexpr RT_API_ATTRS bool IsComplex() const { + return raw_ >= CFI_type_half_float_Complex && + raw_ <= CFI_type_float128_Complex; + } + constexpr RT_API_ATTRS bool IsCharacter() const { + return raw_ == CFI_type_char || raw_ == CFI_type_char16_t || + raw_ == CFI_type_char32_t; + } + constexpr RT_API_ATTRS bool IsLogical() const { + return raw_ == CFI_type_Bool || + (raw_ >= CFI_type_int_least8_t && raw_ <= CFI_type_int_least64_t); + } + constexpr RT_API_ATTRS bool IsDerived() const { + return raw_ == CFI_type_struct; + } + constexpr RT_API_ATTRS bool IsIntrinsic() const { + return IsValid() && !IsDerived(); + } + + RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>> + GetCategoryAndKind() const; + + RT_API_ATTRS bool operator==(TypeCode that) const { + if (raw_ == that.raw_) { // fast path + return true; + } else { + // Multiple raw CFI_type_... codes can represent the same Fortran + // type category + kind type parameter, e.g. CFI_type_int and + // CFI_type_int32_t. + auto thisCK{GetCategoryAndKind()}; + auto thatCK{that.GetCategoryAndKind()}; + return thisCK && thatCK && *thisCK == *thatCK; + } + } + RT_API_ATTRS bool operator!=(TypeCode that) const { return !(*this == that); } + +private: + ISO::CFI_type_t raw_{CFI_type_other}; +}; +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_TYPE_CODE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/type-info.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/type-info.h new file mode 100644 index 00000000000..a8d39f4f8a1 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/type-info.h @@ -0,0 +1,339 @@ +//===-- include/flang-rt/runtime/type-info.h --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_TYPE_INFO_H_ +#define FLANG_RT_RUNTIME_TYPE_INFO_H_ + +// A C++ perspective of the derived type description schemata in +// flang/module/__fortran_type_info.f90. + +#include "descriptor.h" +#include "terminator.h" +#include "flang/Common/Fortran-consts.h" +#include "flang/Common/bit-population-count.h" +#include "flang/Common/optional.h" +#include <cinttypes> +#include <memory> + +namespace Fortran::runtime::typeInfo { + +class DerivedType; + +using ProcedurePointer = void (*)(); // TYPE(C_FUNPTR) + +struct Binding { + ProcedurePointer proc; + StaticDescriptor<0> name; // CHARACTER(:), POINTER +}; + +class Value { +public: + enum class Genre : std::uint8_t { + Deferred = 1, + Explicit = 2, + LenParameter = 3 + }; + RT_API_ATTRS Genre genre() const { return genre_; } + RT_API_ATTRS Fortran::common::optional<TypeParameterValue> GetValue( + const Descriptor *) const; + +private: + Genre genre_{Genre::Explicit}; + // The value encodes an index into the table of LEN type parameters in + // a descriptor's addendum for genre == Genre::LenParameter. + TypeParameterValue value_{0}; +}; + +class Component { +public: + enum class Genre : std::uint8_t { + Data = 1, + Pointer = 2, + Allocatable = 3, + Automatic = 4 + }; + + RT_API_ATTRS const Descriptor &name() const { return name_.descriptor(); } + RT_API_ATTRS Genre genre() const { return genre_; } + RT_API_ATTRS TypeCategory category() const { + return static_cast<TypeCategory>(category_); + } + RT_API_ATTRS int kind() const { return kind_; } + RT_API_ATTRS int rank() const { return rank_; } + RT_API_ATTRS std::uint64_t offset() const { return offset_; } + RT_API_ATTRS const Value &characterLen() const { return characterLen_; } + RT_API_ATTRS const DerivedType *derivedType() const { + return category() == TypeCategory::Derived + ? derivedType_.descriptor().OffsetElement<const DerivedType>() + : nullptr; + } + RT_API_ATTRS const Value *lenValue() const { + return lenValue_.descriptor().OffsetElement<const Value>(); + } + RT_API_ATTRS const Value *bounds() const { + return bounds_.descriptor().OffsetElement<const Value>(); + } + RT_API_ATTRS const char *initialization() const { return initialization_; } + + RT_API_ATTRS std::size_t GetElementByteSize(const Descriptor &) const; + RT_API_ATTRS std::size_t GetElements(const Descriptor &) const; + + // For components that are descriptors, returns size of descriptor; + // for Genre::Data, returns elemental byte size times element count. + RT_API_ATTRS std::size_t SizeInBytes(const Descriptor &) const; + + // Establishes a descriptor from this component description. + RT_API_ATTRS void EstablishDescriptor( + Descriptor &, const Descriptor &container, Terminator &) const; + + // Creates a pointer descriptor from this component description, possibly + // with subscripts + RT_API_ATTRS void CreatePointerDescriptor(Descriptor &, + const Descriptor &container, Terminator &, + const SubscriptValue * = nullptr) const; + + FILE *Dump(FILE * = stdout) const; + +private: + StaticDescriptor<0> name_; // CHARACTER(:), POINTER + Genre genre_{Genre::Data}; + std::uint8_t category_; // common::TypeCategory + std::uint8_t kind_{0}; + std::uint8_t rank_{0}; + std::uint64_t offset_{0}; + Value characterLen_; // for TypeCategory::Character + StaticDescriptor<0, true> derivedType_; // TYPE(DERIVEDTYPE), POINTER + StaticDescriptor<1, true> + lenValue_; // TYPE(VALUE), POINTER, DIMENSION(:), CONTIGUOUS + StaticDescriptor<2, true> + bounds_; // TYPE(VALUE), POINTER, DIMENSION(2,:), CONTIGUOUS + const char *initialization_{nullptr}; // for Genre::Data and Pointer + // TODO: cobounds + // TODO: `PRIVATE` attribute +}; + +struct ProcPtrComponent { + StaticDescriptor<0> name; // CHARACTER(:), POINTER + std::uint64_t offset{0}; + ProcedurePointer procInitialization; +}; + +class SpecialBinding { +public: + enum class Which : std::uint8_t { + None = 0, + ScalarAssignment = 1, + ElementalAssignment = 2, + ReadFormatted = 3, + ReadUnformatted = 4, + WriteFormatted = 5, + WriteUnformatted = 6, + ElementalFinal = 7, + AssumedRankFinal = 8, + ScalarFinal = 9, + // higher-ranked final procedures follow + }; + + // Special bindings can be created during execution to handle defined + // I/O procedures that are not type-bound. + RT_API_ATTRS SpecialBinding(Which which, ProcedurePointer proc, + std::uint8_t isArgDescSet, std::uint8_t isTypeBound, + std::uint8_t isArgContiguousSet) + : which_{which}, isArgDescriptorSet_{isArgDescSet}, + isTypeBound_{isTypeBound}, isArgContiguousSet_{isArgContiguousSet}, + proc_{proc} {} + + static constexpr RT_API_ATTRS Which RankFinal(int rank) { + return static_cast<Which>(static_cast<int>(Which::ScalarFinal) + rank); + } + + RT_API_ATTRS Which which() const { return which_; } + RT_API_ATTRS bool IsArgDescriptor(int zeroBasedArg) const { + return (isArgDescriptorSet_ >> zeroBasedArg) & 1; + } + RT_API_ATTRS bool IsTypeBound() const { return isTypeBound_ != 0; } + RT_API_ATTRS bool IsArgContiguous(int zeroBasedArg) const { + return (isArgContiguousSet_ >> zeroBasedArg) & 1; + } + template <typename PROC> + RT_API_ATTRS PROC GetProc(const Binding *bindings = nullptr) const { + if (bindings && isTypeBound_ > 0) { + return reinterpret_cast<PROC>(bindings[isTypeBound_ - 1].proc); + } else { + return reinterpret_cast<PROC>(proc_); + } + } + + FILE *Dump(FILE *) const; + +private: + Which which_{Which::None}; + + // The following little bit-set identifies which dummy arguments are + // passed via descriptors for their derived type arguments. + // Which::Assignment and Which::ElementalAssignment: + // Set to 1, 2, or (usually 3). + // The passed-object argument (usually the "to") is always passed via a + // a descriptor in the cases where the runtime will call a defined + // assignment because these calls are to type-bound generics, + // not generic interfaces, and type-bound generic defined assigment + // may appear only in an extensible type and requires a passed-object + // argument (see C774), and passed-object arguments to TBPs must be + // both polymorphic and scalar (C760). The non-passed-object argument + // (usually the "from") is usually, but not always, also a descriptor. + // Which::Final and Which::ElementalFinal: + // Set to 1 when dummy argument is assumed-shape; otherwise, the + // argument can be passed by address. (Fortran guarantees that + // any finalized object must be whole and contiguous by restricting + // the use of DEALLOCATE on pointers. The dummy argument of an + // elemental final subroutine must be scalar and monomorphic, but + // use a descriptors when the type has LEN parameters.) + // Which::AssumedRankFinal: flag must necessarily be set + // Defined I/O: + // Set to 1 when "dtv" initial dummy argument is polymorphic, which is + // the case when and only when the derived type is extensible. + // When false, the defined I/O subroutine must have been + // called via a generic interface, not a generic TBP. + std::uint8_t isArgDescriptorSet_{0}; + // When a special binding is type-bound, this is its binding's index (plus 1, + // so that 0 signifies that it's not type-bound). + std::uint8_t isTypeBound_{0}; + // True when a FINAL subroutine has a dummy argument that is an array that + // is CONTIGUOUS or neither assumed-rank nor assumed-shape. + std::uint8_t isArgContiguousSet_{0}; + + ProcedurePointer proc_{nullptr}; +}; + +class DerivedType { +public: + ~DerivedType(); // never defined + + RT_API_ATTRS const Descriptor &binding() const { + return binding_.descriptor(); + } + RT_API_ATTRS const Descriptor &name() const { return name_.descriptor(); } + RT_API_ATTRS std::uint64_t sizeInBytes() const { return sizeInBytes_; } + RT_API_ATTRS const Descriptor &uninstantiated() const { + return uninstantiated_.descriptor(); + } + RT_API_ATTRS const DerivedType *uninstantiatedType() const { + return reinterpret_cast<const DerivedType *>( + uninstantiated().raw().base_addr); + } + RT_API_ATTRS const Descriptor &kindParameter() const { + return kindParameter_.descriptor(); + } + RT_API_ATTRS const Descriptor &lenParameterKind() const { + return lenParameterKind_.descriptor(); + } + RT_API_ATTRS const Descriptor &component() const { + return component_.descriptor(); + } + RT_API_ATTRS const Descriptor &procPtr() const { + return procPtr_.descriptor(); + } + RT_API_ATTRS const Descriptor &special() const { + return special_.descriptor(); + } + RT_API_ATTRS bool hasParent() const { return hasParent_; } + RT_API_ATTRS bool noInitializationNeeded() const { + return noInitializationNeeded_; + } + RT_API_ATTRS bool noDestructionNeeded() const { return noDestructionNeeded_; } + RT_API_ATTRS bool noFinalizationNeeded() const { + return noFinalizationNeeded_; + } + RT_API_ATTRS bool noDefinedAssignment() const { return noDefinedAssignment_; } + + RT_API_ATTRS std::size_t LenParameters() const { + return lenParameterKind().Elements(); + } + + RT_API_ATTRS const DerivedType *GetParentType() const; + + // Finds a data component by name in this derived type or its ancestors. + RT_API_ATTRS const Component *FindDataComponent( + const char *name, std::size_t nameLen) const; + + // O(1) look-up of special procedure bindings + RT_API_ATTRS const SpecialBinding *FindSpecialBinding( + SpecialBinding::Which which) const { + auto bitIndex{static_cast<std::uint32_t>(which)}; + auto bit{std::uint32_t{1} << bitIndex}; + if (specialBitSet_ & bit) { + // The index of this special procedure in the sorted array is the + // number of special bindings that are present with smaller "which" + // code values. + int offset{common::BitPopulationCount(specialBitSet_ & (bit - 1))}; + const auto *binding{ + special_.descriptor().ZeroBasedIndexedElement<SpecialBinding>( + offset)}; + INTERNAL_CHECK(binding && binding->which() == which); + return binding; + } else { + return nullptr; + } + } + + FILE *Dump(FILE * = stdout) const; + +private: + // This member comes first because it's used like a vtable by generated code. + // It includes all of the ancestor types' bindings, if any, first, + // with any overrides from descendants already applied to them. Local + // bindings then follow in alphabetic order of binding name. + StaticDescriptor<1, true> + binding_; // TYPE(BINDING), DIMENSION(:), POINTER, CONTIGUOUS + + StaticDescriptor<0> name_; // CHARACTER(:), POINTER + + std::uint64_t sizeInBytes_{0}; + + // Instantiations of a parameterized derived type with KIND type + // parameters will point this data member to the description of + // the original uninstantiated type, which may be shared from a + // module via use association. The original uninstantiated derived + // type description will point to itself. Derived types that have + // no KIND type parameters will have a null pointer here. + StaticDescriptor<0, true> uninstantiated_; // TYPE(DERIVEDTYPE), POINTER + + // These pointer targets include all of the items from the parent, if any. + StaticDescriptor<1> kindParameter_; // pointer to rank-1 array of INTEGER(8) + StaticDescriptor<1> + lenParameterKind_; // pointer to rank-1 array of INTEGER(1) + + // This array of local data components includes the parent component. + // Components are in component order, not collation order of their names. + // It does not include procedure pointer components. + StaticDescriptor<1, true> + component_; // TYPE(COMPONENT), POINTER, DIMENSION(:), CONTIGUOUS + + // Procedure pointer components + StaticDescriptor<1, true> + procPtr_; // TYPE(PROCPTR), POINTER, DIMENSION(:), CONTIGUOUS + + // Packed in ascending order of "which" code values. + // Does not include special bindings from ancestral types. + StaticDescriptor<1, true> + special_; // TYPE(SPECIALBINDING), POINTER, DIMENSION(:), CONTIGUOUS + + // Little-endian bit-set of special procedure binding "which" code values + // for O(1) look-up in FindSpecialBinding() above. + std::uint32_t specialBitSet_{0}; + + // Flags + bool hasParent_{false}; + bool noInitializationNeeded_{false}; + bool noDestructionNeeded_{false}; + bool noFinalizationNeeded_{false}; + bool noDefinedAssignment_{false}; +}; + +} // namespace Fortran::runtime::typeInfo +#endif // FLANG_RT_RUNTIME_TYPE_INFO_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/utf.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/utf.h new file mode 100644 index 00000000000..b5add823124 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/utf.h @@ -0,0 +1,73 @@ +//===-- include/flang-rt/runtime/utf.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UTF-8 is the variant-width standard encoding of Unicode (ISO 10646) +// code points. +// +// 7-bit values in [00 .. 7F] represent themselves as single bytes, so true +// 7-bit ASCII is also valid UTF-8. +// +// Larger values are encoded with a start byte in [C0 .. FE] that carries +// the length of the encoding and some of the upper bits of the value, followed +// by one or more bytes in the range [80 .. BF]. +// +// Specifically, the first byte holds two or more uppermost set bits, +// a zero bit, and some payload; the second and later bytes each start with +// their uppermost bit set, the next bit clear, and six bits of payload. +// Payload parcels are in big-endian order. All bytes must be present in a +// valid sequence; i.e., low-order sezo bits must be explicit. UTF-8 is +// self-synchronizing on input as any byte value cannot be both a valid +// first byte or trailing byte. +// +// 0xxxxxxx - 7 bit ASCII +// 110xxxxx 10xxxxxx - 11-bit value +// 1110xxxx 10xxxxxx 10xxxxxx - 16-bit value +// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - 21-bit value +// 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - 26-bit value +// 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - 31-bit value +// 11111110 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - 36-bit value +// +// Canonical UTF-8 sequences should be minimal, and our output is so, but +// we do not reject non-minimal sequences on input. Unicode only defines +// code points up to 0x10FFFF, so 21-bit (4-byte) UTF-8 is the actual +// standard maximum. However, we support extended forms up to 32 bits so that +// CHARACTER(KIND=4) can be abused to hold arbitrary 32-bit data. + +#ifndef FLANG_RT_RUNTIME_UTF_H_ +#define FLANG_RT_RUNTIME_UTF_H_ + +#include "flang/Common/optional.h" +#include <cstddef> +#include <cstdint> + +namespace Fortran::runtime { + +// Derive the length of a UTF-8 character encoding from its first byte. +// A zero result signifies an invalid encoding. +RT_OFFLOAD_VAR_GROUP_BEGIN +extern const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]; +static constexpr std::size_t maxUTF8Bytes{7}; +RT_OFFLOAD_VAR_GROUP_END + +static inline RT_API_ATTRS std::size_t MeasureUTF8Bytes(char first) { + return UTF8FirstByteTable[static_cast<std::uint8_t>(first)]; +} + +RT_API_ATTRS std::size_t MeasurePreviousUTF8Bytes( + const char *end, std::size_t limit); + +// Ensure that all bytes are present in sequence in the input buffer +// before calling; use MeasureUTF8Bytes(first byte) to count them. +RT_API_ATTRS Fortran::common::optional<char32_t> DecodeUTF8(const char *); + +// Ensure that at least maxUTF8Bytes remain in the output +// buffer before calling. +RT_API_ATTRS std::size_t EncodeUTF8(char *, char32_t); + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_UTF_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/work-queue.h b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/work-queue.h new file mode 100644 index 00000000000..7d7f8ad991a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/include/flang-rt/runtime/work-queue.h @@ -0,0 +1,578 @@ +//===-- include/flang-rt/runtime/work-queue.h -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Internal runtime utilities for work queues that replace the use of recursion +// for better GPU device support. +// +// A work queue comprises a list of tickets. Each ticket class has a Begin() +// member function, which is called once, and a Continue() member function +// that can be called zero or more times. A ticket's execution terminates +// when either of these member functions returns a status other than +// StatContinue. When that status is not StatOk, then the whole queue +// is shut down. +// +// By returning StatContinue from its Continue() member function, +// a ticket suspends its execution so that any nested tickets that it +// may have created can be run to completion. It is the reponsibility +// of each ticket class to maintain resumption information in its state +// and manage its own progress. Most ticket classes inherit from +// class ComponentsOverElements, which implements an outer loop over all +// components of a derived type, and an inner loop over all elements +// of a descriptor, possibly with multiple phases of execution per element. +// +// Tickets are created by WorkQueue::Begin...() member functions. +// There is one of these for each "top level" recursive function in the +// Fortran runtime support library that has been restructured into this +// ticket framework. +// +// When the work queue is running tickets, it always selects the last ticket +// on the list for execution -- "work stack" might have been a more accurate +// name for this framework. This ticket may, while doing its job, create +// new tickets, and since those are pushed after the active one, the first +// such nested ticket will be the next one executed to completion -- i.e., +// the order of nested WorkQueue::Begin...() calls is respected. +// Note that a ticket's Continue() member function won't be called again +// until all nested tickets have run to completion and it is once again +// the last ticket on the queue. +// +// Example for an assignment to a derived type: +// 1. Assign() is called, and its work queue is created. It calls +// WorkQueue::BeginAssign() and then WorkQueue::Run(). +// 2. Run calls AssignTicket::Begin(), which pushes a tickets via +// BeginFinalize() and returns StatContinue. +// 3. FinalizeTicket::Begin() and FinalizeTicket::Continue() are called +// until one of them returns StatOk, which ends the finalization ticket. +// 4. AssignTicket::Continue() is then called; it creates a DerivedAssignTicket +// and then returns StatOk, which ends the ticket. +// 5. At this point, only one ticket remains. DerivedAssignTicket::Begin() +// and ::Continue() are called until they are done (not StatContinue). +// Along the way, it may create nested AssignTickets for components, +// and suspend itself so that they may each run to completion. + +#ifndef FLANG_RT_RUNTIME_WORK_QUEUE_H_ +#define FLANG_RT_RUNTIME_WORK_QUEUE_H_ + +#include "flang-rt/runtime/connection.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Common/api-attrs.h" +#include "flang/Common/optional.h" +#include "flang/Runtime/freestanding-tools.h" +#include <flang/Common/variant.h> + +namespace Fortran::runtime::io { +class IoStatementState; +struct NonTbpDefinedIoTable; +} // namespace Fortran::runtime::io + +namespace Fortran::runtime { +class Terminator; +class WorkQueue; + +RT_OFFLOAD_API_GROUP_BEGIN + +// Ticket worker base classes + +template <typename TICKET> class ImmediateTicketRunner { +public: + RT_API_ATTRS explicit ImmediateTicketRunner(TICKET &ticket) + : ticket_{ticket} {} + RT_API_ATTRS int Run(WorkQueue &workQueue) { + int status{ticket_.Begin(workQueue)}; + while (status == StatContinue) { + status = ticket_.Continue(workQueue); + } + return status; + } + +private: + TICKET &ticket_; +}; + +// Base class for ticket workers that operate elementwise over descriptors +class Elementwise { +public: + RT_API_ATTRS Elementwise( + const Descriptor &instance, const Descriptor *from = nullptr) + : instance_{instance}, from_{from} { + instance_.GetLowerBounds(subscripts_); + if (from_) { + from_->GetLowerBounds(fromSubscripts_); + } + } + RT_API_ATTRS bool IsComplete() const { return elementAt_ >= elements_; } + RT_API_ATTRS void Advance() { + ++elementAt_; + instance_.IncrementSubscripts(subscripts_); + if (from_) { + from_->IncrementSubscripts(fromSubscripts_); + } + } + RT_API_ATTRS void SkipToEnd() { elementAt_ = elements_; } + RT_API_ATTRS void Reset() { + elementAt_ = 0; + instance_.GetLowerBounds(subscripts_); + if (from_) { + from_->GetLowerBounds(fromSubscripts_); + } + } + +protected: + const Descriptor &instance_, *from_{nullptr}; + std::size_t elements_{instance_.InlineElements()}; + std::size_t elementAt_{0}; + SubscriptValue subscripts_[common::maxRank]; + SubscriptValue fromSubscripts_[common::maxRank]; +}; + +// Base class for ticket workers that operate over derived type components. +class Componentwise { +public: + RT_API_ATTRS Componentwise(const typeInfo::DerivedType &derived) + : derived_{derived}, components_{derived_.component().InlineElements()} { + GetFirstComponent(); + } + + RT_API_ATTRS bool IsComplete() const { return componentAt_ >= components_; } + RT_API_ATTRS void Advance() { + ++componentAt_; + if (IsComplete()) { + component_ = nullptr; + } else { + ++component_; + } + } + RT_API_ATTRS void SkipToEnd() { + component_ = nullptr; + componentAt_ = components_; + } + RT_API_ATTRS void Reset() { + component_ = nullptr; + componentAt_ = 0; + GetFirstComponent(); + } + +protected: + const typeInfo::DerivedType &derived_; + std::size_t components_{0}, componentAt_{0}; + const typeInfo::Component *component_{nullptr}; + StaticDescriptor<common::maxRank, true, 0> componentDescriptor_; + +private: + RT_API_ATTRS void GetFirstComponent() { + if (components_ > 0) { + component_ = derived_.component().OffsetElement<typeInfo::Component>(); + } + } +}; + +// Base class for ticket workers that operate over derived type components +// in an outer loop, and elements in an inner loop. +class ComponentsOverElements : public Componentwise, public Elementwise { +public: + RT_API_ATTRS ComponentsOverElements(const Descriptor &instance, + const typeInfo::DerivedType &derived, const Descriptor *from = nullptr) + : Componentwise{derived}, Elementwise{instance, from} { + if (Elementwise::IsComplete()) { + Componentwise::SkipToEnd(); + } + } + RT_API_ATTRS bool IsComplete() const { return Componentwise::IsComplete(); } + RT_API_ATTRS void Advance() { + SkipToNextElement(); + if (Elementwise::IsComplete()) { + Elementwise::Reset(); + Componentwise::Advance(); + } + } + RT_API_ATTRS void SkipToNextElement() { + phase_ = 0; + Elementwise::Advance(); + } + RT_API_ATTRS void SkipToNextComponent() { + phase_ = 0; + Elementwise::Reset(); + Componentwise::Advance(); + } + RT_API_ATTRS void Reset() { + phase_ = 0; + Elementwise::Reset(); + Componentwise::Reset(); + } + +protected: + int phase_{0}; +}; + +// Base class for ticket workers that operate over elements in an outer loop, +// type components in an inner loop. +class ElementsOverComponents : public Elementwise, public Componentwise { +public: + RT_API_ATTRS ElementsOverComponents(const Descriptor &instance, + const typeInfo::DerivedType &derived, const Descriptor *from = nullptr) + : Elementwise{instance, from}, Componentwise{derived} { + if (Componentwise::IsComplete()) { + Elementwise::SkipToEnd(); + } + } + RT_API_ATTRS bool IsComplete() const { return Elementwise::IsComplete(); } + RT_API_ATTRS void Advance() { + SkipToNextComponent(); + if (Componentwise::IsComplete()) { + Componentwise::Reset(); + Elementwise::Advance(); + } + } + RT_API_ATTRS void SkipToNextComponent() { + phase_ = 0; + Componentwise::Advance(); + } + RT_API_ATTRS void SkipToNextElement() { + phase_ = 0; + Componentwise::Reset(); + Elementwise::Advance(); + } + +protected: + int phase_{0}; +}; + +// Ticket worker classes + +// Implements derived type instance initialization. +class InitializeTicket : public ImmediateTicketRunner<InitializeTicket>, + private ElementsOverComponents { +public: + RT_API_ATTRS InitializeTicket( + const Descriptor &instance, const typeInfo::DerivedType &derived) + : ImmediateTicketRunner<InitializeTicket>{*this}, + ElementsOverComponents{instance, derived} {} + RT_API_ATTRS int Begin(WorkQueue &); + RT_API_ATTRS int Continue(WorkQueue &); +}; + +// Initializes one derived type instance from the value of another +class InitializeCloneTicket + : public ImmediateTicketRunner<InitializeCloneTicket>, + private ComponentsOverElements { +public: + RT_API_ATTRS InitializeCloneTicket(const Descriptor &clone, + const Descriptor &original, const typeInfo::DerivedType &derived, + bool hasStat, const Descriptor *errMsg) + : ImmediateTicketRunner<InitializeCloneTicket>{*this}, + ComponentsOverElements{original, derived}, clone_{clone}, + hasStat_{hasStat}, errMsg_{errMsg} {} + RT_API_ATTRS int Begin(WorkQueue &) { return StatContinue; } + RT_API_ATTRS int Continue(WorkQueue &); + +private: + const Descriptor &clone_; + bool hasStat_{false}; + const Descriptor *errMsg_{nullptr}; + StaticDescriptor<common::maxRank, true, 0> cloneComponentDescriptor_; +}; + +// Implements derived type instance finalization +class FinalizeTicket : public ImmediateTicketRunner<FinalizeTicket>, + private ComponentsOverElements { +public: + RT_API_ATTRS FinalizeTicket( + const Descriptor &instance, const typeInfo::DerivedType &derived) + : ImmediateTicketRunner<FinalizeTicket>{*this}, + ComponentsOverElements{instance, derived} {} + RT_API_ATTRS int Begin(WorkQueue &); + RT_API_ATTRS int Continue(WorkQueue &); + +private: + const typeInfo::DerivedType *finalizableParentType_{nullptr}; +}; + +// Implements derived type instance destruction +class DestroyTicket : public ImmediateTicketRunner<DestroyTicket>, + private ComponentsOverElements { +public: + RT_API_ATTRS DestroyTicket(const Descriptor &instance, + const typeInfo::DerivedType &derived, bool finalize) + : ImmediateTicketRunner<DestroyTicket>{*this}, + ComponentsOverElements{instance, derived}, finalize_{finalize}, + fixedStride_{instance.FixedStride()} {} + RT_API_ATTRS int Begin(WorkQueue &); + RT_API_ATTRS int Continue(WorkQueue &); + +private: + bool finalize_{false}; + common::optional<SubscriptValue> fixedStride_; +}; + +// Implements general intrinsic assignment +class AssignTicket : public ImmediateTicketRunner<AssignTicket> { +public: + RT_API_ATTRS AssignTicket(Descriptor &to, const Descriptor &from, int flags, + MemmoveFct memmoveFct, const typeInfo::DerivedType *declaredType) + : ImmediateTicketRunner<AssignTicket>{*this}, to_{to}, from_{&from}, + flags_{flags}, memmoveFct_{memmoveFct}, declaredType_{declaredType} {} + RT_API_ATTRS int Begin(WorkQueue &); + RT_API_ATTRS int Continue(WorkQueue &); + +private: + RT_API_ATTRS Descriptor &GetTempDescriptor(); + RT_API_ATTRS bool IsSimpleMemmove() const { + return !toDerived_ && to_.rank() == from_->rank() && to_.IsContiguous() && + from_->IsContiguous() && to_.ElementBytes() == from_->ElementBytes(); + } + + Descriptor &to_; + const Descriptor *from_{nullptr}; + int flags_{0}; // enum AssignFlags + MemmoveFct memmoveFct_{nullptr}; + StaticDescriptor<common::maxRank, true, 0> tempDescriptor_; + const typeInfo::DerivedType *declaredType_{nullptr}; + const typeInfo::DerivedType *toDerived_{nullptr}; + Descriptor *toDeallocate_{nullptr}; + bool persist_{false}; + bool done_{false}; +}; + +// Implements derived type intrinsic assignment. +template <bool IS_COMPONENTWISE> +class DerivedAssignTicket + : public ImmediateTicketRunner<DerivedAssignTicket<IS_COMPONENTWISE>>, + private std::conditional_t<IS_COMPONENTWISE, ComponentsOverElements, + ElementsOverComponents> { +public: + using Base = std::conditional_t<IS_COMPONENTWISE, ComponentsOverElements, + ElementsOverComponents>; + RT_API_ATTRS DerivedAssignTicket(const Descriptor &to, const Descriptor &from, + const typeInfo::DerivedType &derived, int flags, MemmoveFct memmoveFct, + Descriptor *deallocateAfter) + : ImmediateTicketRunner<DerivedAssignTicket>{*this}, + Base{to, derived, &from}, flags_{flags}, memmoveFct_{memmoveFct}, + deallocateAfter_{deallocateAfter} {} + RT_API_ATTRS int Begin(WorkQueue &); + RT_API_ATTRS int Continue(WorkQueue &); + +private: + static constexpr bool isComponentwise_{IS_COMPONENTWISE}; + bool toIsContiguous_{this->instance_.IsContiguous()}; + bool fromIsContiguous_{this->from_->IsContiguous()}; + int flags_{0}; + MemmoveFct memmoveFct_{nullptr}; + Descriptor *deallocateAfter_{nullptr}; + StaticDescriptor<common::maxRank, true, 0> fromComponentDescriptor_; +}; + +namespace io::descr { + +template <io::Direction DIR> +class DescriptorIoTicket + : public ImmediateTicketRunner<DescriptorIoTicket<DIR>>, + private Elementwise { +public: + RT_API_ATTRS DescriptorIoTicket(io::IoStatementState &io, + const Descriptor &descriptor, const io::NonTbpDefinedIoTable *table, + bool &anyIoTookPlace) + : ImmediateTicketRunner<DescriptorIoTicket>(*this), + Elementwise{descriptor}, io_{io}, table_{table}, + anyIoTookPlace_{anyIoTookPlace} {} + + RT_API_ATTRS int Begin(WorkQueue &); + RT_API_ATTRS int Continue(WorkQueue &); + RT_API_ATTRS bool &anyIoTookPlace() { return anyIoTookPlace_; } + +private: + io::IoStatementState &io_; + const io::NonTbpDefinedIoTable *table_{nullptr}; + bool &anyIoTookPlace_; + common::optional<typeInfo::SpecialBinding> nonTbpSpecial_; + const typeInfo::DerivedType *derived_{nullptr}; + const typeInfo::SpecialBinding *special_{nullptr}; + StaticDescriptor<common::maxRank, true, 0> elementDescriptor_; +}; + +template <io::Direction DIR> +class DerivedIoTicket : public ImmediateTicketRunner<DerivedIoTicket<DIR>>, + private ElementsOverComponents { +public: + RT_API_ATTRS DerivedIoTicket(io::IoStatementState &io, + const Descriptor &descriptor, const typeInfo::DerivedType &derived, + const io::NonTbpDefinedIoTable *table, bool &anyIoTookPlace) + : ImmediateTicketRunner<DerivedIoTicket>(*this), + ElementsOverComponents{descriptor, derived}, io_{io}, table_{table}, + anyIoTookPlace_{anyIoTookPlace} {} + RT_API_ATTRS int Begin(WorkQueue &) { return StatContinue; } + RT_API_ATTRS int Continue(WorkQueue &); + +private: + io::IoStatementState &io_; + const io::NonTbpDefinedIoTable *table_{nullptr}; + bool &anyIoTookPlace_; +}; + +} // namespace io::descr + +struct NullTicket { + RT_API_ATTRS int Begin(WorkQueue &) const { return StatOk; } + RT_API_ATTRS int Continue(WorkQueue &) const { return StatOk; } +}; + +struct Ticket { + RT_API_ATTRS int Continue(WorkQueue &); + bool begun{false}; + std::variant<NullTicket, InitializeTicket, InitializeCloneTicket, + FinalizeTicket, DestroyTicket, AssignTicket, DerivedAssignTicket<false>, + DerivedAssignTicket<true>, + io::descr::DescriptorIoTicket<io::Direction::Output>, + io::descr::DescriptorIoTicket<io::Direction::Input>, + io::descr::DerivedIoTicket<io::Direction::Output>, + io::descr::DerivedIoTicket<io::Direction::Input>> + u; +}; + +class WorkQueue { +public: + RT_API_ATTRS explicit WorkQueue(Terminator &terminator) + : terminator_{terminator} { + for (int j{1}; j < numStatic_; ++j) { + static_[j].previous = &static_[j - 1]; + static_[j - 1].next = &static_[j]; + } + } + RT_API_ATTRS ~WorkQueue(); + RT_API_ATTRS Terminator &terminator() { return terminator_; }; + + // APIs for particular tasks. These can return StatOk if the work is + // completed immediately. + RT_API_ATTRS int BeginInitialize( + const Descriptor &descriptor, const typeInfo::DerivedType &derived) { + if (runTicketsImmediately_) { + return InitializeTicket{descriptor, derived}.Run(*this); + } else { + StartTicket().u.emplace<InitializeTicket>(descriptor, derived); + return StatContinue; + } + } + RT_API_ATTRS int BeginInitializeClone(const Descriptor &clone, + const Descriptor &original, const typeInfo::DerivedType &derived, + bool hasStat, const Descriptor *errMsg) { + if (runTicketsImmediately_) { + return InitializeCloneTicket{clone, original, derived, hasStat, errMsg} + .Run(*this); + } else { + StartTicket().u.emplace<InitializeCloneTicket>( + clone, original, derived, hasStat, errMsg); + return StatContinue; + } + } + RT_API_ATTRS int BeginFinalize( + const Descriptor &descriptor, const typeInfo::DerivedType &derived) { + if (runTicketsImmediately_) { + return FinalizeTicket{descriptor, derived}.Run(*this); + } else { + StartTicket().u.emplace<FinalizeTicket>(descriptor, derived); + return StatContinue; + } + } + RT_API_ATTRS int BeginDestroy(const Descriptor &descriptor, + const typeInfo::DerivedType &derived, bool finalize) { + if (runTicketsImmediately_) { + return DestroyTicket{descriptor, derived, finalize}.Run(*this); + } else { + StartTicket().u.emplace<DestroyTicket>(descriptor, derived, finalize); + return StatContinue; + } + } + RT_API_ATTRS int BeginAssign(Descriptor &to, const Descriptor &from, + int flags, MemmoveFct memmoveFct, + const typeInfo::DerivedType *declaredType) { + if (runTicketsImmediately_) { + return AssignTicket{to, from, flags, memmoveFct, declaredType}.Run(*this); + } else { + StartTicket().u.emplace<AssignTicket>( + to, from, flags, memmoveFct, declaredType); + return StatContinue; + } + } + template <bool IS_COMPONENTWISE> + RT_API_ATTRS int BeginDerivedAssign(Descriptor &to, const Descriptor &from, + const typeInfo::DerivedType &derived, int flags, MemmoveFct memmoveFct, + Descriptor *deallocateAfter) { + if (runTicketsImmediately_) { + return DerivedAssignTicket<IS_COMPONENTWISE>{ + to, from, derived, flags, memmoveFct, deallocateAfter} + .Run(*this); + } else { + StartTicket().u.emplace<DerivedAssignTicket<IS_COMPONENTWISE>>( + to, from, derived, flags, memmoveFct, deallocateAfter); + return StatContinue; + } + } + template <io::Direction DIR> + RT_API_ATTRS int BeginDescriptorIo(io::IoStatementState &io, + const Descriptor &descriptor, const io::NonTbpDefinedIoTable *table, + bool &anyIoTookPlace) { + if (runTicketsImmediately_) { + return io::descr::DescriptorIoTicket<DIR>{ + io, descriptor, table, anyIoTookPlace} + .Run(*this); + } else { + StartTicket().u.emplace<io::descr::DescriptorIoTicket<DIR>>( + io, descriptor, table, anyIoTookPlace); + return StatContinue; + } + } + template <io::Direction DIR> + RT_API_ATTRS int BeginDerivedIo(io::IoStatementState &io, + const Descriptor &descriptor, const typeInfo::DerivedType &derived, + const io::NonTbpDefinedIoTable *table, bool &anyIoTookPlace) { + if (runTicketsImmediately_) { + return io::descr::DerivedIoTicket<DIR>{ + io, descriptor, derived, table, anyIoTookPlace} + .Run(*this); + } else { + StartTicket().u.emplace<io::descr::DerivedIoTicket<DIR>>( + io, descriptor, derived, table, anyIoTookPlace); + return StatContinue; + } + } + + RT_API_ATTRS int Run(); + +private: +#if RT_DEVICE_COMPILATION + // Always use the work queue on a GPU device to avoid recursion. + static constexpr bool runTicketsImmediately_{false}; +#else + // Avoid the work queue overhead on the host, unless it needs + // debugging, which is so much easier there. + static constexpr bool runTicketsImmediately_{true}; +#endif + + // Most uses of the work queue won't go very deep. + static constexpr int numStatic_{2}; + + struct TicketList { + bool isStatic{true}; + Ticket ticket; + TicketList *previous{nullptr}, *next{nullptr}; + }; + + RT_API_ATTRS Ticket &StartTicket(); + RT_API_ATTRS void Stop(); + + Terminator &terminator_; + TicketList *first_{nullptr}, *last_{nullptr}, *insertAfter_{nullptr}; + TicketList static_[numStatic_]; + TicketList *firstFree_{static_}; + bool anyDynamicAllocation_{false}; +}; + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_WORK_QUEUE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ISO_Fortran_binding.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ISO_Fortran_binding.cpp new file mode 100644 index 00000000000..a5f8b357ae0 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ISO_Fortran_binding.cpp @@ -0,0 +1,302 @@ +//===-- lib/runtime/ISO_Fortran_binding.cpp ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements the required interoperability API from ISO_Fortran_binding.h +// as specified in section 18.5.5 of Fortran 2018. + +#include "ISO_Fortran_util.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/type-code.h" +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Runtime/pointer.h" +#include <cstdlib> + +namespace Fortran::ISO { +extern "C" { + +RT_EXT_API_GROUP_BEGIN + +RT_API_ATTRS void *CFI_address( + const CFI_cdesc_t *descriptor, const CFI_index_t subscripts[]) { + char *p{static_cast<char *>(descriptor->base_addr)}; + const CFI_rank_t rank{descriptor->rank}; + const CFI_dim_t *dim{descriptor->dim}; + for (CFI_rank_t j{0}; j < rank; ++j, ++dim) { + p += (subscripts[j] - dim->lower_bound) * dim->sm; + } + return p; +} + +RT_API_ATTRS int CFI_allocate(CFI_cdesc_t *descriptor, + const CFI_index_t lower_bounds[], const CFI_index_t upper_bounds[], + std::size_t elem_len) { + if (!descriptor) { + return CFI_INVALID_DESCRIPTOR; + } + if (descriptor->version != CFI_VERSION) { + return CFI_INVALID_DESCRIPTOR; + } + if (descriptor->attribute != CFI_attribute_allocatable && + descriptor->attribute != CFI_attribute_pointer) { + // Non-interoperable object + return CFI_INVALID_ATTRIBUTE; + } + if (descriptor->attribute == CFI_attribute_allocatable && + descriptor->base_addr) { + return CFI_ERROR_BASE_ADDR_NOT_NULL; + } + if (descriptor->rank > CFI_MAX_RANK) { + return CFI_INVALID_RANK; + } + if (descriptor->type < CFI_type_signed_char || + descriptor->type > CFI_TYPE_LAST) { + return CFI_INVALID_TYPE; + } + if (!IsCharacterType(descriptor->type)) { + elem_len = descriptor->elem_len; + if (elem_len <= 0) { + return CFI_INVALID_ELEM_LEN; + } + } + std::size_t rank{descriptor->rank}; + CFI_dim_t *dim{descriptor->dim}; + std::size_t byteSize{elem_len}; + for (std::size_t j{0}; j < rank; ++j, ++dim) { + CFI_index_t lb{lower_bounds[j]}; + CFI_index_t ub{upper_bounds[j]}; + CFI_index_t extent{ub >= lb ? ub - lb + 1 : 0}; + dim->lower_bound = extent == 0 ? 1 : lb; + dim->extent = extent; + dim->sm = byteSize; + byteSize *= extent; + } + void *p{runtime::AllocateValidatedPointerPayload(byteSize)}; + if (!p && byteSize) { + return CFI_ERROR_MEM_ALLOCATION; + } + descriptor->base_addr = p; + descriptor->elem_len = elem_len; + return CFI_SUCCESS; +} + +RT_API_ATTRS int CFI_deallocate(CFI_cdesc_t *descriptor) { + if (!descriptor) { + return CFI_INVALID_DESCRIPTOR; + } + if (descriptor->version != CFI_VERSION) { + return CFI_INVALID_DESCRIPTOR; + } + if (descriptor->attribute == CFI_attribute_pointer) { + if (!runtime::ValidatePointerPayload(*descriptor)) { + return CFI_INVALID_DESCRIPTOR; + } + } else if (descriptor->attribute != CFI_attribute_allocatable) { + // Non-interoperable object + return CFI_INVALID_DESCRIPTOR; + } + if (!descriptor->base_addr) { + return CFI_ERROR_BASE_ADDR_NULL; + } + std::free(descriptor->base_addr); + descriptor->base_addr = nullptr; + return CFI_SUCCESS; +} + +RT_API_ATTRS int CFI_establish(CFI_cdesc_t *descriptor, void *base_addr, + CFI_attribute_t attribute, CFI_type_t type, std::size_t elem_len, + CFI_rank_t rank, const CFI_index_t extents[]) { + int cfiStatus{VerifyEstablishParameters(descriptor, base_addr, attribute, + type, elem_len, rank, extents, /*external=*/true)}; + if (cfiStatus != CFI_SUCCESS) { + return cfiStatus; + } + if (type != CFI_type_struct && type != CFI_type_other && + !IsCharacterType(type)) { + elem_len = MinElemLen(type); + } + if (elem_len <= 0) { + return CFI_INVALID_ELEM_LEN; + } + EstablishDescriptor( + descriptor, base_addr, attribute, type, elem_len, rank, extents); + return CFI_SUCCESS; +} + +RT_API_ATTRS int CFI_is_contiguous(const CFI_cdesc_t *descriptor) { + // See Descriptor::IsContiguous for the rationale. + bool stridesAreContiguous{true}; + CFI_index_t bytes = descriptor->elem_len; + for (int j{0}; j < descriptor->rank; ++j) { + stridesAreContiguous &= + (bytes == descriptor->dim[j].sm) || (descriptor->dim[j].extent == 1); + bytes *= descriptor->dim[j].extent; + } + if (stridesAreContiguous || bytes == 0) { + return 1; + } + return 0; +} + +RT_API_ATTRS int CFI_section(CFI_cdesc_t *result, const CFI_cdesc_t *source, + const CFI_index_t lower_bounds[], const CFI_index_t upper_bounds[], + const CFI_index_t strides[]) { + CFI_index_t extent[CFI_MAX_RANK]; + CFI_index_t actualStride[CFI_MAX_RANK]; + CFI_rank_t resRank{0}; + + if (!result || !source) { + return CFI_INVALID_DESCRIPTOR; + } + if (source->rank == 0) { + return CFI_INVALID_RANK; + } + if (IsAssumedSize(source) && !upper_bounds) { + return CFI_INVALID_DESCRIPTOR; + } + if (runtime::TypeCode{result->type} != runtime::TypeCode{source->type}) { + return CFI_INVALID_TYPE; + } + if (source->elem_len != result->elem_len) { + return CFI_INVALID_ELEM_LEN; + } + if (result->attribute == CFI_attribute_allocatable) { + return CFI_INVALID_ATTRIBUTE; + } + if (!source->base_addr) { + return CFI_ERROR_BASE_ADDR_NULL; + } + + char *shiftedBaseAddr{static_cast<char *>(source->base_addr)}; + bool isZeroSized{false}; + for (int j{0}; j < source->rank; ++j) { + const CFI_dim_t &dim{source->dim[j]}; + const CFI_index_t srcLB{dim.lower_bound}; + const CFI_index_t srcUB{srcLB + dim.extent - 1}; + const CFI_index_t lb{lower_bounds ? lower_bounds[j] : srcLB}; + const CFI_index_t ub{upper_bounds ? upper_bounds[j] : srcUB}; + const CFI_index_t stride{strides ? strides[j] : 1}; + + if (stride == 0 && lb != ub) { + return CFI_ERROR_OUT_OF_BOUNDS; + } + if ((lb <= ub && stride >= 0) || (lb >= ub && stride < 0)) { + if ((lb < srcLB) || (lb > srcUB) || (ub < srcLB) || (ub > srcUB)) { + return CFI_ERROR_OUT_OF_BOUNDS; + } + shiftedBaseAddr += (lb - srcLB) * dim.sm; + extent[j] = stride != 0 ? 1 + (ub - lb) / stride : 1; + } else { + isZeroSized = true; + extent[j] = 0; + } + actualStride[j] = stride; + resRank += (stride != 0); + } + if (resRank != result->rank) { + return CFI_INVALID_DESCRIPTOR; + } + + // For zero-sized arrays, base_addr is processor-dependent (see 18.5.3). + // We keep it on the source base_addr + result->base_addr = isZeroSized ? source->base_addr : shiftedBaseAddr; + resRank = 0; + for (int j{0}; j < source->rank; ++j) { + if (actualStride[j] != 0) { + result->dim[resRank].extent = extent[j]; + result->dim[resRank].lower_bound = extent[j] == 0 ? 1 + : lower_bounds ? lower_bounds[j] + : source->dim[j].lower_bound; + result->dim[resRank].sm = actualStride[j] * source->dim[j].sm; + ++resRank; + } + } + return CFI_SUCCESS; +} + +RT_API_ATTRS int CFI_select_part(CFI_cdesc_t *result, const CFI_cdesc_t *source, + std::size_t displacement, std::size_t elem_len) { + if (!result || !source) { + return CFI_INVALID_DESCRIPTOR; + } + if (result->rank != source->rank) { + return CFI_INVALID_RANK; + } + if (result->attribute == CFI_attribute_allocatable) { + return CFI_INVALID_ATTRIBUTE; + } + if (!source->base_addr) { + return CFI_ERROR_BASE_ADDR_NULL; + } + if (IsAssumedSize(source)) { + return CFI_INVALID_DESCRIPTOR; + } + + if (!IsCharacterType(result->type)) { + elem_len = result->elem_len; + } + if (displacement + elem_len > source->elem_len) { + return CFI_INVALID_ELEM_LEN; + } + + result->base_addr = displacement + static_cast<char *>(source->base_addr); + result->elem_len = elem_len; + for (int j{0}; j < source->rank; ++j) { + result->dim[j].lower_bound = 0; + result->dim[j].extent = source->dim[j].extent; + result->dim[j].sm = source->dim[j].sm; + } + return CFI_SUCCESS; +} + +RT_API_ATTRS int CFI_setpointer(CFI_cdesc_t *result, const CFI_cdesc_t *source, + const CFI_index_t lower_bounds[]) { + if (!result) { + return CFI_INVALID_DESCRIPTOR; + } + if (result->attribute != CFI_attribute_pointer) { + return CFI_INVALID_ATTRIBUTE; + } + if (!source) { + result->base_addr = nullptr; + return CFI_SUCCESS; + } + if (source->rank != result->rank) { + return CFI_INVALID_RANK; + } + if (runtime::TypeCode{source->type} != runtime::TypeCode{result->type}) { + return CFI_INVALID_TYPE; + } + if (source->elem_len != result->elem_len) { + return CFI_INVALID_ELEM_LEN; + } + if (!source->base_addr && source->attribute != CFI_attribute_pointer) { + return CFI_ERROR_BASE_ADDR_NULL; + } + if (IsAssumedSize(source)) { + return CFI_INVALID_DESCRIPTOR; + } + + const bool copySrcLB{!lower_bounds}; + result->base_addr = source->base_addr; + if (source->base_addr) { + for (int j{0}; j < result->rank; ++j) { + CFI_index_t extent{source->dim[j].extent}; + result->dim[j].extent = extent; + result->dim[j].sm = source->dim[j].sm; + result->dim[j].lower_bound = extent == 0 ? 1 + : copySrcLB ? source->dim[j].lower_bound + : lower_bounds[j]; + } + } + return CFI_SUCCESS; +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::ISO diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ISO_Fortran_util.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ISO_Fortran_util.h new file mode 100644 index 00000000000..9bbc03eefc4 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ISO_Fortran_util.h @@ -0,0 +1,102 @@ +//===-- lib/runtime/ISO_Fortran_util.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_ISO_FORTRAN_UTIL_H_ +#define FLANG_RT_RUNTIME_ISO_FORTRAN_UTIL_H_ + +// Internal utils for establishing CFI_cdesc_t descriptors. + +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/type-code.h" +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include <cstdlib> + +namespace Fortran::ISO { +static inline constexpr RT_API_ATTRS bool IsCharacterType(CFI_type_t ty) { + return ty == CFI_type_char || ty == CFI_type_char16_t || + ty == CFI_type_char32_t; +} +static inline constexpr RT_API_ATTRS bool IsAssumedSize(const CFI_cdesc_t *dv) { + return dv->rank > 0 && dv->dim[dv->rank - 1].extent == -1; +} + +static inline RT_API_ATTRS std::size_t MinElemLen(CFI_type_t type) { + auto typeParams{Fortran::runtime::TypeCode{type}.GetCategoryAndKind()}; + if (!typeParams) { + Fortran::runtime::Terminator terminator{__FILE__, __LINE__}; + terminator.Crash( + "not yet implemented: CFI_type_t=%d", static_cast<int>(type)); + } + + return Fortran::runtime::Descriptor::BytesFor( + typeParams->first, typeParams->second); +} + +static inline RT_API_ATTRS int VerifyEstablishParameters( + CFI_cdesc_t *descriptor, void *base_addr, CFI_attribute_t attribute, + CFI_type_t type, std::size_t elem_len, CFI_rank_t rank, + const CFI_index_t extents[], bool external) { + if (attribute != CFI_attribute_other && attribute != CFI_attribute_pointer && + attribute != CFI_attribute_allocatable) { + return CFI_INVALID_ATTRIBUTE; + } + if (rank > CFI_MAX_RANK) { + return CFI_INVALID_RANK; + } + if (base_addr && attribute == CFI_attribute_allocatable) { + return CFI_ERROR_BASE_ADDR_NOT_NULL; + } + if (rank > 0 && base_addr && !extents) { + return CFI_INVALID_EXTENT; + } + if (type < CFI_type_signed_char || type > CFI_TYPE_LAST) { + return CFI_INVALID_TYPE; + } + if (!descriptor) { + return CFI_INVALID_DESCRIPTOR; + } + if (external) { + if (type == CFI_type_struct || type == CFI_type_other || + IsCharacterType(type)) { + if (elem_len <= 0) { + return CFI_INVALID_ELEM_LEN; + } + } + } else { + // We do not expect CFI_type_other for internal invocations. + if (type == CFI_type_other) { + return CFI_INVALID_TYPE; + } + } + return CFI_SUCCESS; +} + +static inline RT_API_ATTRS void EstablishDescriptor(CFI_cdesc_t *descriptor, + void *base_addr, CFI_attribute_t attribute, CFI_type_t type, + std::size_t elem_len, CFI_rank_t rank, const CFI_index_t extents[]) { + descriptor->base_addr = base_addr; + descriptor->elem_len = elem_len; + descriptor->version = CFI_VERSION; + descriptor->rank = rank; + descriptor->type = type; + descriptor->attribute = attribute; + descriptor->extra = 0; + std::size_t byteSize{elem_len}; + constexpr std::size_t lower_bound{0}; + if (base_addr) { + for (std::size_t j{0}; j < rank; ++j) { + descriptor->dim[j].lower_bound = lower_bound; + descriptor->dim[j].extent = extents[j]; + descriptor->dim[j].sm = byteSize; + byteSize *= extents[j]; + } + } +} +} // namespace Fortran::ISO +#endif // FLANG_RT_RUNTIME_ISO_FORTRAN_UTIL_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/allocatable.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/allocatable.cpp new file mode 100644 index 00000000000..f724f0a2088 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/allocatable.cpp @@ -0,0 +1,246 @@ +//===-- lib/runtime/allocatable.cpp -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/allocatable.h" +#include "flang-rt/runtime/assign-impl.h" +#include "flang-rt/runtime/derived.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Runtime/assign.h" + +namespace Fortran::runtime { +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(AllocatableInitIntrinsic)(Descriptor &descriptor, + TypeCategory category, int kind, int rank, int corank) { + INTERNAL_CHECK(corank == 0); + descriptor.Establish(TypeCode{category, kind}, + Descriptor::BytesFor(category, kind), nullptr, rank, nullptr, + CFI_attribute_allocatable); +} + +void RTDEF(AllocatableInitCharacter)(Descriptor &descriptor, + SubscriptValue length, int kind, int rank, int corank) { + INTERNAL_CHECK(corank == 0); + descriptor.Establish( + kind, length, nullptr, rank, nullptr, CFI_attribute_allocatable); +} + +void RTDEF(AllocatableInitDerived)(Descriptor &descriptor, + const typeInfo::DerivedType &derivedType, int rank, int corank) { + INTERNAL_CHECK(corank == 0); + descriptor.Establish( + derivedType, nullptr, rank, nullptr, CFI_attribute_allocatable); +} + +void RTDEF(AllocatableInitIntrinsicForAllocate)(Descriptor &descriptor, + TypeCategory category, int kind, int rank, int corank) { + if (!descriptor.IsAllocated()) { + RTNAME(AllocatableInitIntrinsic)(descriptor, category, kind, rank, corank); + } +} + +void RTDEF(AllocatableInitCharacterForAllocate)(Descriptor &descriptor, + SubscriptValue length, int kind, int rank, int corank) { + if (!descriptor.IsAllocated()) { + RTNAME(AllocatableInitCharacter)(descriptor, length, kind, rank, corank); + } +} + +void RTDEF(AllocatableInitDerivedForAllocate)(Descriptor &descriptor, + const typeInfo::DerivedType &derivedType, int rank, int corank) { + if (!descriptor.IsAllocated()) { + RTNAME(AllocatableInitDerived)(descriptor, derivedType, rank, corank); + } +} + +std::int32_t RTDEF(MoveAlloc)(Descriptor &to, Descriptor &from, + const typeInfo::DerivedType *derivedType, bool hasStat, + const Descriptor *errMsg, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + + // If to and from are the same allocatable they must not be allocated + // and nothing should be done. + if (from.raw().base_addr == to.raw().base_addr && from.IsAllocated()) { + return ReturnError( + terminator, StatMoveAllocSameAllocatable, errMsg, hasStat); + } + + if (to.IsAllocated()) { + int stat{ + to.Destroy(/*finalize=*/true, /*destroyPointers=*/false, &terminator)}; + if (stat != StatOk) { + return ReturnError(terminator, stat, errMsg, hasStat); + } + } + + // If from isn't allocated, the standard defines that nothing should be done. + if (from.IsAllocated()) { + to = from; + from.raw().base_addr = nullptr; + + // Carry over the dynamic type. + if (auto *toAddendum{to.Addendum()}) { + if (const auto *fromAddendum{from.Addendum()}) { + if (const auto *derived{fromAddendum->derivedType()}) { + toAddendum->set_derivedType(derived); + } + } + } + + // Reset from dynamic type if needed. + if (auto *fromAddendum{from.Addendum()}) { + if (derivedType) { + fromAddendum->set_derivedType(derivedType); + } + } + } + + return StatOk; +} + +void RTDEF(AllocatableSetBounds)(Descriptor &descriptor, int zeroBasedDim, + SubscriptValue lower, SubscriptValue upper) { + INTERNAL_CHECK(zeroBasedDim >= 0 && zeroBasedDim < descriptor.rank()); + if (descriptor.IsAllocatable() && !descriptor.IsAllocated()) { + descriptor.GetDimension(zeroBasedDim).SetBounds(lower, upper); + // The byte strides are computed when the object is allocated. + } +} + +void RTDEF(AllocatableSetDerivedLength)( + Descriptor &descriptor, int which, SubscriptValue x) { + if (descriptor.IsAllocatable() && !descriptor.IsAllocated()) { + DescriptorAddendum *addendum{descriptor.Addendum()}; + INTERNAL_CHECK(addendum != nullptr); + addendum->SetLenParameterValue(which, x); + } +} + +void RTDEF(AllocatableApplyMold)( + Descriptor &descriptor, const Descriptor &mold, int rank) { + if (descriptor.IsAllocatable() && !descriptor.IsAllocated()) { + descriptor.ApplyMold(mold, rank); + } +} + +int RTDEF(AllocatableAllocate)(Descriptor &descriptor, + std::int64_t *asyncObject, bool hasStat, const Descriptor *errMsg, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (!descriptor.IsAllocatable()) { + return ReturnError(terminator, StatInvalidDescriptor, errMsg, hasStat); + } else if (descriptor.IsAllocated()) { + return ReturnError(terminator, StatBaseNotNull, errMsg, hasStat); + } else { + int stat{ReturnError( + terminator, descriptor.Allocate(asyncObject), errMsg, hasStat)}; + if (stat == StatOk) { + if (const DescriptorAddendum * addendum{descriptor.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noInitializationNeeded()) { + stat = + Initialize(descriptor, *derived, terminator, hasStat, errMsg); + } + } + } + } + return stat; + } +} + +int RTDEF(AllocatableAllocateSource)(Descriptor &alloc, + const Descriptor &source, bool hasStat, const Descriptor *errMsg, + const char *sourceFile, int sourceLine) { + int stat{RTNAME(AllocatableAllocate)( + alloc, /*asyncObject=*/nullptr, hasStat, errMsg, sourceFile, sourceLine)}; + if (stat == StatOk) { + Terminator terminator{sourceFile, sourceLine}; + if (alloc.rank() != source.rank() && source.rank() != 0) { + terminator.Crash("ALLOCATE object has rank %d while SOURCE= has rank %d", + alloc.rank(), source.rank()); + } + if (int rank{source.rank()}; rank > 0) { + SubscriptValue allocExtent[maxRank], sourceExtent[maxRank]; + alloc.GetShape(allocExtent); + source.GetShape(sourceExtent); + for (int j{0}; j < rank; ++j) { + if (allocExtent[j] != sourceExtent[j]) { + if (!hasStat) { + terminator.Crash("ALLOCATE object has extent %jd on dimension %d, " + "but SOURCE= has extent %jd", + static_cast<std::intmax_t>(allocExtent[j]), j + 1, + static_cast<std::intmax_t>(sourceExtent[j])); + } + return StatInvalidExtent; + } + } + } + DoFromSourceAssign(alloc, source, terminator); + } + return stat; +} + +int RTDEF(AllocatableDeallocate)(Descriptor &descriptor, bool hasStat, + const Descriptor *errMsg, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (!descriptor.IsAllocatable()) { + return ReturnError(terminator, StatInvalidDescriptor, errMsg, hasStat); + } else if (!descriptor.IsAllocated()) { + return ReturnError(terminator, StatBaseNull, errMsg, hasStat); + } else { + return ReturnError(terminator, + descriptor.Destroy( + /*finalize=*/true, /*destroyPointers=*/false, &terminator), + errMsg, hasStat); + } +} + +int RTDEF(AllocatableDeallocatePolymorphic)(Descriptor &descriptor, + const typeInfo::DerivedType *derivedType, bool hasStat, + const Descriptor *errMsg, const char *sourceFile, int sourceLine) { + int stat{RTNAME(AllocatableDeallocate)( + descriptor, hasStat, errMsg, sourceFile, sourceLine)}; + if (stat == StatOk) { + if (DescriptorAddendum * addendum{descriptor.Addendum()}) { + addendum->set_derivedType(derivedType); + descriptor.raw().type = derivedType ? CFI_type_struct : CFI_type_other; + } else { + // Unlimited polymorphic descriptors initialized with + // AllocatableInitIntrinsic do not have an addendum. Make sure the + // derivedType is null in that case. + INTERNAL_CHECK(!derivedType); + descriptor.raw().type = CFI_type_other; + } + } + return stat; +} + +void RTDEF(AllocatableDeallocateNoFinal)( + Descriptor &descriptor, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (!descriptor.IsAllocatable()) { + ReturnError(terminator, StatInvalidDescriptor); + } else if (!descriptor.IsAllocated()) { + ReturnError(terminator, StatBaseNull); + } else { + ReturnError(terminator, + descriptor.Destroy( + /*finalize=*/false, /*destroyPointers=*/false, &terminator)); + } +} + +// TODO: AllocatableCheckLengthParameter + +RT_EXT_API_GROUP_END +} +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/allocator-registry.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/allocator-registry.cpp new file mode 100644 index 00000000000..f8a8daaf8e7 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/allocator-registry.cpp @@ -0,0 +1,42 @@ +//===-- lib/runtime/allocator-registry.cpp ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/allocator-registry.h" +#include "flang-rt/runtime/terminator.h" + +namespace Fortran::runtime { + +#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS +RT_OFFLOAD_VAR_GROUP_BEGIN +RT_VAR_ATTRS AllocatorRegistry allocatorRegistry; +RT_OFFLOAD_VAR_GROUP_END +#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS + +RT_OFFLOAD_API_GROUP_BEGIN +RT_API_ATTRS void AllocatorRegistry::Register(int pos, Allocator_t allocator) { + // pos 0 is reserved for the default allocator and is registered in the + // struct ctor. + INTERNAL_CHECK(pos > 0 && pos < MAX_ALLOCATOR); + allocators[pos] = allocator; +} + +RT_API_ATTRS AllocFct AllocatorRegistry::GetAllocator(int pos) { + INTERNAL_CHECK(pos >= 0 && pos < MAX_ALLOCATOR); + AllocFct f{allocators[pos].alloc}; + INTERNAL_CHECK(f != nullptr); + return f; +} + +RT_API_ATTRS FreeFct AllocatorRegistry::GetDeallocator(int pos) { + INTERNAL_CHECK(pos >= 0 && pos < MAX_ALLOCATOR); + FreeFct f{allocators[pos].free}; + INTERNAL_CHECK(f != nullptr); + return f; +} +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/array-constructor.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/array-constructor.cpp new file mode 100644 index 00000000000..858fac7bf2b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/array-constructor.cpp @@ -0,0 +1,182 @@ +//===-- lib/runtime/array-constructor.cpp -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/array-constructor.h" +#include "flang-rt/runtime/derived.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Runtime/allocatable.h" +#include "flang/Runtime/assign.h" + +namespace Fortran::runtime { + +// Initial allocation size for an array constructor temporary whose extent +// cannot be pre-computed. This could be fined tuned if needed based on actual +// program performance. +// REAL(4), INTEGER(4), COMPLEX(2), ... -> 32 elements. +// REAL(8), INTEGER(8), COMPLEX(4), ... -> 16 elements. +// REAL(16), INTEGER(16), COMPLEX(8), ... -> 8 elements. +// Bigger types -> 4 elements. +static RT_API_ATTRS SubscriptValue initialAllocationSize( + SubscriptValue initialNumberOfElements, SubscriptValue elementBytes) { + // Try to guess an optimal initial allocation size in number of elements to + // avoid doing too many reallocation. + static constexpr SubscriptValue minNumberOfBytes{128}; + static constexpr SubscriptValue minNumberOfElements{4}; + SubscriptValue numberOfElements{initialNumberOfElements > minNumberOfElements + ? initialNumberOfElements + : minNumberOfElements}; + SubscriptValue elementsForMinBytes{minNumberOfBytes / elementBytes}; + return std::max(numberOfElements, elementsForMinBytes); +} + +static RT_API_ATTRS void AllocateOrReallocateVectorIfNeeded( + ArrayConstructorVector &vector, Terminator &terminator, + SubscriptValue previousToElements, SubscriptValue fromElements) { + Descriptor &to{vector.to}; + if (to.IsAllocatable() && !to.IsAllocated()) { + // The descriptor bounds may already be set here if the array constructor + // extent could be pre-computed, but information about length parameters + // was missing and required evaluating the first array constructor value. + if (previousToElements == 0) { + SubscriptValue allocationSize{ + initialAllocationSize(fromElements, to.ElementBytes())}; + to.GetDimension(0).SetBounds(1, allocationSize); + RTNAME(AllocatableAllocate) + (to, /*asyncObject=*/nullptr, /*hasStat=*/false, /*errMsg=*/nullptr, + vector.sourceFile, vector.sourceLine); + to.GetDimension(0).SetBounds(1, fromElements); + vector.actualAllocationSize = allocationSize; + } else { + // Do not over-allocate if the final extent was known before pushing the + // first value: there should be no reallocation. + RUNTIME_CHECK(terminator, previousToElements >= fromElements); + RTNAME(AllocatableAllocate) + (to, /*asyncObject=*/nullptr, /*hasStat=*/false, /*errMsg=*/nullptr, + vector.sourceFile, vector.sourceLine); + vector.actualAllocationSize = previousToElements; + } + } else { + SubscriptValue newToElements{vector.nextValuePosition + fromElements}; + if (to.IsAllocatable() && vector.actualAllocationSize < newToElements) { + // Reallocate. Ensure the current storage is at least doubled to avoid + // doing too many reallocations. + SubscriptValue requestedAllocationSize{ + std::max(newToElements, vector.actualAllocationSize * 2)}; + std::size_t newByteSize{requestedAllocationSize * to.ElementBytes()}; + // realloc is undefined with zero new size and ElementBytes() may be null + // if the character length is null, or if "from" is a zero sized array. + if (newByteSize > 0) { + void *p{ReallocateMemoryOrCrash( + terminator, to.raw().base_addr, newByteSize)}; + to.set_base_addr(p); + } + vector.actualAllocationSize = requestedAllocationSize; + to.GetDimension(0).SetBounds(1, newToElements); + } else if (previousToElements < newToElements) { + // Storage is big enough, but descriptor extent must be increased because + // the final extent was not known before pushing array constructor values. + to.GetDimension(0).SetBounds(1, newToElements); + } + } +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(InitArrayConstructorVector)(ArrayConstructorVector &vector, + Descriptor &to, bool useValueLengthParameters, const char *sourceFile, + int sourceLine) { + Terminator terminator{vector.sourceFile, vector.sourceLine}; + RUNTIME_CHECK(terminator, to.rank() == 1); + SubscriptValue actualAllocationSize{ + to.IsAllocated() ? static_cast<SubscriptValue>(to.Elements()) : 0}; + (void)new (&vector) ArrayConstructorVector{to, /*nextValuePosition=*/0, + actualAllocationSize, sourceFile, sourceLine, useValueLengthParameters}; +} + +void RTDEF(PushArrayConstructorValue)( + ArrayConstructorVector &vector, const Descriptor &from) { + Terminator terminator{vector.sourceFile, vector.sourceLine}; + Descriptor &to{vector.to}; + SubscriptValue fromElements{static_cast<SubscriptValue>(from.Elements())}; + SubscriptValue previousToElements{static_cast<SubscriptValue>(to.Elements())}; + if (vector.useValueLengthParameters()) { + // Array constructor with no type spec. + if (to.IsAllocatable() && !to.IsAllocated()) { + // Takes length parameters, if any, from the first value. + // Note that "to" type must already be set by the caller of this API since + // it cannot be taken from "from" here: "from" may be polymorphic (have a + // dynamic type that differs from its declared type) and Fortran 2018 7.8 + // point 4. says that the dynamic type of an array constructor is its + // declared type: it does not inherit the dynamic type of its ac-value + // even if if there is no type-spec. + if (to.type().IsCharacter()) { + to.raw().elem_len = from.ElementBytes(); + } else if (auto *toAddendum{to.Addendum()}) { + if (const auto *fromAddendum{from.Addendum()}) { + if (const auto *toDerived{toAddendum->derivedType()}) { + std::size_t lenParms{toDerived->LenParameters()}; + for (std::size_t j{0}; j < lenParms; ++j) { + toAddendum->SetLenParameterValue( + j, fromAddendum->LenParameterValue(j)); + } + } + } + } + } else if (to.type().IsCharacter()) { + // Fortran 2018 7.8 point 2. + if (to.ElementBytes() != from.ElementBytes()) { + terminator.Crash("Array constructor: mismatched character lengths (%d " + "!= %d) between " + "values of an array constructor without type-spec", + to.ElementBytes() / to.type().GetCategoryAndKind()->second, + from.ElementBytes() / from.type().GetCategoryAndKind()->second); + } + } + } + // Otherwise, the array constructor had a type-spec and the length + // parameters are already in the "to" descriptor. + + AllocateOrReallocateVectorIfNeeded( + vector, terminator, previousToElements, fromElements); + + // Create descriptor for "to" element or section being copied to. + SubscriptValue lower[1]{ + to.GetDimension(0).LowerBound() + vector.nextValuePosition}; + SubscriptValue upper[1]{lower[0] + fromElements - 1}; + SubscriptValue stride[1]{from.rank() == 0 ? 0 : 1}; + StaticDescriptor<maxRank, true, 1> staticDesc; + Descriptor &toCurrentElement{staticDesc.descriptor()}; + toCurrentElement.EstablishPointerSection(to, lower, upper, stride); + // Note: toCurrentElement and from have the same number of elements + // and "toCurrentElement" is not an allocatable so AssignTemporary + // below works even if "from" rank is bigger than one (and differs + // from "toCurrentElement") and not time is wasted reshaping + // "toCurrentElement" to "from" shape. + RTNAME(AssignTemporary) + (toCurrentElement, from, vector.sourceFile, vector.sourceLine); + vector.nextValuePosition += fromElements; +} + +void RTDEF(PushArrayConstructorSimpleScalar)( + ArrayConstructorVector &vector, void *from) { + Terminator terminator{vector.sourceFile, vector.sourceLine}; + Descriptor &to{vector.to}; + AllocateOrReallocateVectorIfNeeded(vector, terminator, to.Elements(), 1); + SubscriptValue subscript[1]{ + to.GetDimension(0).LowerBound() + vector.nextValuePosition}; + std::memcpy(to.Element<char>(subscript), from, to.ElementBytes()); + ++vector.nextValuePosition; +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/assign.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/assign.cpp new file mode 100644 index 00000000000..d642ed578b0 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/assign.cpp @@ -0,0 +1,833 @@ +//===-- lib/runtime/assign.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/assign.h" +#include "flang-rt/runtime/assign-impl.h" +#include "flang-rt/runtime/derived.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/type-info.h" +#include "flang-rt/runtime/work-queue.h" + +namespace Fortran::runtime { + +// Predicate: is the left-hand side of an assignment an allocated allocatable +// that must be deallocated? +static inline RT_API_ATTRS bool MustDeallocateLHS( + Descriptor &to, const Descriptor &from, Terminator &terminator, int flags) { + // Top-level assignments to allocatable variables (*not* components) + // may first deallocate existing content if there's about to be a + // change in type or shape; see F'2018 10.2.1.3(3). + if (!(flags & MaybeReallocate)) { + return false; + } + if (!to.IsAllocatable() || !to.IsAllocated()) { + return false; + } + if (to.type() != from.type()) { + return true; + } + if (!(flags & ExplicitLengthCharacterLHS) && to.type().IsCharacter() && + to.ElementBytes() != from.ElementBytes()) { + return true; + } + if (flags & PolymorphicLHS) { + DescriptorAddendum *toAddendum{to.Addendum()}; + const typeInfo::DerivedType *toDerived{ + toAddendum ? toAddendum->derivedType() : nullptr}; + const DescriptorAddendum *fromAddendum{from.Addendum()}; + const typeInfo::DerivedType *fromDerived{ + fromAddendum ? fromAddendum->derivedType() : nullptr}; + if (toDerived != fromDerived) { + return true; + } + if (fromDerived) { + // Distinct LEN parameters? Deallocate + std::size_t lenParms{fromDerived->LenParameters()}; + for (std::size_t j{0}; j < lenParms; ++j) { + if (toAddendum->LenParameterValue(j) != + fromAddendum->LenParameterValue(j)) { + return true; + } + } + } + } + if (from.rank() > 0) { + // Distinct shape? Deallocate + int rank{to.rank()}; + for (int j{0}; j < rank; ++j) { + const auto &toDim{to.GetDimension(j)}; + const auto &fromDim{from.GetDimension(j)}; + if (toDim.Extent() != fromDim.Extent()) { + return true; + } + if ((flags & UpdateLHSBounds) && + toDim.LowerBound() != fromDim.LowerBound()) { + return true; + } + } + } + // Not reallocating; may have to update bounds + if (flags & UpdateLHSBounds) { + int rank{to.rank()}; + for (int j{0}; j < rank; ++j) { + to.GetDimension(j).SetLowerBound(from.GetDimension(j).LowerBound()); + } + } + return false; +} + +// Utility: allocate the allocatable left-hand side, either because it was +// originally deallocated or because it required reallocation +static RT_API_ATTRS int AllocateAssignmentLHS( + Descriptor &to, const Descriptor &from, Terminator &terminator, int flags) { + to.raw().type = from.raw().type; + if (!(flags & ExplicitLengthCharacterLHS)) { + to.raw().elem_len = from.ElementBytes(); + } + const typeInfo::DerivedType *derived{nullptr}; + DescriptorAddendum *toAddendum{to.Addendum()}; + if (const DescriptorAddendum * fromAddendum{from.Addendum()}) { + derived = fromAddendum->derivedType(); + if (toAddendum) { + toAddendum->set_derivedType(derived); + std::size_t lenParms{derived ? derived->LenParameters() : 0}; + for (std::size_t j{0}; j < lenParms; ++j) { + toAddendum->SetLenParameterValue(j, fromAddendum->LenParameterValue(j)); + } + } + } else if (toAddendum) { + toAddendum->set_derivedType(nullptr); + } + // subtle: leave bounds in place when "from" is scalar (10.2.1.3(3)) + int rank{from.rank()}; + auto stride{static_cast<SubscriptValue>(to.ElementBytes())}; + for (int j{0}; j < rank; ++j) { + auto &toDim{to.GetDimension(j)}; + const auto &fromDim{from.GetDimension(j)}; + toDim.SetBounds(fromDim.LowerBound(), fromDim.UpperBound()); + toDim.SetByteStride(stride); + stride *= toDim.Extent(); + } + return ReturnError(terminator, to.Allocate(kNoAsyncObject)); +} + +// least <= 0, most >= 0 +static RT_API_ATTRS void MaximalByteOffsetRange( + const Descriptor &desc, std::int64_t &least, std::int64_t &most) { + least = most = 0; + if (desc.ElementBytes() == 0) { + return; + } + int n{desc.raw().rank}; + for (int j{0}; j < n; ++j) { + const auto &dim{desc.GetDimension(j)}; + auto extent{dim.Extent()}; + if (extent > 0) { + auto sm{dim.ByteStride()}; + if (sm < 0) { + least += (extent - 1) * sm; + } else { + most += (extent - 1) * sm; + } + } + } + most += desc.ElementBytes() - 1; +} + +static inline RT_API_ATTRS bool RangesOverlap(const char *aStart, + const char *aEnd, const char *bStart, const char *bEnd) { + return aEnd >= bStart && bEnd >= aStart; +} + +// Predicate: could the left-hand and right-hand sides of the assignment +// possibly overlap in memory? Note that the descriptors themeselves +// are included in the test. +static RT_API_ATTRS bool MayAlias(const Descriptor &x, const Descriptor &y) { + const char *xBase{x.OffsetElement()}; + const char *yBase{y.OffsetElement()}; + if (!xBase || !yBase) { + return false; // not both allocated + } + const char *xDesc{reinterpret_cast<const char *>(&x)}; + const char *xDescLast{xDesc + x.SizeInBytes() - 1}; + const char *yDesc{reinterpret_cast<const char *>(&y)}; + const char *yDescLast{yDesc + y.SizeInBytes() - 1}; + std::int64_t xLeast, xMost, yLeast, yMost; + MaximalByteOffsetRange(x, xLeast, xMost); + MaximalByteOffsetRange(y, yLeast, yMost); + if (RangesOverlap(xDesc, xDescLast, yBase + yLeast, yBase + yMost) || + RangesOverlap(yDesc, yDescLast, xBase + xLeast, xBase + xMost)) { + // A descriptor overlaps with the storage described by the other; + // this can arise when an allocatable or pointer component is + // being assigned to/from. + return true; + } + if (!RangesOverlap( + xBase + xLeast, xBase + xMost, yBase + yLeast, yBase + yMost)) { + return false; // no storage overlap + } + // TODO: check dimensions: if any is independent, return false + return true; +} + +static RT_API_ATTRS void DoScalarDefinedAssignment(const Descriptor &to, + const Descriptor &from, const typeInfo::DerivedType &derived, + const typeInfo::SpecialBinding &special) { + bool toIsDesc{special.IsArgDescriptor(0)}; + bool fromIsDesc{special.IsArgDescriptor(1)}; + const auto *bindings{ + derived.binding().OffsetElement<const typeInfo::Binding>()}; + if (toIsDesc) { + if (fromIsDesc) { + auto *p{special.GetProc<void (*)(const Descriptor &, const Descriptor &)>( + bindings)}; + p(to, from); + } else { + auto *p{special.GetProc<void (*)(const Descriptor &, void *)>(bindings)}; + p(to, from.raw().base_addr); + } + } else { + if (fromIsDesc) { + auto *p{special.GetProc<void (*)(void *, const Descriptor &)>(bindings)}; + p(to.raw().base_addr, from); + } else { + auto *p{special.GetProc<void (*)(void *, void *)>(bindings)}; + p(to.raw().base_addr, from.raw().base_addr); + } + } +} + +static RT_API_ATTRS void DoElementalDefinedAssignment(const Descriptor &to, + const Descriptor &from, const typeInfo::DerivedType &derived, + const typeInfo::SpecialBinding &special) { + SubscriptValue toAt[maxRank], fromAt[maxRank]; + to.GetLowerBounds(toAt); + from.GetLowerBounds(fromAt); + StaticDescriptor<maxRank, true, 8 /*?*/> statDesc[2]; + Descriptor &toElementDesc{statDesc[0].descriptor()}; + Descriptor &fromElementDesc{statDesc[1].descriptor()}; + toElementDesc.Establish(derived, nullptr, 0, nullptr, CFI_attribute_pointer); + fromElementDesc.Establish( + derived, nullptr, 0, nullptr, CFI_attribute_pointer); + for (std::size_t toElements{to.InlineElements()}; toElements-- > 0; + to.IncrementSubscripts(toAt), from.IncrementSubscripts(fromAt)) { + toElementDesc.set_base_addr(to.Element<char>(toAt)); + fromElementDesc.set_base_addr(from.Element<char>(fromAt)); + DoScalarDefinedAssignment(toElementDesc, fromElementDesc, derived, special); + } +} + +template <typename CHAR> +static RT_API_ATTRS void BlankPadCharacterAssignment(Descriptor &to, + const Descriptor &from, SubscriptValue toAt[], SubscriptValue fromAt[], + std::size_t elements, std::size_t toElementBytes, + std::size_t fromElementBytes) { + std::size_t padding{(toElementBytes - fromElementBytes) / sizeof(CHAR)}; + std::size_t copiedCharacters{fromElementBytes / sizeof(CHAR)}; + for (; elements-- > 0; + to.IncrementSubscripts(toAt), from.IncrementSubscripts(fromAt)) { + CHAR *p{to.Element<CHAR>(toAt)}; + Fortran::runtime::memmove( + p, from.Element<std::add_const_t<CHAR>>(fromAt), fromElementBytes); + p += copiedCharacters; + for (auto n{padding}; n-- > 0;) { + *p++ = CHAR{' '}; + } + } +} + +RT_OFFLOAD_API_GROUP_BEGIN + +// Common implementation of assignments, both intrinsic assignments and +// those cases of polymorphic user-defined ASSIGNMENT(=) TBPs that could not +// be resolved in semantics. Most assignment statements do not need any +// of the capabilities of this function -- but when the LHS is allocatable, +// the type might have a user-defined ASSIGNMENT(=), or the type might be +// finalizable, this function should be used. +// When "to" is not a whole allocatable, "from" is an array, and defined +// assignments are not used, "to" and "from" only need to have the same number +// of elements, but their shape need not to conform (the assignment is done in +// element sequence order). This facilitates some internal usages, like when +// dealing with array constructors. +RT_API_ATTRS void Assign(Descriptor &to, const Descriptor &from, + Terminator &terminator, int flags, MemmoveFct memmoveFct) { + WorkQueue workQueue{terminator}; + if (workQueue.BeginAssign(to, from, flags, memmoveFct, nullptr) == + StatContinue) { + workQueue.Run(); + } +} + +RT_API_ATTRS int AssignTicket::Begin(WorkQueue &workQueue) { + bool mustDeallocateLHS{(flags_ & DeallocateLHS) || + MustDeallocateLHS(to_, *from_, workQueue.terminator(), flags_)}; + DescriptorAddendum *toAddendum{to_.Addendum()}; + toDerived_ = toAddendum ? toAddendum->derivedType() : nullptr; + if (toDerived_ && (flags_ & NeedFinalization) && + toDerived_->noFinalizationNeeded()) { + flags_ &= ~NeedFinalization; + } + if (MayAlias(to_, *from_)) { + if (mustDeallocateLHS) { + // Convert the LHS into a temporary, then make it look deallocated. + toDeallocate_ = &tempDescriptor_.descriptor(); + persist_ = true; // tempDescriptor_ state must outlive child tickets + std::memcpy( + reinterpret_cast<void *>(toDeallocate_), &to_, to_.SizeInBytes()); + to_.set_base_addr(nullptr); + if (toDerived_ && (flags_ & NeedFinalization)) { + if (int status{workQueue.BeginFinalize(*toDeallocate_, *toDerived_)}; + status != StatOk && status != StatContinue) { + return status; + } + flags_ &= ~NeedFinalization; + } + } else if (!IsSimpleMemmove()) { + // Handle LHS/RHS aliasing by copying RHS into a temp, then + // recursively assigning from that temp. + auto descBytes{from_->SizeInBytes()}; + Descriptor &newFrom{tempDescriptor_.descriptor()}; + persist_ = true; // tempDescriptor_ state must outlive child tickets + std::memcpy(reinterpret_cast<void *>(&newFrom), from_, descBytes); + // Pretend the temporary descriptor is for an ALLOCATABLE + // entity, otherwise, the Deallocate() below will not + // free the descriptor memory. + newFrom.raw().attribute = CFI_attribute_allocatable; + if (int stat{ReturnError( + workQueue.terminator(), newFrom.Allocate(kNoAsyncObject))}; + stat != StatOk) { + return stat; + } + if (HasDynamicComponent(*from_)) { + // If 'from' has allocatable/automatic component, we cannot + // just make a shallow copy of the descriptor member. + // This will still leave data overlap in 'to' and 'newFrom'. + // For example: + // type t + // character, allocatable :: c(:) + // end type t + // type(t) :: x(3) + // x(2:3) = x(1:2) + // We have to make a deep copy into 'newFrom' in this case. + if (const DescriptorAddendum *addendum{newFrom.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noInitializationNeeded()) { + if (int status{workQueue.BeginInitialize(newFrom, *derived)}; + status != StatOk && status != StatContinue) { + return status; + } + } + } + } + static constexpr int nestedFlags{MaybeReallocate | PolymorphicLHS}; + if (int status{workQueue.BeginAssign( + newFrom, *from_, nestedFlags, memmoveFct_, nullptr)}; + status != StatOk && status != StatContinue) { + return status; + } + } else { + ShallowCopy(newFrom, *from_, true, from_->IsContiguous()); + } + from_ = &newFrom; // this is why from_ has to be a pointer + flags_ &= NeedFinalization | ComponentCanBeDefinedAssignment | + ExplicitLengthCharacterLHS | CanBeDefinedAssignment; + toDeallocate_ = &newFrom; + } + } + if (to_.IsAllocatable()) { + if (mustDeallocateLHS) { + if (!toDeallocate_ && to_.IsAllocated()) { + toDeallocate_ = &to_; + } + } else if (to_.rank() != from_->rank() && !to_.IsAllocated()) { + workQueue.terminator().Crash("Assign: mismatched ranks (%d != %d) in " + "assignment to unallocated allocatable", + to_.rank(), from_->rank()); + } + } else if (!to_.IsAllocated()) { + workQueue.terminator().Crash( + "Assign: left-hand side variable is neither allocated nor allocatable"); + } + if (toDerived_ && to_.IsAllocated()) { + // Schedule finalization or destruction of the LHS. + if (flags_ & NeedFinalization) { + if (int status{workQueue.BeginFinalize(to_, *toDerived_)}; + status != StatOk && status != StatContinue) { + return status; + } + } else if (!toDerived_->noDestructionNeeded()) { + if (int status{ + workQueue.BeginDestroy(to_, *toDerived_, /*finalize=*/false)}; + status != StatOk && status != StatContinue) { + return status; + } + } + } + return StatContinue; +} + +RT_API_ATTRS int AssignTicket::Continue(WorkQueue &workQueue) { + if (done_) { + // All child tickets are complete; can release this ticket's state. + if (toDeallocate_) { + toDeallocate_->Deallocate(); + } + return StatOk; + } + // All necessary finalization or destruction that was initiated by Begin() + // has been completed. Deallocation may be pending, and if it's for the LHS, + // do it now so that the LHS gets reallocated. + if (toDeallocate_ == &to_) { + toDeallocate_ = nullptr; + to_.Deallocate(); + } + // Allocate the LHS if needed + if (!to_.IsAllocated()) { + if (int stat{ + AllocateAssignmentLHS(to_, *from_, workQueue.terminator(), flags_)}; + stat != StatOk) { + return stat; + } + const auto *addendum{to_.Addendum()}; + toDerived_ = addendum ? addendum->derivedType() : nullptr; + if (toDerived_) { + if (!toDerived_->noInitializationNeeded()) { + if (int status{workQueue.BeginInitialize(to_, *toDerived_)}; + status != StatOk) { + return status; + } + } + } + } + // Check for a user-defined assignment type-bound procedure; + // see 10.2.1.4-5. + // Note that the aliasing and LHS (re)allocation handling above + // needs to run even with CanBeDefinedAssignment flag, since + // Assign() can be invoked recursively for component-wise assignments. + // The declared type (if known) must be used for generic resolution + // of ASSIGNMENT(=) to a binding, but that binding can be overridden. + if (declaredType_ && (flags_ & CanBeDefinedAssignment)) { + if (to_.rank() == 0) { + if (const auto *special{declaredType_->FindSpecialBinding( + typeInfo::SpecialBinding::Which::ScalarAssignment)}) { + DoScalarDefinedAssignment(to_, *from_, *toDerived_, *special); + done_ = true; + return StatContinue; + } + } + if (const auto *special{declaredType_->FindSpecialBinding( + typeInfo::SpecialBinding::Which::ElementalAssignment)}) { + DoElementalDefinedAssignment(to_, *from_, *toDerived_, *special); + done_ = true; + return StatContinue; + } + } + // Intrinsic assignment + std::size_t toElements{to_.InlineElements()}; + if (from_->rank() > 0) { + std::size_t fromElements{from_->InlineElements()}; + if (toElements != fromElements) { + workQueue.terminator().Crash("Assign: mismatching element counts in " + "array assignment (to %zd, from %zd)", + toElements, fromElements); + } + } + if (to_.type() != from_->type()) { + workQueue.terminator().Crash( + "Assign: mismatching types (to code %d != from code %d)", + to_.type().raw(), from_->type().raw()); + } + std::size_t toElementBytes{to_.ElementBytes()}; + std::size_t fromElementBytes{from_->ElementBytes()}; + if (toElementBytes > fromElementBytes && !to_.type().IsCharacter()) { + workQueue.terminator().Crash("Assign: mismatching non-character element " + "sizes (to %zd bytes != from %zd bytes)", + toElementBytes, fromElementBytes); + } + if (toDerived_) { + if (toDerived_->noDefinedAssignment()) { // componentwise + if (int status{workQueue.BeginDerivedAssign<true>( + to_, *from_, *toDerived_, flags_, memmoveFct_, toDeallocate_)}; + status != StatOk && status != StatContinue) { + return status; + } + } else { // elementwise + if (int status{workQueue.BeginDerivedAssign<false>( + to_, *from_, *toDerived_, flags_, memmoveFct_, toDeallocate_)}; + status != StatOk && status != StatContinue) { + return status; + } + } + toDeallocate_ = nullptr; + } else if (IsSimpleMemmove()) { + memmoveFct_(to_.raw().base_addr, from_->raw().base_addr, + toElements * toElementBytes); + } else { + // Scalar expansion of the RHS is implied by using the same empty + // subscript values on each (seemingly) elemental reference into + // "from". + SubscriptValue toAt[maxRank]; + to_.GetLowerBounds(toAt); + SubscriptValue fromAt[maxRank]; + from_->GetLowerBounds(fromAt); + if (toElementBytes > fromElementBytes) { // blank padding + switch (to_.type().raw()) { + case CFI_type_signed_char: + case CFI_type_char: + BlankPadCharacterAssignment<char>(to_, *from_, toAt, fromAt, toElements, + toElementBytes, fromElementBytes); + break; + case CFI_type_char16_t: + BlankPadCharacterAssignment<char16_t>(to_, *from_, toAt, fromAt, + toElements, toElementBytes, fromElementBytes); + break; + case CFI_type_char32_t: + BlankPadCharacterAssignment<char32_t>(to_, *from_, toAt, fromAt, + toElements, toElementBytes, fromElementBytes); + break; + default: + workQueue.terminator().Crash( + "unexpected type code %d in blank padded Assign()", + to_.type().raw()); + } + } else { // elemental copies, possibly with character truncation + for (std::size_t n{toElements}; n-- > 0; + to_.IncrementSubscripts(toAt), from_->IncrementSubscripts(fromAt)) { + memmoveFct_(to_.Element<char>(toAt), from_->Element<const char>(fromAt), + toElementBytes); + } + } + } + if (persist_) { + done_ = true; + return StatContinue; + } else { + if (toDeallocate_) { + toDeallocate_->Deallocate(); + toDeallocate_ = nullptr; + } + return StatOk; + } +} + +template <bool IS_COMPONENTWISE> +RT_API_ATTRS int DerivedAssignTicket<IS_COMPONENTWISE>::Begin( + WorkQueue &workQueue) { + if (toIsContiguous_ && fromIsContiguous_ && + this->derived_.noDestructionNeeded() && + this->derived_.noDefinedAssignment() && + this->instance_.rank() == this->from_->rank()) { + if (std::size_t elementBytes{this->instance_.ElementBytes()}; + elementBytes == this->from_->ElementBytes()) { + // Fastest path. Both LHS and RHS are contiguous, RHS is not a scalar + // to be expanded, the types have the same size, and there are no + // allocatable components or defined ASSIGNMENT(=) at any level. + memmoveFct_(this->instance_.template OffsetElement<char>(), + this->from_->template OffsetElement<const char *>(), + this->instance_.InlineElements() * elementBytes); + return StatOk; + } + } + // Use PolymorphicLHS for components so that the right things happen + // when the components are polymorphic; when they're not, they're both + // not, and their declared types will match. + int nestedFlags{MaybeReallocate | PolymorphicLHS}; + if (flags_ & ComponentCanBeDefinedAssignment) { + nestedFlags |= CanBeDefinedAssignment | ComponentCanBeDefinedAssignment; + } + flags_ = nestedFlags; + // Copy procedure pointer components + const Descriptor &procPtrDesc{this->derived_.procPtr()}; + bool noDataComponents{this->IsComplete()}; + if (std::size_t numProcPtrs{procPtrDesc.InlineElements()}) { + for (std::size_t k{0}; k < numProcPtrs; ++k) { + const auto &procPtr{ + *procPtrDesc.ZeroBasedIndexedElement<typeInfo::ProcPtrComponent>(k)}; + // Loop only over elements + if (k > 0) { + Elementwise::Reset(); + } + for (; !Elementwise::IsComplete(); Elementwise::Advance()) { + memmoveFct_(this->instance_.template ElementComponent<char>( + this->subscripts_, procPtr.offset), + this->from_->template ElementComponent<const char>( + this->fromSubscripts_, procPtr.offset), + sizeof(typeInfo::ProcedurePointer)); + } + } + if (noDataComponents) { + return StatOk; + } + Elementwise::Reset(); + } + if (noDataComponents) { + return StatOk; + } + return StatContinue; +} +template RT_API_ATTRS int DerivedAssignTicket<false>::Begin(WorkQueue &); +template RT_API_ATTRS int DerivedAssignTicket<true>::Begin(WorkQueue &); + +template <bool IS_COMPONENTWISE> +RT_API_ATTRS int DerivedAssignTicket<IS_COMPONENTWISE>::Continue( + WorkQueue &workQueue) { + while (!this->IsComplete()) { + // Copy the data components (incl. the parent) first. + switch (this->component_->genre()) { + case typeInfo::Component::Genre::Data: + if (this->component_->category() == TypeCategory::Derived) { + Descriptor &toCompDesc{this->componentDescriptor_.descriptor()}; + Descriptor &fromCompDesc{this->fromComponentDescriptor_.descriptor()}; + this->component_->CreatePointerDescriptor(toCompDesc, this->instance_, + workQueue.terminator(), this->subscripts_); + this->component_->CreatePointerDescriptor(fromCompDesc, *this->from_, + workQueue.terminator(), this->fromSubscripts_); + const auto *componentDerived{this->component_->derivedType()}; + this->Advance(); + if (int status{workQueue.BeginAssign(toCompDesc, fromCompDesc, flags_, + memmoveFct_, componentDerived)}; + status != StatOk) { + return status; + } + } else { // Component has intrinsic type; simply copy raw bytes + std::size_t componentByteSize{ + this->component_->SizeInBytes(this->instance_)}; + if (IS_COMPONENTWISE && toIsContiguous_ && fromIsContiguous_) { + std::size_t offset{ + static_cast<std::size_t>(this->component_->offset())}; + char *to{this->instance_.template OffsetElement<char>(offset)}; + const char *from{ + this->from_->template OffsetElement<const char>(offset)}; + std::size_t toElementStride{this->instance_.ElementBytes()}; + std::size_t fromElementStride{ + this->from_->rank() == 0 ? 0 : this->from_->ElementBytes()}; + if (toElementStride == fromElementStride && + toElementStride == componentByteSize) { + memmoveFct_(to, from, this->elements_ * componentByteSize); + } else { + for (std::size_t n{this->elements_}; n--; + to += toElementStride, from += fromElementStride) { + memmoveFct_(to, from, componentByteSize); + } + } + this->SkipToNextComponent(); + } else { + memmoveFct_( + this->instance_.template Element<char>(this->subscripts_) + + this->component_->offset(), + this->from_->template Element<const char>(this->fromSubscripts_) + + this->component_->offset(), + componentByteSize); + this->Advance(); + } + } + break; + case typeInfo::Component::Genre::Pointer: { + std::size_t componentByteSize{ + this->component_->SizeInBytes(this->instance_)}; + if (IS_COMPONENTWISE && toIsContiguous_ && fromIsContiguous_) { + std::size_t offset{ + static_cast<std::size_t>(this->component_->offset())}; + char *to{this->instance_.template OffsetElement<char>(offset)}; + const char *from{ + this->from_->template OffsetElement<const char>(offset)}; + std::size_t toElementStride{this->instance_.ElementBytes()}; + std::size_t fromElementStride{ + this->from_->rank() == 0 ? 0 : this->from_->ElementBytes()}; + if (toElementStride == fromElementStride && + toElementStride == componentByteSize) { + memmoveFct_(to, from, this->elements_ * componentByteSize); + } else { + for (std::size_t n{this->elements_}; n--; + to += toElementStride, from += fromElementStride) { + memmoveFct_(to, from, componentByteSize); + } + } + this->SkipToNextComponent(); + } else { + memmoveFct_(this->instance_.template Element<char>(this->subscripts_) + + this->component_->offset(), + this->from_->template Element<const char>(this->fromSubscripts_) + + this->component_->offset(), + componentByteSize); + this->Advance(); + } + } break; + case typeInfo::Component::Genre::Allocatable: + case typeInfo::Component::Genre::Automatic: { + auto *toDesc{reinterpret_cast<Descriptor *>( + this->instance_.template Element<char>(this->subscripts_) + + this->component_->offset())}; + const auto *fromDesc{reinterpret_cast<const Descriptor *>( + this->from_->template Element<char>(this->fromSubscripts_) + + this->component_->offset())}; + const auto *componentDerived{this->component_->derivedType()}; + if (toDesc->IsAllocatable() && !fromDesc->IsAllocated()) { + if (toDesc->IsAllocated()) { + if (this->phase_ == 0) { + if (componentDerived && !componentDerived->noDestructionNeeded()) { + if (int status{workQueue.BeginDestroy( + *toDesc, *componentDerived, /*finalize=*/false)}; + status != StatOk) { + this->phase_++; + return status; + } + } + } + toDesc->Deallocate(); + } + this->Advance(); + } else { + // Allocatable components of the LHS are unconditionally + // deallocated before assignment (F'2018 10.2.1.3(13)(1)), + // unlike a "top-level" assignment to a variable, where + // deallocation is optional. + int nestedFlags{flags_}; + if (!componentDerived || + (componentDerived->noFinalizationNeeded() && + componentDerived->noInitializationNeeded() && + componentDerived->noDestructionNeeded())) { + // The actual deallocation might be avoidable when the existing + // location can be reoccupied. + nestedFlags |= MaybeReallocate | UpdateLHSBounds; + } else { + // Force LHS deallocation with DeallocateLHS flag. + nestedFlags |= DeallocateLHS; + } + this->Advance(); + if (int status{workQueue.BeginAssign(*toDesc, *fromDesc, nestedFlags, + memmoveFct_, componentDerived)}; + status != StatOk) { + return status; + } + } + } break; + } + } + if (deallocateAfter_) { + deallocateAfter_->Deallocate(); + } + return StatOk; +} +template RT_API_ATTRS int DerivedAssignTicket<false>::Continue(WorkQueue &); +template RT_API_ATTRS int DerivedAssignTicket<true>::Continue(WorkQueue &); + +RT_API_ATTRS void DoFromSourceAssign(Descriptor &alloc, + const Descriptor &source, Terminator &terminator, MemmoveFct memmoveFct) { + if (alloc.rank() > 0 && source.rank() == 0) { + // The value of each element of allocate object becomes the value of source. + DescriptorAddendum *allocAddendum{alloc.Addendum()}; + const typeInfo::DerivedType *allocDerived{ + allocAddendum ? allocAddendum->derivedType() : nullptr}; + SubscriptValue allocAt[maxRank]; + alloc.GetLowerBounds(allocAt); + if (allocDerived) { + for (std::size_t n{alloc.InlineElements()}; n-- > 0; + alloc.IncrementSubscripts(allocAt)) { + Descriptor allocElement{*Descriptor::Create(*allocDerived, + reinterpret_cast<void *>(alloc.Element<char>(allocAt)), 0)}; + Assign(allocElement, source, terminator, NoAssignFlags, memmoveFct); + } + } else { // intrinsic type + for (std::size_t n{alloc.InlineElements()}; n-- > 0; + alloc.IncrementSubscripts(allocAt)) { + memmoveFct(alloc.Element<char>(allocAt), source.raw().base_addr, + alloc.ElementBytes()); + } + } + } else { + Assign(alloc, source, terminator, NoAssignFlags, memmoveFct); + } +} + +RT_OFFLOAD_API_GROUP_END + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(Assign)(Descriptor &to, const Descriptor &from, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + // All top-level defined assignments can be recognized in semantics and + // will have been already been converted to calls, so don't check for + // defined assignment apart from components. + Assign(to, from, terminator, + MaybeReallocate | NeedFinalization | ComponentCanBeDefinedAssignment); +} + +void RTDEF(AssignTemporary)(Descriptor &to, const Descriptor &from, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + // Initialize the "to" if it is of derived type that needs initialization. + if (const DescriptorAddendum * addendum{to.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + // Do not invoke the initialization, if the descriptor is unallocated. + // AssignTemporary() is used for component-by-component assignments, + // for example, for structure constructors. This means that the LHS + // may be an allocatable component with unallocated status. + // The initialization will just fail in this case. By skipping + // the initialization we let Assign() automatically allocate + // and initialize the component according to the RHS. + // So we only need to initialize the LHS here if it is allocated. + // Note that initializing already initialized entity has no visible + // effect, though, it is assumed that the compiler does not initialize + // the temporary and leaves the initialization to this runtime code. + if (!derived->noInitializationNeeded() && to.IsAllocated()) { + if (ReturnError(terminator, Initialize(to, *derived, terminator)) != + StatOk) { + return; + } + } + } + } + Assign(to, from, terminator, MaybeReallocate | PolymorphicLHS); +} + +void RTDEF(CopyInAssign)(Descriptor &temp, const Descriptor &var, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + temp = var; + temp.set_base_addr(nullptr); + temp.raw().attribute = CFI_attribute_allocatable; + temp.Allocate(kNoAsyncObject); + ShallowCopy(temp, var); +} + +void RTDEF(CopyOutAssign)( + Descriptor *var, Descriptor &temp, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + // Copyout from the temporary must not cause any finalizations + // for LHS. The variable must be properly initialized already. + if (var) { + ShallowCopy(*var, temp); + } + temp.Deallocate(); +} + +void RTDEF(AssignExplicitLengthCharacter)(Descriptor &to, + const Descriptor &from, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + Assign(to, from, terminator, + MaybeReallocate | NeedFinalization | ComponentCanBeDefinedAssignment | + ExplicitLengthCharacterLHS); +} + +void RTDEF(AssignPolymorphic)(Descriptor &to, const Descriptor &from, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + Assign(to, from, terminator, + MaybeReallocate | NeedFinalization | ComponentCanBeDefinedAssignment | + PolymorphicLHS); +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/buffer.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/buffer.cpp new file mode 100644 index 00000000000..4cf85e13b6d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/buffer.cpp @@ -0,0 +1,29 @@ +//===-- lib/runtime/buffer.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/buffer.h" +#include <algorithm> + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +// Here's a very old trick for shifting circular buffer data cheaply +// without a need for a temporary array. +void LeftShiftBufferCircularly( + char *buffer, std::size_t bytes, std::size_t shift) { + // Assume that we start with "efgabcd" and the left shift is 3. + RT_DIAG_PUSH + RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN + std::reverse(buffer, buffer + shift); // "gfeabcd" + std::reverse(buffer, buffer + bytes); // "dcbaefg" + std::reverse(buffer, buffer + bytes - shift); // "abcdefg" + RT_DIAG_POP +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/character.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/character.cpp new file mode 100644 index 00000000000..f140d202e11 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/character.cpp @@ -0,0 +1,922 @@ +//===-- lib/runtime/character.cpp -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/character.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Common/bit-population-count.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/character.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/freestanding-tools.h" +#include <algorithm> +#include <cstring> + +namespace Fortran::runtime { + +template <typename CHAR> +inline RT_API_ATTRS int CompareToBlankPadding( + const CHAR *x, std::size_t chars) { + using UNSIGNED_CHAR = std::make_unsigned_t<CHAR>; + const auto blank{static_cast<UNSIGNED_CHAR>(' ')}; + for (; chars-- > 0; ++x) { + const UNSIGNED_CHAR ux{*reinterpret_cast<const UNSIGNED_CHAR *>(x)}; + if (ux < blank) { + return -1; + } + if (ux > blank) { + return 1; + } + } + return 0; +} + +RT_OFFLOAD_API_GROUP_BEGIN + +template <typename CHAR> +RT_API_ATTRS int CharacterScalarCompare( + const CHAR *x, const CHAR *y, std::size_t xChars, std::size_t yChars) { + auto minChars{std::min(xChars, yChars)}; + if constexpr (sizeof(CHAR) == 1) { + // don't use for kind=2 or =4, that would fail on little-endian machines + int cmp{Fortran::runtime::memcmp(x, y, minChars)}; + if (cmp < 0) { + return -1; + } + if (cmp > 0) { + return 1; + } + if (xChars == yChars) { + return 0; + } + x += minChars; + y += minChars; + } else { + for (std::size_t n{minChars}; n-- > 0; ++x, ++y) { + if (*x < *y) { + return -1; + } + if (*x > *y) { + return 1; + } + } + } + if (int cmp{CompareToBlankPadding(x, xChars - minChars)}) { + return cmp; + } + return -CompareToBlankPadding(y, yChars - minChars); +} + +template RT_API_ATTRS int CharacterScalarCompare<char>( + const char *x, const char *y, std::size_t xChars, std::size_t yChars); +template RT_API_ATTRS int CharacterScalarCompare<char16_t>(const char16_t *x, + const char16_t *y, std::size_t xChars, std::size_t yChars); +template RT_API_ATTRS int CharacterScalarCompare<char32_t>(const char32_t *x, + const char32_t *y, std::size_t xChars, std::size_t yChars); + +RT_OFFLOAD_API_GROUP_END + +// Shift count to use when converting between character lengths +// and byte counts. +template <typename CHAR> +constexpr int shift{common::TrailingZeroBitCount(sizeof(CHAR))}; + +template <typename CHAR> +static RT_API_ATTRS void Compare(Descriptor &result, const Descriptor &x, + const Descriptor &y, const Terminator &terminator) { + RUNTIME_CHECK( + terminator, x.rank() == y.rank() || x.rank() == 0 || y.rank() == 0); + int rank{std::max(x.rank(), y.rank())}; + SubscriptValue ub[maxRank], xAt[maxRank], yAt[maxRank]; + SubscriptValue elements{1}; + for (int j{0}; j < rank; ++j) { + if (x.rank() > 0 && y.rank() > 0) { + SubscriptValue xUB{x.GetDimension(j).Extent()}; + SubscriptValue yUB{y.GetDimension(j).Extent()}; + if (xUB != yUB) { + terminator.Crash("Character array comparison: operands are not " + "conforming on dimension %d (%jd != %jd)", + j + 1, static_cast<std::intmax_t>(xUB), + static_cast<std::intmax_t>(yUB)); + } + ub[j] = xUB; + } else { + ub[j] = (x.rank() ? x : y).GetDimension(j).Extent(); + } + elements *= ub[j]; + } + x.GetLowerBounds(xAt); + y.GetLowerBounds(yAt); + result.Establish( + TypeCategory::Logical, 1, nullptr, rank, ub, CFI_attribute_allocatable); + for (int j{0}; j < rank; ++j) { + result.GetDimension(j).SetBounds(1, ub[j]); + } + if (result.Allocate(kNoAsyncObject) != CFI_SUCCESS) { + terminator.Crash("Compare: could not allocate storage for result"); + } + std::size_t xChars{x.ElementBytes() >> shift<CHAR>}; + std::size_t yChars{y.ElementBytes() >> shift<char>}; + for (SubscriptValue resultAt{0}; elements-- > 0; + ++resultAt, x.IncrementSubscripts(xAt), y.IncrementSubscripts(yAt)) { + *result.OffsetElement<char>(resultAt) = CharacterScalarCompare<CHAR>( + x.Element<CHAR>(xAt), y.Element<CHAR>(yAt), xChars, yChars); + } +} + +template <typename CHAR, bool ADJUSTR> +static RT_API_ATTRS void Adjust(CHAR *to, const CHAR *from, std::size_t chars) { + if constexpr (ADJUSTR) { + std::size_t j{chars}, k{chars}; + for (; k > 0 && from[k - 1] == ' '; --k) { + } + while (k > 0) { + to[--j] = from[--k]; + } + while (j > 0) { + to[--j] = ' '; + } + } else { // ADJUSTL + std::size_t j{0}, k{0}; + for (; k < chars && from[k] == ' '; ++k) { + } + while (k < chars) { + to[j++] = from[k++]; + } + while (j < chars) { + to[j++] = ' '; + } + } +} + +template <typename CHAR, bool ADJUSTR> +static RT_API_ATTRS void AdjustLRHelper(Descriptor &result, + const Descriptor &string, const Terminator &terminator) { + int rank{string.rank()}; + SubscriptValue ub[maxRank], stringAt[maxRank]; + SubscriptValue elements{1}; + for (int j{0}; j < rank; ++j) { + ub[j] = string.GetDimension(j).Extent(); + elements *= ub[j]; + stringAt[j] = 1; + } + string.GetLowerBounds(stringAt); + std::size_t elementBytes{string.ElementBytes()}; + result.Establish(string.type(), elementBytes, nullptr, rank, ub, + CFI_attribute_allocatable); + for (int j{0}; j < rank; ++j) { + result.GetDimension(j).SetBounds(1, ub[j]); + } + if (result.Allocate(kNoAsyncObject) != CFI_SUCCESS) { + terminator.Crash("ADJUSTL/R: could not allocate storage for result"); + } + for (SubscriptValue resultAt{0}; elements-- > 0; + resultAt += elementBytes, string.IncrementSubscripts(stringAt)) { + Adjust<CHAR, ADJUSTR>(result.OffsetElement<CHAR>(resultAt), + string.Element<const CHAR>(stringAt), elementBytes >> shift<CHAR>); + } +} + +template <bool ADJUSTR> +RT_API_ATTRS void AdjustLR(Descriptor &result, const Descriptor &string, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + switch (string.raw().type) { + case CFI_type_char: + AdjustLRHelper<char, ADJUSTR>(result, string, terminator); + break; + case CFI_type_char16_t: + AdjustLRHelper<char16_t, ADJUSTR>(result, string, terminator); + break; + case CFI_type_char32_t: + AdjustLRHelper<char32_t, ADJUSTR>(result, string, terminator); + break; + default: + terminator.Crash("ADJUSTL/R: bad string type code %d", + static_cast<int>(string.raw().type)); + } +} + +template <typename CHAR> +inline RT_API_ATTRS std::size_t LenTrim(const CHAR *x, std::size_t chars) { + while (chars > 0 && x[chars - 1] == ' ') { + --chars; + } + return chars; +} + +template <typename INT, typename CHAR> +static RT_API_ATTRS void LenTrim(Descriptor &result, const Descriptor &string, + const Terminator &terminator) { + int rank{string.rank()}; + SubscriptValue ub[maxRank], stringAt[maxRank]; + SubscriptValue elements{1}; + for (int j{0}; j < rank; ++j) { + ub[j] = string.GetDimension(j).Extent(); + elements *= ub[j]; + } + string.GetLowerBounds(stringAt); + result.Establish(TypeCategory::Integer, sizeof(INT), nullptr, rank, ub, + CFI_attribute_allocatable); + for (int j{0}; j < rank; ++j) { + result.GetDimension(j).SetBounds(1, ub[j]); + } + if (result.Allocate(kNoAsyncObject) != CFI_SUCCESS) { + terminator.Crash("LEN_TRIM: could not allocate storage for result"); + } + std::size_t stringElementChars{string.ElementBytes() >> shift<CHAR>}; + for (SubscriptValue resultAt{0}; elements-- > 0; + resultAt += sizeof(INT), string.IncrementSubscripts(stringAt)) { + *result.OffsetElement<INT>(resultAt) = + LenTrim(string.Element<CHAR>(stringAt), stringElementChars); + } +} + +template <typename CHAR> +static RT_API_ATTRS void LenTrimKind(Descriptor &result, + const Descriptor &string, int kind, const Terminator &terminator) { + switch (kind) { + case 1: + LenTrim<CppTypeFor<TypeCategory::Integer, 1>, CHAR>( + result, string, terminator); + break; + case 2: + LenTrim<CppTypeFor<TypeCategory::Integer, 2>, CHAR>( + result, string, terminator); + break; + case 4: + LenTrim<CppTypeFor<TypeCategory::Integer, 4>, CHAR>( + result, string, terminator); + break; + case 8: + LenTrim<CppTypeFor<TypeCategory::Integer, 8>, CHAR>( + result, string, terminator); + break; + case 16: + LenTrim<CppTypeFor<TypeCategory::Integer, 16>, CHAR>( + result, string, terminator); + break; + default: + terminator.Crash( + "not yet implemented: CHARACTER(KIND=%d) in LEN_TRIM intrinsic", kind); + } +} + +// INDEX implementation +template <typename CHAR> +inline RT_API_ATTRS std::size_t Index(const CHAR *x, std::size_t xLen, + const CHAR *want, std::size_t wantLen, bool back) { + if (xLen < wantLen) { + return 0; + } + if (xLen == 0) { + return 1; // wantLen is also 0, so trivial match + } + if (back) { + // If wantLen==0, returns xLen + 1 per standard (and all other compilers) + std::size_t at{xLen - wantLen + 1}; + for (; at > 0; --at) { + std::size_t j{1}; + for (; j <= wantLen; ++j) { + if (x[at + j - 2] != want[j - 1]) { + break; + } + } + if (j > wantLen) { + return at; + } + } + return 0; + } + if (wantLen == 1) { + // Trivial case for single character lookup. + // We can use simple forward search. + CHAR ch{want[0]}; + if constexpr (std::is_same_v<CHAR, char>) { + if (auto pos{reinterpret_cast<const CHAR *>( + Fortran::runtime::memchr(x, ch, xLen))}) { + return pos - x + 1; + } + } else { + for (std::size_t at{0}; at < xLen; ++at) { + if (x[at] == ch) { + return at + 1; + } + } + } + return 0; + } + // Non-trivial forward substring search: use a simplified form of + // Boyer-Moore substring searching. + for (std::size_t at{1}; at + wantLen - 1 <= xLen;) { + // Compare x(at:at+wantLen-1) with want(1:wantLen). + // The comparison proceeds from the ends of the substrings forward + // so that we can skip ahead by multiple positions on a miss. + std::size_t j{wantLen}; + CHAR ch; + for (; j > 0; --j) { + ch = x[at + j - 2]; + if (ch != want[j - 1]) { + break; + } + } + if (j == 0) { + return at; // found a match + } + // Suppose we have at==2: + // "THAT FORTRAN THAT I RAN" <- the string (x) in which we search + // "THAT I RAN" <- the string (want) for which we search + // ^------------------ j==7, ch=='T' + // We can shift ahead 3 positions to at==5 to align the 'T's: + // "THAT FORTRAN THAT I RAN" + // "THAT I RAN" + std::size_t shift{1}; + for (; shift < j; ++shift) { + if (want[j - shift - 1] == ch) { + break; + } + } + at += shift; + } + return 0; +} + +// SCAN and VERIFY implementation help. These intrinsic functions +// do pretty much the same thing, so they're templatized with a +// distinguishing flag. + +enum class CharFunc { Index, Scan, Verify }; + +template <typename CHAR, CharFunc FUNC> +inline RT_API_ATTRS std::size_t ScanVerify(const CHAR *x, std::size_t xLen, + const CHAR *set, std::size_t setLen, bool back) { + std::size_t at{back ? xLen : 1}; + int increment{back ? -1 : 1}; + for (; xLen-- > 0; at += increment) { + CHAR ch{x[at - 1]}; + bool inSet{false}; + // TODO: If set is sorted, could use binary search + for (std::size_t j{0}; j < setLen; ++j) { + if (set[j] == ch) { + inSet = true; + break; + } + } + if (inSet != (FUNC == CharFunc::Verify)) { + return at; + } + } + return 0; +} + +// Specialization for one-byte characters +template <bool IS_VERIFY = false> +inline RT_API_ATTRS std::size_t ScanVerify(const char *x, std::size_t xLen, + const char *set, std::size_t setLen, bool back) { + std::size_t at{back ? xLen : 1}; + int increment{back ? -1 : 1}; + if (xLen > 0) { + std::uint64_t bitSet[256 / 64]{0}; + std::uint64_t one{1}; + for (std::size_t j{0}; j < setLen; ++j) { + unsigned setCh{static_cast<unsigned char>(set[j])}; + bitSet[setCh / 64] |= one << (setCh % 64); + } + for (; xLen-- > 0; at += increment) { + unsigned ch{static_cast<unsigned char>(x[at - 1])}; + bool inSet{((bitSet[ch / 64] >> (ch % 64)) & 1) != 0}; + if (inSet != IS_VERIFY) { + return at; + } + } + } + return 0; +} + +template <typename INT, typename CHAR, CharFunc FUNC> +static RT_API_ATTRS void GeneralCharFunc(Descriptor &result, + const Descriptor &string, const Descriptor &arg, const Descriptor *back, + const Terminator &terminator) { + int rank{string.rank() ? string.rank() + : arg.rank() ? arg.rank() + : back ? back->rank() + : 0}; + SubscriptValue ub[maxRank], stringAt[maxRank], argAt[maxRank], + backAt[maxRank]; + SubscriptValue elements{1}; + for (int j{0}; j < rank; ++j) { + ub[j] = string.rank() ? string.GetDimension(j).Extent() + : arg.rank() ? arg.GetDimension(j).Extent() + : back ? back->GetDimension(j).Extent() + : 1; + elements *= ub[j]; + } + string.GetLowerBounds(stringAt); + arg.GetLowerBounds(argAt); + if (back) { + back->GetLowerBounds(backAt); + } + result.Establish(TypeCategory::Integer, sizeof(INT), nullptr, rank, ub, + CFI_attribute_allocatable); + for (int j{0}; j < rank; ++j) { + result.GetDimension(j).SetBounds(1, ub[j]); + } + if (result.Allocate(kNoAsyncObject) != CFI_SUCCESS) { + terminator.Crash("SCAN/VERIFY: could not allocate storage for result"); + } + std::size_t stringElementChars{string.ElementBytes() >> shift<CHAR>}; + std::size_t argElementChars{arg.ElementBytes() >> shift<CHAR>}; + for (SubscriptValue resultAt{0}; elements-- > 0; resultAt += sizeof(INT), + string.IncrementSubscripts(stringAt), arg.IncrementSubscripts(argAt), + back && back->IncrementSubscripts(backAt)) { + if constexpr (FUNC == CharFunc::Index) { + *result.OffsetElement<INT>(resultAt) = + Index<CHAR>(string.Element<CHAR>(stringAt), stringElementChars, + arg.Element<CHAR>(argAt), argElementChars, + back && IsLogicalElementTrue(*back, backAt)); + } else if constexpr (FUNC == CharFunc::Scan) { + *result.OffsetElement<INT>(resultAt) = + ScanVerify<CHAR, CharFunc::Scan>(string.Element<CHAR>(stringAt), + stringElementChars, arg.Element<CHAR>(argAt), argElementChars, + back && IsLogicalElementTrue(*back, backAt)); + } else if constexpr (FUNC == CharFunc::Verify) { + *result.OffsetElement<INT>(resultAt) = + ScanVerify<CHAR, CharFunc::Verify>(string.Element<CHAR>(stringAt), + stringElementChars, arg.Element<CHAR>(argAt), argElementChars, + back && IsLogicalElementTrue(*back, backAt)); + } else { + static_assert(FUNC == CharFunc::Index || FUNC == CharFunc::Scan || + FUNC == CharFunc::Verify); + } + } +} + +template <typename CHAR, CharFunc FUNC> +static RT_API_ATTRS void GeneralCharFuncKind(Descriptor &result, + const Descriptor &string, const Descriptor &arg, const Descriptor *back, + int kind, const Terminator &terminator) { + switch (kind) { + case 1: + GeneralCharFunc<CppTypeFor<TypeCategory::Integer, 1>, CHAR, FUNC>( + result, string, arg, back, terminator); + break; + case 2: + GeneralCharFunc<CppTypeFor<TypeCategory::Integer, 2>, CHAR, FUNC>( + result, string, arg, back, terminator); + break; + case 4: + GeneralCharFunc<CppTypeFor<TypeCategory::Integer, 4>, CHAR, FUNC>( + result, string, arg, back, terminator); + break; + case 8: + GeneralCharFunc<CppTypeFor<TypeCategory::Integer, 8>, CHAR, FUNC>( + result, string, arg, back, terminator); + break; + case 16: + GeneralCharFunc<CppTypeFor<TypeCategory::Integer, 16>, CHAR, FUNC>( + result, string, arg, back, terminator); + break; + default: + terminator.Crash("not yet implemented: CHARACTER(KIND=%d) in " + "INDEX/SCAN/VERIFY intrinsic", + kind); + } +} + +template <typename CHAR, bool ISMIN> +static RT_API_ATTRS void MaxMinHelper(Descriptor &accumulator, + const Descriptor &x, const Terminator &terminator) { + RUNTIME_CHECK(terminator, + accumulator.rank() == 0 || x.rank() == 0 || + accumulator.rank() == x.rank()); + SubscriptValue ub[maxRank], xAt[maxRank]; + SubscriptValue elements{1}; + std::size_t accumChars{accumulator.ElementBytes() >> shift<CHAR>}; + std::size_t xChars{x.ElementBytes() >> shift<CHAR>}; + std::size_t chars{std::max(accumChars, xChars)}; + bool reallocate{accumulator.raw().base_addr == nullptr || + accumChars != chars || (accumulator.rank() == 0 && x.rank() > 0)}; + int rank{std::max(accumulator.rank(), x.rank())}; + for (int j{0}; j < rank; ++j) { + if (x.rank() > 0) { + ub[j] = x.GetDimension(j).Extent(); + if (accumulator.rank() > 0) { + SubscriptValue accumExt{accumulator.GetDimension(j).Extent()}; + if (accumExt != ub[j]) { + terminator.Crash("Character MAX/MIN: operands are not " + "conforming on dimension %d (%jd != %jd)", + j + 1, static_cast<std::intmax_t>(accumExt), + static_cast<std::intmax_t>(ub[j])); + } + } + } else { + ub[j] = accumulator.GetDimension(j).Extent(); + } + elements *= ub[j]; + } + x.GetLowerBounds(xAt); + void *old{nullptr}; + const CHAR *accumData{accumulator.OffsetElement<CHAR>()}; + if (reallocate) { + old = accumulator.raw().base_addr; + accumulator.set_base_addr(nullptr); + accumulator.raw().elem_len = chars << shift<CHAR>; + for (int j{0}; j < rank; ++j) { + accumulator.GetDimension(j).SetBounds(1, ub[j]); + } + RUNTIME_CHECK( + terminator, accumulator.Allocate(kNoAsyncObject) == CFI_SUCCESS); + } + for (CHAR *result{accumulator.OffsetElement<CHAR>()}; elements-- > 0; + accumData += accumChars, result += chars, x.IncrementSubscripts(xAt)) { + const CHAR *xData{x.Element<CHAR>(xAt)}; + int cmp{CharacterScalarCompare(accumData, xData, accumChars, xChars)}; + if constexpr (ISMIN) { + cmp = -cmp; + } + if (cmp < 0) { + CopyAndPad(result, xData, chars, xChars); + } else if (result != accumData) { + CopyAndPad(result, accumData, chars, accumChars); + } + } + FreeMemory(old); +} + +template <bool ISMIN> +static RT_API_ATTRS void MaxMin(Descriptor &accumulator, const Descriptor &x, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + RUNTIME_CHECK(terminator, accumulator.raw().type == x.raw().type); + switch (accumulator.raw().type) { + case CFI_type_char: + MaxMinHelper<char, ISMIN>(accumulator, x, terminator); + break; + case CFI_type_char16_t: + MaxMinHelper<char16_t, ISMIN>(accumulator, x, terminator); + break; + case CFI_type_char32_t: + MaxMinHelper<char32_t, ISMIN>(accumulator, x, terminator); + break; + default: + terminator.Crash( + "Character MAX/MIN: result does not have a character type"); + } +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(CharacterConcatenate)(Descriptor &accumulator, + const Descriptor &from, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + RUNTIME_CHECK(terminator, + accumulator.rank() == 0 || from.rank() == 0 || + accumulator.rank() == from.rank()); + int rank{std::max(accumulator.rank(), from.rank())}; + SubscriptValue ub[maxRank], fromAt[maxRank]; + SubscriptValue elements{1}; + for (int j{0}; j < rank; ++j) { + if (accumulator.rank() > 0 && from.rank() > 0) { + ub[j] = accumulator.GetDimension(j).Extent(); + SubscriptValue fromUB{from.GetDimension(j).Extent()}; + if (ub[j] != fromUB) { + terminator.Crash("Character array concatenation: operands are not " + "conforming on dimension %d (%jd != %jd)", + j + 1, static_cast<std::intmax_t>(ub[j]), + static_cast<std::intmax_t>(fromUB)); + } + } else { + ub[j] = + (accumulator.rank() ? accumulator : from).GetDimension(j).Extent(); + } + elements *= ub[j]; + } + std::size_t oldBytes{accumulator.ElementBytes()}; + void *old{accumulator.raw().base_addr}; + accumulator.set_base_addr(nullptr); + std::size_t fromBytes{from.ElementBytes()}; + accumulator.raw().elem_len += fromBytes; + std::size_t newBytes{accumulator.ElementBytes()}; + for (int j{0}; j < rank; ++j) { + accumulator.GetDimension(j).SetBounds(1, ub[j]); + } + if (accumulator.Allocate(kNoAsyncObject) != CFI_SUCCESS) { + terminator.Crash( + "CharacterConcatenate: could not allocate storage for result"); + } + const char *p{static_cast<const char *>(old)}; + char *to{static_cast<char *>(accumulator.raw().base_addr)}; + from.GetLowerBounds(fromAt); + for (; elements-- > 0; + to += newBytes, p += oldBytes, from.IncrementSubscripts(fromAt)) { + std::memcpy(to, p, oldBytes); + std::memcpy(to + oldBytes, from.Element<char>(fromAt), fromBytes); + } + FreeMemory(old); +} + +void RTDEF(CharacterConcatenateScalar1)( + Descriptor &accumulator, const char *from, std::size_t chars) { + Terminator terminator{__FILE__, __LINE__}; + RUNTIME_CHECK(terminator, accumulator.rank() == 0); + void *old{accumulator.raw().base_addr}; + accumulator.set_base_addr(nullptr); + std::size_t oldLen{accumulator.ElementBytes()}; + accumulator.raw().elem_len += chars; + RUNTIME_CHECK( + terminator, accumulator.Allocate(kNoAsyncObject) == CFI_SUCCESS); + std::memcpy(accumulator.OffsetElement<char>(oldLen), from, chars); + FreeMemory(old); +} + +int RTDEF(CharacterCompareScalar)(const Descriptor &x, const Descriptor &y) { + Terminator terminator{__FILE__, __LINE__}; + RUNTIME_CHECK(terminator, x.rank() == 0); + RUNTIME_CHECK(terminator, y.rank() == 0); + RUNTIME_CHECK(terminator, x.raw().type == y.raw().type); + switch (x.raw().type) { + case CFI_type_char: + return CharacterScalarCompare<char>(x.OffsetElement<char>(), + y.OffsetElement<char>(), x.ElementBytes(), y.ElementBytes()); + case CFI_type_char16_t: + return CharacterScalarCompare<char16_t>(x.OffsetElement<char16_t>(), + y.OffsetElement<char16_t>(), x.ElementBytes() >> 1, + y.ElementBytes() >> 1); + case CFI_type_char32_t: + return CharacterScalarCompare<char32_t>(x.OffsetElement<char32_t>(), + y.OffsetElement<char32_t>(), x.ElementBytes() >> 2, + y.ElementBytes() >> 2); + default: + terminator.Crash("CharacterCompareScalar: bad string type code %d", + static_cast<int>(x.raw().type)); + } + return 0; +} + +int RTDEF(CharacterCompareScalar1)( + const char *x, const char *y, std::size_t xChars, std::size_t yChars) { + return CharacterScalarCompare(x, y, xChars, yChars); +} + +int RTDEF(CharacterCompareScalar2)(const char16_t *x, const char16_t *y, + std::size_t xChars, std::size_t yChars) { + return CharacterScalarCompare(x, y, xChars, yChars); +} + +int RTDEF(CharacterCompareScalar4)(const char32_t *x, const char32_t *y, + std::size_t xChars, std::size_t yChars) { + return CharacterScalarCompare(x, y, xChars, yChars); +} + +void RTDEF(CharacterCompare)( + Descriptor &result, const Descriptor &x, const Descriptor &y) { + Terminator terminator{__FILE__, __LINE__}; + RUNTIME_CHECK(terminator, x.raw().type == y.raw().type); + switch (x.raw().type) { + case CFI_type_char: + Compare<char>(result, x, y, terminator); + break; + case CFI_type_char16_t: + Compare<char16_t>(result, x, y, terminator); + break; + case CFI_type_char32_t: + Compare<char32_t>(result, x, y, terminator); + break; + default: + terminator.Crash("CharacterCompareScalar: bad string type code %d", + static_cast<int>(x.raw().type)); + } +} + +std::size_t RTDEF(CharacterAppend1)(char *lhs, std::size_t lhsBytes, + std::size_t offset, const char *rhs, std::size_t rhsBytes) { + if (auto n{std::min(lhsBytes - offset, rhsBytes)}) { + std::memcpy(lhs + offset, rhs, n); + offset += n; + } + return offset; +} + +void RTDEF(CharacterPad1)(char *lhs, std::size_t bytes, std::size_t offset) { + if (bytes > offset) { + std::memset(lhs + offset, ' ', bytes - offset); + } +} + +// Intrinsic function entry points + +void RTDEF(Adjustl)(Descriptor &result, const Descriptor &string, + const char *sourceFile, int sourceLine) { + AdjustLR<false>(result, string, sourceFile, sourceLine); +} + +void RTDEF(Adjustr)(Descriptor &result, const Descriptor &string, + const char *sourceFile, int sourceLine) { + AdjustLR<true>(result, string, sourceFile, sourceLine); +} + +std::size_t RTDEF(Index1)(const char *x, std::size_t xLen, const char *set, + std::size_t setLen, bool back) { + return Index<char>(x, xLen, set, setLen, back); +} +std::size_t RTDEF(Index2)(const char16_t *x, std::size_t xLen, + const char16_t *set, std::size_t setLen, bool back) { + return Index<char16_t>(x, xLen, set, setLen, back); +} +std::size_t RTDEF(Index4)(const char32_t *x, std::size_t xLen, + const char32_t *set, std::size_t setLen, bool back) { + return Index<char32_t>(x, xLen, set, setLen, back); +} + +void RTDEF(Index)(Descriptor &result, const Descriptor &string, + const Descriptor &substring, const Descriptor *back, int kind, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + switch (string.raw().type) { + case CFI_type_char: + GeneralCharFuncKind<char, CharFunc::Index>( + result, string, substring, back, kind, terminator); + break; + case CFI_type_char16_t: + GeneralCharFuncKind<char16_t, CharFunc::Index>( + result, string, substring, back, kind, terminator); + break; + case CFI_type_char32_t: + GeneralCharFuncKind<char32_t, CharFunc::Index>( + result, string, substring, back, kind, terminator); + break; + default: + terminator.Crash( + "INDEX: bad string type code %d", static_cast<int>(string.raw().type)); + } +} + +std::size_t RTDEF(LenTrim1)(const char *x, std::size_t chars) { + return LenTrim(x, chars); +} +std::size_t RTDEF(LenTrim2)(const char16_t *x, std::size_t chars) { + return LenTrim(x, chars); +} +std::size_t RTDEF(LenTrim4)(const char32_t *x, std::size_t chars) { + return LenTrim(x, chars); +} + +void RTDEF(LenTrim)(Descriptor &result, const Descriptor &string, int kind, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + switch (string.raw().type) { + case CFI_type_char: + LenTrimKind<char>(result, string, kind, terminator); + break; + case CFI_type_char16_t: + LenTrimKind<char16_t>(result, string, kind, terminator); + break; + case CFI_type_char32_t: + LenTrimKind<char32_t>(result, string, kind, terminator); + break; + default: + terminator.Crash("LEN_TRIM: bad string type code %d", + static_cast<int>(string.raw().type)); + } +} + +std::size_t RTDEF(Scan1)(const char *x, std::size_t xLen, const char *set, + std::size_t setLen, bool back) { + return ScanVerify<char, CharFunc::Scan>(x, xLen, set, setLen, back); +} +std::size_t RTDEF(Scan2)(const char16_t *x, std::size_t xLen, + const char16_t *set, std::size_t setLen, bool back) { + return ScanVerify<char16_t, CharFunc::Scan>(x, xLen, set, setLen, back); +} +std::size_t RTDEF(Scan4)(const char32_t *x, std::size_t xLen, + const char32_t *set, std::size_t setLen, bool back) { + return ScanVerify<char32_t, CharFunc::Scan>(x, xLen, set, setLen, back); +} + +void RTDEF(Scan)(Descriptor &result, const Descriptor &string, + const Descriptor &set, const Descriptor *back, int kind, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + switch (string.raw().type) { + case CFI_type_char: + GeneralCharFuncKind<char, CharFunc::Scan>( + result, string, set, back, kind, terminator); + break; + case CFI_type_char16_t: + GeneralCharFuncKind<char16_t, CharFunc::Scan>( + result, string, set, back, kind, terminator); + break; + case CFI_type_char32_t: + GeneralCharFuncKind<char32_t, CharFunc::Scan>( + result, string, set, back, kind, terminator); + break; + default: + terminator.Crash( + "SCAN: bad string type code %d", static_cast<int>(string.raw().type)); + } +} + +void RTDEF(Repeat)(Descriptor &result, const Descriptor &string, + std::int64_t ncopies, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (ncopies < 0) { + terminator.Crash( + "REPEAT has negative NCOPIES=%jd", static_cast<std::intmax_t>(ncopies)); + } + std::size_t origBytes{string.ElementBytes()}; + result.Establish(string.type(), origBytes * ncopies, nullptr, 0, nullptr, + CFI_attribute_allocatable); + if (result.Allocate(kNoAsyncObject) != CFI_SUCCESS) { + terminator.Crash("REPEAT could not allocate storage for result"); + } + const char *from{string.OffsetElement()}; + for (char *to{result.OffsetElement()}; ncopies-- > 0; to += origBytes) { + std::memcpy(to, from, origBytes); + } +} + +void RTDEF(Trim)(Descriptor &result, const Descriptor &string, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + std::size_t resultBytes{0}; + switch (string.raw().type) { + case CFI_type_char: + resultBytes = + LenTrim(string.OffsetElement<const char>(), string.ElementBytes()); + break; + case CFI_type_char16_t: + resultBytes = LenTrim(string.OffsetElement<const char16_t>(), + string.ElementBytes() >> 1) + << 1; + break; + case CFI_type_char32_t: + resultBytes = LenTrim(string.OffsetElement<const char32_t>(), + string.ElementBytes() >> 2) + << 2; + break; + default: + terminator.Crash( + "TRIM: bad string type code %d", static_cast<int>(string.raw().type)); + } + result.Establish(string.type(), resultBytes, nullptr, 0, nullptr, + CFI_attribute_allocatable); + RUNTIME_CHECK(terminator, result.Allocate(kNoAsyncObject) == CFI_SUCCESS); + std::memcpy(result.OffsetElement(), string.OffsetElement(), resultBytes); +} + +std::size_t RTDEF(Verify1)(const char *x, std::size_t xLen, const char *set, + std::size_t setLen, bool back) { + return ScanVerify<char, CharFunc::Verify>(x, xLen, set, setLen, back); +} +std::size_t RTDEF(Verify2)(const char16_t *x, std::size_t xLen, + const char16_t *set, std::size_t setLen, bool back) { + return ScanVerify<char16_t, CharFunc::Verify>(x, xLen, set, setLen, back); +} +std::size_t RTDEF(Verify4)(const char32_t *x, std::size_t xLen, + const char32_t *set, std::size_t setLen, bool back) { + return ScanVerify<char32_t, CharFunc::Verify>(x, xLen, set, setLen, back); +} + +void RTDEF(Verify)(Descriptor &result, const Descriptor &string, + const Descriptor &set, const Descriptor *back, int kind, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + switch (string.raw().type) { + case CFI_type_char: + GeneralCharFuncKind<char, CharFunc::Verify>( + result, string, set, back, kind, terminator); + break; + case CFI_type_char16_t: + GeneralCharFuncKind<char16_t, CharFunc::Verify>( + result, string, set, back, kind, terminator); + break; + case CFI_type_char32_t: + GeneralCharFuncKind<char32_t, CharFunc::Verify>( + result, string, set, back, kind, terminator); + break; + default: + terminator.Crash( + "VERIFY: bad string type code %d", static_cast<int>(string.raw().type)); + } +} + +void RTDEF(CharacterMax)(Descriptor &accumulator, const Descriptor &x, + const char *sourceFile, int sourceLine) { + MaxMin<false>(accumulator, x, sourceFile, sourceLine); +} + +void RTDEF(CharacterMin)(Descriptor &accumulator, const Descriptor &x, + const char *sourceFile, int sourceLine) { + MaxMin<true>(accumulator, x, sourceFile, sourceLine); +} + +RT_EXT_API_GROUP_END +} +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/command.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/command.cpp new file mode 100644 index 00000000000..a4e8e31ad02 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/command.cpp @@ -0,0 +1,377 @@ +//===-- lib/runtime/command.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/command.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include <cerrno> +#include <cstdlib> +#include <limits> + +#ifdef _WIN32 +#include "flang/Common/windows-include.h" +#include <direct.h> +#define getcwd _getcwd +#define unlink _unlink +#define PATH_MAX MAX_PATH + +#ifdef _MSC_VER +// On Windows GetCurrentProcessId returns a DWORD aka uint32_t +#include <processthreadsapi.h> +inline pid_t getpid() { return GetCurrentProcessId(); } +#endif +#else +#include <unistd.h> //getpid() unlink() + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif +#endif + +namespace Fortran::runtime { +std::int32_t RTNAME(ArgumentCount)() { + int argc{executionEnvironment.argc}; + if (argc > 1) { + // C counts the command name as one of the arguments, but Fortran doesn't. + return argc - 1; + } + return 0; +} + +pid_t RTNAME(GetPID)() { return getpid(); } + +// Returns the length of the \p string. Assumes \p string is valid. +static std::int64_t StringLength(const char *string) { + std::size_t length{std::strlen(string)}; + if (length <= std::numeric_limits<std::int64_t>::max()) + return static_cast<std::int64_t>(length); + return 0; +} + +static void FillWithSpaces(const Descriptor &value, std::size_t offset = 0) { + if (offset < value.ElementBytes()) { + std::memset( + value.OffsetElement(offset), ' ', value.ElementBytes() - offset); + } +} + +static std::int32_t CheckAndCopyCharsToDescriptor(const Descriptor *value, + const char *rawValue, const Descriptor *errmsg, std::size_t &offset) { + bool haveValue{IsValidCharDescriptor(value)}; + + std::int64_t len{StringLength(rawValue)}; + if (len <= 0) { + if (haveValue) { + FillWithSpaces(*value); + } + return ToErrmsg(errmsg, StatMissingArgument); + } + + std::int32_t stat{StatOk}; + if (haveValue) { + stat = CopyCharsToDescriptor(*value, rawValue, len, errmsg, offset); + } + + offset += len; + return stat; +} + +template <int KIND> struct FitsInIntegerKind { + bool operator()([[maybe_unused]] std::int64_t value) { + if constexpr (KIND >= 8) { + return true; + } else { + return value <= std::numeric_limits<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Integer, KIND>>::max(); + } + } +}; + +static bool FitsInDescriptor( + const Descriptor *length, std::int64_t value, Terminator &terminator) { + auto typeCode{length->type().GetCategoryAndKind()}; + int kind{typeCode->second}; + return Fortran::runtime::ApplyIntegerKind<FitsInIntegerKind, bool>( + kind, terminator, value); +} + +std::int32_t RTNAME(GetCommandArgument)(std::int32_t n, const Descriptor *value, + const Descriptor *length, const Descriptor *errmsg, const char *sourceFile, + int line) { + Terminator terminator{sourceFile, line}; + + if (value) { + RUNTIME_CHECK(terminator, IsValidCharDescriptor(value)); + FillWithSpaces(*value); + } + + // Store 0 in case we error out later on. + if (length) { + RUNTIME_CHECK(terminator, IsValidIntDescriptor(length)); + StoreIntToDescriptor(length, 0, terminator); + } + + if (n < 0 || n >= executionEnvironment.argc) { + return ToErrmsg(errmsg, StatInvalidArgumentNumber); + } + + const char *arg{executionEnvironment.argv[n]}; + std::int64_t argLen{StringLength(arg)}; + if (argLen <= 0) { + return ToErrmsg(errmsg, StatMissingArgument); + } + + if (length && FitsInDescriptor(length, argLen, terminator)) { + StoreIntToDescriptor(length, argLen, terminator); + } + + if (value) { + return CopyCharsToDescriptor(*value, arg, argLen, errmsg); + } + + return StatOk; +} + +std::int32_t RTNAME(GetCommand)(const Descriptor *value, + const Descriptor *length, const Descriptor *errmsg, const char *sourceFile, + int line) { + Terminator terminator{sourceFile, line}; + + if (value) { + RUNTIME_CHECK(terminator, IsValidCharDescriptor(value)); + } + + // Store 0 in case we error out later on. + if (length) { + RUNTIME_CHECK(terminator, IsValidIntDescriptor(length)); + StoreIntToDescriptor(length, 0, terminator); + } + + auto shouldContinue = [&](std::int32_t stat) -> bool { + // We continue as long as everything is ok OR the value descriptor is + // too short, but we still need to compute the length. + return stat == StatOk || (length && stat == StatValueTooShort); + }; + + std::size_t offset{0}; + + if (executionEnvironment.argc == 0) { + return CheckAndCopyCharsToDescriptor(value, "", errmsg, offset); + } + + // value = argv[0] + std::int32_t stat{CheckAndCopyCharsToDescriptor( + value, executionEnvironment.argv[0], errmsg, offset)}; + if (!shouldContinue(stat)) { + return stat; + } + + // value += " " + argv[1:n] + for (std::int32_t i{1}; i < executionEnvironment.argc; ++i) { + stat = CheckAndCopyCharsToDescriptor(value, " ", errmsg, offset); + if (!shouldContinue(stat)) { + return stat; + } + + stat = CheckAndCopyCharsToDescriptor( + value, executionEnvironment.argv[i], errmsg, offset); + if (!shouldContinue(stat)) { + return stat; + } + } + + if (length && FitsInDescriptor(length, offset, terminator)) { + StoreIntToDescriptor(length, offset, terminator); + } + + // value += spaces for padding + if (value) { + FillWithSpaces(*value, offset); + } + + return stat; +} + +static std::size_t LengthWithoutTrailingSpaces(const Descriptor &d) { + std::size_t s{d.ElementBytes()}; // This can be 0. + while (s != 0 && *d.OffsetElement(s - 1) == ' ') { + --s; + } + return s; +} + +std::int32_t RTNAME(GetEnvVariable)(const Descriptor &name, + const Descriptor *value, const Descriptor *length, bool trim_name, + const Descriptor *errmsg, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + + if (value) { + RUNTIME_CHECK(terminator, IsValidCharDescriptor(value)); + FillWithSpaces(*value); + } + + // Store 0 in case we error out later on. + if (length) { + RUNTIME_CHECK(terminator, IsValidIntDescriptor(length)); + StoreIntToDescriptor(length, 0, terminator); + } + + const char *rawValue{nullptr}; + std::size_t nameLength{ + trim_name ? LengthWithoutTrailingSpaces(name) : name.ElementBytes()}; + if (nameLength != 0) { + rawValue = executionEnvironment.GetEnv( + name.OffsetElement(), nameLength, terminator); + } + if (!rawValue) { + return ToErrmsg(errmsg, StatMissingEnvVariable); + } + + std::int64_t varLen{StringLength(rawValue)}; + if (length && FitsInDescriptor(length, varLen, terminator)) { + StoreIntToDescriptor(length, varLen, terminator); + } + + if (value) { + return CopyCharsToDescriptor(*value, rawValue, varLen, errmsg); + } + return StatOk; +} + +std::int32_t RTNAME(GetCwd)( + const Descriptor &cwd, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + + RUNTIME_CHECK(terminator, IsValidCharDescriptor(&cwd)); + + char *buf{(char *)AllocateMemoryOrCrash(terminator, PATH_MAX)}; + + if (!getcwd(buf, PATH_MAX)) { + return StatMissingCurrentWorkDirectory; + } + + std::int64_t strLen{StringLength(buf)}; + std::int32_t status{CopyCharsToDescriptor(cwd, buf, strLen)}; + + std::free(buf); + return status; +} + +std::int32_t RTNAME(Hostnm)( + const Descriptor &res, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + + RUNTIME_CHECK(terminator, IsValidCharDescriptor(&res)); + + char buf[256]; + std::int32_t status{0}; + + // Fill the output with spaces. Upon success, CopyCharsToDescriptor() + // will overwrite part of the string with the result, so we'll end up + // with a padded string. If we fail to obtain the host name, we return + // the string of all spaces, which is the original gfortran behavior. + FillWithSpaces(res); + +#ifdef _WIN32 + + DWORD dwSize{sizeof(buf)}; + + // Note: Winsock has gethostname(), but use Win32 API GetComputerNameEx(), + // in order to avoid adding dependency on Winsock. + if (!GetComputerNameExA(ComputerNameDnsHostname, buf, &dwSize)) { + status = GetLastError(); + } + +#else + + if (gethostname(buf, sizeof(buf)) < 0) { + status = errno; + } + +#endif + + if (status == 0) { + std::int64_t strLen{StringLength(buf)}; + status = CopyCharsToDescriptor(res, buf, strLen); + + // Note: if the result string is too short, then we'll return partial + // host name with "too short" error status. + } + + return status; +} + +std::int32_t RTNAME(PutEnv)( + const char *str, size_t str_length, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + + RUNTIME_CHECK(terminator, str && str_length); + + // Note: don't trim the input string, because the user should be able + // to set the value to all spaces if necessary. + + // While Fortran's putenv() extended intrinsic sementics loosly follow + // Linux C library putenv(), don't actually use putenv() on Linux, because + // it takes the passed string pointer and incorporates it into the + // environment without copy. To make this safe, one would have to copy + // the passed string into some allocated memory, but then there's no good + // way to deallocate it. Instead, use the implementation from + // ExecutionEnvironment, which does the right thing for both Windows and + // Linux. + + std::int32_t status{0}; + + // Split the input string into name and value substrings. Note: + // if input string is in "name=value" form, then we set variable "name" with + // value "value". If the input string is in "name=" form, then we delete + // the variable "name". + + const char *str_end = str + str_length; + const char *str_sep = std::find(str, str_end, '='); + if (str_sep == str_end) { + // No separator, invalid input string + status = EINVAL; + } else if ((str_sep + 1) == str_end) { + // "name=" form, which means we need to delete this variable + status = executionEnvironment.UnsetEnv(str, str_sep - str, terminator); + } else { + // Example: consider str "abc=defg", str_length = 8 + // + // addr: 05 06 07 08 09 10 11 12 13 + // str@addr: a b c = d e f g ?? + // + // str = 5, str_end = 13, str_sep = 8, name length: str_sep - str = 3 + // value ptr: str_sep + 1 = 9, value length: 4 + // + status = executionEnvironment.SetEnv( + str, str_sep - str, str_sep + 1, str_end - str_sep - 1, terminator); + } + + return status; +} + +std::int32_t RTNAME(Unlink)( + const char *str, size_t strLength, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + + auto pathLength = TrimTrailingSpaces(str, strLength); + auto path = SaveDefaultCharacter(str, pathLength, terminator); + + std::int32_t status{0}; + + if (unlink(path.get()) != 0) { + status = errno; + } + + return status; +} + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-powi.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-powi.cpp new file mode 100644 index 00000000000..a561d114591 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-powi.cpp @@ -0,0 +1,171 @@ +//===-- lib/runtime/complex-powi.cpp ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Common/float128.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/entry-names.h" +#include <cstdint> +#include <cstdio> +#include <limits> + +namespace Fortran::runtime { +#ifdef __clang_major__ +#pragma clang diagnostic ignored "-Wc99-extensions" +#endif + +template <typename C, typename I> C tgpowi(C base, I exp) { + if (exp == 0) { + return C{1}; + } + + bool invertResult{exp < 0}; + bool isMin{exp == std::numeric_limits<I>::min()}; + + if (isMin) { + exp = std::numeric_limits<I>::max(); + } + + if (exp < 0) { + exp = exp * -1; + } + + C origBase{base}; + + while ((exp & 1) == 0) { + base *= base; + exp >>= 1; + } + + C acc{base}; + + while (exp > 1) { + exp >>= 1; + base *= base; + if ((exp & 1) == 1) { + acc *= base; + } + } + + if (isMin) { + acc *= origBase; + } + + if (invertResult) { + acc = C{1} / acc; + } + + return acc; +} + +#ifndef _MSC_VER +// With most compilers, C complex is implemented as a builtin type that may have +// specific ABI requirements +extern "C" float _Complex RTNAME(cpowi)(float _Complex base, std::int32_t exp) { + return tgpowi(base, exp); +} + +extern "C" double _Complex RTNAME(zpowi)( + double _Complex base, std::int32_t exp) { + return tgpowi(base, exp); +} + +extern "C" float _Complex RTNAME(cpowk)(float _Complex base, std::int64_t exp) { + return tgpowi(base, exp); +} + +extern "C" double _Complex RTNAME(zpowk)( + double _Complex base, std::int64_t exp) { + return tgpowi(base, exp); +} + +#if HAS_LDBL128 || HAS_FLOAT128 +// Duplicate CFloat128ComplexType definition from flang/Common/float128.h. +// float128.h does not define it for C++, because _Complex triggers +// c99-extension warnings. We decided to disable warnings for this +// particular file, so we can use _Complex here. +#if HAS_LDBL128 +typedef long double _Complex Qcomplex; +#elif HAS_FLOAT128 +#if !defined(_ARCH_PPC) || defined(__LONG_DOUBLE_IEEE128__) +typedef _Complex float __attribute__((mode(TC))) Qcomplex; +#else +typedef _Complex float __attribute__((mode(KC))) Qcomplex; +#endif +#endif + +extern "C" Qcomplex RTNAME(cqpowi)(Qcomplex base, std::int32_t exp) { + return tgpowi(base, exp); +} +extern "C" Qcomplex RTNAME(cqpowk)(Qcomplex base, std::int64_t exp) { + return tgpowi(base, exp); +} +#endif + +#else +// on MSVC, C complex is always just a struct of two members as it is not +// supported as a builtin type. So we use C++ complex here as that has the +// same ABI and layout. See: +// https://learn.microsoft.com/en-us/cpp/c-runtime-library/complex-math-support +#include <complex> + +// MSVC doesn't allow including <ccomplex> or <complex.h> in C++17 mode to get +// the Windows definitions of these structs so just redefine here. +struct Fcomplex { + CppTypeFor<TypeCategory::Real, 4> re; + CppTypeFor<TypeCategory::Real, 4> im; +}; + +struct Dcomplex { + CppTypeFor<TypeCategory::Real, 8> re; + CppTypeFor<TypeCategory::Real, 8> im; +}; + +extern "C" Fcomplex RTNAME(cpowi)(Fcomplex base, std::int32_t exp) { + auto cppbase = *(CppTypeFor<TypeCategory::Complex, 4> *)(&base); + auto cppres = tgpowi(cppbase, exp); + return *(Fcomplex *)(&cppres); +} + +extern "C" Dcomplex RTNAME(zpowi)(Dcomplex base, std::int32_t exp) { + auto cppbase = *(CppTypeFor<TypeCategory::Complex, 8> *)(&base); + auto cppres = tgpowi(cppbase, exp); + return *(Dcomplex *)(&cppres); +} + +extern "C" Fcomplex RTNAME(cpowk)(Fcomplex base, std::int64_t exp) { + auto cppbase = *(CppTypeFor<TypeCategory::Complex, 4> *)(&base); + auto cppres = tgpowi(cppbase, exp); + return *(Fcomplex *)(&cppres); +} + +extern "C" Dcomplex RTNAME(zpowk)(Dcomplex base, std::int64_t exp) { + auto cppbase = *(CppTypeFor<TypeCategory::Complex, 8> *)(&base); + auto cppres = tgpowi(cppbase, exp); + return *(Dcomplex *)(&cppres); +} + +#if HAS_LDBL128 || HAS_FLOAT128 +struct Qcomplex { + CFloat128Type re; + CFloat128Type im; +}; + +extern "C" Dcomplex RTNAME(cqpowi)(Qcomplex base, std::int32_t exp) { + auto cppbase = *(rtcmplx::complex<CFloat128Type> *)(&base); + auto cppres = tgpowi(cppbase, exp); + return *(Qcomplex *)(&cppres); +} + +extern "C" Dcomplex RTNAME(cqpowk)(Qcomplex base, std::int64_t exp) { + auto cppbase = *(rtcmplx::complex<CFloat128Type> *)(&base); + auto cppres = tgpowi(cppbase, exp); + return *(Qcomplex *)(&cppres); +} +#endif +#endif +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-reduction.c b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-reduction.c new file mode 100644 index 00000000000..967f26c05e7 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-reduction.c @@ -0,0 +1,194 @@ +/*===-- lib/flang_rt/complex-reduction.c ----------------------------*- C -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ + +#include "complex-reduction.h" +#include <float.h> + +struct CppComplexFloat { + float r, i; +}; +struct CppComplexDouble { + double r, i; +}; +struct CppComplexLongDouble { + long double r, i; +}; +#if HAS_LDBL128 || HAS_FLOAT128 +struct CppComplexFloat128 { + CFloat128Type r, i; +}; +#endif + +/* Not all environments define CMPLXF, CMPLX, CMPLXL. */ + +#ifndef CMPLXF +#if defined(__clang_major__) && (__clang_major__ >= 12) +#define CMPLXF __builtin_complex +#else +static float_Complex_t CMPLXF(float r, float i) { + union { + struct CppComplexFloat x; + float_Complex_t result; + } u; + u.x.r = r; + u.x.i = i; + return u.result; +} +#endif +#endif + +#ifndef CMPLX +#if defined(__clang_major__) && (__clang_major__ >= 12) +#define CMPLX __builtin_complex +#else +static double_Complex_t CMPLX(double r, double i) { + union { + struct CppComplexDouble x; + double_Complex_t result; + } u; + u.x.r = r; + u.x.i = i; + return u.result; +} +#endif +#endif + +#ifndef CMPLXL +#if defined(__clang_major__) && (__clang_major__ >= 12) +#define CMPLXL __builtin_complex +#else +static long_double_Complex_t CMPLXL(long double r, long double i) { + union { + struct CppComplexLongDouble x; + long_double_Complex_t result; + } u; + u.x.r = r; + u.x.i = i; + return u.result; +} +#endif +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +#ifndef CMPLXF128 +/* + * GCC 7.4.0 (currently minimum GCC version for llvm builds) + * supports __builtin_complex. For Clang, require >=12.0. + * Otherwise, rely on the memory layout compatibility. + */ +#if (defined(__clang_major__) && (__clang_major__ >= 12)) || \ + (defined(__GNUC__) && !defined(__clang__)) +#define CMPLXF128 __builtin_complex +#else +static CFloat128ComplexType CMPLXF128(CFloat128Type r, CFloat128Type i) { + union { + struct CppComplexFloat128 x; + CFloat128ComplexType result; + } u; + u.x.r = r; + u.x.i = i; + return u.result; +} +#endif +#endif +#endif + +/* RTNAME(SumComplex4) calls RTNAME(CppSumComplex4) with the same arguments + * and converts the members of its C++ complex result to C _Complex. + */ + +#define CPP_NAME(name) Cpp##name +#define ADAPT_REDUCTION(name, cComplex, cpptype, cmplxMacro, ARGS, ARG_NAMES) \ + struct cpptype RTNAME(CPP_NAME(name))(struct cpptype *, ARGS); \ + cComplex RTNAME(name)(ARGS) { \ + struct cpptype result; \ + RTNAME(CPP_NAME(name))(&result, ARG_NAMES); \ + return cmplxMacro(result.r, result.i); \ + } + +/* TODO: COMPLEX(2 & 3) */ + +/* SUM() */ +ADAPT_REDUCTION(SumComplex4, float_Complex_t, CppComplexFloat, CMPLXF, + REDUCTION_ARGS, REDUCTION_ARG_NAMES) +ADAPT_REDUCTION(SumComplex8, double_Complex_t, CppComplexDouble, CMPLX, + REDUCTION_ARGS, REDUCTION_ARG_NAMES) +#if HAS_FLOAT80 +ADAPT_REDUCTION(SumComplex10, long_double_Complex_t, CppComplexLongDouble, + CMPLXL, REDUCTION_ARGS, REDUCTION_ARG_NAMES) +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +ADAPT_REDUCTION(SumComplex16, CFloat128ComplexType, CppComplexFloat128, + CMPLXF128, REDUCTION_ARGS, REDUCTION_ARG_NAMES) +#endif + +/* PRODUCT() */ +ADAPT_REDUCTION(ProductComplex4, float_Complex_t, CppComplexFloat, CMPLXF, + REDUCTION_ARGS, REDUCTION_ARG_NAMES) +ADAPT_REDUCTION(ProductComplex8, double_Complex_t, CppComplexDouble, CMPLX, + REDUCTION_ARGS, REDUCTION_ARG_NAMES) +#if HAS_FLOAT80 +ADAPT_REDUCTION(ProductComplex10, long_double_Complex_t, CppComplexLongDouble, + CMPLXL, REDUCTION_ARGS, REDUCTION_ARG_NAMES) +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +ADAPT_REDUCTION(ProductComplex16, CFloat128ComplexType, CppComplexFloat128, + CMPLXF128, REDUCTION_ARGS, REDUCTION_ARG_NAMES) +#endif + +/* DOT_PRODUCT() */ +ADAPT_REDUCTION(DotProductComplex4, float_Complex_t, CppComplexFloat, CMPLXF, + DOT_PRODUCT_ARGS, DOT_PRODUCT_ARG_NAMES) +ADAPT_REDUCTION(DotProductComplex8, double_Complex_t, CppComplexDouble, CMPLX, + DOT_PRODUCT_ARGS, DOT_PRODUCT_ARG_NAMES) +#if HAS_FLOAT80 +ADAPT_REDUCTION(DotProductComplex10, long_double_Complex_t, + CppComplexLongDouble, CMPLXL, DOT_PRODUCT_ARGS, DOT_PRODUCT_ARG_NAMES) +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +ADAPT_REDUCTION(DotProductComplex16, CFloat128ComplexType, CppComplexFloat128, + CMPLXF128, DOT_PRODUCT_ARGS, DOT_PRODUCT_ARG_NAMES) +#endif + +/* REDUCE() */ +#define RARGS REDUCE_ARGS(float_Complex_t, float_Complex_t_ref_op) +ADAPT_REDUCTION(ReduceComplex4Ref, float_Complex_t, CppComplexFloat, CMPLXF, + RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#define RARGS REDUCE_ARGS(float_Complex_t, float_Complex_t_value_op) +ADAPT_REDUCTION(ReduceComplex4Value, float_Complex_t, CppComplexFloat, CMPLXF, + RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#define RARGS REDUCE_ARGS(double_Complex_t, double_Complex_t_ref_op) +ADAPT_REDUCTION(ReduceComplex8Ref, double_Complex_t, CppComplexDouble, CMPLX, + RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#define RARGS REDUCE_ARGS(double_Complex_t, double_Complex_t_value_op) +ADAPT_REDUCTION(ReduceComplex8Value, double_Complex_t, CppComplexDouble, CMPLX, + RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#if HAS_FLOAT80 +#define RARGS REDUCE_ARGS(long_double_Complex_t, long_double_Complex_t_ref_op) +ADAPT_REDUCTION(ReduceComplex10Ref, long_double_Complex_t, CppComplexLongDouble, + CMPLXL, RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#define RARGS REDUCE_ARGS(long_double_Complex_t, long_double_Complex_t_value_op) +ADAPT_REDUCTION(ReduceComplex10Value, long_double_Complex_t, + CppComplexLongDouble, CMPLXL, RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +#define RARGS REDUCE_ARGS(CFloat128ComplexType, CFloat128ComplexType_ref_op) +ADAPT_REDUCTION(ReduceComplex16Ref, CFloat128ComplexType, CppComplexFloat128, + CMPLXF128, RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#define RARGS REDUCE_ARGS(CFloat128ComplexType, CFloat128ComplexType_value_op) +ADAPT_REDUCTION(ReduceComplex16Value, CFloat128ComplexType, CppComplexFloat128, + CMPLXF128, RARGS, REDUCE_ARG_NAMES) +#undef RARGS +#endif diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-reduction.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-reduction.h new file mode 100644 index 00000000000..44c52fb02fa --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/complex-reduction.h @@ -0,0 +1,158 @@ +/*===-- lib/runtime/complex-reduction.h -----------------------------*- C -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ + +/* Wraps the C++-coded complex-valued SUM and PRODUCT reductions with + * C-coded wrapper functions returning _Complex values, to avoid problems + * with C++ build compilers that don't support C's _Complex. + */ + +#ifndef FLANG_RT_RUNTIME_COMPLEX_REDUCTION_H_ +#define FLANG_RT_RUNTIME_COMPLEX_REDUCTION_H_ + +#include "flang/Common/float128.h" +#include "flang/Runtime/entry-names.h" +#include <complex.h> + +struct CppDescriptor; /* dummy type name for Fortran::runtime::Descriptor */ + +#if defined(_MSC_VER) && !(defined(__clang_major__) && __clang_major__ >= 12) +typedef _Fcomplex float_Complex_t; +typedef _Dcomplex double_Complex_t; +typedef _Lcomplex long_double_Complex_t; +#else +typedef float _Complex float_Complex_t; +typedef double _Complex double_Complex_t; +typedef long double _Complex long_double_Complex_t; +#endif + +#define REDUCTION_ARGS \ + const struct CppDescriptor *x, const char *source, int line, int dim /*=0*/, \ + const struct CppDescriptor *mask /*=NULL*/ +#define REDUCTION_ARG_NAMES x, source, line, dim, mask + +float_Complex_t RTNAME(SumComplex2)(REDUCTION_ARGS); +float_Complex_t RTNAME(SumComplex3)(REDUCTION_ARGS); +float_Complex_t RTNAME(SumComplex4)(REDUCTION_ARGS); +double_Complex_t RTNAME(SumComplex8)(REDUCTION_ARGS); +long_double_Complex_t RTNAME(SumComplex10)(REDUCTION_ARGS); +#if HAS_LDBL128 || HAS_FLOAT128 +CFloat128ComplexType RTNAME(SumComplex16)(REDUCTION_ARGS); +#endif + +float_Complex_t RTNAME(ProductComplex2)(REDUCTION_ARGS); +float_Complex_t RTNAME(ProductComplex3)(REDUCTION_ARGS); +float_Complex_t RTNAME(ProductComplex4)(REDUCTION_ARGS); +double_Complex_t RTNAME(ProductComplex8)(REDUCTION_ARGS); +long_double_Complex_t RTNAME(ProductComplex10)(REDUCTION_ARGS); +#if HAS_LDBL128 || HAS_FLOAT128 +CFloat128ComplexType RTNAME(ProductComplex16)(REDUCTION_ARGS); +#endif + +#define DOT_PRODUCT_ARGS \ + const struct CppDescriptor *x, const struct CppDescriptor *y, \ + const char *source, int line, int dim /*=0*/, \ + const struct CppDescriptor *mask /*=NULL*/ +#define DOT_PRODUCT_ARG_NAMES x, y, source, line, dim, mask + +float_Complex_t RTNAME(DotProductComplex2)(DOT_PRODUCT_ARGS); +float_Complex_t RTNAME(DotProductComplex3)(DOT_PRODUCT_ARGS); +float_Complex_t RTNAME(DotProductComplex4)(DOT_PRODUCT_ARGS); +double_Complex_t RTNAME(DotProductComplex8)(DOT_PRODUCT_ARGS); +long_double_Complex_t RTNAME(DotProductComplex10)(DOT_PRODUCT_ARGS); +#if HAS_LDBL128 || HAS_FLOAT128 +CFloat128ComplexType RTNAME(DotProductComplex16)(DOT_PRODUCT_ARGS); +#endif + +#define REDUCE_ARGS(T, OP) \ + OP operation, const struct CppDescriptor *x, const struct CppDescriptor *y, \ + const char *source, int line, int dim /*=0*/, \ + const struct CppDescriptor *mask /*=NULL*/, const T *identity /*=NULL*/, \ + _Bool ordered /*=true*/ +#define REDUCE_ARG_NAMES \ + operation, x, y, source, line, dim, mask, identity, ordered + +typedef float_Complex_t (*float_Complex_t_ref_op)( + const float_Complex_t *, const float_Complex_t *); +typedef float_Complex_t (*float_Complex_t_value_op)( + float_Complex_t, float_Complex_t); +typedef double_Complex_t (*double_Complex_t_ref_op)( + const double_Complex_t *, const double_Complex_t *); +typedef double_Complex_t (*double_Complex_t_value_op)( + double_Complex_t, double_Complex_t); +typedef long_double_Complex_t (*long_double_Complex_t_ref_op)( + const long_double_Complex_t *, const long_double_Complex_t *); +typedef long_double_Complex_t (*long_double_Complex_t_value_op)( + long_double_Complex_t, long_double_Complex_t); + +float_Complex_t RTNAME(ReduceComplex2Ref)( + REDUCE_ARGS(float_Complex_t, float_Complex_t_ref_op)); +float_Complex_t RTNAME(ReduceComplex2Value)( + REDUCE_ARGS(float_Complex_t, float_Complex_t_value_op)); +float_Complex_t RTNAME(ReduceComplex3Ref)( + REDUCE_ARGS(float_Complex_t, float_Complex_t_ref_op)); +float_Complex_t RTNAME(ReduceComplex3Value)( + REDUCE_ARGS(float_Complex_t, float_Complex_t_value_op)); +float_Complex_t RTNAME(ReduceComplex4Ref)( + REDUCE_ARGS(float_Complex_t, float_Complex_t_ref_op)); +float_Complex_t RTNAME(ReduceComplex4Value)( + REDUCE_ARGS(float_Complex_t, float_Complex_t_value_op)); +double_Complex_t RTNAME(ReduceComplex8Ref)( + REDUCE_ARGS(double_Complex_t, double_Complex_t_ref_op)); +double_Complex_t RTNAME(ReduceComplex8Value)( + REDUCE_ARGS(double_Complex_t, double_Complex_t_value_op)); +long_double_Complex_t RTNAME(ReduceComplex10Ref)( + REDUCE_ARGS(long_double_Complex_t, long_double_Complex_t_ref_op)); +long_double_Complex_t RTNAME(ReduceComplex10Value)( + REDUCE_ARGS(long_double_Complex_t, long_double_Complex_t_value_op)); +#if HAS_LDBL128 || HAS_FLOAT128 +typedef CFloat128ComplexType (*CFloat128ComplexType_ref_op)( + const CFloat128ComplexType *, const CFloat128ComplexType *); +typedef CFloat128ComplexType (*CFloat128ComplexType_value_op)( + CFloat128ComplexType, CFloat128ComplexType); +CFloat128ComplexType RTNAME(ReduceComplex16Ref)( + REDUCE_ARGS(CFloat128ComplexType, CFloat128ComplexType_ref_op)); +CFloat128ComplexType RTNAME(ReduceComplex16Value)( + REDUCE_ARGS(CFloat128ComplexType, CFloat128ComplexType_value_op)); +#endif + +#define REDUCE_DIM_ARGS(T, OP) \ + struct CppDescriptor *result, OP operation, const struct CppDescriptor *x, \ + const struct CppDescriptor *y, const char *source, int line, int dim, \ + const struct CppDescriptor *mask /*=NULL*/, const T *identity /*=NULL*/, \ + _Bool ordered /*=true*/ +#define REDUCE_DIM_ARG_NAMES \ + result, operation, x, y, source, line, dim, mask, identity, ordered + +void RTNAME(ReduceComplex2DimRef)( + REDUCE_DIM_ARGS(float_Complex_t, float_Complex_t_ref_op)); +void RTNAME(ReduceComplex2DimValue)( + REDUCE_DIM_ARGS(float_Complex_t, float_Complex_t_value_op)); +void RTNAME(ReduceComplex3DimRef)( + REDUCE_DIM_ARGS(float_Complex_t, float_Complex_t_ref_op)); +void RTNAME(ReduceComplex3DimValue)( + REDUCE_DIM_ARGS(float_Complex_t, float_Complex_t_value_op)); +void RTNAME(ReduceComplex4DimRef)( + REDUCE_DIM_ARGS(float_Complex_t, float_Complex_t_ref_op)); +void RTNAME(ReduceComplex4DimValue)( + REDUCE_DIM_ARGS(float_Complex_t, float_Complex_t_value_op)); +void RTNAME(ReduceComplex8DimRef)( + REDUCE_DIM_ARGS(double_Complex_t, double_Complex_t_ref_op)); +void RTNAME(ReduceComplex8DimValue)( + REDUCE_DIM_ARGS(double_Complex_t, double_Complex_t_value_op)); +void RTNAME(ReduceComplex10DimRef)( + REDUCE_DIM_ARGS(long_double_Complex_t, long_double_Complex_t_ref_op)); +void RTNAME(ReduceComplex10DimValue)( + REDUCE_DIM_ARGS(long_double_Complex_t, long_double_Complex_t_value_op)); +#if HAS_LDBL128 || HAS_FLOAT128 +void RTNAME(ReduceComplex16DimRef)( + REDUCE_DIM_ARGS(CFloat128ComplexType, CFloat128ComplexType_ref_op)); +void RTNAME(ReduceComplex16DimValue)( + REDUCE_DIM_ARGS(CFloat128ComplexType, CFloat128ComplexType_value_op)); +#endif + +#endif // FLANG_RT_RUNTIME_COMPLEX_REDUCTION_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/connection.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/connection.cpp new file mode 100644 index 00000000000..2e02717f542 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/connection.cpp @@ -0,0 +1,36 @@ +//===-- lib/runtime/connection.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/connection.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/io-stmt.h" + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +SavedPosition::SavedPosition(IoStatementState &io) : io_{io} { + ConnectionState &conn{io_.GetConnectionState()}; + saved_ = conn; + conn.pinnedFrame = true; +} + +SavedPosition::~SavedPosition() { + if (!cancelled_) { + ConnectionState &conn{io_.GetConnectionState()}; + while (conn.currentRecordNumber > saved_.currentRecordNumber) { + io_.BackspaceRecord(); + } + conn.leftTabLimit = saved_.leftTabLimit; + conn.furthestPositionInRecord = saved_.furthestPositionInRecord; + conn.positionInRecord = saved_.positionInRecord; + conn.pinnedFrame = saved_.pinnedFrame; + } +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/copy.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/copy.cpp new file mode 100644 index 00000000000..f990f46e0be --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/copy.cpp @@ -0,0 +1,215 @@ +//===-- lib/runtime/copy.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "copy.h" +#include "stack.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Runtime/allocatable.h" +#include <cstring> + +namespace Fortran::runtime { +namespace { +using StaticDescTy = StaticDescriptor<maxRank, true, 0>; + +// A structure describing the data copy that needs to be done +// from one descriptor to another. It is a helper structure +// for CopyElement. +struct CopyDescriptor { + // A constructor specifying all members explicitly. + // The toAt and fromAt specify subscript storages that might be + // external to CopyElement, and cannot be modified. + // The copy descriptor only establishes toAtPtr_ and fromAtPtr_ + // pointers to point to these storages. + RT_API_ATTRS CopyDescriptor(const Descriptor &to, const SubscriptValue toAt[], + const Descriptor &from, const SubscriptValue fromAt[], + std::size_t elements, bool usesStaticDescriptors = false) + : to_(to), from_(from), elements_(elements), + usesStaticDescriptors_(usesStaticDescriptors) { + toAtPtr_ = toAt; + fromAtPtr_ = fromAt; + } + // The number of elements to copy is initialized from the to descriptor. + // The current element subscripts are initialized from the lower bounds + // of the to and from descriptors. + RT_API_ATTRS CopyDescriptor(const Descriptor &to, const Descriptor &from, + bool usesStaticDescriptors = false) + : to_(to), from_(from), elements_(to.Elements()), + usesStaticDescriptors_(usesStaticDescriptors) { + to.GetLowerBounds(toAt_); + from.GetLowerBounds(fromAt_); + } + + // Increment the toAt_ and fromAt_ subscripts to the next + // element. + RT_API_ATTRS void IncrementSubscripts(Terminator &terminator) { + // This method must not be called for copy descriptors + // using external non-modifiable subscript storage. + RUNTIME_CHECK(terminator, toAt_ == toAtPtr_ && fromAt_ == fromAtPtr_); + to_.IncrementSubscripts(toAt_); + from_.IncrementSubscripts(fromAt_); + } + + // Descriptor of the destination. + const Descriptor &to_; + // A subscript specifying the current element position to copy to. + SubscriptValue toAt_[maxRank]; + // A pointer to the storage of the 'to' subscript. + // It may point to toAt_ or to an external non-modifiable + // subscript storage. + const SubscriptValue *toAtPtr_{toAt_}; + // Descriptor of the source. + const Descriptor &from_; + // A subscript specifying the current element position to copy from. + SubscriptValue fromAt_[maxRank]; + // A pointer to the storage of the 'from' subscript. + // It may point to fromAt_ or to an external non-modifiable + // subscript storage. + const SubscriptValue *fromAtPtr_{fromAt_}; + // Number of elements left to copy. + std::size_t elements_; + // Must be true, if the to and from descriptors are allocated + // by the CopyElement runtime. The allocated memory belongs + // to a separate stack that needs to be popped in correspondence + // with popping such a CopyDescriptor node. + bool usesStaticDescriptors_; +}; + +// A pair of StaticDescTy elements. +struct StaticDescriptorsPair { + StaticDescTy to; + StaticDescTy from; +}; +} // namespace + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS void CopyElement(const Descriptor &to, const SubscriptValue toAt[], + const Descriptor &from, const SubscriptValue fromAt[], + Terminator &terminator) { + if (!to.Addendum()) { + // Avoid the overhead of creating the work stacks below + // for the simple non-derived type cases, because the overhead + // might be noticeable over the total amount of work that + // needs to be done for the copy. + char *toPtr{to.Element<char>(toAt)}; + char *fromPtr{from.Element<char>(fromAt)}; + RUNTIME_CHECK(terminator, to.ElementBytes() == from.ElementBytes()); + std::memcpy(toPtr, fromPtr, to.ElementBytes()); + return; + } + +#if !defined(RT_DEVICE_COMPILATION) + constexpr unsigned copyStackReserve{16}; + constexpr unsigned descriptorStackReserve{6}; +#else + // Always use dynamic allocation on the device to avoid + // big stack sizes. This may be tuned as needed. + constexpr unsigned copyStackReserve{0}; + constexpr unsigned descriptorStackReserve{0}; +#endif + // Keep a stack of CopyDescriptor's to avoid recursive calls. + Stack<CopyDescriptor, copyStackReserve> copyStack{terminator}; + // Keep a separate stack of StaticDescTy pairs. These descriptors + // may be used for representing copies of Component::Genre::Data + // components (since they do not have their descriptors allocated + // in memory). + Stack<StaticDescriptorsPair, descriptorStackReserve> descriptorsStack{ + terminator}; + copyStack.emplace(to, toAt, from, fromAt, /*elements=*/std::size_t{1}); + + while (!copyStack.empty()) { + CopyDescriptor ¤tCopy{copyStack.top()}; + std::size_t &elements{currentCopy.elements_}; + if (elements == 0) { + // This copy has been exhausted. + if (currentCopy.usesStaticDescriptors_) { + // Pop the static descriptors, if they were used + // for the current copy. + descriptorsStack.pop(); + } + copyStack.pop(); + continue; + } + const Descriptor &curTo{currentCopy.to_}; + const SubscriptValue *curToAt{currentCopy.toAtPtr_}; + const Descriptor &curFrom{currentCopy.from_}; + const SubscriptValue *curFromAt{currentCopy.fromAtPtr_}; + char *toPtr{curTo.Element<char>(curToAt)}; + char *fromPtr{curFrom.Element<char>(curFromAt)}; + RUNTIME_CHECK(terminator, curTo.ElementBytes() == curFrom.ElementBytes()); + // TODO: the memcpy can be optimized when both to and from are contiguous. + // Moreover, if we came here from an Component::Genre::Data component, + // all the per-element copies are redundant, because the parent + // has already been copied as a whole. + std::memcpy(toPtr, fromPtr, curTo.ElementBytes()); + --elements; + if (elements != 0) { + currentCopy.IncrementSubscripts(terminator); + } + + // Deep copy allocatable and automatic components if any. + if (const auto *addendum{curTo.Addendum()}) { + if (const auto *derived{addendum->derivedType()}; + derived && !derived->noDestructionNeeded()) { + RUNTIME_CHECK(terminator, + curFrom.Addendum() && derived == curFrom.Addendum()->derivedType()); + const Descriptor &componentDesc{derived->component()}; + const typeInfo::Component *component{ + componentDesc.OffsetElement<typeInfo::Component>()}; + std::size_t nComponents{componentDesc.Elements()}; + for (std::size_t j{0}; j < nComponents; ++j, ++component) { + if (component->genre() == typeInfo::Component::Genre::Allocatable || + component->genre() == typeInfo::Component::Genre::Automatic) { + Descriptor &toDesc{ + *reinterpret_cast<Descriptor *>(toPtr + component->offset())}; + if (toDesc.raw().base_addr != nullptr) { + toDesc.set_base_addr(nullptr); + RUNTIME_CHECK(terminator, + toDesc.Allocate(/*asyncObject=*/nullptr) == CFI_SUCCESS); + const Descriptor &fromDesc{*reinterpret_cast<const Descriptor *>( + fromPtr + component->offset())}; + copyStack.emplace(toDesc, fromDesc); + } + } else if (component->genre() == typeInfo::Component::Genre::Data && + component->derivedType() && + !component->derivedType()->noDestructionNeeded()) { + SubscriptValue extents[maxRank]; + const typeInfo::Value *bounds{component->bounds()}; + std::size_t elements{1}; + for (int dim{0}; dim < component->rank(); ++dim) { + typeInfo::TypeParameterValue lb{ + bounds[2 * dim].GetValue(&curTo).value_or(0)}; + typeInfo::TypeParameterValue ub{ + bounds[2 * dim + 1].GetValue(&curTo).value_or(0)}; + extents[dim] = ub >= lb ? ub - lb + 1 : 0; + elements *= extents[dim]; + } + if (elements != 0) { + const typeInfo::DerivedType &compType{*component->derivedType()}; + // Place a pair of static descriptors onto the descriptors stack. + descriptorsStack.emplace(); + StaticDescriptorsPair &descs{descriptorsStack.top()}; + Descriptor &toCompDesc{descs.to.descriptor()}; + toCompDesc.Establish(compType, toPtr + component->offset(), + component->rank(), extents); + Descriptor &fromCompDesc{descs.from.descriptor()}; + fromCompDesc.Establish(compType, fromPtr + component->offset(), + component->rank(), extents); + copyStack.emplace(toCompDesc, fromCompDesc, + /*usesStaticDescriptors=*/true); + } + } + } + } + } + } +} +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/copy.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/copy.h new file mode 100644 index 00000000000..836c9d4a1ef --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/copy.h @@ -0,0 +1,25 @@ +//===-- lib/runtime/copy.h --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Utilities that copy data in a type-aware fashion, allocating & duplicating +// allocatable/automatic components of derived types along the way. + +#ifndef FLANG_RT_RUNTIME_COPY_H_ +#define FLANG_RT_RUNTIME_COPY_H_ + +#include "flang-rt/runtime/descriptor.h" + +namespace Fortran::runtime { + +// Assigns to uninitialized storage. +// Duplicates allocatable & automatic components. +RT_API_ATTRS void CopyElement(const Descriptor &to, const SubscriptValue toAt[], + const Descriptor &from, const SubscriptValue fromAt[], Terminator &); + +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_COPY_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/derived-api.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/derived-api.cpp new file mode 100644 index 00000000000..bb08e0397fe --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/derived-api.cpp @@ -0,0 +1,159 @@ +//===-- lib/runtime/derived-api.cpp -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/derived-api.h" +#include "flang-rt/runtime/derived.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/type-info.h" + +namespace Fortran::runtime { + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(Initialize)( + const Descriptor &descriptor, const char *sourceFile, int sourceLine) { + if (const DescriptorAddendum * addendum{descriptor.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noInitializationNeeded()) { + Terminator terminator{sourceFile, sourceLine}; + Initialize(descriptor, *derived, terminator); + } + } + } +} + +void RTDEF(InitializeClone)(const Descriptor &clone, const Descriptor &orig, + const char *sourceFile, int sourceLine) { + if (const DescriptorAddendum * addendum{clone.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + Terminator terminator{sourceFile, sourceLine}; + InitializeClone(clone, orig, *derived, terminator); + } + } +} + +void RTDEF(Destroy)(const Descriptor &descriptor) { + if (const DescriptorAddendum * addendum{descriptor.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noDestructionNeeded()) { + // TODO: Pass source file & line information to the API + // so that a good Terminator can be passed + Destroy(descriptor, true, *derived, nullptr); + } + } + } +} + +void RTDEF(Finalize)( + const Descriptor &descriptor, const char *sourceFile, int sourceLine) { + if (const DescriptorAddendum * addendum{descriptor.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noFinalizationNeeded()) { + Terminator terminator{sourceFile, sourceLine}; + Finalize(descriptor, *derived, &terminator); + } + } + } +} + +bool RTDEF(ClassIs)( + const Descriptor &descriptor, const typeInfo::DerivedType &derivedType) { + if (const DescriptorAddendum * addendum{descriptor.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (derived == &derivedType) { + return true; + } + const typeInfo::DerivedType *parent{derived->GetParentType()}; + while (parent) { + if (parent == &derivedType) { + return true; + } + parent = parent->GetParentType(); + } + } + } + return false; +} + +static RT_API_ATTRS const typeInfo::DerivedType *GetDerivedType( + const Descriptor &desc) { + if (const DescriptorAddendum * addendum{desc.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + return derived; + } + } + return nullptr; +} + +bool RTDEF(SameTypeAs)(const Descriptor &a, const Descriptor &b) { + auto aType{a.raw().type}; + auto bType{b.raw().type}; + if ((aType != CFI_type_struct && aType != CFI_type_other) || + (bType != CFI_type_struct && bType != CFI_type_other)) { + // If either type is intrinsic, they must match. + return aType == bType; + } else if (const typeInfo::DerivedType * derivedTypeA{GetDerivedType(a)}) { + if (const typeInfo::DerivedType * derivedTypeB{GetDerivedType(b)}) { + if (derivedTypeA == derivedTypeB) { + return true; + } else if (const typeInfo::DerivedType * + uninstDerivedTypeA{derivedTypeA->uninstantiatedType()}) { + // There are KIND type parameters, are these the same type if those + // are ignored? + const typeInfo::DerivedType *uninstDerivedTypeB{ + derivedTypeB->uninstantiatedType()}; + return uninstDerivedTypeA == uninstDerivedTypeB; + } + } + } + return false; +} + +bool RTDEF(ExtendsTypeOf)(const Descriptor &a, const Descriptor &mold) { + auto aType{a.raw().type}; + auto moldType{mold.raw().type}; + if ((aType != CFI_type_struct && aType != CFI_type_other) || + (moldType != CFI_type_struct && moldType != CFI_type_other)) { + // If either type is intrinsic, they must match. + return aType == moldType; + } else if (const typeInfo::DerivedType * + derivedTypeMold{GetDerivedType(mold)}) { + // If A is unlimited polymorphic and is either a disassociated pointer or + // unallocated allocatable, the result is false. + // Otherwise if the dynamic type of A or MOLD is extensible, the result is + // true if and only if the dynamic type of A is an extension type of the + // dynamic type of MOLD. + for (const typeInfo::DerivedType *derivedTypeA{GetDerivedType(a)}; + derivedTypeA; derivedTypeA = derivedTypeA->GetParentType()) { + if (derivedTypeA == derivedTypeMold) { + return true; + } + } + return false; + } else { + // MOLD is unlimited polymorphic and unallocated/disassociated. + return true; + } +} + +void RTDEF(DestroyWithoutFinalization)(const Descriptor &descriptor) { + if (const DescriptorAddendum * addendum{descriptor.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noDestructionNeeded()) { + Destroy(descriptor, /*finalize=*/false, *derived, nullptr); + } + } + } +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/derived.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/derived.cpp new file mode 100644 index 00000000000..bb9a68abef2 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/derived.cpp @@ -0,0 +1,489 @@ +//===-- lib/runtime/derived.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/derived.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/type-info.h" +#include "flang-rt/runtime/work-queue.h" + +namespace Fortran::runtime { + +RT_OFFLOAD_API_GROUP_BEGIN + +// Fill "extents" array with the extents of component "comp" from derived type +// instance "derivedInstance". +static RT_API_ATTRS void GetComponentExtents(SubscriptValue (&extents)[maxRank], + const typeInfo::Component &comp, const Descriptor &derivedInstance) { + const typeInfo::Value *bounds{comp.bounds()}; + for (int dim{0}; dim < comp.rank(); ++dim) { + auto lb{bounds[2 * dim].GetValue(&derivedInstance).value_or(0)}; + auto ub{bounds[2 * dim + 1].GetValue(&derivedInstance).value_or(0)}; + extents[dim] = ub >= lb ? static_cast<SubscriptValue>(ub - lb + 1) : 0; + } +} + +RT_API_ATTRS int Initialize(const Descriptor &instance, + const typeInfo::DerivedType &derived, Terminator &terminator, bool, + const Descriptor *) { + WorkQueue workQueue{terminator}; + int status{workQueue.BeginInitialize(instance, derived)}; + return status == StatContinue ? workQueue.Run() : status; +} + +RT_API_ATTRS int InitializeTicket::Begin(WorkQueue &) { + if (elements_ == 0) { + return StatOk; + } else { + // Initialize procedure pointer components in the first element, + // whence they will be copied later into all others. + const Descriptor &procPtrDesc{derived_.procPtr()}; + std::size_t numProcPtrs{procPtrDesc.InlineElements()}; + char *raw{instance_.OffsetElement<char>()}; + const auto *ppComponent{ + procPtrDesc.OffsetElement<typeInfo::ProcPtrComponent>()}; + for (std::size_t k{0}; k < numProcPtrs; ++k, ++ppComponent) { + auto &pptr{*reinterpret_cast<typeInfo::ProcedurePointer *>( + raw + ppComponent->offset)}; + pptr = ppComponent->procInitialization; + } + return StatContinue; + } +} + +RT_API_ATTRS int InitializeTicket::Continue(WorkQueue &workQueue) { + // Initialize the data components of the first element. + char *rawInstance{instance_.OffsetElement<char>()}; + for (; !Componentwise::IsComplete(); SkipToNextComponent()) { + char *rawComponent{rawInstance + component_->offset()}; + if (component_->genre() == typeInfo::Component::Genre::Allocatable) { + Descriptor &allocDesc{*reinterpret_cast<Descriptor *>(rawComponent)}; + component_->EstablishDescriptor( + allocDesc, instance_, workQueue.terminator()); + } else if (const void *init{component_->initialization()}) { + // Explicit initialization of data pointers and + // non-allocatable non-automatic components + std::size_t bytes{component_->SizeInBytes(instance_)}; + std::memcpy(rawComponent, init, bytes); + } else if (component_->genre() == typeInfo::Component::Genre::Pointer) { + // Data pointers without explicit initialization are established + // so that they are valid right-hand side targets of pointer + // assignment statements. + Descriptor &ptrDesc{*reinterpret_cast<Descriptor *>(rawComponent)}; + component_->EstablishDescriptor( + ptrDesc, instance_, workQueue.terminator()); + } else if (component_->genre() == typeInfo::Component::Genre::Data && + component_->derivedType() && + !component_->derivedType()->noInitializationNeeded()) { + // Default initialization of non-pointer non-allocatable/automatic + // data component. Handles parent component's elements. + SubscriptValue extents[maxRank]; + GetComponentExtents(extents, *component_, instance_); + Descriptor &compDesc{componentDescriptor_.descriptor()}; + const typeInfo::DerivedType &compType{*component_->derivedType()}; + compDesc.Establish(compType, rawComponent, component_->rank(), extents); + if (int status{workQueue.BeginInitialize(compDesc, compType)}; + status != StatOk) { + SkipToNextComponent(); + return status; + } + } + } + // The first element is now complete. Copy it into the others. + if (elements_ < 2) { + } else { + auto elementBytes{static_cast<SubscriptValue>(instance_.ElementBytes())}; + if (auto stride{instance_.FixedStride()}) { + if (*stride == elementBytes) { // contiguous + for (std::size_t done{1}; done < elements_;) { + std::size_t chunk{elements_ - done}; + if (chunk > done) { + chunk = done; + } + char *uninitialized{rawInstance + done * *stride}; + std::memcpy(uninitialized, rawInstance, chunk * *stride); + done += chunk; + } + } else { + for (std::size_t done{1}; done < elements_; ++done) { + char *uninitialized{rawInstance + done * *stride}; + std::memcpy(uninitialized, rawInstance, elementBytes); + } + } + } else { // one at a time with subscription + for (Elementwise::Advance(); !Elementwise::IsComplete(); + Elementwise::Advance()) { + char *element{instance_.Element<char>(subscripts_)}; + std::memcpy(element, rawInstance, elementBytes); + } + } + } + return StatOk; +} + +RT_API_ATTRS int InitializeClone(const Descriptor &clone, + const Descriptor &original, const typeInfo::DerivedType &derived, + Terminator &terminator, bool hasStat, const Descriptor *errMsg) { + if (original.IsPointer() || !original.IsAllocated()) { + return StatOk; // nothing to do + } else { + WorkQueue workQueue{terminator}; + int status{workQueue.BeginInitializeClone( + clone, original, derived, hasStat, errMsg)}; + return status == StatContinue ? workQueue.Run() : status; + } +} + +RT_API_ATTRS int InitializeCloneTicket::Continue(WorkQueue &workQueue) { + while (!IsComplete()) { + if (component_->genre() == typeInfo::Component::Genre::Allocatable) { + Descriptor &origDesc{*instance_.ElementComponent<Descriptor>( + subscripts_, component_->offset())}; + if (origDesc.IsAllocated()) { + Descriptor &cloneDesc{*clone_.ElementComponent<Descriptor>( + subscripts_, component_->offset())}; + if (phase_ == 0) { + ++phase_; + cloneDesc.ApplyMold(origDesc, origDesc.rank()); + if (int stat{ReturnError(workQueue.terminator(), + cloneDesc.Allocate(kNoAsyncObject), errMsg_, hasStat_)}; + stat != StatOk) { + return stat; + } + if (const DescriptorAddendum *addendum{cloneDesc.Addendum()}) { + if (const typeInfo::DerivedType *derived{addendum->derivedType()}) { + if (!derived->noInitializationNeeded()) { + // Perform default initialization for the allocated element. + if (int status{workQueue.BeginInitialize(cloneDesc, *derived)}; + status != StatOk) { + return status; + } + } + } + } + } + if (phase_ == 1) { + ++phase_; + if (const DescriptorAddendum *addendum{cloneDesc.Addendum()}) { + if (const typeInfo::DerivedType *derived{addendum->derivedType()}) { + // Initialize derived type's allocatables. + if (int status{workQueue.BeginInitializeClone( + cloneDesc, origDesc, *derived, hasStat_, errMsg_)}; + status != StatOk) { + return status; + } + } + } + } + } + Advance(); + } else if (component_->genre() == typeInfo::Component::Genre::Data) { + if (component_->derivedType()) { + // Handle nested derived types. + const typeInfo::DerivedType &compType{*component_->derivedType()}; + SubscriptValue extents[maxRank]; + GetComponentExtents(extents, *component_, instance_); + Descriptor &origDesc{componentDescriptor_.descriptor()}; + Descriptor &cloneDesc{cloneComponentDescriptor_.descriptor()}; + origDesc.Establish(compType, + instance_.ElementComponent<char>(subscripts_, component_->offset()), + component_->rank(), extents); + cloneDesc.Establish(compType, + clone_.ElementComponent<char>(subscripts_, component_->offset()), + component_->rank(), extents); + Advance(); + if (int status{workQueue.BeginInitializeClone( + cloneDesc, origDesc, compType, hasStat_, errMsg_)}; + status != StatOk) { + return status; + } + } else { + SkipToNextComponent(); + } + } else { + SkipToNextComponent(); + } + } + return StatOk; +} + +// Fortran 2018 subclause 7.5.6.2 +RT_API_ATTRS void Finalize(const Descriptor &descriptor, + const typeInfo::DerivedType &derived, Terminator *terminator) { + if (!derived.noFinalizationNeeded() && descriptor.IsAllocated()) { + Terminator stubTerminator{"Finalize() in Fortran runtime", 0}; + WorkQueue workQueue{terminator ? *terminator : stubTerminator}; + if (workQueue.BeginFinalize(descriptor, derived) == StatContinue) { + workQueue.Run(); + } + } +} + +static RT_API_ATTRS const typeInfo::SpecialBinding *FindFinal( + const typeInfo::DerivedType &derived, int rank) { + if (const auto *ranked{derived.FindSpecialBinding( + typeInfo::SpecialBinding::RankFinal(rank))}) { + return ranked; + } else if (const auto *assumed{derived.FindSpecialBinding( + typeInfo::SpecialBinding::Which::AssumedRankFinal)}) { + return assumed; + } else { + return derived.FindSpecialBinding( + typeInfo::SpecialBinding::Which::ElementalFinal); + } +} + +static RT_API_ATTRS void CallFinalSubroutine(const Descriptor &descriptor, + const typeInfo::DerivedType &derived, Terminator &terminator) { + if (const auto *special{FindFinal(derived, descriptor.rank())}) { + if (special->which() == typeInfo::SpecialBinding::Which::ElementalFinal) { + std::size_t elements{descriptor.InlineElements()}; + SubscriptValue at[maxRank]; + descriptor.GetLowerBounds(at); + if (special->IsArgDescriptor(0)) { + StaticDescriptor<maxRank, true, 8 /*?*/> statDesc; + Descriptor &elemDesc{statDesc.descriptor()}; + elemDesc = descriptor; + elemDesc.raw().attribute = CFI_attribute_pointer; + elemDesc.raw().rank = 0; + auto *p{special->GetProc<void (*)(const Descriptor &)>()}; + for (std::size_t j{0}; j++ < elements; + descriptor.IncrementSubscripts(at)) { + elemDesc.set_base_addr(descriptor.Element<char>(at)); + p(elemDesc); + } + } else { + auto *p{special->GetProc<void (*)(char *)>()}; + for (std::size_t j{0}; j++ < elements; + descriptor.IncrementSubscripts(at)) { + p(descriptor.Element<char>(at)); + } + } + } else { + StaticDescriptor<maxRank, true, 10> statDesc; + Descriptor ©{statDesc.descriptor()}; + const Descriptor *argDescriptor{&descriptor}; + if (descriptor.rank() > 0 && special->IsArgContiguous(0) && + !descriptor.IsContiguous()) { + // The FINAL subroutine demands a contiguous array argument, but + // this INTENT(OUT) or intrinsic assignment LHS isn't contiguous. + // Finalize a shallow copy of the data. + copy = descriptor; + copy.set_base_addr(nullptr); + copy.raw().attribute = CFI_attribute_allocatable; + RUNTIME_CHECK(terminator, copy.Allocate(kNoAsyncObject) == CFI_SUCCESS); + ShallowCopyDiscontiguousToContiguous(copy, descriptor); + argDescriptor = © + } + if (special->IsArgDescriptor(0)) { + StaticDescriptor<maxRank, true, 8 /*?*/> statDesc; + Descriptor &tmpDesc{statDesc.descriptor()}; + tmpDesc = *argDescriptor; + tmpDesc.raw().attribute = CFI_attribute_pointer; + tmpDesc.Addendum()->set_derivedType(&derived); + auto *p{special->GetProc<void (*)(const Descriptor &)>()}; + p(tmpDesc); + } else { + auto *p{special->GetProc<void (*)(char *)>()}; + p(argDescriptor->OffsetElement<char>()); + } + if (argDescriptor == ©) { + ShallowCopyContiguousToDiscontiguous(descriptor, copy); + copy.Deallocate(); + } + } + } +} + +RT_API_ATTRS int FinalizeTicket::Begin(WorkQueue &workQueue) { + CallFinalSubroutine(instance_, derived_, workQueue.terminator()); + // If there's a finalizable parent component, handle it last, as required + // by the Fortran standard (7.5.6.2), and do so recursively with the same + // descriptor so that the rank is preserved. + finalizableParentType_ = derived_.GetParentType(); + if (finalizableParentType_) { + if (finalizableParentType_->noFinalizationNeeded()) { + finalizableParentType_ = nullptr; + } else { + SkipToNextComponent(); + } + } + return StatContinue; +} + +RT_API_ATTRS int FinalizeTicket::Continue(WorkQueue &workQueue) { + while (!IsComplete()) { + if (component_->genre() == typeInfo::Component::Genre::Allocatable && + component_->category() == TypeCategory::Derived) { + // Component may be polymorphic or unlimited polymorphic. Need to use the + // dynamic type to check whether finalization is needed. + const Descriptor &compDesc{*instance_.ElementComponent<Descriptor>( + subscripts_, component_->offset())}; + Advance(); + if (compDesc.IsAllocated()) { + if (const DescriptorAddendum *addendum{compDesc.Addendum()}) { + if (const typeInfo::DerivedType *compDynamicType{ + addendum->derivedType()}) { + if (!compDynamicType->noFinalizationNeeded()) { + if (int status{ + workQueue.BeginFinalize(compDesc, *compDynamicType)}; + status != StatOk) { + return status; + } + } + } + } + } + } else if (component_->genre() == typeInfo::Component::Genre::Allocatable || + component_->genre() == typeInfo::Component::Genre::Automatic) { + if (const typeInfo::DerivedType *compType{component_->derivedType()}; + compType && !compType->noFinalizationNeeded()) { + const Descriptor &compDesc{*instance_.ElementComponent<Descriptor>( + subscripts_, component_->offset())}; + Advance(); + if (compDesc.IsAllocated()) { + if (int status{workQueue.BeginFinalize(compDesc, *compType)}; + status != StatOk) { + return status; + } + } + } else { + SkipToNextComponent(); + } + } else if (component_->genre() == typeInfo::Component::Genre::Data && + component_->derivedType() && + !component_->derivedType()->noFinalizationNeeded()) { + SubscriptValue extents[maxRank]; + GetComponentExtents(extents, *component_, instance_); + Descriptor &compDesc{componentDescriptor_.descriptor()}; + const typeInfo::DerivedType &compType{*component_->derivedType()}; + compDesc.Establish(compType, + instance_.ElementComponent<char>(subscripts_, component_->offset()), + component_->rank(), extents); + Advance(); + if (int status{workQueue.BeginFinalize(compDesc, compType)}; + status != StatOk) { + return status; + } + } else { + SkipToNextComponent(); + } + } + // Last, do the parent component, if any and finalizable. + if (finalizableParentType_) { + Descriptor &tmpDesc{componentDescriptor_.descriptor()}; + tmpDesc = instance_; + tmpDesc.raw().attribute = CFI_attribute_pointer; + tmpDesc.Addendum()->set_derivedType(finalizableParentType_); + tmpDesc.raw().elem_len = finalizableParentType_->sizeInBytes(); + const auto &parentType{*finalizableParentType_}; + finalizableParentType_ = nullptr; + // Don't return StatOk here if the nested FInalize is still running; + // it needs this->componentDescriptor_. + return workQueue.BeginFinalize(tmpDesc, parentType); + } + return StatOk; +} + +// The order of finalization follows Fortran 2018 7.5.6.2, with +// elementwise finalization of non-parent components taking place +// before parent component finalization, and with all finalization +// preceding any deallocation. +RT_API_ATTRS void Destroy(const Descriptor &descriptor, bool finalize, + const typeInfo::DerivedType &derived, Terminator *terminator) { + if (descriptor.IsAllocated() && !derived.noDestructionNeeded()) { + Terminator stubTerminator{"Destroy() in Fortran runtime", 0}; + WorkQueue workQueue{terminator ? *terminator : stubTerminator}; + if (workQueue.BeginDestroy(descriptor, derived, finalize) == StatContinue) { + workQueue.Run(); + } + } +} + +RT_API_ATTRS int DestroyTicket::Begin(WorkQueue &workQueue) { + if (finalize_ && !derived_.noFinalizationNeeded()) { + if (int status{workQueue.BeginFinalize(instance_, derived_)}; + status != StatOk && status != StatContinue) { + return status; + } + } + return StatContinue; +} + +RT_API_ATTRS int DestroyTicket::Continue(WorkQueue &workQueue) { + // Deallocate all direct and indirect allocatable and automatic components. + // Contrary to finalization, the order of deallocation does not matter. + while (!IsComplete()) { + const auto *componentDerived{component_->derivedType()}; + if (component_->genre() == typeInfo::Component::Genre::Allocatable) { + if (fixedStride_ && + (!componentDerived || componentDerived->noDestructionNeeded())) { + // common fast path, just deallocate in every element + char *p{instance_.OffsetElement<char>(component_->offset())}; + for (std::size_t j{0}; j < elements_; ++j, p += *fixedStride_) { + Descriptor &d{*reinterpret_cast<Descriptor *>(p)}; + d.Deallocate(); + } + SkipToNextComponent(); + } else { + Descriptor &d{*instance_.ElementComponent<Descriptor>( + subscripts_, component_->offset())}; + if (d.IsAllocated()) { + if (componentDerived && !componentDerived->noDestructionNeeded() && + phase_ == 0) { + if (int status{workQueue.BeginDestroy( + d, *componentDerived, /*finalize=*/false)}; + status != StatOk) { + ++phase_; + return status; + } + } + d.Deallocate(); + } + Advance(); + } + } else if (component_->genre() == typeInfo::Component::Genre::Data) { + if (!componentDerived || componentDerived->noDestructionNeeded()) { + SkipToNextComponent(); + } else { + SubscriptValue extents[maxRank]; + GetComponentExtents(extents, *component_, instance_); + Descriptor &compDesc{componentDescriptor_.descriptor()}; + const typeInfo::DerivedType &compType{*componentDerived}; + compDesc.Establish(compType, + instance_.ElementComponent<char>(subscripts_, component_->offset()), + component_->rank(), extents); + Advance(); + if (int status{workQueue.BeginDestroy( + compDesc, *componentDerived, /*finalize=*/false)}; + status != StatOk) { + return status; + } + } + } else { + SkipToNextComponent(); + } + } + return StatOk; +} + +RT_API_ATTRS bool HasDynamicComponent(const Descriptor &descriptor) { + if (const DescriptorAddendum * addendum{descriptor.Addendum()}) { + if (const auto *derived = addendum->derivedType()) { + // Destruction is needed if and only if there are direct or indirect + // allocatable or automatic components. + return !derived->noDestructionNeeded(); + } + } + return false; +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor-io.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor-io.cpp new file mode 100644 index 00000000000..b208cb2c397 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor-io.cpp @@ -0,0 +1,809 @@ +//===-- lib/runtime/descriptor-io.cpp ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "descriptor-io.h" +#include "edit-input.h" +#include "edit-output.h" +#include "unit.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang-rt/runtime/namelist.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/type-info.h" +#include "flang-rt/runtime/work-queue.h" +#include "flang/Common/optional.h" +#include "flang/Common/restorer.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/freestanding-tools.h" + +// Implementation of I/O data list item transfers based on descriptors. +// (All I/O items come through here so that the code is exercised for test; +// some scalar I/O data transfer APIs could be changed to bypass their use +// of descriptors in the future for better efficiency.) + +namespace Fortran::runtime::io::descr { +RT_OFFLOAD_API_GROUP_BEGIN + +template <typename A> +inline RT_API_ATTRS A &ExtractElement(IoStatementState &io, + const Descriptor &descriptor, const SubscriptValue subscripts[]) { + A *p{descriptor.Element<A>(subscripts)}; + if (!p) { + io.GetIoErrorHandler().Crash("Bad address for I/O item -- null base " + "address or subscripts out of range"); + } + return *p; +} + +// Defined formatted I/O (maybe) +static RT_API_ATTRS Fortran::common::optional<bool> DefinedFormattedIo( + IoStatementState &io, const Descriptor &descriptor, + const typeInfo::DerivedType &derived, + const typeInfo::SpecialBinding &special, + const SubscriptValue subscripts[]) { + Fortran::common::optional<DataEdit> peek{ + io.GetNextDataEdit(0 /*to peek at it*/)}; + if (peek && + (peek->descriptor == DataEdit::DefinedDerivedType || + peek->descriptor == DataEdit::ListDirected)) { + // Defined formatting + IoErrorHandler &handler{io.GetIoErrorHandler()}; + DataEdit edit{*io.GetNextDataEdit(1)}; // now consume it; no repeats + RUNTIME_CHECK(handler, edit.descriptor == peek->descriptor); + char ioType[2 + edit.maxIoTypeChars]; + auto ioTypeLen{std::size_t{2} /*"DT"*/ + edit.ioTypeChars}; + if (edit.descriptor == DataEdit::DefinedDerivedType) { + ioType[0] = 'D'; + ioType[1] = 'T'; + std::memcpy(ioType + 2, edit.ioType, edit.ioTypeChars); + } else { + runtime::strcpy( + ioType, io.mutableModes().inNamelist ? "NAMELIST" : "LISTDIRECTED"); + ioTypeLen = runtime::strlen(ioType); + } + StaticDescriptor<1, true> vListStatDesc; + Descriptor &vListDesc{vListStatDesc.descriptor()}; + vListDesc.Establish(TypeCategory::Integer, sizeof(int), nullptr, 1); + vListDesc.set_base_addr(edit.vList); + vListDesc.GetDimension(0).SetBounds(1, edit.vListEntries); + vListDesc.GetDimension(0).SetByteStride( + static_cast<SubscriptValue>(sizeof(int))); + ExternalFileUnit *actualExternal{io.GetExternalFileUnit()}; + ExternalFileUnit *external{actualExternal}; + if (!external) { + // Create a new unit to service defined I/O for an + // internal I/O parent. + external = &ExternalFileUnit::NewUnit(handler, true); + } + ChildIo &child{external->PushChildIo(io)}; + // Child formatted I/O is nonadvancing by definition (F'2018 12.6.2.4). + auto restorer{common::ScopedSet(io.mutableModes().nonAdvancing, true)}; + int unit{external->unitNumber()}; + int ioStat{IostatOk}; + char ioMsg[100]; + Fortran::common::optional<std::int64_t> startPos; + if (edit.descriptor == DataEdit::DefinedDerivedType && + special.which() == typeInfo::SpecialBinding::Which::ReadFormatted) { + // DT is an edit descriptor so everything that the child + // I/O subroutine reads counts towards READ(SIZE=). + startPos = io.InquirePos(); + } + const auto *bindings{ + derived.binding().OffsetElement<const typeInfo::Binding>()}; + if (special.IsArgDescriptor(0)) { + // "dtv" argument is "class(t)", pass a descriptor + auto *p{special.GetProc<void (*)(const Descriptor &, int &, char *, + const Descriptor &, int &, char *, std::size_t, std::size_t)>( + bindings)}; + StaticDescriptor<1, true, 10 /*?*/> elementStatDesc; + Descriptor &elementDesc{elementStatDesc.descriptor()}; + elementDesc.Establish( + derived, nullptr, 0, nullptr, CFI_attribute_pointer); + elementDesc.set_base_addr(descriptor.Element<char>(subscripts)); + p(elementDesc, unit, ioType, vListDesc, ioStat, ioMsg, ioTypeLen, + sizeof ioMsg); + } else { + // "dtv" argument is "type(t)", pass a raw pointer + auto *p{special.GetProc<void (*)(const void *, int &, char *, + const Descriptor &, int &, char *, std::size_t, std::size_t)>( + bindings)}; + p(descriptor.Element<char>(subscripts), unit, ioType, vListDesc, ioStat, + ioMsg, ioTypeLen, sizeof ioMsg); + } + handler.Forward(ioStat, ioMsg, sizeof ioMsg); + external->PopChildIo(child); + if (!actualExternal) { + // Close unit created for internal I/O above. + auto *closing{external->LookUpForClose(external->unitNumber())}; + RUNTIME_CHECK(handler, external == closing); + external->DestroyClosed(); + } + if (startPos) { + io.GotChar(io.InquirePos() - *startPos); + } + return handler.GetIoStat() == IostatOk; + } else { + // There's a defined I/O subroutine, but there's a FORMAT present and + // it does not have a DT data edit descriptor, so apply default formatting + // to the components of the derived type as usual. + return Fortran::common::nullopt; + } +} + +// Defined unformatted I/O +static RT_API_ATTRS bool DefinedUnformattedIo(IoStatementState &io, + const Descriptor &descriptor, const typeInfo::DerivedType &derived, + const typeInfo::SpecialBinding &special) { + // Unformatted I/O must have an external unit (or child thereof). + IoErrorHandler &handler{io.GetIoErrorHandler()}; + ExternalFileUnit *external{io.GetExternalFileUnit()}; + if (!external) { // INQUIRE(IOLENGTH=) + handler.SignalError(IostatNonExternalDefinedUnformattedIo); + return false; + } + ChildIo &child{external->PushChildIo(io)}; + int unit{external->unitNumber()}; + int ioStat{IostatOk}; + char ioMsg[100]; + std::size_t numElements{descriptor.Elements()}; + SubscriptValue subscripts[maxRank]; + descriptor.GetLowerBounds(subscripts); + const auto *bindings{ + derived.binding().OffsetElement<const typeInfo::Binding>()}; + if (special.IsArgDescriptor(0)) { + // "dtv" argument is "class(t)", pass a descriptor + auto *p{special.GetProc<void (*)( + const Descriptor &, int &, int &, char *, std::size_t)>(bindings)}; + StaticDescriptor<1, true, 10 /*?*/> elementStatDesc; + Descriptor &elementDesc{elementStatDesc.descriptor()}; + elementDesc.Establish(derived, nullptr, 0, nullptr, CFI_attribute_pointer); + for (; numElements-- > 0; descriptor.IncrementSubscripts(subscripts)) { + elementDesc.set_base_addr(descriptor.Element<char>(subscripts)); + p(elementDesc, unit, ioStat, ioMsg, sizeof ioMsg); + if (ioStat != IostatOk) { + break; + } + } + } else { + // "dtv" argument is "type(t)", pass a raw pointer + auto *p{special + .GetProc<void (*)(const void *, int &, int &, char *, std::size_t)>( + bindings)}; + for (; numElements-- > 0; descriptor.IncrementSubscripts(subscripts)) { + p(descriptor.Element<char>(subscripts), unit, ioStat, ioMsg, + sizeof ioMsg); + if (ioStat != IostatOk) { + break; + } + } + } + handler.Forward(ioStat, ioMsg, sizeof ioMsg); + external->PopChildIo(child); + return handler.GetIoStat() == IostatOk; +} + +// Per-category descriptor-based I/O templates + +// TODO (perhaps as a nontrivial but small starter project): implement +// automatic repetition counts, like "10*3.14159", for list-directed and +// NAMELIST array output. + +template <int KIND, Direction DIR> +inline RT_API_ATTRS bool FormattedIntegerIO(IoStatementState &io, + const Descriptor &descriptor, [[maybe_unused]] bool isSigned) { + std::size_t numElements{descriptor.Elements()}; + SubscriptValue subscripts[maxRank]; + descriptor.GetLowerBounds(subscripts); + using IntType = CppTypeFor<common::TypeCategory::Integer, KIND>; + bool anyInput{false}; + for (std::size_t j{0}; j < numElements; ++j) { + if (auto edit{io.GetNextDataEdit()}) { + IntType &x{ExtractElement<IntType>(io, descriptor, subscripts)}; + if constexpr (DIR == Direction::Output) { + if (!EditIntegerOutput<KIND>(io, *edit, x, isSigned)) { + return false; + } + } else if (edit->descriptor != DataEdit::ListDirectedNullValue) { + if (EditIntegerInput( + io, *edit, reinterpret_cast<void *>(&x), KIND, isSigned)) { + anyInput = true; + } else { + return anyInput && edit->IsNamelist(); + } + } + if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) { + io.GetIoErrorHandler().Crash( + "FormattedIntegerIO: subscripts out of bounds"); + } + } else { + return false; + } + } + return true; +} + +template <int KIND, Direction DIR> +inline RT_API_ATTRS bool FormattedRealIO( + IoStatementState &io, const Descriptor &descriptor) { + std::size_t numElements{descriptor.Elements()}; + SubscriptValue subscripts[maxRank]; + descriptor.GetLowerBounds(subscripts); + using RawType = typename RealOutputEditing<KIND>::BinaryFloatingPoint; + bool anyInput{false}; + for (std::size_t j{0}; j < numElements; ++j) { + if (auto edit{io.GetNextDataEdit()}) { + RawType &x{ExtractElement<RawType>(io, descriptor, subscripts)}; + if constexpr (DIR == Direction::Output) { + if (!RealOutputEditing<KIND>{io, x}.Edit(*edit)) { + return false; + } + } else if (edit->descriptor != DataEdit::ListDirectedNullValue) { + if (EditRealInput<KIND>(io, *edit, reinterpret_cast<void *>(&x))) { + anyInput = true; + } else { + return anyInput && edit->IsNamelist(); + } + } + if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) { + io.GetIoErrorHandler().Crash( + "FormattedRealIO: subscripts out of bounds"); + } + } else { + return false; + } + } + return true; +} + +template <int KIND, Direction DIR> +inline RT_API_ATTRS bool FormattedComplexIO( + IoStatementState &io, const Descriptor &descriptor) { + std::size_t numElements{descriptor.Elements()}; + SubscriptValue subscripts[maxRank]; + descriptor.GetLowerBounds(subscripts); + bool isListOutput{ + io.get_if<ListDirectedStatementState<Direction::Output>>() != nullptr}; + using RawType = typename RealOutputEditing<KIND>::BinaryFloatingPoint; + bool anyInput{false}; + for (std::size_t j{0}; j < numElements; ++j) { + RawType *x{&ExtractElement<RawType>(io, descriptor, subscripts)}; + if (isListOutput) { + DataEdit rEdit, iEdit; + rEdit.descriptor = DataEdit::ListDirectedRealPart; + iEdit.descriptor = DataEdit::ListDirectedImaginaryPart; + rEdit.modes = iEdit.modes = io.mutableModes(); + if (!RealOutputEditing<KIND>{io, x[0]}.Edit(rEdit) || + !RealOutputEditing<KIND>{io, x[1]}.Edit(iEdit)) { + return false; + } + } else { + for (int k{0}; k < 2; ++k, ++x) { + auto edit{io.GetNextDataEdit()}; + if (!edit) { + return false; + } else if constexpr (DIR == Direction::Output) { + if (!RealOutputEditing<KIND>{io, *x}.Edit(*edit)) { + return false; + } + } else if (edit->descriptor == DataEdit::ListDirectedNullValue) { + break; + } else if (EditRealInput<KIND>( + io, *edit, reinterpret_cast<void *>(x))) { + anyInput = true; + } else { + return anyInput && edit->IsNamelist(); + } + } + } + if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) { + io.GetIoErrorHandler().Crash( + "FormattedComplexIO: subscripts out of bounds"); + } + } + return true; +} + +template <typename A, Direction DIR> +inline RT_API_ATTRS bool FormattedCharacterIO( + IoStatementState &io, const Descriptor &descriptor) { + std::size_t numElements{descriptor.Elements()}; + SubscriptValue subscripts[maxRank]; + descriptor.GetLowerBounds(subscripts); + std::size_t length{descriptor.ElementBytes() / sizeof(A)}; + auto *listOutput{io.get_if<ListDirectedStatementState<Direction::Output>>()}; + bool anyInput{false}; + for (std::size_t j{0}; j < numElements; ++j) { + A *x{&ExtractElement<A>(io, descriptor, subscripts)}; + if (listOutput) { + if (!ListDirectedCharacterOutput(io, *listOutput, x, length)) { + return false; + } + } else if (auto edit{io.GetNextDataEdit()}) { + if constexpr (DIR == Direction::Output) { + if (!EditCharacterOutput(io, *edit, x, length)) { + return false; + } + } else { // input + if (edit->descriptor != DataEdit::ListDirectedNullValue) { + if (EditCharacterInput(io, *edit, x, length)) { + anyInput = true; + } else { + return anyInput && edit->IsNamelist(); + } + } + } + } else { + return false; + } + if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) { + io.GetIoErrorHandler().Crash( + "FormattedCharacterIO: subscripts out of bounds"); + } + } + return true; +} + +template <int KIND, Direction DIR> +inline RT_API_ATTRS bool FormattedLogicalIO( + IoStatementState &io, const Descriptor &descriptor) { + std::size_t numElements{descriptor.Elements()}; + SubscriptValue subscripts[maxRank]; + descriptor.GetLowerBounds(subscripts); + auto *listOutput{io.get_if<ListDirectedStatementState<Direction::Output>>()}; + using IntType = CppTypeFor<TypeCategory::Integer, KIND>; + bool anyInput{false}; + for (std::size_t j{0}; j < numElements; ++j) { + IntType &x{ExtractElement<IntType>(io, descriptor, subscripts)}; + if (listOutput) { + if (!ListDirectedLogicalOutput(io, *listOutput, x != 0)) { + return false; + } + } else if (auto edit{io.GetNextDataEdit()}) { + if constexpr (DIR == Direction::Output) { + if (!EditLogicalOutput(io, *edit, x != 0)) { + return false; + } + } else { + if (edit->descriptor != DataEdit::ListDirectedNullValue) { + bool truth{}; + if (EditLogicalInput(io, *edit, truth)) { + x = truth; + anyInput = true; + } else { + return anyInput && edit->IsNamelist(); + } + } + } + } else { + return false; + } + if (!descriptor.IncrementSubscripts(subscripts) && j + 1 < numElements) { + io.GetIoErrorHandler().Crash( + "FormattedLogicalIO: subscripts out of bounds"); + } + } + return true; +} + +template <Direction DIR> +RT_API_ATTRS int DerivedIoTicket<DIR>::Continue(WorkQueue &workQueue) { + while (!IsComplete()) { + if (component_->genre() == typeInfo::Component::Genre::Data) { + // Create a descriptor for the component + Descriptor &compDesc{componentDescriptor_.descriptor()}; + component_->CreatePointerDescriptor( + compDesc, instance_, io_.GetIoErrorHandler(), subscripts_); + Advance(); + if (int status{workQueue.BeginDescriptorIo<DIR>( + io_, compDesc, table_, anyIoTookPlace_)}; + status != StatOk) { + return status; + } + } else { + // Component is itself a descriptor + char *pointer{ + instance_.Element<char>(subscripts_) + component_->offset()}; + const Descriptor &compDesc{ + *reinterpret_cast<const Descriptor *>(pointer)}; + Advance(); + if (compDesc.IsAllocated()) { + if (int status{workQueue.BeginDescriptorIo<DIR>( + io_, compDesc, table_, anyIoTookPlace_)}; + status != StatOk) { + return status; + } + } + } + } + return StatOk; +} + +template RT_API_ATTRS int DerivedIoTicket<Direction::Output>::Continue( + WorkQueue &); +template RT_API_ATTRS int DerivedIoTicket<Direction::Input>::Continue( + WorkQueue &); + +template <Direction DIR> +RT_API_ATTRS int DescriptorIoTicket<DIR>::Begin(WorkQueue &workQueue) { + IoErrorHandler &handler{io_.GetIoErrorHandler()}; + if (handler.InError()) { + return handler.GetIoStat(); + } + if (!io_.get_if<IoDirectionState<DIR>>()) { + handler.Crash("DescriptorIO() called for wrong I/O direction"); + return handler.GetIoStat(); + } + if constexpr (DIR == Direction::Input) { + if (!io_.BeginReadingRecord()) { + return StatOk; + } + } + if (!io_.get_if<FormattedIoStatementState<DIR>>()) { + // Unformatted I/O + IoErrorHandler &handler{io_.GetIoErrorHandler()}; + const DescriptorAddendum *addendum{instance_.Addendum()}; + if (const typeInfo::DerivedType *type{ + addendum ? addendum->derivedType() : nullptr}) { + // derived type unformatted I/O + if (DIR == Direction::Input || !io_.get_if<InquireIOLengthState>()) { + if (table_) { + if (const auto *definedIo{table_->Find(*type, + DIR == Direction::Input + ? common::DefinedIo::ReadUnformatted + : common::DefinedIo::WriteUnformatted)}) { + if (definedIo->subroutine) { + typeInfo::SpecialBinding special{DIR == Direction::Input + ? typeInfo::SpecialBinding::Which::ReadUnformatted + : typeInfo::SpecialBinding::Which::WriteUnformatted, + definedIo->subroutine, definedIo->isDtvArgPolymorphic, false, + false}; + if (DefinedUnformattedIo(io_, instance_, *type, special)) { + anyIoTookPlace_ = true; + return StatOk; + } + } else { + int status{workQueue.BeginDerivedIo<DIR>( + io_, instance_, *type, table_, anyIoTookPlace_)}; + return status == StatContinue ? StatOk : status; // done here + } + } + } + if (const typeInfo::SpecialBinding *special{ + type->FindSpecialBinding(DIR == Direction::Input + ? typeInfo::SpecialBinding::Which::ReadUnformatted + : typeInfo::SpecialBinding::Which::WriteUnformatted)}) { + if (!table_ || !table_->ignoreNonTbpEntries || + special->IsTypeBound()) { + // defined derived type unformatted I/O + if (DefinedUnformattedIo(io_, instance_, *type, *special)) { + anyIoTookPlace_ = true; + return StatOk; + } else { + return IostatEnd; + } + } + } + } + // Default derived type unformatted I/O + // TODO: If no component at any level has defined READ or WRITE + // (as appropriate), the elements are contiguous, and no byte swapping + // is active, do a block transfer via the code below. + int status{workQueue.BeginDerivedIo<DIR>( + io_, instance_, *type, table_, anyIoTookPlace_)}; + return status == StatContinue ? StatOk : status; // done here + } else { + // intrinsic type unformatted I/O + auto *externalUnf{io_.get_if<ExternalUnformattedIoStatementState<DIR>>()}; + ChildUnformattedIoStatementState<DIR> *childUnf{nullptr}; + InquireIOLengthState *inq{nullptr}; + bool swapEndianness{false}; + if (externalUnf) { + swapEndianness = externalUnf->unit().swapEndianness(); + } else { + childUnf = io_.get_if<ChildUnformattedIoStatementState<DIR>>(); + if (!childUnf) { + inq = DIR == Direction::Output ? io_.get_if<InquireIOLengthState>() + : nullptr; + RUNTIME_CHECK(handler, inq != nullptr); + } + } + std::size_t elementBytes{instance_.ElementBytes()}; + std::size_t swappingBytes{elementBytes}; + if (auto maybeCatAndKind{instance_.type().GetCategoryAndKind()}) { + // Byte swapping units can be smaller than elements, namely + // for COMPLEX and CHARACTER. + if (maybeCatAndKind->first == TypeCategory::Character) { + // swap each character position independently + swappingBytes = maybeCatAndKind->second; // kind + } else if (maybeCatAndKind->first == TypeCategory::Complex) { + // swap real and imaginary components independently + swappingBytes /= 2; + } + } + using CharType = + std::conditional_t<DIR == Direction::Output, const char, char>; + auto Transfer{[=](CharType &x, std::size_t totalBytes) -> bool { + if constexpr (DIR == Direction::Output) { + return externalUnf ? externalUnf->Emit(&x, totalBytes, swappingBytes) + : childUnf ? childUnf->Emit(&x, totalBytes, swappingBytes) + : inq->Emit(&x, totalBytes, swappingBytes); + } else { + return externalUnf + ? externalUnf->Receive(&x, totalBytes, swappingBytes) + : childUnf->Receive(&x, totalBytes, swappingBytes); + } + }}; + if (!swapEndianness && + instance_.IsContiguous()) { // contiguous unformatted I/O + char &x{ExtractElement<char>(io_, instance_, subscripts_)}; + if (Transfer(x, elements_ * elementBytes)) { + anyIoTookPlace_ = true; + } else { + return IostatEnd; + } + } else { // non-contiguous or byte-swapped intrinsic type unformatted I/O + for (; !IsComplete(); Advance()) { + char &x{ExtractElement<char>(io_, instance_, subscripts_)}; + if (Transfer(x, elementBytes)) { + anyIoTookPlace_ = true; + } else { + return IostatEnd; + } + } + } + } + // Unformatted I/O never needs to call Continue(). + return StatOk; + } + // Formatted I/O + if (auto catAndKind{instance_.type().GetCategoryAndKind()}) { + TypeCategory cat{catAndKind->first}; + int kind{catAndKind->second}; + bool any{false}; + switch (cat) { + case TypeCategory::Integer: + switch (kind) { + case 1: + any = FormattedIntegerIO<1, DIR>(io_, instance_, true); + break; + case 2: + any = FormattedIntegerIO<2, DIR>(io_, instance_, true); + break; + case 4: + any = FormattedIntegerIO<4, DIR>(io_, instance_, true); + break; + case 8: + any = FormattedIntegerIO<8, DIR>(io_, instance_, true); + break; + case 16: + any = FormattedIntegerIO<16, DIR>(io_, instance_, true); + break; + default: + handler.Crash( + "not yet implemented: INTEGER(KIND=%d) in formatted IO", kind); + return IostatEnd; + } + break; + case TypeCategory::Unsigned: + switch (kind) { + case 1: + any = FormattedIntegerIO<1, DIR>(io_, instance_, false); + break; + case 2: + any = FormattedIntegerIO<2, DIR>(io_, instance_, false); + break; + case 4: + any = FormattedIntegerIO<4, DIR>(io_, instance_, false); + break; + case 8: + any = FormattedIntegerIO<8, DIR>(io_, instance_, false); + break; + case 16: + any = FormattedIntegerIO<16, DIR>(io_, instance_, false); + break; + default: + handler.Crash( + "not yet implemented: UNSIGNED(KIND=%d) in formatted IO", kind); + return IostatEnd; + } + break; + case TypeCategory::Real: + switch (kind) { + case 2: + any = FormattedRealIO<2, DIR>(io_, instance_); + break; + case 3: + any = FormattedRealIO<3, DIR>(io_, instance_); + break; + case 4: + any = FormattedRealIO<4, DIR>(io_, instance_); + break; + case 8: + any = FormattedRealIO<8, DIR>(io_, instance_); + break; + case 10: + any = FormattedRealIO<10, DIR>(io_, instance_); + break; + // TODO: case double/double + case 16: + any = FormattedRealIO<16, DIR>(io_, instance_); + break; + default: + handler.Crash( + "not yet implemented: REAL(KIND=%d) in formatted IO", kind); + return IostatEnd; + } + break; + case TypeCategory::Complex: + switch (kind) { + case 2: + any = FormattedComplexIO<2, DIR>(io_, instance_); + break; + case 3: + any = FormattedComplexIO<3, DIR>(io_, instance_); + break; + case 4: + any = FormattedComplexIO<4, DIR>(io_, instance_); + break; + case 8: + any = FormattedComplexIO<8, DIR>(io_, instance_); + break; + case 10: + any = FormattedComplexIO<10, DIR>(io_, instance_); + break; + // TODO: case double/double + case 16: + any = FormattedComplexIO<16, DIR>(io_, instance_); + break; + default: + handler.Crash( + "not yet implemented: COMPLEX(KIND=%d) in formatted IO", kind); + return IostatEnd; + } + break; + case TypeCategory::Character: + switch (kind) { + case 1: + any = FormattedCharacterIO<char, DIR>(io_, instance_); + break; + case 2: + any = FormattedCharacterIO<char16_t, DIR>(io_, instance_); + break; + case 4: + any = FormattedCharacterIO<char32_t, DIR>(io_, instance_); + break; + default: + handler.Crash( + "not yet implemented: CHARACTER(KIND=%d) in formatted IO", kind); + return IostatEnd; + } + break; + case TypeCategory::Logical: + switch (kind) { + case 1: + any = FormattedLogicalIO<1, DIR>(io_, instance_); + break; + case 2: + any = FormattedLogicalIO<2, DIR>(io_, instance_); + break; + case 4: + any = FormattedLogicalIO<4, DIR>(io_, instance_); + break; + case 8: + any = FormattedLogicalIO<8, DIR>(io_, instance_); + break; + default: + handler.Crash( + "not yet implemented: LOGICAL(KIND=%d) in formatted IO", kind); + return IostatEnd; + } + break; + case TypeCategory::Derived: { + // Derived type information must be present for formatted I/O. + IoErrorHandler &handler{io_.GetIoErrorHandler()}; + const DescriptorAddendum *addendum{instance_.Addendum()}; + RUNTIME_CHECK(handler, addendum != nullptr); + derived_ = addendum->derivedType(); + RUNTIME_CHECK(handler, derived_ != nullptr); + if (table_) { + if (const auto *definedIo{table_->Find(*derived_, + DIR == Direction::Input ? common::DefinedIo::ReadFormatted + : common::DefinedIo::WriteFormatted)}) { + if (definedIo->subroutine) { + nonTbpSpecial_.emplace(DIR == Direction::Input + ? typeInfo::SpecialBinding::Which::ReadFormatted + : typeInfo::SpecialBinding::Which::WriteFormatted, + definedIo->subroutine, definedIo->isDtvArgPolymorphic, false, + false); + special_ = &*nonTbpSpecial_; + } + } + } + if (!special_) { + if (const typeInfo::SpecialBinding *binding{ + derived_->FindSpecialBinding(DIR == Direction::Input + ? typeInfo::SpecialBinding::Which::ReadFormatted + : typeInfo::SpecialBinding::Which::WriteFormatted)}) { + if (!table_ || !table_->ignoreNonTbpEntries || + binding->IsTypeBound()) { + special_ = binding; + } + } + } + return StatContinue; + } + } + if (any) { + anyIoTookPlace_ = true; + } else { + return IostatEnd; + } + } else { + handler.Crash("DescriptorIO: bad type code (%d) in descriptor", + static_cast<int>(instance_.type().raw())); + return handler.GetIoStat(); + } + return StatOk; +} + +template RT_API_ATTRS int DescriptorIoTicket<Direction::Output>::Begin( + WorkQueue &); +template RT_API_ATTRS int DescriptorIoTicket<Direction::Input>::Begin( + WorkQueue &); + +template <Direction DIR> +RT_API_ATTRS int DescriptorIoTicket<DIR>::Continue(WorkQueue &workQueue) { + // Only derived type formatted I/O gets here. + while (!IsComplete()) { + if (special_) { + if (auto defined{DefinedFormattedIo( + io_, instance_, *derived_, *special_, subscripts_)}) { + anyIoTookPlace_ |= *defined; + Advance(); + continue; + } + } + Descriptor &elementDesc{elementDescriptor_.descriptor()}; + elementDesc.Establish( + *derived_, nullptr, 0, nullptr, CFI_attribute_pointer); + elementDesc.set_base_addr(instance_.Element<char>(subscripts_)); + Advance(); + if (int status{workQueue.BeginDerivedIo<DIR>( + io_, elementDesc, *derived_, table_, anyIoTookPlace_)}; + status != StatOk) { + return status; + } + } + return StatOk; +} + +template RT_API_ATTRS int DescriptorIoTicket<Direction::Output>::Continue( + WorkQueue &); +template RT_API_ATTRS int DescriptorIoTicket<Direction::Input>::Continue( + WorkQueue &); + +template <Direction DIR> +RT_API_ATTRS bool DescriptorIO(IoStatementState &io, + const Descriptor &descriptor, const NonTbpDefinedIoTable *table) { + bool anyIoTookPlace{false}; + WorkQueue workQueue{io.GetIoErrorHandler()}; + if (workQueue.BeginDescriptorIo<DIR>(io, descriptor, table, anyIoTookPlace) == + StatContinue) { + workQueue.Run(); + } + return anyIoTookPlace; +} + +template RT_API_ATTRS bool DescriptorIO<Direction::Output>( + IoStatementState &, const Descriptor &, const NonTbpDefinedIoTable *); +template RT_API_ATTRS bool DescriptorIO<Direction::Input>( + IoStatementState &, const Descriptor &, const NonTbpDefinedIoTable *); + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io::descr diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor-io.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor-io.h new file mode 100644 index 00000000000..88ad59bd24b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor-io.h @@ -0,0 +1,35 @@ +//===-- lib/runtime/descriptor-io.h -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_DESCRIPTOR_IO_H_ +#define FLANG_RT_RUNTIME_DESCRIPTOR_IO_H_ + +#include "flang-rt/runtime/connection.h" + +namespace Fortran::runtime { +class Descriptor; +} // namespace Fortran::runtime + +namespace Fortran::runtime::io { +class IoStatementState; +struct NonTbpDefinedIoTable; +} // namespace Fortran::runtime::io + +namespace Fortran::runtime::io::descr { + +template <Direction DIR> +RT_API_ATTRS bool DescriptorIO(IoStatementState &, const Descriptor &, + const NonTbpDefinedIoTable * = nullptr); + +extern template RT_API_ATTRS bool DescriptorIO<Direction::Output>( + IoStatementState &, const Descriptor &, const NonTbpDefinedIoTable *); +extern template RT_API_ATTRS bool DescriptorIO<Direction::Input>( + IoStatementState &, const Descriptor &, const NonTbpDefinedIoTable *); + +} // namespace Fortran::runtime::io::descr +#endif // FLANG_RT_RUNTIME_DESCRIPTOR_IO_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor.cpp new file mode 100644 index 00000000000..b723acdd27b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/descriptor.cpp @@ -0,0 +1,329 @@ +//===-- lib/runtime/descriptor.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/descriptor.h" +#include "ISO_Fortran_util.h" +#include "memory.h" +#include "flang-rt/runtime/allocator-registry.h" +#include "flang-rt/runtime/derived.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Common/type-kinds.h" +#include <cassert> +#include <cstdlib> +#include <cstring> + +namespace Fortran::runtime { + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS Descriptor::Descriptor(const Descriptor &that) { *this = that; } + +RT_API_ATTRS Descriptor &Descriptor::operator=(const Descriptor &that) { + std::memcpy(reinterpret_cast<void *>(this), &that, that.SizeInBytes()); + return *this; +} + +RT_API_ATTRS void Descriptor::Establish(TypeCode t, std::size_t elementBytes, + void *p, int rank, const SubscriptValue *extent, + ISO::CFI_attribute_t attribute, bool addendum) { + Terminator terminator{__FILE__, __LINE__}; + int cfiStatus{ISO::VerifyEstablishParameters(&raw_, p, attribute, t.raw(), + elementBytes, rank, extent, /*external=*/false)}; + if (cfiStatus != CFI_SUCCESS) { + terminator.Crash( + "Descriptor::Establish: CFI_establish returned %d for CFI_type_t(%d)", + cfiStatus, t.raw()); + } + ISO::EstablishDescriptor( + &raw_, p, attribute, t.raw(), elementBytes, rank, extent); + if (elementBytes == 0) { + raw_.elem_len = 0; + // Reset byte strides of the dimensions, since EstablishDescriptor() + // only does that when the base address is not nullptr. + for (int j{0}; j < rank; ++j) { + GetDimension(j).SetByteStride(0); + } + } + if (addendum) { + SetHasAddendum(); + } + DescriptorAddendum *a{Addendum()}; + RUNTIME_CHECK(terminator, addendum == (a != nullptr)); + if (a) { + new (a) DescriptorAddendum{}; + } +} + +RT_API_ATTRS std::size_t Descriptor::BytesFor(TypeCategory category, int kind) { + Terminator terminator{__FILE__, __LINE__}; + int bytes{common::TypeSizeInBytes(category, kind)}; + RUNTIME_CHECK(terminator, bytes > 0); + return bytes; +} + +RT_API_ATTRS void Descriptor::Establish(TypeCategory c, int kind, void *p, + int rank, const SubscriptValue *extent, ISO::CFI_attribute_t attribute, + bool addendum) { + Establish(TypeCode(c, kind), BytesFor(c, kind), p, rank, extent, attribute, + addendum); +} + +RT_API_ATTRS void Descriptor::Establish(int characterKind, + std::size_t characters, void *p, int rank, const SubscriptValue *extent, + ISO::CFI_attribute_t attribute, bool addendum) { + Establish(TypeCode{TypeCategory::Character, characterKind}, + characterKind * characters, p, rank, extent, attribute, addendum); +} + +RT_API_ATTRS void Descriptor::Establish(const typeInfo::DerivedType &dt, + void *p, int rank, const SubscriptValue *extent, + ISO::CFI_attribute_t attribute) { + std::size_t elementBytes{dt.sizeInBytes()}; + ISO::EstablishDescriptor( + &raw_, p, attribute, CFI_type_struct, elementBytes, rank, extent); + if (elementBytes == 0) { + raw_.elem_len = 0; + // Reset byte strides of the dimensions, since EstablishDescriptor() + // only does that when the base address is not nullptr. + for (int j{0}; j < rank; ++j) { + GetDimension(j).SetByteStride(0); + } + } + SetHasAddendum(); + new (Addendum()) DescriptorAddendum{&dt}; +} + +RT_API_ATTRS OwningPtr<Descriptor> Descriptor::Create(TypeCode t, + std::size_t elementBytes, void *p, int rank, const SubscriptValue *extent, + ISO::CFI_attribute_t attribute, bool addendum, + const typeInfo::DerivedType *dt) { + Terminator terminator{__FILE__, __LINE__}; + RUNTIME_CHECK(terminator, t.IsDerived() == (dt != nullptr)); + int derivedTypeLenParameters = dt ? dt->LenParameters() : 0; + std::size_t bytes{SizeInBytes(rank, addendum, derivedTypeLenParameters)}; + Descriptor *result{ + reinterpret_cast<Descriptor *>(AllocateMemoryOrCrash(terminator, bytes))}; + if (dt) { + result->Establish(*dt, p, rank, extent, attribute); + } else { + result->Establish(t, elementBytes, p, rank, extent, attribute, addendum); + } + return OwningPtr<Descriptor>{result}; +} + +RT_API_ATTRS OwningPtr<Descriptor> Descriptor::Create(TypeCategory c, int kind, + void *p, int rank, const SubscriptValue *extent, + ISO::CFI_attribute_t attribute) { + return Create( + TypeCode(c, kind), BytesFor(c, kind), p, rank, extent, attribute); +} + +RT_API_ATTRS OwningPtr<Descriptor> Descriptor::Create(int characterKind, + SubscriptValue characters, void *p, int rank, const SubscriptValue *extent, + ISO::CFI_attribute_t attribute) { + return Create(TypeCode{TypeCategory::Character, characterKind}, + characterKind * characters, p, rank, extent, attribute); +} + +RT_API_ATTRS OwningPtr<Descriptor> Descriptor::Create( + const typeInfo::DerivedType &dt, void *p, int rank, + const SubscriptValue *extent, ISO::CFI_attribute_t attribute) { + return Create(TypeCode{TypeCategory::Derived, 0}, dt.sizeInBytes(), p, rank, + extent, attribute, /*addendum=*/true, &dt); +} + +RT_API_ATTRS std::size_t Descriptor::SizeInBytes() const { + const DescriptorAddendum *addendum{Addendum()}; + std::size_t bytes{ sizeof *this - sizeof(Dimension) + raw_.rank * sizeof(Dimension) + + (addendum ? addendum->SizeInBytes() : 0)}; + assert (bytes <= MaxDescriptorSizeInBytes(raw_.rank,addendum) && "Descriptor must fit compiler-allocated space"); + return bytes; +} + +RT_API_ATTRS std::size_t Descriptor::Elements() const { + return InlineElements(); +} + +RT_API_ATTRS int Descriptor::Allocate(std::int64_t *asyncObject) { + std::size_t elementBytes{ElementBytes()}; + if (static_cast<std::int64_t>(elementBytes) < 0) { + // F'2023 7.4.4.2 p5: "If the character length parameter value evaluates + // to a negative value, the length of character entities declared is zero." + elementBytes = raw_.elem_len = 0; + } + std::size_t byteSize{Elements() * elementBytes}; + AllocFct alloc{allocatorRegistry.GetAllocator(MapAllocIdx())}; + // Zero size allocation is possible in Fortran and the resulting + // descriptor must be allocated/associated. Since std::malloc(0) + // result is implementation defined, always allocate at least one byte. + void *p{alloc(byteSize ? byteSize : 1, asyncObject)}; + if (!p) { + return CFI_ERROR_MEM_ALLOCATION; + } + // TODO: image synchronization + raw_.base_addr = p; + SetByteStrides(); + return 0; +} + +RT_API_ATTRS void Descriptor::SetByteStrides() { + if (int dims{rank()}) { + std::size_t stride{ElementBytes()}; + for (int j{0}; j < dims; ++j) { + auto &dimension{GetDimension(j)}; + dimension.SetByteStride(stride); + stride *= dimension.Extent(); + } + } +} + +RT_API_ATTRS int Descriptor::Destroy( + bool finalize, bool destroyPointers, Terminator *terminator) { + if (!destroyPointers && raw_.attribute == CFI_attribute_pointer) { + return StatOk; + } else { + if (auto *addendum{Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noDestructionNeeded()) { + runtime::Destroy(*this, finalize, *derived, terminator); + } + } + } + return Deallocate(); + } +} + +RT_API_ATTRS bool Descriptor::DecrementSubscripts( + SubscriptValue *subscript, const int *permutation) const { + for (int j{raw_.rank - 1}; j >= 0; --j) { + int k{permutation ? permutation[j] : j}; + const Dimension &dim{GetDimension(k)}; + if (--subscript[k] >= dim.LowerBound()) { + return true; + } + subscript[k] = dim.UpperBound(); + } + return false; +} + +RT_API_ATTRS std::size_t Descriptor::ZeroBasedElementNumber( + const SubscriptValue *subscript, const int *permutation) const { + std::size_t result{0}; + std::size_t coefficient{1}; + for (int j{0}; j < raw_.rank; ++j) { + int k{permutation ? permutation[j] : j}; + const Dimension &dim{GetDimension(k)}; + result += coefficient * (subscript[k] - dim.LowerBound()); + coefficient *= dim.Extent(); + } + return result; +} + +RT_API_ATTRS bool Descriptor::EstablishPointerSection(const Descriptor &source, + const SubscriptValue *lower, const SubscriptValue *upper, + const SubscriptValue *stride) { + *this = source; + raw_.attribute = CFI_attribute_pointer; + int newRank{raw_.rank}; + for (int j{0}; j < raw_.rank; ++j) { + if (!stride || stride[j] == 0) { + if (newRank > 0) { + --newRank; + } else { + return false; + } + } + } + raw_.rank = newRank; + if (const auto *sourceAddendum = source.Addendum()) { + if (auto *addendum{Addendum()}) { + *addendum = *sourceAddendum; + } else { + return false; + } + } + return CFI_section(&raw_, &source.raw_, lower, upper, stride) == CFI_SUCCESS; +} + +RT_API_ATTRS void Descriptor::ApplyMold(const Descriptor &mold, int rank) { + raw_.elem_len = mold.raw_.elem_len; + raw_.rank = rank; + raw_.type = mold.raw_.type; + for (int j{0}; j < rank && j < mold.raw_.rank; ++j) { + GetDimension(j) = mold.GetDimension(j); + } + if (auto *addendum{Addendum()}) { + if (auto *moldAddendum{mold.Addendum()}) { + *addendum = *moldAddendum; + } else { + INTERNAL_CHECK(!addendum->derivedType()); + } + } +} + +RT_API_ATTRS void Descriptor::Check() const { + // TODO +} + +void Descriptor::Dump(FILE *f) const { + std::fprintf(f, "Descriptor @ %p:\n", reinterpret_cast<const void *>(this)); + std::fprintf(f, " base_addr %p\n", raw_.base_addr); + std::fprintf(f, " elem_len %zd\n", static_cast<std::size_t>(raw_.elem_len)); + std::fprintf(f, " version %d\n", static_cast<int>(raw_.version)); + std::fprintf(f, " rank %d\n", static_cast<int>(raw_.rank)); + std::fprintf(f, " type %d\n", static_cast<int>(raw_.type)); + std::fprintf(f, " attribute %d\n", static_cast<int>(raw_.attribute)); + std::fprintf(f, " extra %d\n", static_cast<int>(raw_.extra)); + std::fprintf(f, " addendum %d\n", static_cast<int>(HasAddendum())); + std::fprintf(f, " alloc_idx %d\n", static_cast<int>(GetAllocIdx())); + for (int j{0}; j < raw_.rank; ++j) { + std::fprintf(f, " dim[%d] lower_bound %jd\n", j, + static_cast<std::intmax_t>(raw_.dim[j].lower_bound)); + std::fprintf(f, " extent %jd\n", + static_cast<std::intmax_t>(raw_.dim[j].extent)); + std::fprintf(f, " sm %jd\n", + static_cast<std::intmax_t>(raw_.dim[j].sm)); + } + if (const DescriptorAddendum * addendum{Addendum()}) { + addendum->Dump(f); + } +} + +RT_API_ATTRS DescriptorAddendum &DescriptorAddendum::operator=( + const DescriptorAddendum &that) { + derivedType_ = that.derivedType_; + auto lenParms{that.LenParameters()}; + for (std::size_t j{0}; j < lenParms; ++j) { + len_[j] = that.len_[j]; + } + return *this; +} + +RT_API_ATTRS std::size_t DescriptorAddendum::SizeInBytes() const { + return SizeInBytes(LenParameters()); +} + +RT_API_ATTRS std::size_t DescriptorAddendum::LenParameters() const { + const auto *type{derivedType()}; + return type ? type->LenParameters() : 0; +} + +void DescriptorAddendum::Dump(FILE *f) const { + std::fprintf( + f, " derivedType @ %p\n", reinterpret_cast<const void *>(derivedType())); + std::size_t lenParms{LenParameters()}; + for (std::size_t j{0}; j < lenParms; ++j) { + std::fprintf(f, " len[%zd] %jd\n", j, static_cast<std::intmax_t>(len_[j])); + } +} + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/dot-product.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/dot-product.cpp new file mode 100644 index 00000000000..20612f1876c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/dot-product.cpp @@ -0,0 +1,259 @@ +//===-- lib/runtime/dot-product.cpp -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "float.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Common/float128.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/reduction.h" +#include <cfloat> +#include <cinttypes> + +namespace Fortran::runtime { + +// Beware: DOT_PRODUCT of COMPLEX data uses the complex conjugate of the first +// argument; MATMUL does not. + +// General accumulator for any type and stride; this is not used for +// contiguous numeric vectors. +template <TypeCategory RCAT, int RKIND, typename XT, typename YT> +class Accumulator { +public: + using Result = AccumulationType<RCAT, RKIND>; + RT_API_ATTRS Accumulator(const Descriptor &x, const Descriptor &y) + : x_{x}, y_{y} {} + RT_API_ATTRS void AccumulateIndexed(SubscriptValue xAt, SubscriptValue yAt) { + if constexpr (RCAT == TypeCategory::Logical) { + sum_ = sum_ || + (IsLogicalElementTrue(x_, &xAt) && IsLogicalElementTrue(y_, &yAt)); + } else { + const XT &xElement{*x_.Element<XT>(&xAt)}; + const YT &yElement{*y_.Element<YT>(&yAt)}; + if constexpr (RCAT == TypeCategory::Complex) { + sum_ += rtcmplx::conj(static_cast<Result>(xElement)) * + static_cast<Result>(yElement); + } else { + sum_ += static_cast<Result>(xElement) * static_cast<Result>(yElement); + } + } + } + RT_API_ATTRS Result GetResult() const { return sum_; } + +private: + const Descriptor &x_, &y_; + Result sum_{}; +}; + +template <TypeCategory RCAT, int RKIND, typename XT, typename YT> +static inline RT_API_ATTRS CppTypeFor<RCAT, RKIND> DoDotProduct( + const Descriptor &x, const Descriptor &y, Terminator &terminator) { + using Result = CppTypeFor<RCAT, RKIND>; + RUNTIME_CHECK(terminator, x.rank() == 1 && y.rank() == 1); + SubscriptValue n{x.GetDimension(0).Extent()}; + if (SubscriptValue yN{y.GetDimension(0).Extent()}; yN != n) { + terminator.Crash( + "DOT_PRODUCT: SIZE(VECTOR_A) is %jd but SIZE(VECTOR_B) is %jd", + static_cast<std::intmax_t>(n), static_cast<std::intmax_t>(yN)); + } + if constexpr (RCAT != TypeCategory::Logical) { + if (x.GetDimension(0).ByteStride() == sizeof(XT) && + y.GetDimension(0).ByteStride() == sizeof(YT)) { + // Contiguous numeric vectors + if constexpr (std::is_same_v<XT, YT>) { + // Contiguous homogeneous numeric vectors + if constexpr (std::is_same_v<XT, float>) { + // TODO: call BLAS-1 SDOT or SDSDOT + } else if constexpr (std::is_same_v<XT, double>) { + // TODO: call BLAS-1 DDOT + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<float>>) { + // TODO: call BLAS-1 CDOTC + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<double>>) { + // TODO: call BLAS-1 ZDOTC + } + } + XT *xp{x.OffsetElement<XT>(0)}; + YT *yp{y.OffsetElement<YT>(0)}; + using AccumType = AccumulationType<RCAT, RKIND>; + AccumType accum{}; + if constexpr (RCAT == TypeCategory::Complex) { + for (SubscriptValue j{0}; j < n; ++j) { + // conj() may instantiate its argument twice, + // so xp has to be incremented separately. + // This is a workaround for an alleged bug in clang, + // that shows up as: + // warning: multiple unsequenced modifications to 'xp' + accum += rtcmplx::conj(static_cast<AccumType>(*xp)) * + static_cast<AccumType>(*yp++); + xp++; + } + } else { + for (SubscriptValue j{0}; j < n; ++j) { + accum += + static_cast<AccumType>(*xp++) * static_cast<AccumType>(*yp++); + } + } + return static_cast<Result>(accum); + } + } + // Non-contiguous, heterogeneous, & LOGICAL cases + SubscriptValue xAt{x.GetDimension(0).LowerBound()}; + SubscriptValue yAt{y.GetDimension(0).LowerBound()}; + Accumulator<RCAT, RKIND, XT, YT> accumulator{x, y}; + for (SubscriptValue j{0}; j < n; ++j) { + accumulator.AccumulateIndexed(xAt++, yAt++); + } + return static_cast<Result>(accumulator.GetResult()); +} + +template <TypeCategory RCAT, int RKIND> struct DotProduct { + using Result = CppTypeFor<RCAT, RKIND>; + template <TypeCategory XCAT, int XKIND> struct DP1 { + template <TypeCategory YCAT, int YKIND> struct DP2 { + RT_API_ATTRS Result operator()(const Descriptor &x, const Descriptor &y, + Terminator &terminator) const { + if constexpr (constexpr auto resultType{ + GetResultType(XCAT, XKIND, YCAT, YKIND)}) { + if constexpr (resultType->first == RCAT && + (resultType->second <= RKIND || RCAT == TypeCategory::Logical)) { + return DoDotProduct<RCAT, RKIND, CppTypeFor<XCAT, XKIND>, + CppTypeFor<YCAT, YKIND>>(x, y, terminator); + } + } + terminator.Crash( + "DOT_PRODUCT(%d(%d)): bad operand types (%d(%d), %d(%d))", + static_cast<int>(RCAT), RKIND, static_cast<int>(XCAT), XKIND, + static_cast<int>(YCAT), YKIND); + } + }; + RT_API_ATTRS Result operator()(const Descriptor &x, const Descriptor &y, + Terminator &terminator, TypeCategory yCat, int yKind) const { + return ApplyType<DP2, Result>(yCat, yKind, terminator, x, y, terminator); + } + }; + RT_API_ATTRS Result operator()(const Descriptor &x, const Descriptor &y, + const char *source, int line) const { + Terminator terminator{source, line}; + if (RCAT != TypeCategory::Logical && x.type() == y.type()) { + // No conversions needed, operands and result have same known type + return typename DP1<RCAT, RKIND>::template DP2<RCAT, RKIND>{}( + x, y, terminator); + } else { + auto xCatKind{x.type().GetCategoryAndKind()}; + auto yCatKind{y.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, xCatKind.has_value() && yCatKind.has_value()); + return ApplyType<DP1, Result>(xCatKind->first, xCatKind->second, + terminator, x, y, terminator, yCatKind->first, yCatKind->second); + } + } +}; + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(DotProductInteger1)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Integer, 1>{}(x, y, source, line); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(DotProductInteger2)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Integer, 2>{}(x, y, source, line); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(DotProductInteger4)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Integer, 4>{}(x, y, source, line); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(DotProductInteger8)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Integer, 8>{}(x, y, source, line); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(DotProductInteger16)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Integer, 16>{}(x, y, source, line); +} +#endif + +CppTypeFor<TypeCategory::Unsigned, 1> RTDEF(DotProductUnsigned1)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Unsigned, 1>{}(x, y, source, line); +} +CppTypeFor<TypeCategory::Unsigned, 2> RTDEF(DotProductUnsigned2)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Unsigned, 2>{}(x, y, source, line); +} +CppTypeFor<TypeCategory::Unsigned, 4> RTDEF(DotProductUnsigned4)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Unsigned, 4>{}(x, y, source, line); +} +CppTypeFor<TypeCategory::Unsigned, 8> RTDEF(DotProductUnsigned8)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Unsigned, 8>{}(x, y, source, line); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Unsigned, 16> RTDEF(DotProductUnsigned16)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Unsigned, 16>{}(x, y, source, line); +} +#endif + +// TODO: REAL/COMPLEX(2 & 3) +// Intermediate results and operations are at least 64 bits +CppTypeFor<TypeCategory::Real, 4> RTDEF(DotProductReal4)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Real, 4>{}(x, y, source, line); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(DotProductReal8)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Real, 8>{}(x, y, source, line); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(DotProductReal10)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Real, 10>{}(x, y, source, line); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(DotProductReal16)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Real, 16>{}(x, y, source, line); +} +#endif + +void RTDEF(CppDotProductComplex4)(CppTypeFor<TypeCategory::Complex, 4> &result, + const Descriptor &x, const Descriptor &y, const char *source, int line) { + result = DotProduct<TypeCategory::Complex, 4>{}(x, y, source, line); +} +void RTDEF(CppDotProductComplex8)(CppTypeFor<TypeCategory::Complex, 8> &result, + const Descriptor &x, const Descriptor &y, const char *source, int line) { + result = DotProduct<TypeCategory::Complex, 8>{}(x, y, source, line); +} +#if HAS_FLOAT80 +void RTDEF(CppDotProductComplex10)( + CppTypeFor<TypeCategory::Complex, 10> &result, const Descriptor &x, + const Descriptor &y, const char *source, int line) { + result = DotProduct<TypeCategory::Complex, 10>{}(x, y, source, line); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(CppDotProductComplex16)( + CppTypeFor<TypeCategory::Complex, 16> &result, const Descriptor &x, + const Descriptor &y, const char *source, int line) { + result = DotProduct<TypeCategory::Complex, 16>{}(x, y, source, line); +} +#endif + +bool RTDEF(DotProductLogical)( + const Descriptor &x, const Descriptor &y, const char *source, int line) { + return DotProduct<TypeCategory::Logical, 1>{}(x, y, source, line); +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-input.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-input.cpp new file mode 100644 index 00000000000..0cc287aa3b4 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-input.cpp @@ -0,0 +1,1195 @@ +//===-- lib/runtime/edit-input.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "edit-input.h" +#include "flang-rt/runtime/namelist.h" +#include "flang-rt/runtime/utf.h" +#include "flang/Common/optional.h" +#include "flang/Common/real.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/freestanding-tools.h" +#include <algorithm> +#include <cfenv> + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +// Checks that a list-directed input value has been entirely consumed and +// doesn't contain unparsed characters before the next value separator. +static inline RT_API_ATTRS bool IsCharValueSeparator( + const DataEdit &edit, char32_t ch) { + char32_t comma{ + edit.modes.editingFlags & decimalComma ? char32_t{';'} : char32_t{','}}; + return ch == ' ' || ch == '\t' || ch == comma || ch == '/' || + (edit.IsNamelist() && (ch == '&' || ch == '$')); +} + +static RT_API_ATTRS bool CheckCompleteListDirectedField( + IoStatementState &io, const DataEdit &edit) { + if (edit.IsListDirected()) { + std::size_t byteCount; + if (auto ch{io.GetCurrentChar(byteCount)}) { + if (IsCharValueSeparator(edit, *ch)) { + return true; + } else { + const auto &connection{io.GetConnectionState()}; + io.GetIoErrorHandler().SignalError(IostatBadListDirectedInputSeparator, + "invalid character (0x%x) after list-directed input value, " + "at column %d in record %d", + static_cast<unsigned>(*ch), + static_cast<int>(connection.positionInRecord + 1), + static_cast<int>(connection.currentRecordNumber)); + return false; + } + } else { + return true; // end of record: ok + } + } else { + return true; + } +} + +static inline RT_API_ATTRS char32_t GetSeparatorChar(const DataEdit &edit) { + return edit.modes.editingFlags & decimalComma ? char32_t{';'} : char32_t{','}; +} + +template <int LOG2_BASE> +static RT_API_ATTRS bool EditBOZInput( + IoStatementState &io, const DataEdit &edit, void *n, std::size_t bytes) { + // Skip leading white space & zeroes + Fortran::common::optional<int> remaining{io.CueUpInput(edit)}; + auto start{io.GetConnectionState().positionInRecord}; + Fortran::common::optional<char32_t> next{io.NextInField(remaining, edit)}; + if (next.value_or('?') == '0') { + do { + start = io.GetConnectionState().positionInRecord; + next = io.NextInField(remaining, edit); + } while (next && *next == '0'); + } + // Count significant digits after any leading white space & zeroes + int digits{0}; + int significantBits{0}; + const char32_t comma{GetSeparatorChar(edit)}; + for (; next; next = io.NextInField(remaining, edit)) { + char32_t ch{*next}; + if (ch == ' ' || ch == '\t') { + if (edit.modes.editingFlags & blankZero) { + ch = '0'; // BZ mode - treat blank as if it were zero + } else { + continue; + } + } + if (ch >= '0' && ch <= '1') { + } else if (LOG2_BASE >= 3 && ch >= '2' && ch <= '7') { + } else if (LOG2_BASE >= 4 && ch >= '8' && ch <= '9') { + } else if (LOG2_BASE >= 4 && ch >= 'A' && ch <= 'F') { + } else if (LOG2_BASE >= 4 && ch >= 'a' && ch <= 'f') { + } else if (ch == comma) { + break; // end non-list-directed field early + } else { + io.GetIoErrorHandler().SignalError( + "Bad character '%lc' in B/O/Z input field", ch); + return false; + } + if (digits++ == 0) { + if (ch >= '0' && ch <= '1') { + significantBits = 1; + } else if (ch >= '2' && ch <= '3') { + significantBits = 2; + } else if (ch >= '4' && ch <= '7') { + significantBits = 3; + } else { + significantBits = 4; + } + } else { + significantBits += LOG2_BASE; + } + } + auto significantBytes{static_cast<std::size_t>(significantBits + 7) / 8}; + if (significantBytes > bytes) { + io.GetIoErrorHandler().SignalError(IostatBOZInputOverflow, + "B/O/Z input of %d digits overflows %zd-byte variable", digits, bytes); + return false; + } + // Reset to start of significant digits + io.HandleAbsolutePosition(start); + remaining.reset(); + // Make a second pass now that the digit count is known + std::memset(n, 0, bytes); + int increment{isHostLittleEndian ? -1 : 1}; + auto *data{reinterpret_cast<unsigned char *>(n) + + (isHostLittleEndian ? significantBytes - 1 : bytes - significantBytes)}; + int bitsAfterFirstDigit{(digits - 1) * LOG2_BASE}; + int shift{bitsAfterFirstDigit & 7}; + if (shift + (significantBits - bitsAfterFirstDigit) > 8) { + shift = shift - 8; // misaligned octal + } + while (digits > 0) { + char32_t ch{io.NextInField(remaining, edit).value_or(' ')}; + int digit{0}; + if (ch == ' ' || ch == '\t') { + if (edit.modes.editingFlags & blankZero) { + ch = '0'; // BZ mode - treat blank as if it were zero + } else { + continue; + } + } + --digits; + if (ch >= '0' && ch <= '9') { + digit = ch - '0'; + } else if (ch >= 'A' && ch <= 'F') { + digit = ch + 10 - 'A'; + } else if (ch >= 'a' && ch <= 'f') { + digit = ch + 10 - 'a'; + } else { + continue; + } + if (shift < 0) { + if (shift + LOG2_BASE > 0) { // misaligned octal + *data |= digit >> -shift; + } + shift += 8; + data += increment; + } + *data |= digit << shift; + shift -= LOG2_BASE; + } + return CheckCompleteListDirectedField(io, edit); +} + +static inline RT_API_ATTRS char32_t GetRadixPointChar(const DataEdit &edit) { + return edit.modes.editingFlags & decimalComma ? char32_t{','} : char32_t{'.'}; +} + +// Prepares input from a field, and returns the sign, if any, else '\0'. +static RT_API_ATTRS char ScanNumericPrefix(IoStatementState &io, + const DataEdit &edit, Fortran::common::optional<char32_t> &next, + Fortran::common::optional<int> &remaining, + IoStatementState::FastAsciiField *fastField = nullptr) { + remaining = io.CueUpInput(edit, fastField); + next = io.NextInField(remaining, edit, fastField); + char sign{'\0'}; + if (next) { + if (*next == '-' || *next == '+') { + sign = *next; + if (!edit.IsListDirected()) { + io.SkipSpaces(remaining, fastField); + } + next = io.NextInField(remaining, edit, fastField); + } + } + return sign; +} + +RT_API_ATTRS bool EditIntegerInput(IoStatementState &io, const DataEdit &edit, + void *n, int kind, bool isSigned) { + auto &handler{io.GetIoErrorHandler()}; + RUNTIME_CHECK(handler, kind >= 1 && !(kind & (kind - 1))); + if (!n) { + handler.Crash("Null address for integer input item"); + } + switch (edit.descriptor) { + case DataEdit::ListDirected: + if (IsNamelistNameOrSlash(io)) { + return false; + } + break; + case 'G': + case 'I': + break; + case 'B': + return EditBOZInput<1>(io, edit, n, kind); + case 'O': + return EditBOZInput<3>(io, edit, n, kind); + case 'Z': + return EditBOZInput<4>(io, edit, n, kind); + case 'A': // legacy extension + return EditCharacterInput(io, edit, reinterpret_cast<char *>(n), kind); + default: + handler.SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used with an INTEGER data item", + edit.descriptor); + return false; + } + Fortran::common::optional<int> remaining; + Fortran::common::optional<char32_t> next; + auto fastField{io.GetUpcomingFastAsciiField()}; + char sign{ScanNumericPrefix(io, edit, next, remaining, &fastField)}; + if (sign == '-' && !isSigned) { + handler.SignalError("Negative sign in UNSIGNED input field"); + return false; + } + common::uint128_t value{0}; + bool any{!!sign}; + bool overflow{false}; + const char32_t comma{GetSeparatorChar(edit)}; + static constexpr auto maxu128{~common::uint128_t{0}}; + for (; next; next = io.NextInField(remaining, edit, &fastField)) { + char32_t ch{*next}; + if (ch == ' ' || ch == '\t') { + if (edit.modes.editingFlags & blankZero) { + ch = '0'; // BZ mode - treat blank as if it were zero + } else { + continue; + } + } + int digit{0}; + if (ch >= '0' && ch <= '9') { + digit = ch - '0'; + } else if (ch == comma) { + break; // end non-list-directed field early + } else { + if (edit.modes.inNamelist && ch == GetRadixPointChar(edit)) { + // Ignore any fractional part that might appear in NAMELIST integer + // input, like a few other Fortran compilers do. + // TODO: also process exponents? Some compilers do, but they obviously + // can't just be ignored. + while ((next = io.NextInField(remaining, edit, &fastField))) { + if (*next < '0' || *next > '9') { + break; + } + } + if (!next || *next == comma) { + break; + } + } + handler.SignalError("Bad character '%lc' in INTEGER input field", ch); + return false; + } + static constexpr auto maxu128OverTen{maxu128 / 10}; + static constexpr int maxLastDigit{ + static_cast<int>(maxu128 - (maxu128OverTen * 10))}; + overflow |= value >= maxu128OverTen && + (value > maxu128OverTen || digit > maxLastDigit); + value *= 10; + value += digit; + any = true; + } + if (!any && !remaining) { + handler.SignalError( + "Integer value absent from NAMELIST or list-directed input"); + return false; + } + if (isSigned) { + auto maxForKind{common::uint128_t{1} << ((8 * kind) - 1)}; + overflow |= value >= maxForKind && (value > maxForKind || sign != '-'); + } else { + auto maxForKind{maxu128 >> (((16 - kind) * 8) + (isSigned ? 1 : 0))}; + overflow |= value >= maxForKind; + } + if (overflow) { + handler.SignalError(IostatIntegerInputOverflow, + "Decimal input overflows INTEGER(%d) variable", kind); + return false; + } + if (sign == '-') { + value = -value; + } + if (any || !handler.InError()) { + // The value is stored in the lower order bits on big endian platform. + // For memcpy, shift the value to the highest order bits. +#if USING_NATIVE_INT128_T + auto shft{static_cast<int>(sizeof value - kind)}; + if (!isHostLittleEndian && shft >= 0) { + auto shifted{value << (8 * shft)}; + std::memcpy(n, &shifted, kind); + } else { + std::memcpy(n, &value, kind); // a blank field means zero + } +#else + auto shft{static_cast<int>(sizeof(value.low())) - kind}; + // For kind==8 (i.e. shft==0), the value is stored in low_ in big endian. + if (!isHostLittleEndian && shft >= 0) { + auto l{value.low() << (8 * shft)}; + std::memcpy(n, &l, kind); + } else { + std::memcpy(n, &value, kind); // a blank field means zero + } +#endif + io.GotChar(fastField.got()); + return true; + } else { + return false; + } +} + +// Parses a REAL input number from the input source as a normalized +// fraction into a supplied buffer -- there's an optional '-', a +// decimal point when the input is not hexadecimal, and at least one +// digit. Replaces blanks with zeroes where appropriate. +struct ScannedRealInput { + // Number of characters that (should) have been written to the + // buffer -- this can be larger than the buffer size, which + // indicates buffer overflow. Zero indicates an error. + int got{0}; + int exponent{0}; // adjusted as necessary; binary if isHexadecimal + bool isHexadecimal{false}; // 0X... +}; +static RT_API_ATTRS ScannedRealInput ScanRealInput( + char *buffer, int bufferSize, IoStatementState &io, const DataEdit &edit) { + Fortran::common::optional<int> remaining; + Fortran::common::optional<char32_t> next; + int got{0}; + Fortran::common::optional<int> radixPointOffset; + // The following lambda definition violates the conding style, + // but cuda-11.8 nvcc hits an internal error with the brace initialization. + auto Put = [&](char ch) -> void { + if (got < bufferSize) { + buffer[got] = ch; + } + ++got; + }; + char sign{ScanNumericPrefix(io, edit, next, remaining)}; + if (sign == '-') { + Put('-'); + } + bool bzMode{(edit.modes.editingFlags & blankZero) != 0}; + int exponent{0}; + if (!next || (!bzMode && *next == ' ') || + (!(edit.modes.editingFlags & decimalComma) && *next == ',')) { + if (!edit.IsListDirected() && !io.GetConnectionState().IsAtEOF()) { + // An empty/blank field means zero when not list-directed. + // A fixed-width field containing only a sign is also zero; + // this behavior isn't standard-conforming in F'2023 but it is + // required to pass FCVS. + Put('0'); + } + return {got, exponent, false}; + } + char32_t radixPointChar{GetRadixPointChar(edit)}; + char32_t first{*next >= 'a' && *next <= 'z' ? *next + 'A' - 'a' : *next}; + bool isHexadecimal{false}; + if (first == 'N' || first == 'I') { + // NaN or infinity - convert to upper case + // Subtle: a blank field of digits could be followed by 'E' or 'D', + for (; next && + ((*next >= 'a' && *next <= 'z') || (*next >= 'A' && *next <= 'Z')); + next = io.NextInField(remaining, edit)) { + if (*next >= 'a' && *next <= 'z') { + Put(*next - 'a' + 'A'); + } else { + Put(*next); + } + } + if (next && *next == '(') { // NaN(...) + Put('('); + int depth{1}; + while (true) { + next = io.NextInField(remaining, edit); + if (depth == 0) { + break; + } else if (!next) { + return {}; // error + } else if (*next == '(') { + ++depth; + } else if (*next == ')') { + --depth; + } + Put(*next); + } + } + } else if (first == radixPointChar || (first >= '0' && first <= '9') || + (bzMode && (first == ' ' || first == '\t')) || first == 'E' || + first == 'D' || first == 'Q') { + if (first == '0') { + next = io.NextInField(remaining, edit); + if (next && (*next == 'x' || *next == 'X')) { // 0X... + isHexadecimal = true; + next = io.NextInField(remaining, edit); + } else { + Put('0'); + } + } + // input field is normalized to a fraction + if (!isHexadecimal) { + Put('.'); + } + auto start{got}; + for (; next; next = io.NextInField(remaining, edit)) { + char32_t ch{*next}; + if (ch == ' ' || ch == '\t') { + if (isHexadecimal) { + return {}; // error + } else if (bzMode) { + ch = '0'; // BZ mode - treat blank as if it were zero + } else { + continue; // ignore blank in fixed field + } + } + if (ch == '0' && got == start && !radixPointOffset) { + // omit leading zeroes before the radix point + } else if (ch >= '0' && ch <= '9') { + Put(ch); + } else if (ch == radixPointChar && !radixPointOffset) { + // The radix point character is *not* copied to the buffer. + radixPointOffset = got - start; // # of digits before the radix point + } else if (isHexadecimal && ch >= 'A' && ch <= 'F') { + Put(ch); + } else if (isHexadecimal && ch >= 'a' && ch <= 'f') { + Put(ch - 'a' + 'A'); // normalize to capitals + } else { + break; + } + } + if (got == start) { + // Nothing but zeroes and maybe a radix point. F'2018 requires + // at least one digit, but F'77 did not, and a bare "." shows up in + // the FCVS suite. + Put('0'); // emit at least one digit + } + // In list-directed input, a bad exponent is not consumed. + auto nextBeforeExponent{next}; + auto startExponent{io.GetConnectionState().positionInRecord}; + bool hasGoodExponent{false}; + if (next) { + if (isHexadecimal) { + if (*next == 'p' || *next == 'P') { + next = io.NextInField(remaining, edit); + } else { + // The binary exponent is not optional in the standard. + return {}; // error + } + } else if (*next == 'e' || *next == 'E' || *next == 'd' || *next == 'D' || + *next == 'q' || *next == 'Q') { + // Optional exponent letter. Blanks are allowed between the + // optional exponent letter and the exponent value. + io.SkipSpaces(remaining); + next = io.NextInField(remaining, edit); + } + } + if (next && + (*next == '-' || *next == '+' || (*next >= '0' && *next <= '9') || + *next == ' ' || *next == '\t')) { + bool negExpo{*next == '-'}; + if (negExpo || *next == '+') { + next = io.NextInField(remaining, edit); + } + for (; next; next = io.NextInField(remaining, edit)) { + if (*next >= '0' && *next <= '9') { + hasGoodExponent = true; + if (exponent < 10000) { + exponent = 10 * exponent + *next - '0'; + } + } else if (*next == ' ' || *next == '\t') { + if (isHexadecimal) { + break; + } else if (bzMode) { + hasGoodExponent = true; + exponent = 10 * exponent; + } + } else { + break; + } + } + if (negExpo) { + exponent = -exponent; + } + } + if (!hasGoodExponent) { + if (isHexadecimal) { + return {}; // error + } + // There isn't a good exponent; do not consume it. + next = nextBeforeExponent; + io.HandleAbsolutePosition(startExponent); + // The default exponent is -kP, but the scale factor doesn't affect + // an explicit exponent. + exponent = -edit.modes.scale; + } + // Adjust exponent by number of digits before the radix point. + if (isHexadecimal) { + // Exponents for hexadecimal input are binary. + exponent += radixPointOffset.value_or(got - start) * 4; + } else if (radixPointOffset) { + exponent += *radixPointOffset; + } else { + // When no redix point (or comma) appears in the value, the 'd' + // part of the edit descriptor must be interpreted as the number of + // digits in the value to be interpreted as being to the *right* of + // the assumed radix point (13.7.2.3.2) + exponent += got - start - edit.digits.value_or(0); + } + } + // Consume the trailing ')' of a list-directed or NAMELIST complex + // input value. + if (edit.descriptor == DataEdit::ListDirectedImaginaryPart) { + if (next && (*next == ' ' || *next == '\t')) { + io.SkipSpaces(remaining); + next = io.NextInField(remaining, edit); + } + if (!next) { // NextInField fails on separators like ')' + std::size_t byteCount{0}; + next = io.GetCurrentChar(byteCount); + if (next && *next == ')') { + io.HandleRelativePosition(byteCount); + } + } + } else if (remaining) { + while (next && (*next == ' ' || *next == '\t')) { + next = io.NextInField(remaining, edit); + } + if (next && (*next != ',' || (edit.modes.editingFlags & decimalComma))) { + return {}; // error: unused nonblank character in fixed-width field + } + } + return {got, exponent, isHexadecimal}; +} + +static RT_API_ATTRS void RaiseFPExceptions( + decimal::ConversionResultFlags flags) { +#undef RAISE +#if defined(RT_DEVICE_COMPILATION) + Terminator terminator(__FILE__, __LINE__); +#define RAISE(e) \ + terminator.Crash( \ + "not implemented yet: raising FP exception in device code: %s", #e); +#else // !defined(RT_DEVICE_COMPILATION) +#ifdef feraisexcept // a macro in some environments; omit std:: +#define RAISE feraiseexcept +#else +#define RAISE std::feraiseexcept +#endif +#endif // !defined(RT_DEVICE_COMPILATION) + +// Some environment (e.g. emscripten, musl) don't define FE_OVERFLOW as allowed +// by c99 (but not c++11) :-/ +#if defined(FE_OVERFLOW) || defined(RT_DEVICE_COMPILATION) + if (flags & decimal::ConversionResultFlags::Overflow) { + RAISE(FE_OVERFLOW); + } +#endif +#if defined(FE_UNDERFLOW) || defined(RT_DEVICE_COMPILATION) + if (flags & decimal::ConversionResultFlags::Underflow) { + RAISE(FE_UNDERFLOW); + } +#endif +#if defined(FE_INEXACT) || defined(RT_DEVICE_COMPILATION) + if (flags & decimal::ConversionResultFlags::Inexact) { + RAISE(FE_INEXACT); + } +#endif +#if defined(FE_INVALID) || defined(RT_DEVICE_COMPILATION) + if (flags & decimal::ConversionResultFlags::Invalid) { + RAISE(FE_INVALID); + } +#endif +#undef RAISE +} + +// If no special modes are in effect and the form of the input value +// that's present in the input stream is acceptable to the decimal->binary +// converter without modification, this fast path for real input +// saves time by avoiding memory copies and reformatting of the exponent. +template <int PRECISION> +static RT_API_ATTRS bool TryFastPathRealDecimalInput( + IoStatementState &io, const DataEdit &edit, void *n) { + if (edit.modes.editingFlags & (blankZero | decimalComma)) { + return false; + } + if (edit.modes.scale != 0) { + return false; + } + const ConnectionState &connection{io.GetConnectionState()}; + if (connection.internalIoCharKind > 1) { + return false; // reading non-default character + } + const char *str{nullptr}; + std::size_t got{io.GetNextInputBytes(str)}; + if (got == 0 || str == nullptr || !connection.recordLength.has_value()) { + return false; // could not access reliably-terminated input stream + } + const char *p{str}; + std::int64_t maxConsume{ + std::min<std::int64_t>(got, edit.width.value_or(got))}; + const char *limit{str + maxConsume}; + decimal::ConversionToBinaryResult<PRECISION> converted{ + decimal::ConvertToBinary<PRECISION>(p, edit.modes.round, limit)}; + if (converted.flags & (decimal::Invalid | decimal::Overflow)) { + return false; + } + if (edit.digits.value_or(0) != 0) { + // Edit descriptor is Fw.d (or other) with d != 0, which + // implies scaling + const char *q{str}; + for (; q < limit; ++q) { + if (*q == '.' || *q == 'n' || *q == 'N') { + break; + } + } + if (q == limit) { + // No explicit decimal point, and not NaN/Inf. + return false; + } + } + if (edit.descriptor == DataEdit::ListDirectedImaginaryPart) { + // Need to consume a trailing ')', possibly with leading spaces + for (; p < limit && (*p == ' ' || *p == '\t'); ++p) { + } + if (p < limit && *p == ')') { + ++p; + } else { + return false; + } + } else if (edit.IsListDirected()) { + if (p < limit && !IsCharValueSeparator(edit, *p)) { + return false; + } + } else { + for (; p < limit && (*p == ' ' || *p == '\t'); ++p) { + } + if (edit.width && p < str + *edit.width) { + return false; // unconverted characters remain in fixed width field + } + } + // Success on the fast path! + *reinterpret_cast<decimal::BinaryFloatingPointNumber<PRECISION> *>(n) = + converted.binary; + io.HandleRelativePosition(p - str); + // Set FP exception flags + if (converted.flags != decimal::ConversionResultFlags::Exact) { + RaiseFPExceptions(converted.flags); + } + return true; +} + +template <int binaryPrecision> +RT_API_ATTRS decimal::ConversionToBinaryResult<binaryPrecision> +ConvertHexadecimal( + const char *&p, enum decimal::FortranRounding rounding, int expo) { + using RealType = decimal::BinaryFloatingPointNumber<binaryPrecision>; + using RawType = typename RealType::RawType; + bool isNegative{*p == '-'}; + constexpr RawType one{1}; + RawType signBit{0}; + if (isNegative) { + ++p; + signBit = one << (RealType::bits - 1); + } + RawType fraction{0}; + // Adjust the incoming binary P+/- exponent to shift the radix point + // to below the LSB and add in the bias. + expo += binaryPrecision - 1 + RealType::exponentBias; + // Input the fraction. + int roundingBit{0}; + int guardBit{0}; + for (; *p; ++p) { + fraction <<= 4; + expo -= 4; + if (*p >= '0' && *p <= '9') { + fraction |= *p - '0'; + } else if (*p >= 'A' && *p <= 'F') { + fraction |= *p - 'A' + 10; // data were normalized to capitals + } else { + break; + } + if (fraction >> binaryPrecision) { + while (fraction >> binaryPrecision) { + guardBit |= roundingBit; + roundingBit = (int)fraction & 1; + fraction >>= 1; + ++expo; + } + // Consume excess digits + while (*++p) { + if (*p == '0') { + } else if ((*p >= '1' && *p <= '9') || (*p >= 'A' && *p <= 'F')) { + guardBit = 1; + } else { + break; + } + } + break; + } + } + if (fraction) { + // Boost biased expo if too small + while (expo < 1) { + guardBit |= roundingBit; + roundingBit = (int)fraction & 1; + fraction >>= 1; + ++expo; + } + // Normalize + while (expo > 1 && !(fraction >> (binaryPrecision - 1))) { + fraction <<= 1; + --expo; + guardBit = roundingBit = 0; + } + } + // Rounding + bool increase{false}; + switch (rounding) { + case decimal::RoundNearest: // RN & RP + increase = roundingBit && (guardBit | ((int)fraction & 1)); + break; + case decimal::RoundUp: // RU + increase = !isNegative && (roundingBit | guardBit); + break; + case decimal::RoundDown: // RD + increase = isNegative && (roundingBit | guardBit); + break; + case decimal::RoundToZero: // RZ + break; + case decimal::RoundCompatible: // RC + increase = roundingBit != 0; + break; + } + if (increase) { + ++fraction; + if (fraction >> binaryPrecision) { + fraction >>= 1; + ++expo; + } + } + // Package & return result + constexpr RawType significandMask{(one << RealType::significandBits) - 1}; + int flags{(roundingBit | guardBit) ? decimal::Inexact : decimal::Exact}; + if (!fraction) { + expo = 0; + } else if (expo == 1 && !(fraction >> (binaryPrecision - 1))) { + expo = 0; // subnormal + flags |= decimal::Underflow; + } else if (expo >= RealType::maxExponent) { + if (rounding == decimal::RoundToZero || + (rounding == decimal::RoundDown && !isNegative) || + (rounding == decimal::RoundUp && isNegative)) { + expo = RealType::maxExponent - 1; // +/-HUGE() + fraction = significandMask; + } else { + expo = RealType::maxExponent; // +/-Inf + fraction = 0; + flags |= decimal::Overflow; + } + } else { + fraction &= significandMask; // remove explicit normalization unless x87 + } + return decimal::ConversionToBinaryResult<binaryPrecision>{ + RealType{static_cast<RawType>(signBit | + static_cast<RawType>(expo) << RealType::significandBits | fraction)}, + static_cast<decimal::ConversionResultFlags>(flags)}; +} + +template <int KIND> +RT_API_ATTRS bool EditCommonRealInput( + IoStatementState &io, const DataEdit &edit, void *n) { + constexpr int binaryPrecision{common::PrecisionOfRealKind(KIND)}; + if (TryFastPathRealDecimalInput<binaryPrecision>(io, edit, n)) { + return CheckCompleteListDirectedField(io, edit); + } + // Fast path wasn't available or didn't work; go the more general route + static constexpr int maxDigits{ + common::MaxDecimalConversionDigits(binaryPrecision)}; + static constexpr int bufferSize{maxDigits + 18}; + char buffer[bufferSize]; + auto scanned{ScanRealInput(buffer, maxDigits + 2, io, edit)}; + int got{scanned.got}; + if (got >= maxDigits + 2) { + io.GetIoErrorHandler().Crash("EditCommonRealInput: buffer was too small"); + return false; + } + if (got == 0) { + const auto &connection{io.GetConnectionState()}; + io.GetIoErrorHandler().SignalError(IostatBadRealInput, + "Bad real input data at column %d of record %d", + static_cast<int>(connection.positionInRecord + 1), + static_cast<int>(connection.currentRecordNumber)); + return false; + } + decimal::ConversionToBinaryResult<binaryPrecision> converted; + const char *p{buffer}; + if (scanned.isHexadecimal) { + buffer[got] = '\0'; + converted = ConvertHexadecimal<binaryPrecision>( + p, edit.modes.round, scanned.exponent); + } else { + bool hadExtra{got > maxDigits}; + int exponent{scanned.exponent}; + if (exponent != 0) { + buffer[got++] = 'e'; + if (exponent < 0) { + buffer[got++] = '-'; + exponent = -exponent; + } + if (exponent > 9999) { + exponent = 9999; // will convert to +/-Inf + } + if (exponent > 999) { + int dig{exponent / 1000}; + buffer[got++] = '0' + dig; + int rest{exponent - 1000 * dig}; + dig = rest / 100; + buffer[got++] = '0' + dig; + rest -= 100 * dig; + dig = rest / 10; + buffer[got++] = '0' + dig; + buffer[got++] = '0' + (rest - 10 * dig); + } else if (exponent > 99) { + int dig{exponent / 100}; + buffer[got++] = '0' + dig; + int rest{exponent - 100 * dig}; + dig = rest / 10; + buffer[got++] = '0' + dig; + buffer[got++] = '0' + (rest - 10 * dig); + } else if (exponent > 9) { + int dig{exponent / 10}; + buffer[got++] = '0' + dig; + buffer[got++] = '0' + (exponent - 10 * dig); + } else { + buffer[got++] = '0' + exponent; + } + } + buffer[got] = '\0'; + converted = decimal::ConvertToBinary<binaryPrecision>(p, edit.modes.round); + if (hadExtra) { + converted.flags = static_cast<enum decimal::ConversionResultFlags>( + converted.flags | decimal::Inexact); + } + } + if (*p) { // unprocessed junk after value + const auto &connection{io.GetConnectionState()}; + io.GetIoErrorHandler().SignalError(IostatBadRealInput, + "Trailing characters after real input data at column %d of record %d", + static_cast<int>(connection.positionInRecord + 1), + static_cast<int>(connection.currentRecordNumber)); + return false; + } + *reinterpret_cast<decimal::BinaryFloatingPointNumber<binaryPrecision> *>(n) = + converted.binary; + // Set FP exception flags + if (converted.flags != decimal::ConversionResultFlags::Exact) { + if (converted.flags & decimal::ConversionResultFlags::Overflow) { + io.GetIoErrorHandler().SignalError(IostatRealInputOverflow); + return false; + } + RaiseFPExceptions(converted.flags); + } + return CheckCompleteListDirectedField(io, edit); +} + +template <int KIND> +RT_API_ATTRS bool EditRealInput( + IoStatementState &io, const DataEdit &edit, void *n) { + switch (edit.descriptor) { + case DataEdit::ListDirected: + if (IsNamelistNameOrSlash(io)) { + return false; + } + return EditCommonRealInput<KIND>(io, edit, n); + case DataEdit::ListDirectedRealPart: + case DataEdit::ListDirectedImaginaryPart: + case 'F': + case 'E': // incl. EN, ES, & EX + case 'D': + case 'G': + return EditCommonRealInput<KIND>(io, edit, n); + case 'B': + return EditBOZInput<1>(io, edit, n, + common::BitsForBinaryPrecision(common::PrecisionOfRealKind(KIND)) >> 3); + case 'O': + return EditBOZInput<3>(io, edit, n, + common::BitsForBinaryPrecision(common::PrecisionOfRealKind(KIND)) >> 3); + case 'Z': + return EditBOZInput<4>(io, edit, n, + common::BitsForBinaryPrecision(common::PrecisionOfRealKind(KIND)) >> 3); + case 'A': // legacy extension + return EditCharacterInput(io, edit, reinterpret_cast<char *>(n), KIND); + default: + io.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used for REAL input", + edit.descriptor); + return false; + } +} + +// 13.7.3 in Fortran 2018 +RT_API_ATTRS bool EditLogicalInput( + IoStatementState &io, const DataEdit &edit, bool &x) { + switch (edit.descriptor) { + case DataEdit::ListDirected: + if (IsNamelistNameOrSlash(io)) { + return false; + } + break; + case 'L': + case 'G': + break; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used for LOGICAL input", + edit.descriptor); + return false; + } + Fortran::common::optional<int> remaining{io.CueUpInput(edit)}; + Fortran::common::optional<char32_t> next{io.NextInField(remaining, edit)}; + if (next && *next == '.') { // skip optional period + next = io.NextInField(remaining, edit); + } + if (!next) { + io.GetIoErrorHandler().SignalError("Empty LOGICAL input field"); + return false; + } + switch (*next) { + case 'T': + case 't': + x = true; + break; + case 'F': + case 'f': + x = false; + break; + default: + io.GetIoErrorHandler().SignalError( + "Bad character '%lc' in LOGICAL input field", *next); + return false; + } + if (remaining) { // ignore the rest of a fixed-width field + io.HandleRelativePosition(*remaining); + } else if (edit.descriptor == DataEdit::ListDirected) { + while (io.NextInField(remaining, edit)) { // discard rest of field + } + } + return CheckCompleteListDirectedField(io, edit); +} + +// See 13.10.3.1 paragraphs 7-9 in Fortran 2018 +template <typename CHAR> +static RT_API_ATTRS bool EditDelimitedCharacterInput( + IoStatementState &io, CHAR *x, std::size_t length, char32_t delimiter) { + bool result{true}; + while (true) { + std::size_t byteCount{0}; + auto ch{io.GetCurrentChar(byteCount)}; + if (!ch) { + if (io.AdvanceRecord()) { + continue; + } else { + result = false; // EOF in character value + break; + } + } + io.HandleRelativePosition(byteCount); + if (*ch == delimiter) { + auto next{io.GetCurrentChar(byteCount)}; + if (next && *next == delimiter) { + // Repeated delimiter: use as character value + io.HandleRelativePosition(byteCount); + } else { + break; // closing delimiter + } + } + if (length > 0) { + *x++ = static_cast<CHAR>(*ch); + --length; + } + } + Fortran::runtime::fill_n(x, length, ' '); + return result; +} + +template <typename CHAR> +static RT_API_ATTRS bool EditListDirectedCharacterInput( + IoStatementState &io, CHAR *x, std::size_t length, const DataEdit &edit) { + std::size_t byteCount{0}; + auto ch{io.GetCurrentChar(byteCount)}; + if (ch && (*ch == '\'' || *ch == '"')) { + io.HandleRelativePosition(byteCount); + return EditDelimitedCharacterInput(io, x, length, *ch); + } + if (IsNamelistNameOrSlash(io) || io.GetConnectionState().IsAtEOF()) { + return false; + } + // Undelimited list-directed character input: stop at a value separator + // or the end of the current record. + while (auto ch{io.GetCurrentChar(byteCount)}) { + bool isSep{false}; + switch (*ch) { + case ' ': + case '\t': + case '/': + isSep = true; + break; + case '&': + case '$': + isSep = edit.IsNamelist(); + break; + case ',': + isSep = !(edit.modes.editingFlags & decimalComma); + break; + case ';': + isSep = !!(edit.modes.editingFlags & decimalComma); + break; + default: + break; + } + if (isSep) { + break; + } + if (length > 0) { + *x++ = static_cast<CHAR>(*ch); + --length; + } else if (edit.IsNamelist()) { + // GNU compatibility + break; + } + io.HandleRelativePosition(byteCount); + io.GotChar(byteCount); + } + Fortran::runtime::fill_n(x, length, ' '); + return true; +} + +template <typename CHAR> +RT_API_ATTRS bool EditCharacterInput(IoStatementState &io, const DataEdit &edit, + CHAR *x, std::size_t lengthChars) { + switch (edit.descriptor) { + case DataEdit::ListDirected: + return EditListDirectedCharacterInput(io, x, lengthChars, edit); + case 'A': + case 'G': + break; + case 'B': + return EditBOZInput<1>(io, edit, x, lengthChars * sizeof *x); + case 'O': + return EditBOZInput<3>(io, edit, x, lengthChars * sizeof *x); + case 'Z': + return EditBOZInput<4>(io, edit, x, lengthChars * sizeof *x); + default: + io.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used with a CHARACTER data item", + edit.descriptor); + return false; + } + const ConnectionState &connection{io.GetConnectionState()}; + std::size_t remainingChars{lengthChars}; + // Skip leading characters. + // Their bytes don't count towards INQUIRE(IOLENGTH=). + std::size_t skipChars{0}; + if (edit.width && *edit.width > 0) { + remainingChars = *edit.width; + if (remainingChars > lengthChars) { + skipChars = remainingChars - lengthChars; + } + } + // When the field is wider than the variable, we drop the leading + // characters. When the variable is wider than the field, there can be + // trailing padding or an EOR condition. + const char *input{nullptr}; + std::size_t readyBytes{0}; + // Transfer payload bytes; these do count. + while (remainingChars > 0) { + if (readyBytes == 0) { + readyBytes = io.GetNextInputBytes(input); + if (readyBytes == 0 || + (readyBytes < remainingChars && edit.modes.nonAdvancing)) { + if (io.CheckForEndOfRecord(readyBytes, connection)) { + if (readyBytes == 0) { + // PAD='YES' and no more data + Fortran::runtime::fill_n(x, lengthChars, ' '); + return !io.GetIoErrorHandler().InError(); + } else { + // Do partial read(s) then pad on last iteration + } + } else { + return !io.GetIoErrorHandler().InError(); + } + } + } + std::size_t chunkBytes; + std::size_t chunkChars{1}; + bool skipping{skipChars > 0}; + if (connection.isUTF8) { + chunkBytes = MeasureUTF8Bytes(*input); + if (skipping) { + --skipChars; + } else if (auto ucs{DecodeUTF8(input)}) { + if ((sizeof *x == 1 && *ucs > 0xff) || + (sizeof *x == 2 && *ucs > 0xffff)) { + *x++ = '?'; + } else { + *x++ = static_cast<CHAR>(*ucs); + } + --lengthChars; + } else if (chunkBytes == 0) { + // error recovery: skip bad encoding + chunkBytes = 1; + } + } else if (connection.internalIoCharKind > 1) { + // Reading from non-default character internal unit + chunkBytes = connection.internalIoCharKind; + if (skipping) { + --skipChars; + } else { + char32_t buffer{0}; + std::memcpy(&buffer, input, chunkBytes); + if ((sizeof *x == 1 && buffer > 0xff) || + (sizeof *x == 2 && buffer > 0xffff)) { + *x++ = '?'; + } else { + *x++ = static_cast<CHAR>(buffer); + } + --lengthChars; + } + } else if constexpr (sizeof *x > 1) { + // Read single byte with expansion into multi-byte CHARACTER + chunkBytes = 1; + if (skipping) { + --skipChars; + } else { + *x++ = static_cast<unsigned char>(*input); + --lengthChars; + } + } else { // single bytes -> default CHARACTER + if (skipping) { + chunkBytes = std::min<std::size_t>(skipChars, readyBytes); + chunkChars = chunkBytes; + skipChars -= chunkChars; + } else { + chunkBytes = std::min<std::size_t>(remainingChars, readyBytes); + chunkBytes = std::min<std::size_t>(lengthChars, chunkBytes); + chunkChars = chunkBytes; + std::memcpy(x, input, chunkBytes); + x += chunkBytes; + lengthChars -= chunkChars; + } + } + input += chunkBytes; + remainingChars -= chunkChars; + if (!skipping) { + io.GotChar(chunkBytes); + } + io.HandleRelativePosition(chunkBytes); + readyBytes -= chunkBytes; + } + // Pad the remainder of the input variable, if any. + Fortran::runtime::fill_n(x, lengthChars, ' '); + return CheckCompleteListDirectedField(io, edit); +} + +template RT_API_ATTRS bool EditRealInput<2>( + IoStatementState &, const DataEdit &, void *); +template RT_API_ATTRS bool EditRealInput<3>( + IoStatementState &, const DataEdit &, void *); +template RT_API_ATTRS bool EditRealInput<4>( + IoStatementState &, const DataEdit &, void *); +template RT_API_ATTRS bool EditRealInput<8>( + IoStatementState &, const DataEdit &, void *); +template RT_API_ATTRS bool EditRealInput<10>( + IoStatementState &, const DataEdit &, void *); +// TODO: double/double +template RT_API_ATTRS bool EditRealInput<16>( + IoStatementState &, const DataEdit &, void *); + +template RT_API_ATTRS bool EditCharacterInput( + IoStatementState &, const DataEdit &, char *, std::size_t); +template RT_API_ATTRS bool EditCharacterInput( + IoStatementState &, const DataEdit &, char16_t *, std::size_t); +template RT_API_ATTRS bool EditCharacterInput( + IoStatementState &, const DataEdit &, char32_t *, std::size_t); + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-input.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-input.h new file mode 100644 index 00000000000..961f06569ac --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-input.h @@ -0,0 +1,57 @@ +//===-- lib/runtime/edit-input.h --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_EDIT_INPUT_H_ +#define FLANG_RT_RUNTIME_EDIT_INPUT_H_ + +#include "flang-rt/runtime/format.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang/Decimal/decimal.h" + +namespace Fortran::runtime::io { + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS bool EditIntegerInput( + IoStatementState &, const DataEdit &, void *, int kind, bool isSigned); + +template <int KIND> +RT_API_ATTRS bool EditRealInput(IoStatementState &, const DataEdit &, void *); + +RT_API_ATTRS bool EditLogicalInput( + IoStatementState &, const DataEdit &, bool &); + +template <typename CHAR> +RT_API_ATTRS bool EditCharacterInput( + IoStatementState &, const DataEdit &, CHAR *, std::size_t); + +extern template RT_API_ATTRS bool EditRealInput<2>( + IoStatementState &, const DataEdit &, void *); +extern template RT_API_ATTRS bool EditRealInput<3>( + IoStatementState &, const DataEdit &, void *); +extern template RT_API_ATTRS bool EditRealInput<4>( + IoStatementState &, const DataEdit &, void *); +extern template RT_API_ATTRS bool EditRealInput<8>( + IoStatementState &, const DataEdit &, void *); +extern template RT_API_ATTRS bool EditRealInput<10>( + IoStatementState &, const DataEdit &, void *); +// TODO: double/double +extern template RT_API_ATTRS bool EditRealInput<16>( + IoStatementState &, const DataEdit &, void *); + +extern template RT_API_ATTRS bool EditCharacterInput( + IoStatementState &, const DataEdit &, char *, std::size_t); +extern template RT_API_ATTRS bool EditCharacterInput( + IoStatementState &, const DataEdit &, char16_t *, std::size_t); +extern template RT_API_ATTRS bool EditCharacterInput( + IoStatementState &, const DataEdit &, char32_t *, std::size_t); + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_EDIT_INPUT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-output.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-output.cpp new file mode 100644 index 00000000000..f90b6fb1096 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-output.cpp @@ -0,0 +1,978 @@ +//===-- lib/runtime/edit-output.cpp -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "edit-output.h" +#include "flang-rt/runtime/emit-encoded.h" +#include "flang-rt/runtime/utf.h" +#include "flang/Common/real.h" +#include "flang/Common/uint128.h" +#include <algorithm> + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +// In output statement, add a space between numbers and characters. +static RT_API_ATTRS void AddSpaceBeforeCharacter(IoStatementState &io) { + if (auto *list{io.get_if<ListDirectedStatementState<Direction::Output>>()}) { + list->set_lastWasUndelimitedCharacter(false); + } +} + +// B/O/Z output of arbitrarily sized data emits a binary/octal/hexadecimal +// representation of what is interpreted to be a single unsigned integer value. +// When used with character data, endianness is exposed. +template <int LOG2_BASE> +static RT_API_ATTRS bool EditBOZOutput(IoStatementState &io, + const DataEdit &edit, const unsigned char *data0, std::size_t bytes) { + AddSpaceBeforeCharacter(io); + int digits{static_cast<int>((bytes * 8) / LOG2_BASE)}; + int get{static_cast<int>(bytes * 8) - digits * LOG2_BASE}; + if (get > 0) { + ++digits; + } else { + get = LOG2_BASE; + } + int shift{7}; + int increment{isHostLittleEndian ? -1 : 1}; + const unsigned char *data{data0 + (isHostLittleEndian ? bytes - 1 : 0)}; + int skippedZeroes{0}; + int digit{0}; + // The same algorithm is used to generate digits for real (below) + // as well as for generating them only to skip leading zeroes (here). + // Bits are copied one at a time from the source data. + // TODO: Multiple bit copies for hexadecimal, where misalignment + // is not possible; or for octal when all 3 bits come from the + // same byte. + while (bytes > 0) { + if (get == 0) { + if (digit != 0) { + break; // first nonzero leading digit + } + ++skippedZeroes; + get = LOG2_BASE; + } else if (shift < 0) { + data += increment; + --bytes; + shift = 7; + } else { + digit = 2 * digit + ((*data >> shift--) & 1); + --get; + } + } + // Emit leading spaces and zeroes; detect field overflow + int leadingZeroes{0}; + int editWidth{edit.width.value_or(0)}; + int significant{digits - skippedZeroes}; + if (edit.digits && significant <= *edit.digits) { // Bw.m, Ow.m, Zw.m + if (*edit.digits == 0 && bytes == 0) { + editWidth = std::max(1, editWidth); + } else { + leadingZeroes = *edit.digits - significant; + } + } else if (bytes == 0) { + leadingZeroes = 1; + } + int subTotal{leadingZeroes + significant}; + int leadingSpaces{std::max(0, editWidth - subTotal)}; + if (editWidth > 0 && leadingSpaces + subTotal > editWidth) { + return EmitRepeated(io, '*', editWidth); + } + if (!(EmitRepeated(io, ' ', leadingSpaces) && + EmitRepeated(io, '0', leadingZeroes))) { + return false; + } + // Emit remaining digits + while (bytes > 0) { + if (get == 0) { + char ch{static_cast<char>(digit >= 10 ? 'A' + digit - 10 : '0' + digit)}; + if (!EmitAscii(io, &ch, 1)) { + return false; + } + get = LOG2_BASE; + digit = 0; + } else if (shift < 0) { + data += increment; + --bytes; + shift = 7; + } else { + digit = 2 * digit + ((*data >> shift--) & 1); + --get; + } + } + return true; +} + +template <int KIND> +bool RT_API_ATTRS EditIntegerOutput(IoStatementState &io, const DataEdit &edit, + common::HostSignedIntType<8 * KIND> n, bool isSigned) { + AddSpaceBeforeCharacter(io); + switch (edit.descriptor) { + case DataEdit::ListDirected: + case 'G': + case 'I': + break; + case 'B': + return EditBOZOutput<1>( + io, edit, reinterpret_cast<const unsigned char *>(&n), KIND); + case 'O': + return EditBOZOutput<3>( + io, edit, reinterpret_cast<const unsigned char *>(&n), KIND); + case 'Z': + return EditBOZOutput<4>( + io, edit, reinterpret_cast<const unsigned char *>(&n), KIND); + case 'L': + return EditLogicalOutput(io, edit, n != 0 ? true : false); + case 'A': // legacy extension + return EditCharacterOutput( + io, edit, reinterpret_cast<char *>(&n), sizeof n); + default: + io.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used with an INTEGER data item", + edit.descriptor); + return false; + } + char buffer[130], *end{&buffer[sizeof buffer]}, *p{end}; + bool isNegative{isSigned && n < 0}; + using Unsigned = common::HostUnsignedIntType<8 * KIND>; + Unsigned un{static_cast<Unsigned>(n)}; + int signChars{0}; + if (isNegative) { + un = -un; + } + if (isNegative || (edit.modes.editingFlags & signPlus)) { + signChars = 1; // '-' or '+' + } + while (un > 0) { + auto quotient{un / 10u}; + *--p = '0' + static_cast<int>(un - Unsigned{10} * quotient); + un = quotient; + } + int digits = end - p; + int leadingZeroes{0}; + int editWidth{edit.width.value_or(0)}; + if (edit.descriptor == 'I' && edit.digits && digits <= *edit.digits) { + // Only Iw.m can produce leading zeroes, not Gw.d (F'202X 13.7.5.2.2) + if (*edit.digits == 0 && n == 0) { + // Iw.0 with zero value: output field must be blank. For I0.0 + // and a zero value, emit one blank character. + signChars = 0; // in case of SP + editWidth = std::max(1, editWidth); + } else { + leadingZeroes = *edit.digits - digits; + } + } else if (n == 0) { + leadingZeroes = 1; + } + int subTotal{signChars + leadingZeroes + digits}; + int leadingSpaces{std::max(0, editWidth - subTotal)}; + if (editWidth > 0 && leadingSpaces + subTotal > editWidth) { + return EmitRepeated(io, '*', editWidth); + } + if (edit.IsListDirected()) { + int total{std::max(leadingSpaces, 1) + subTotal}; + if (io.GetConnectionState().NeedAdvance(static_cast<std::size_t>(total)) && + !io.AdvanceRecord()) { + return false; + } + leadingSpaces = 1; + } else if (!edit.width) { + // Bare 'I' and 'G' are interpreted with various default widths in the + // compilers that support them, so there's always some leading space + // after column 1. + if (io.GetConnectionState().positionInRecord > 0) { + leadingSpaces = 1; + } + } + return EmitRepeated(io, ' ', leadingSpaces) && + EmitAscii(io, n < 0 ? "-" : "+", signChars) && + EmitRepeated(io, '0', leadingZeroes) && EmitAscii(io, p, digits); +} + +// Formats the exponent (see table 13.1 for all the cases) +RT_API_ATTRS const char *RealOutputEditingBase::FormatExponent( + int expo, const DataEdit &edit, int &length) { + char *eEnd{&exponent_[sizeof exponent_]}; + char *exponent{eEnd}; + for (unsigned e{static_cast<unsigned>(std::abs(expo))}; e > 0;) { + unsigned quotient{e / 10u}; + *--exponent = '0' + e - 10 * quotient; + e = quotient; + } + bool overflow{false}; + if (edit.expoDigits) { + if (int ed{*edit.expoDigits}) { // Ew.dEe with e > 0 + overflow = exponent + ed < eEnd; + while (exponent > exponent_ + 2 /*E+*/ && exponent + ed > eEnd) { + *--exponent = '0'; + } + } else if (exponent == eEnd) { + *--exponent = '0'; // Ew.dE0 with zero-valued exponent + } + } else if (edit.variation == 'X') { + if (expo == 0) { + *--exponent = '0'; // EX without Ee and zero-valued exponent + } + } else { + // Ensure at least two exponent digits unless EX + while (exponent + 2 > eEnd) { + *--exponent = '0'; + } + } + *--exponent = expo < 0 ? '-' : '+'; + if (edit.variation == 'X') { + *--exponent = 'P'; + } else if (edit.expoDigits || edit.IsListDirected() || exponent + 3 == eEnd) { + *--exponent = edit.descriptor == 'D' ? 'D' : 'E'; // not 'G' or 'Q' + } + length = eEnd - exponent; + return overflow ? nullptr : exponent; +} + +RT_API_ATTRS bool RealOutputEditingBase::EmitPrefix( + const DataEdit &edit, std::size_t length, std::size_t width) { + if (edit.IsListDirected()) { + int prefixLength{edit.descriptor == DataEdit::ListDirectedRealPart ? 2 + : edit.descriptor == DataEdit::ListDirectedImaginaryPart ? 0 + : 1}; + int suffixLength{edit.descriptor == DataEdit::ListDirectedRealPart || + edit.descriptor == DataEdit::ListDirectedImaginaryPart + ? 1 + : 0}; + length += prefixLength + suffixLength; + ConnectionState &connection{io_.GetConnectionState()}; + return (!connection.NeedAdvance(length) || io_.AdvanceRecord()) && + EmitAscii(io_, " (", prefixLength); + } else if (width > length) { + return EmitRepeated(io_, ' ', width - length); + } else { + return true; + } +} + +RT_API_ATTRS bool RealOutputEditingBase::EmitSuffix(const DataEdit &edit) { + if (edit.descriptor == DataEdit::ListDirectedRealPart) { + return EmitAscii( + io_, edit.modes.editingFlags & decimalComma ? ";" : ",", 1); + } else if (edit.descriptor == DataEdit::ListDirectedImaginaryPart) { + return EmitAscii(io_, ")", 1); + } else { + return true; + } +} + +template <int KIND> +RT_API_ATTRS decimal::ConversionToDecimalResult +RealOutputEditing<KIND>::ConvertToDecimal( + int significantDigits, enum decimal::FortranRounding rounding, int flags) { + auto converted{decimal::ConvertToDecimal<binaryPrecision>(buffer_, + sizeof buffer_, static_cast<enum decimal::DecimalConversionFlags>(flags), + significantDigits, rounding, x_)}; + if (!converted.str) { // overflow + io_.GetIoErrorHandler().Crash( + "RealOutputEditing::ConvertToDecimal: buffer size %zd was insufficient", + sizeof buffer_); + } + return converted; +} + +static RT_API_ATTRS bool IsInfOrNaN(const char *p, int length) { + if (!p || length < 1) { + return false; + } + if (*p == '-' || *p == '+') { + if (length == 1) { + return false; + } + ++p; + } + return *p == 'I' || *p == 'N'; +} + +// 13.7.2.3.3 in F'2018 +template <int KIND> +RT_API_ATTRS bool RealOutputEditing<KIND>::EditEorDOutput( + const DataEdit &edit) { + AddSpaceBeforeCharacter(io_); + int editDigits{edit.digits.value_or(0)}; // 'd' field + int editWidth{edit.width.value_or(0)}; // 'w' field + int significantDigits{editDigits}; + int flags{0}; + if (edit.modes.editingFlags & signPlus) { + flags |= decimal::AlwaysSign; + } + int scale{edit.modes.scale}; // 'kP' value + bool isEN{edit.variation == 'N'}; + bool isES{edit.variation == 'S'}; + if (editWidth == 0) { // "the processor selects the field width" + if (edit.digits.has_value()) { // E0.d + if (editDigits == 0 && scale <= 0) { // E0.0 + significantDigits = isEN || isES ? 0 : 1; + } + } else { // E0 + flags |= decimal::Minimize; + significantDigits = + sizeof buffer_ - 5; // sign, NUL, + 3 extra for EN scaling + } + } + int zeroesAfterPoint{0}; + if (isEN) { + scale = IsZero() ? 1 : 3; + significantDigits += scale; + } else if (isES) { + scale = 1; + ++significantDigits; + } else if (scale < 0) { + if (scale <= -editDigits) { + io_.GetIoErrorHandler().SignalError(IostatBadScaleFactor, + "Scale factor (kP) %d cannot be less than -d (%d)", scale, + -editDigits); + return false; + } + zeroesAfterPoint = -scale; + significantDigits = std::max(0, significantDigits - zeroesAfterPoint); + } else if (scale > 0) { + if (scale >= editDigits + 2) { + io_.GetIoErrorHandler().SignalError(IostatBadScaleFactor, + "Scale factor (kP) %d cannot be greater than d+2 (%d)", scale, + editDigits + 2); + return false; + } + ++significantDigits; + scale = std::min(scale, significantDigits + 1); + } else if (edit.digits.value_or(1) == 0 && !edit.variation) { + // F'2023 13.7.2.3.3 p5; does not apply to Gw.0(Ee) or E0(no d) + io_.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Output edit descriptor %cw.d must have d>0", edit.descriptor); + return false; + } + // In EN editing, multiple attempts may be necessary, so this is a loop. + while (true) { + decimal::ConversionToDecimalResult converted{ + ConvertToDecimal(significantDigits, edit.modes.round, flags)}; + if (IsInfOrNaN(converted.str, static_cast<int>(converted.length))) { + return editWidth > 0 && + converted.length + trailingBlanks_ > + static_cast<std::size_t>(editWidth) + ? EmitRepeated(io_, '*', editWidth) + : EmitPrefix(edit, converted.length, editWidth) && + EmitAscii(io_, converted.str, converted.length) && + EmitRepeated(io_, ' ', trailingBlanks_) && EmitSuffix(edit); + } + if (!IsZero()) { + converted.decimalExponent -= scale; + } + if (isEN) { + // EN mode: we need an effective exponent field that is + // a multiple of three. + if (int modulus{converted.decimalExponent % 3}; modulus != 0) { + if (significantDigits > 1) { + --significantDigits; + --scale; + continue; + } + // Rounded nines up to a 1. + scale += modulus; + converted.decimalExponent -= modulus; + } + if (scale > 3) { + int adjust{3 * (scale / 3)}; + scale -= adjust; + converted.decimalExponent += adjust; + } else if (scale < 1) { + int adjust{3 - 3 * (scale / 3)}; + scale += adjust; + converted.decimalExponent -= adjust; + } + significantDigits = editDigits + scale; + } + // Format the exponent (see table 13.1 for all the cases) + int expoLength{0}; + const char *exponent{ + FormatExponent(converted.decimalExponent, edit, expoLength)}; + int signLength{*converted.str == '-' || *converted.str == '+' ? 1 : 0}; + int convertedDigits{static_cast<int>(converted.length) - signLength}; + int zeroesBeforePoint{std::max(0, scale - convertedDigits)}; + int digitsBeforePoint{std::max(0, scale - zeroesBeforePoint)}; + int digitsAfterPoint{convertedDigits - digitsBeforePoint}; + int trailingZeroes{flags & decimal::Minimize + ? 0 + : std::max(0, + significantDigits - (convertedDigits + zeroesBeforePoint))}; + int totalLength{signLength + digitsBeforePoint + zeroesBeforePoint + + 1 /*'.'*/ + zeroesAfterPoint + digitsAfterPoint + trailingZeroes + + expoLength}; + int width{editWidth > 0 ? editWidth : totalLength}; + if (totalLength > width || !exponent) { + return EmitRepeated(io_, '*', width); + } + if (totalLength < width && digitsBeforePoint == 0 && + zeroesBeforePoint == 0) { + zeroesBeforePoint = 1; + ++totalLength; + } + if (totalLength < width && editWidth == 0) { + width = totalLength; + } + return EmitPrefix(edit, totalLength, width) && + EmitAscii(io_, converted.str, signLength + digitsBeforePoint) && + EmitRepeated(io_, '0', zeroesBeforePoint) && + EmitAscii(io_, edit.modes.editingFlags & decimalComma ? "," : ".", 1) && + EmitRepeated(io_, '0', zeroesAfterPoint) && + EmitAscii(io_, converted.str + signLength + digitsBeforePoint, + digitsAfterPoint) && + EmitRepeated(io_, '0', trailingZeroes) && + EmitAscii(io_, exponent, expoLength) && EmitSuffix(edit); + } +} + +// 13.7.2.3.2 in F'2018 +template <int KIND> +RT_API_ATTRS bool RealOutputEditing<KIND>::EditFOutput(const DataEdit &edit) { + AddSpaceBeforeCharacter(io_); + int fracDigits{edit.digits.value_or(0)}; // 'd' field + const int editWidth{edit.width.value_or(0)}; // 'w' field + enum decimal::FortranRounding rounding{edit.modes.round}; + int flags{0}; + if (edit.modes.editingFlags & signPlus) { + flags |= decimal::AlwaysSign; + } + if (editWidth == 0) { // "the processor selects the field width" + if (!edit.digits.has_value()) { // F0 + flags |= decimal::Minimize; + fracDigits = sizeof buffer_ - 2; // sign & NUL + } + } + bool emitTrailingZeroes{!(flags & decimal::Minimize)}; + // Multiple conversions may be needed to get the right number of + // effective rounded fractional digits. + bool canIncrease{true}; + for (int extraDigits{fracDigits == 0 ? 1 : 0};;) { + decimal::ConversionToDecimalResult converted{ + ConvertToDecimal(extraDigits + fracDigits, rounding, flags)}; + const char *convertedStr{converted.str}; + if (IsInfOrNaN(convertedStr, static_cast<int>(converted.length))) { + return editWidth > 0 && + converted.length > static_cast<std::size_t>(editWidth) + ? EmitRepeated(io_, '*', editWidth) + : EmitPrefix(edit, converted.length, editWidth) && + EmitAscii(io_, convertedStr, converted.length) && + EmitSuffix(edit); + } + int expo{converted.decimalExponent + edit.modes.scale /*kP*/}; + int signLength{*convertedStr == '-' || *convertedStr == '+' ? 1 : 0}; + int convertedDigits{static_cast<int>(converted.length) - signLength}; + if (IsZero()) { // don't treat converted "0" as significant digit + expo = 0; + convertedDigits = 0; + } + bool isNegative{*convertedStr == '-'}; + char one[2]; + if (expo > extraDigits && extraDigits >= 0 && canIncrease) { + extraDigits = expo; + if (!edit.digits.has_value()) { // F0 + fracDigits = sizeof buffer_ - extraDigits - 2; // sign & NUL + } + canIncrease = false; // only once + continue; + } else if (expo == -fracDigits && convertedDigits > 0) { + // Result will be either a signed zero or power of ten, depending + // on rounding. + char leading{convertedStr[signLength]}; + bool roundToPowerOfTen{false}; + switch (edit.modes.round) { + case decimal::FortranRounding::RoundUp: + roundToPowerOfTen = !isNegative; + break; + case decimal::FortranRounding::RoundDown: + roundToPowerOfTen = isNegative; + break; + case decimal::FortranRounding::RoundToZero: + break; + case decimal::FortranRounding::RoundNearest: + if (leading == '5' && + rounding == decimal::FortranRounding::RoundNearest) { + // Try again, rounding away from zero. + rounding = isNegative ? decimal::FortranRounding::RoundDown + : decimal::FortranRounding::RoundUp; + extraDigits = 1 - fracDigits; // just one digit needed + continue; + } + roundToPowerOfTen = leading > '5'; + break; + case decimal::FortranRounding::RoundCompatible: + roundToPowerOfTen = leading >= '5'; + break; + } + if (roundToPowerOfTen) { + ++expo; + convertedDigits = 1; + if (signLength > 0) { + one[0] = *convertedStr; + one[1] = '1'; + } else { + one[0] = '1'; + } + convertedStr = one; + } else { + expo = 0; + convertedDigits = 0; + } + } else if (expo < extraDigits && extraDigits > -fracDigits) { + extraDigits = std::max(expo, -fracDigits); + continue; + } + int digitsBeforePoint{std::max(0, std::min(expo, convertedDigits))}; + int zeroesBeforePoint{std::max(0, expo - digitsBeforePoint)}; + if (zeroesBeforePoint > 0 && (flags & decimal::Minimize)) { + // If a minimized result looks like an integer, emit all of + // its digits rather than clipping some to zeroes. + // This can happen with HUGE(0._2) == 65504._2. + flags &= ~decimal::Minimize; + continue; + } + int zeroesAfterPoint{std::min(fracDigits, std::max(0, -expo))}; + int digitsAfterPoint{convertedDigits - digitsBeforePoint}; + int trailingZeroes{emitTrailingZeroes + ? std::max(0, fracDigits - (zeroesAfterPoint + digitsAfterPoint)) + : 0}; + if (digitsBeforePoint + zeroesBeforePoint + zeroesAfterPoint + + digitsAfterPoint + trailingZeroes == + 0) { + zeroesBeforePoint = 1; // "." -> "0." + } + int totalLength{signLength + digitsBeforePoint + zeroesBeforePoint + + 1 /*'.'*/ + zeroesAfterPoint + digitsAfterPoint + trailingZeroes + + trailingBlanks_ /* G editing converted to F */}; + int width{editWidth > 0 || trailingBlanks_ ? editWidth : totalLength}; + if (totalLength > width) { + return EmitRepeated(io_, '*', width); + } + if (totalLength < width && digitsBeforePoint + zeroesBeforePoint == 0) { + zeroesBeforePoint = 1; + ++totalLength; + } + return EmitPrefix(edit, totalLength, width) && + EmitAscii(io_, convertedStr, signLength + digitsBeforePoint) && + EmitRepeated(io_, '0', zeroesBeforePoint) && + EmitAscii(io_, edit.modes.editingFlags & decimalComma ? "," : ".", 1) && + EmitRepeated(io_, '0', zeroesAfterPoint) && + EmitAscii(io_, convertedStr + signLength + digitsBeforePoint, + digitsAfterPoint) && + EmitRepeated(io_, '0', trailingZeroes) && + EmitRepeated(io_, ' ', trailingBlanks_) && EmitSuffix(edit); + } +} + +// 13.7.5.2.3 in F'2018 +template <int KIND> +RT_API_ATTRS DataEdit RealOutputEditing<KIND>::EditForGOutput(DataEdit edit) { + edit.descriptor = 'E'; + edit.variation = 'G'; // to suppress error for Ew.0 + int editWidth{edit.width.value_or(0)}; + int significantDigits{edit.digits.value_or( + static_cast<int>(BinaryFloatingPoint::decimalPrecision))}; // 'd' + if (editWidth > 0 && significantDigits == 0) { + return edit; // Gw.0Ee -> Ew.0Ee for w > 0 + } + int flags{0}; + if (edit.modes.editingFlags & signPlus) { + flags |= decimal::AlwaysSign; + } + decimal::ConversionToDecimalResult converted{ + ConvertToDecimal(significantDigits, edit.modes.round, flags)}; + if (IsInfOrNaN(converted.str, static_cast<int>(converted.length))) { + return edit; // Inf/Nan -> Ew.d (same as Fw.d) + } + int expo{IsZero() ? 1 : converted.decimalExponent}; // 's' + if (expo < 0 || expo > significantDigits) { + if (editWidth == 0 && !edit.expoDigits) { // G0.d -> G0.dE0 + edit.expoDigits = 0; + } + return edit; // Ew.dEe + } + edit.descriptor = 'F'; + edit.modes.scale = 0; // kP is ignored for G when no exponent field + trailingBlanks_ = 0; + if (editWidth > 0) { + int expoDigits{edit.expoDigits.value_or(0)}; + // F'2023 13.7.5.2.3 p5: "If 0 <= s <= d, the scale factor has no effect + // and F(w − n).(d − s),n(’b’) editing is used where b is a blank and + // n is 4 for Gw.d editing, e + 2 for Gw.dEe editing if e > 0, and + // 4 for Gw.dE0 editing." + trailingBlanks_ = expoDigits > 0 ? expoDigits + 2 : 4; // 'n' + } + if (edit.digits.has_value()) { + *edit.digits = std::max(0, *edit.digits - expo); + } + return edit; +} + +// 13.10.4 in F'2018 +template <int KIND> +RT_API_ATTRS bool RealOutputEditing<KIND>::EditListDirectedOutput( + const DataEdit &edit) { + decimal::ConversionToDecimalResult converted{ + ConvertToDecimal(1, edit.modes.round)}; + if (IsInfOrNaN(converted.str, static_cast<int>(converted.length))) { + DataEdit copy{edit}; + copy.variation = DataEdit::ListDirected; + return EditEorDOutput(copy); + } + int expo{converted.decimalExponent}; + // The decimal precision of 16-bit floating-point types is very low, + // so use a reasonable cap of 6 to allow more values to be emitted + // with Fw.d editing. + static constexpr int maxExpo{ + std::max(6, BinaryFloatingPoint::decimalPrecision)}; + if (expo < 0 || expo > maxExpo) { + DataEdit copy{edit}; + copy.variation = DataEdit::ListDirected; + copy.modes.scale = 1; // 1P + return EditEorDOutput(copy); + } else { + return EditFOutput(edit); + } +} + +// 13.7.2.3.6 in F'2023 +// The specification for hexadecimal output, unfortunately for implementors, +// leaves as "implementation dependent" the choice of how to emit values +// with multiple hexadecimal output possibilities that are numerically +// equivalent. The one working implementation of EX output that I can find +// apparently chooses to frame the nybbles from most to least significant, +// rather than trying to minimize the magnitude of the binary exponent. +// E.g., 2. is edited into 0X8.0P-2 rather than 0X2.0P0. This implementation +// follows that precedent so as to avoid a gratuitous incompatibility. +template <int KIND> +RT_API_ATTRS auto RealOutputEditing<KIND>::ConvertToHexadecimal( + int significantDigits, enum decimal::FortranRounding rounding, + int flags) -> ConvertToHexadecimalResult { + if (x_.IsNaN() || x_.IsInfinite()) { + auto converted{ConvertToDecimal(significantDigits, rounding, flags)}; + return {converted.str, static_cast<int>(converted.length), 0}; + } + x_.RoundToBits(4 * significantDigits, rounding); + if (x_.IsInfinite()) { // rounded away to +/-Inf + auto converted{ConvertToDecimal(significantDigits, rounding, flags)}; + return {converted.str, static_cast<int>(converted.length), 0}; + } + int len{0}; + if (x_.IsNegative()) { + buffer_[len++] = '-'; + } else if (flags & decimal::AlwaysSign) { + buffer_[len++] = '+'; + } + auto fraction{x_.Fraction()}; + if (fraction == 0) { + buffer_[len++] = '0'; + return {buffer_, len, 0}; + } else { + // Ensure that the MSB is set. + int expo{x_.UnbiasedExponent() - 3}; + while (!(fraction >> (x_.binaryPrecision - 1))) { + fraction <<= 1; + --expo; + } + // This is initially the right shift count needed to bring the + // most-significant hexadecimal digit's bits into the LSBs. + // x_.binaryPrecision is constant, so / can be used for readability. + int shift{x_.binaryPrecision - 4}; + typename BinaryFloatingPoint::RawType one{1}; + auto remaining{(one << x_.binaryPrecision) - one}; + for (int digits{0}; digits < significantDigits; ++digits) { + if ((flags & decimal::Minimize) && !(fraction & remaining)) { + break; + } + int hexDigit{0}; + if (shift >= 0) { + hexDigit = int(fraction >> shift) & 0xf; + } else if (shift >= -3) { + hexDigit = int(fraction << -shift) & 0xf; + } + if (hexDigit >= 10) { + buffer_[len++] = 'A' + hexDigit - 10; + } else { + buffer_[len++] = '0' + hexDigit; + } + shift -= 4; + remaining >>= 4; + } + return {buffer_, len, expo}; + } +} + +template <int KIND> +RT_API_ATTRS bool RealOutputEditing<KIND>::EditEXOutput(const DataEdit &edit) { + AddSpaceBeforeCharacter(io_); + int editDigits{edit.digits.value_or(0)}; // 'd' field + int significantDigits{editDigits + 1}; + int flags{0}; + if (edit.modes.editingFlags & signPlus) { + flags |= decimal::AlwaysSign; + } + int editWidth{edit.width.value_or(0)}; // 'w' field + if ((editWidth == 0 && !edit.digits) || editDigits == 0) { + // EX0 or EXw.0 + flags |= decimal::Minimize; + static constexpr int maxSigHexDigits{ + (common::PrecisionOfRealKind(16) + 3) / 4}; + significantDigits = maxSigHexDigits; + } + auto converted{ + ConvertToHexadecimal(significantDigits, edit.modes.round, flags)}; + if (IsInfOrNaN(converted.str, converted.length)) { + return editWidth > 0 && converted.length > editWidth + ? EmitRepeated(io_, '*', editWidth) + : (editWidth <= converted.length || + EmitRepeated(io_, ' ', editWidth - converted.length)) && + EmitAscii(io_, converted.str, converted.length); + } + int signLength{converted.length > 0 && + (converted.str[0] == '-' || converted.str[0] == '+') + ? 1 + : 0}; + int convertedDigits{converted.length - signLength}; + int expoLength{0}; + const char *exponent{FormatExponent(converted.exponent, edit, expoLength)}; + int trailingZeroes{flags & decimal::Minimize + ? 0 + : std::max(0, significantDigits - convertedDigits)}; + int totalLength{converted.length + trailingZeroes + expoLength + 3 /*0X.*/}; + int width{editWidth > 0 ? editWidth : totalLength}; + return totalLength > width || !exponent + ? EmitRepeated(io_, '*', width) + : EmitRepeated(io_, ' ', width - totalLength) && + EmitAscii(io_, converted.str, signLength) && + EmitAscii(io_, "0X", 2) && + EmitAscii(io_, converted.str + signLength, 1) && + EmitAscii( + io_, edit.modes.editingFlags & decimalComma ? "," : ".", 1) && + EmitAscii(io_, converted.str + signLength + 1, + converted.length - (signLength + 1)) && + EmitRepeated(io_, '0', trailingZeroes) && + EmitAscii(io_, exponent, expoLength); +} + +template <int KIND> +RT_API_ATTRS bool RealOutputEditing<KIND>::Edit(const DataEdit &edit) { + const DataEdit *editPtr{&edit}; + DataEdit newEdit; + if (editPtr->descriptor == 'G') { + // Avoid recursive call as in Edit(EditForGOutput(edit)). + newEdit = EditForGOutput(*editPtr); + editPtr = &newEdit; + RUNTIME_CHECK(io_.GetIoErrorHandler(), editPtr->descriptor != 'G'); + } + switch (editPtr->descriptor) { + case 'D': + return EditEorDOutput(*editPtr); + case 'E': + if (editPtr->variation == 'X') { + return EditEXOutput(*editPtr); + } else { + return EditEorDOutput(*editPtr); + } + case 'F': + return EditFOutput(*editPtr); + case 'B': + return EditBOZOutput<1>(io_, *editPtr, + reinterpret_cast<const unsigned char *>(&x_), + common::BitsForBinaryPrecision(common::PrecisionOfRealKind(KIND)) >> 3); + case 'O': + return EditBOZOutput<3>(io_, *editPtr, + reinterpret_cast<const unsigned char *>(&x_), + common::BitsForBinaryPrecision(common::PrecisionOfRealKind(KIND)) >> 3); + case 'Z': + return EditBOZOutput<4>(io_, *editPtr, + reinterpret_cast<const unsigned char *>(&x_), + common::BitsForBinaryPrecision(common::PrecisionOfRealKind(KIND)) >> 3); + case 'L': + return EditLogicalOutput( + io_, *editPtr, *reinterpret_cast<const char *>(&x_)); + case 'A': // legacy extension + return EditCharacterOutput( + io_, *editPtr, reinterpret_cast<char *>(&x_), sizeof x_); + default: + if (editPtr->IsListDirected()) { + return EditListDirectedOutput(*editPtr); + } + io_.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used with a REAL data item", + editPtr->descriptor); + return false; + } + return false; +} + +RT_API_ATTRS bool ListDirectedLogicalOutput(IoStatementState &io, + ListDirectedStatementState<Direction::Output> &list, bool truth) { + return list.EmitLeadingSpaceOrAdvance(io) && + EmitAscii(io, truth ? "T" : "F", 1); +} + +RT_API_ATTRS bool EditLogicalOutput( + IoStatementState &io, const DataEdit &edit, bool truth) { + switch (edit.descriptor) { + case 'L': + case 'G': + return EmitRepeated(io, ' ', std::max(0, edit.width.value_or(1) - 1)) && + EmitAscii(io, truth ? "T" : "F", 1); + case 'B': + return EditBOZOutput<1>(io, edit, + reinterpret_cast<const unsigned char *>(&truth), sizeof truth); + case 'O': + return EditBOZOutput<3>(io, edit, + reinterpret_cast<const unsigned char *>(&truth), sizeof truth); + case 'Z': + return EditBOZOutput<4>(io, edit, + reinterpret_cast<const unsigned char *>(&truth), sizeof truth); + case 'A': { // legacy extension + int truthBits{truth}; + int len{sizeof truthBits}; + int width{edit.width.value_or(len)}; + return EmitRepeated(io, ' ', std::max(0, width - len)) && + EmitEncoded( + io, reinterpret_cast<char *>(&truthBits), std::min(width, len)); + } + default: + io.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used with a LOGICAL data item", + edit.descriptor); + return false; + } +} + +template <typename CHAR> +RT_API_ATTRS bool ListDirectedCharacterOutput(IoStatementState &io, + ListDirectedStatementState<Direction::Output> &list, const CHAR *x, + std::size_t length) { + bool ok{true}; + MutableModes &modes{io.mutableModes()}; + ConnectionState &connection{io.GetConnectionState()}; + if (modes.delim) { + ok = ok && list.EmitLeadingSpaceOrAdvance(io); + // Value is delimited with ' or " marks, and interior + // instances of that character are doubled. + auto EmitOne{[&](CHAR ch) { + if (connection.NeedAdvance(1)) { + ok = ok && io.AdvanceRecord(); + } + ok = ok && EmitEncoded(io, &ch, 1); + }}; + EmitOne(modes.delim); + for (std::size_t j{0}; j < length; ++j) { + // Doubled delimiters must be put on the same record + // in order to be acceptable as list-directed or NAMELIST + // input; however, this requirement is not always possible + // when the records have a fixed length, as is the case with + // internal output. The standard is silent on what should + // happen, and no two extant Fortran implementations do + // the same thing when tested with this case. + // This runtime splits the doubled delimiters across + // two records for lack of a better alternative. + if (x[j] == static_cast<CHAR>(modes.delim)) { + EmitOne(x[j]); + } + EmitOne(x[j]); + } + EmitOne(modes.delim); + } else { + // Undelimited list-directed output + ok = ok && list.EmitLeadingSpaceOrAdvance(io, length > 0 ? 1 : 0, true); + std::size_t put{0}; + std::size_t oneAtATime{ + connection.useUTF8<CHAR>() || connection.internalIoCharKind > 1 + ? 1 + : length}; + while (ok && put < length) { + if (std::size_t chunk{std::min<std::size_t>( + std::min<std::size_t>(length - put, oneAtATime), + connection.RemainingSpaceInRecord())}) { + ok = EmitEncoded(io, x + put, chunk); + put += chunk; + } else { + ok = io.AdvanceRecord() && EmitAscii(io, " ", 1); + } + } + list.set_lastWasUndelimitedCharacter(true); + } + return ok; +} + +template <typename CHAR> +RT_API_ATTRS bool EditCharacterOutput(IoStatementState &io, + const DataEdit &edit, const CHAR *x, std::size_t length) { + int len{static_cast<int>(length)}; + int width{edit.width.value_or(len)}; + switch (edit.descriptor) { + case 'A': + break; + case 'G': + if (width == 0) { + width = len; + } + break; + case 'B': + return EditBOZOutput<1>(io, edit, + reinterpret_cast<const unsigned char *>(x), sizeof(CHAR) * length); + case 'O': + return EditBOZOutput<3>(io, edit, + reinterpret_cast<const unsigned char *>(x), sizeof(CHAR) * length); + case 'Z': + return EditBOZOutput<4>(io, edit, + reinterpret_cast<const unsigned char *>(x), sizeof(CHAR) * length); + case 'L': + return EditLogicalOutput(io, edit, *reinterpret_cast<const char *>(x)); + default: + io.GetIoErrorHandler().SignalError(IostatErrorInFormat, + "Data edit descriptor '%c' may not be used with a CHARACTER data item", + edit.descriptor); + return false; + } + return EmitRepeated(io, ' ', std::max(0, width - len)) && + EmitEncoded(io, x, std::min(width, len)); +} + +template RT_API_ATTRS bool EditIntegerOutput<1>( + IoStatementState &, const DataEdit &, std::int8_t, bool); +template RT_API_ATTRS bool EditIntegerOutput<2>( + IoStatementState &, const DataEdit &, std::int16_t, bool); +template RT_API_ATTRS bool EditIntegerOutput<4>( + IoStatementState &, const DataEdit &, std::int32_t, bool); +template RT_API_ATTRS bool EditIntegerOutput<8>( + IoStatementState &, const DataEdit &, std::int64_t, bool); +template RT_API_ATTRS bool EditIntegerOutput<16>( + IoStatementState &, const DataEdit &, common::int128_t, bool); + +template class RealOutputEditing<2>; +template class RealOutputEditing<3>; +template class RealOutputEditing<4>; +template class RealOutputEditing<8>; +template class RealOutputEditing<10>; +// TODO: double/double +template class RealOutputEditing<16>; + +template RT_API_ATTRS bool ListDirectedCharacterOutput(IoStatementState &, + ListDirectedStatementState<Direction::Output> &, const char *, + std::size_t chars); +template RT_API_ATTRS bool ListDirectedCharacterOutput(IoStatementState &, + ListDirectedStatementState<Direction::Output> &, const char16_t *, + std::size_t chars); +template RT_API_ATTRS bool ListDirectedCharacterOutput(IoStatementState &, + ListDirectedStatementState<Direction::Output> &, const char32_t *, + std::size_t chars); + +template RT_API_ATTRS bool EditCharacterOutput( + IoStatementState &, const DataEdit &, const char *, std::size_t chars); +template RT_API_ATTRS bool EditCharacterOutput( + IoStatementState &, const DataEdit &, const char16_t *, std::size_t chars); +template RT_API_ATTRS bool EditCharacterOutput( + IoStatementState &, const DataEdit &, const char32_t *, std::size_t chars); + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-output.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-output.h new file mode 100644 index 00000000000..dbeccb291d3 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/edit-output.h @@ -0,0 +1,145 @@ +//===-- lib/runtime/edit-output.h -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_EDIT_OUTPUT_H_ +#define FLANG_RT_RUNTIME_EDIT_OUTPUT_H_ + +// Output data editing templates implementing the FORMAT data editing +// descriptors E, EN, ES, EX, D, F, and G for REAL data (and COMPLEX +// components, I and G for INTEGER, and B/O/Z for both. +// See subclauses in 13.7.2.3 of Fortran 2018 for the +// detailed specifications of these descriptors. +// List-directed output (13.10.4) for numeric types is also done here. +// Drives the same fast binary-to-decimal formatting templates used +// in the f18 front-end. + +#include "flang-rt/runtime/format.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang/Common/uint128.h" +#include "flang/Decimal/decimal.h" + +namespace Fortran::runtime::io { + +RT_OFFLOAD_API_GROUP_BEGIN + +// I, B, O, Z, and G output editing for INTEGER. +// The DataEdit reference is const here (and elsewhere in this header) so that +// one edit descriptor with a repeat factor may safely serve to edit +// multiple elements of an array. +template <int KIND> +RT_API_ATTRS bool EditIntegerOutput(IoStatementState &, const DataEdit &, + common::HostSignedIntType<8 * KIND>, bool isSigned); + +// Encapsulates the state of a REAL output conversion. +class RealOutputEditingBase { +protected: + explicit RT_API_ATTRS RealOutputEditingBase(IoStatementState &io) : io_{io} {} + + // Returns null when the exponent overflows a fixed-size output field. + RT_API_ATTRS const char *FormatExponent( + int, const DataEdit &edit, int &length); + RT_API_ATTRS bool EmitPrefix( + const DataEdit &, std::size_t length, std::size_t width); + RT_API_ATTRS bool EmitSuffix(const DataEdit &); + + IoStatementState &io_; + int trailingBlanks_{0}; // created when Gw editing maps to Fw + char exponent_[16]; +}; + +template <int KIND> class RealOutputEditing : public RealOutputEditingBase { +public: + RT_VAR_GROUP_BEGIN + static constexpr int binaryPrecision{common::PrecisionOfRealKind(KIND)}; + RT_VAR_GROUP_END + using BinaryFloatingPoint = + decimal::BinaryFloatingPointNumber<binaryPrecision>; + template <typename A> + RT_API_ATTRS RealOutputEditing(IoStatementState &io, A x) + : RealOutputEditingBase{io}, x_{x} {} + RT_API_ATTRS bool Edit(const DataEdit &); + +private: + // The DataEdit arguments here are const references or copies so that + // the original DataEdit can safely serve multiple array elements when + // it has a repeat count. + RT_API_ATTRS bool EditEorDOutput(const DataEdit &); + RT_API_ATTRS bool EditFOutput(const DataEdit &); + RT_API_ATTRS DataEdit EditForGOutput(DataEdit); // returns an E or F edit + RT_API_ATTRS bool EditEXOutput(const DataEdit &); + RT_API_ATTRS bool EditListDirectedOutput(const DataEdit &); + + RT_API_ATTRS bool IsZero() const { return x_.IsZero(); } + + RT_API_ATTRS decimal::ConversionToDecimalResult ConvertToDecimal( + int significantDigits, enum decimal::FortranRounding, int flags = 0); + + struct ConvertToHexadecimalResult { + const char *str; + int length; + int exponent; + }; + RT_API_ATTRS ConvertToHexadecimalResult ConvertToHexadecimal( + int significantDigits, enum decimal::FortranRounding, int flags = 0); + + BinaryFloatingPoint x_; + char buffer_[BinaryFloatingPoint::maxDecimalConversionDigits + + EXTRA_DECIMAL_CONVERSION_SPACE]; +}; + +RT_API_ATTRS bool ListDirectedLogicalOutput( + IoStatementState &, ListDirectedStatementState<Direction::Output> &, bool); +RT_API_ATTRS bool EditLogicalOutput(IoStatementState &, const DataEdit &, bool); + +template <typename CHAR> +RT_API_ATTRS bool ListDirectedCharacterOutput(IoStatementState &, + ListDirectedStatementState<Direction::Output> &, const CHAR *, + std::size_t chars); +extern template RT_API_ATTRS bool ListDirectedCharacterOutput( + IoStatementState &, ListDirectedStatementState<Direction::Output> &, + const char *, std::size_t chars); +extern template RT_API_ATTRS bool ListDirectedCharacterOutput( + IoStatementState &, ListDirectedStatementState<Direction::Output> &, + const char16_t *, std::size_t chars); +extern template RT_API_ATTRS bool ListDirectedCharacterOutput( + IoStatementState &, ListDirectedStatementState<Direction::Output> &, + const char32_t *, std::size_t chars); + +template <typename CHAR> +RT_API_ATTRS bool EditCharacterOutput( + IoStatementState &, const DataEdit &, const CHAR *, std::size_t chars); +extern template RT_API_ATTRS bool EditCharacterOutput( + IoStatementState &, const DataEdit &, const char *, std::size_t chars); +extern template RT_API_ATTRS bool EditCharacterOutput( + IoStatementState &, const DataEdit &, const char16_t *, std::size_t chars); +extern template RT_API_ATTRS bool EditCharacterOutput( + IoStatementState &, const DataEdit &, const char32_t *, std::size_t chars); + +extern template RT_API_ATTRS bool EditIntegerOutput<1>( + IoStatementState &, const DataEdit &, std::int8_t, bool); +extern template RT_API_ATTRS bool EditIntegerOutput<2>( + IoStatementState &, const DataEdit &, std::int16_t, bool); +extern template RT_API_ATTRS bool EditIntegerOutput<4>( + IoStatementState &, const DataEdit &, std::int32_t, bool); +extern template RT_API_ATTRS bool EditIntegerOutput<8>( + IoStatementState &, const DataEdit &, std::int64_t, bool); +extern template RT_API_ATTRS bool EditIntegerOutput<16>( + IoStatementState &, const DataEdit &, common::int128_t, bool); + +extern template class RealOutputEditing<2>; +extern template class RealOutputEditing<3>; +extern template class RealOutputEditing<4>; +extern template class RealOutputEditing<8>; +extern template class RealOutputEditing<10>; +// TODO: double/double +extern template class RealOutputEditing<16>; + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_EDIT_OUTPUT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/environment-default-list.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/environment-default-list.h new file mode 100644 index 00000000000..76c0955bcce --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/environment-default-list.h @@ -0,0 +1,30 @@ +/*===-- lib/flang_rt/environment-default-list.h ---------------------*- C -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ + +#ifndef FLANG_RT_ENVIRONMENT_DEFAULT_LIST_H_ +#define FLANG_RT_ENVIRONMENT_DEFAULT_LIST_H_ + +/* Try to maintain C compatibility to make it easier to both define environment + * defaults in non-Fortran main programs as well as pass through the environment + * default list in C code. + */ + +struct EnvironmentDefaultItem { + const char *name; + const char *value; +}; + +/* Default values for environment variables are packaged by lowering into an + * instance of this struct to be read and set by the runtime. + */ +struct EnvironmentDefaultList { + int numItems; + const struct EnvironmentDefaultItem *item; +}; + +#endif /* FLANG_RT_ENVIRONMENT_DEFAULT_LIST_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/environment.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/environment.cpp new file mode 100644 index 00000000000..0f0564403c0 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/environment.cpp @@ -0,0 +1,252 @@ +//===-- lib/runtime/environment.cpp -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/environment.h" +#include "environment-default-list.h" +#include "memory.h" +#include "flang-rt/runtime/tools.h" +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <limits> + +#ifdef _WIN32 +extern char **_environ; +#else +extern char **environ; +#endif + +namespace Fortran::runtime { + +#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS +RT_OFFLOAD_VAR_GROUP_BEGIN +RT_VAR_ATTRS ExecutionEnvironment executionEnvironment; +RT_OFFLOAD_VAR_GROUP_END +#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS + +static void SetEnvironmentDefaults(const EnvironmentDefaultList *envDefaults) { + if (!envDefaults) { + return; + } + + for (int itemIndex = 0; itemIndex < envDefaults->numItems; ++itemIndex) { + const char *name = envDefaults->item[itemIndex].name; + const char *value = envDefaults->item[itemIndex].value; +#ifdef _WIN32 + if (auto *x{std::getenv(name)}) { + continue; + } + if (_putenv_s(name, value) != 0) { +#else + if (setenv(name, value, /*overwrite=*/0) == -1) { +#endif + Fortran::runtime::Terminator{__FILE__, __LINE__}.Crash( + std::strerror(errno)); + } + } +} + +RT_OFFLOAD_API_GROUP_BEGIN +Fortran::common::optional<Convert> GetConvertFromString( + const char *x, std::size_t n) { + static const char *keywords[]{ + "UNKNOWN", "NATIVE", "LITTLE_ENDIAN", "BIG_ENDIAN", "SWAP", nullptr}; + switch (IdentifyValue(x, n, keywords)) { + case 0: + return Convert::Unknown; + case 1: + return Convert::Native; + case 2: + return Convert::LittleEndian; + case 3: + return Convert::BigEndian; + case 4: + return Convert::Swap; + default: + return Fortran::common::nullopt; + } +} +RT_OFFLOAD_API_GROUP_END + +void ExecutionEnvironment::Configure(int ac, const char *av[], + const char *env[], const EnvironmentDefaultList *envDefaults) { + argc = ac; + argv = av; + SetEnvironmentDefaults(envDefaults); +#ifdef _WIN32 + envp = _environ; +#else + envp = environ; +#endif + listDirectedOutputLineLengthLimit = 79; // PGI default + defaultOutputRoundingMode = + decimal::FortranRounding::RoundNearest; // RP(==RN) + conversion = Convert::Unknown; + + if (auto *x{std::getenv("FORT_FMT_RECL")}) { + char *end; + auto n{std::strtol(x, &end, 10)}; + if (n > 0 && n < std::numeric_limits<int>::max() && *end == '\0') { + listDirectedOutputLineLengthLimit = n; + } else { + std::fprintf( + stderr, "Fortran runtime: FORT_FMT_RECL=%s is invalid; ignored\n", x); + } + } + + if (auto *x{std::getenv("FORT_CONVERT")}) { + if (auto convert{GetConvertFromString(x, std::strlen(x))}) { + conversion = *convert; + } else { + std::fprintf( + stderr, "Fortran runtime: FORT_CONVERT=%s is invalid; ignored\n", x); + } + } + + if (auto *x{std::getenv("NO_STOP_MESSAGE")}) { + char *end; + auto n{std::strtol(x, &end, 10)}; + if (n >= 0 && n <= 1 && *end == '\0') { + noStopMessage = n != 0; + } else { + std::fprintf(stderr, + "Fortran runtime: NO_STOP_MESSAGE=%s is invalid; ignored\n", x); + } + } + + if (auto *x{std::getenv("DEFAULT_UTF8")}) { + char *end; + auto n{std::strtol(x, &end, 10)}; + if (n >= 0 && n <= 1 && *end == '\0') { + defaultUTF8 = n != 0; + } else { + std::fprintf( + stderr, "Fortran runtime: DEFAULT_UTF8=%s is invalid; ignored\n", x); + } + } + + if (auto *x{std::getenv("FORT_CHECK_POINTER_DEALLOCATION")}) { + char *end; + auto n{std::strtol(x, &end, 10)}; + if (n >= 0 && n <= 1 && *end == '\0') { + checkPointerDeallocation = n != 0; + } else { + std::fprintf(stderr, + "Fortran runtime: FORT_CHECK_POINTER_DEALLOCATION=%s is invalid; " + "ignored\n", + x); + } + } + + if (auto *x{std::getenv("FLANG_RT_DEBUG")}) { + internalDebugging = std::strtol(x, nullptr, 10); + } + + if (auto *x{std::getenv("ACC_OFFLOAD_STACK_SIZE")}) { + char *end; + auto n{std::strtoul(x, &end, 10)}; + if (n > 0 && n < std::numeric_limits<std::size_t>::max() && *end == '\0') { + cudaStackLimit = n; + } else { + std::fprintf(stderr, + "Fortran runtime: ACC_OFFLOAD_STACK_SIZE=%s is invalid; ignored\n", + x); + } + } + + if (auto *x{std::getenv("NV_CUDAFOR_DEVICE_IS_MANAGED")}) { + char *end; + auto n{std::strtol(x, &end, 10)}; + if (n >= 0 && n <= 1 && *end == '\0') { + cudaDeviceIsManaged = n != 0; + } else { + std::fprintf(stderr, + "Fortran runtime: NV_CUDAFOR_DEVICE_IS_MANAGED=%s is invalid; " + "ignored\n", + x); + } + } + + // TODO: Set RP/ROUND='PROCESSOR_DEFINED' from environment +} + +const char *ExecutionEnvironment::GetEnv( + const char *name, std::size_t name_length, const Terminator &terminator) { + RUNTIME_CHECK(terminator, name && name_length); + + OwningPtr<char> cStyleName{ + SaveDefaultCharacter(name, name_length, terminator)}; + RUNTIME_CHECK(terminator, cStyleName); + + return std::getenv(cStyleName.get()); +} + +std::int32_t ExecutionEnvironment::SetEnv(const char *name, + std::size_t name_length, const char *value, std::size_t value_length, + const Terminator &terminator) { + + RUNTIME_CHECK(terminator, name && name_length && value && value_length); + + OwningPtr<char> cStyleName{ + SaveDefaultCharacter(name, name_length, terminator)}; + RUNTIME_CHECK(terminator, cStyleName); + + OwningPtr<char> cStyleValue{ + SaveDefaultCharacter(value, value_length, terminator)}; + RUNTIME_CHECK(terminator, cStyleValue); + + std::int32_t status{0}; + +#ifdef _WIN32 + + status = _putenv_s(cStyleName.get(), cStyleValue.get()); + +#else + + constexpr int overwrite = 1; + status = setenv(cStyleName.get(), cStyleValue.get(), overwrite); + +#endif + + if (status != 0) { + status = errno; + } + + return status; +} + +std::int32_t ExecutionEnvironment::UnsetEnv( + const char *name, std::size_t name_length, const Terminator &terminator) { + + RUNTIME_CHECK(terminator, name && name_length); + + OwningPtr<char> cStyleName{ + SaveDefaultCharacter(name, name_length, terminator)}; + RUNTIME_CHECK(terminator, cStyleName); + + std::int32_t status{0}; + +#ifdef _WIN32 + + // Passing empty string as value will unset the variable + status = _putenv_s(cStyleName.get(), ""); + +#else + + status = unsetenv(cStyleName.get()); + +#endif + + if (status != 0) { + status = errno; + } + + return status; +} + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/exceptions.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/exceptions.cpp new file mode 100644 index 00000000000..e5ba06c92ca --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/exceptions.cpp @@ -0,0 +1,201 @@ +//===-- lib/runtime/exceptions.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Runtime exception support. + +#include "flang/Runtime/exceptions.h" +#include "flang-rt/runtime/terminator.h" +#include <cfenv> +#if defined(__aarch64__) && defined(__GLIBC__) +#include <fpu_control.h> +#elif defined(__x86_64__) && !defined(_WIN32) +#include <xmmintrin.h> +#endif + +// File fenv.h usually, but not always, defines standard exceptions as both +// enumerator values and preprocessor #defines. Some x86 environments also +// define a nonstandard __FE_DENORM enumerator, but without a corresponding +// #define, which makes it more difficult to determine if it is present or not. +#ifndef FE_INVALID +#define FE_INVALID 0 +#endif +#ifndef FE_DIVBYZERO +#define FE_DIVBYZERO 0 +#endif +#ifndef FE_OVERFLOW +#define FE_OVERFLOW 0 +#endif +#ifndef FE_UNDERFLOW +#define FE_UNDERFLOW 0 +#endif +#ifndef FE_INEXACT +#define FE_INEXACT 0 +#endif +#if FE_INVALID == 1 && FE_DIVBYZERO == 4 && FE_OVERFLOW == 8 && \ + FE_UNDERFLOW == 16 && FE_INEXACT == 32 +#define __FE_DENORM 2 +#else +#define __FE_DENORM 0 +#endif + +namespace Fortran::runtime { + +extern "C" { + +// Map a set of Fortran ieee_arithmetic module exceptions to a libm fenv.h +// excepts value. +uint32_t RTNAME(MapException)(uint32_t excepts) { + Terminator terminator{__FILE__, __LINE__}; + + static constexpr uint32_t v{FE_INVALID}; + static constexpr uint32_t s{__FE_DENORM}; + static constexpr uint32_t z{FE_DIVBYZERO}; + static constexpr uint32_t o{FE_OVERFLOW}; + static constexpr uint32_t u{FE_UNDERFLOW}; + static constexpr uint32_t x{FE_INEXACT}; + +#define vm(p) p, p | v +#define sm(p) vm(p), vm(p | s) +#define zm(p) sm(p), sm(p | z) +#define om(p) zm(p), zm(p | o) +#define um(p) om(p), om(p | u) +#define xm um(0), um(x) + + static constexpr uint32_t map[]{xm}; + static constexpr uint32_t mapSize{sizeof(map) / sizeof(uint32_t)}; + static_assert(mapSize == 64); + if (excepts >= mapSize) { + terminator.Crash("Invalid excepts value: %d", excepts); + } + uint32_t except_value = map[excepts]; + return except_value; +} + +// The following exception processing routines have a libm call component, +// and where available, an additional component for handling the nonstandard +// ieee_denorm exception. The denorm component does not subsume the libm +// component; both are needed. + +void RTNAME(feclearexcept)(uint32_t excepts) { + feclearexcept(excepts); +#if defined(_MM_EXCEPT_DENORM) + _mm_setcsr(_mm_getcsr() & ~(excepts & _MM_EXCEPT_MASK)); +#endif +} +void RTNAME(feraiseexcept)(uint32_t excepts) { + feraiseexcept(excepts); +#if defined(_MM_EXCEPT_DENORM) + _mm_setcsr(_mm_getcsr() | (excepts & _MM_EXCEPT_MASK)); +#endif +} +uint32_t RTNAME(fetestexcept)(uint32_t excepts) { +#if defined(_MM_EXCEPT_DENORM) + return (_mm_getcsr() & _MM_EXCEPT_MASK & excepts) | fetestexcept(excepts); +#else + return fetestexcept(excepts); +#endif +} +void RTNAME(fedisableexcept)(uint32_t excepts) { +#ifdef __USE_GNU + fedisableexcept(excepts); +#endif +#if defined(_MM_EXCEPT_DENORM) + _mm_setcsr(_mm_getcsr() | ((excepts & _MM_EXCEPT_MASK) << 7)); +#endif +} +void RTNAME(feenableexcept)(uint32_t excepts) { +#ifdef __USE_GNU + feenableexcept(excepts); +#endif +#if defined(_MM_EXCEPT_DENORM) + _mm_setcsr(_mm_getcsr() & ~((excepts & _MM_EXCEPT_MASK) << 7)); +#endif +} +uint32_t RTNAME(fegetexcept)() { + uint32_t excepts = 0; +#ifdef __USE_GNU + excepts = fegetexcept(); +#endif +#if defined(_MM_EXCEPT_DENORM) + return (63 - ((_mm_getcsr() >> 7) & _MM_EXCEPT_MASK)) | excepts; +#else + return excepts; +#endif +} + +// Check if the processor has the ability to control whether to halt or +// continue execution when a given exception is raised. +bool RTNAME(SupportHalting)([[maybe_unused]] uint32_t except) { +#ifdef __USE_GNU + except = RTNAME(MapException)(except); + int currentSet = RTNAME(fegetexcept)(), flipSet; + if (currentSet & except) { + RTNAME(fedisableexcept)(except); + flipSet = RTNAME(fegetexcept)(); + RTNAME(feenableexcept)(except); + } else { + RTNAME(feenableexcept)(except); + flipSet = RTNAME(fegetexcept)(); + RTNAME(fedisableexcept)(except); + } + return currentSet != flipSet; +#else + return false; +#endif +} + +// A hardware FZ (flush to zero) bit is the negation of the +// ieee_[get|set]_underflow_mode GRADUAL argument. +#if defined(_MM_FLUSH_ZERO_MASK) +// The x86_64 MXCSR FZ bit affects computations of real kinds 3, 4, and 8. +#elif defined(_FPU_GETCW) +// The aarch64 FPCR FZ bit affects computations of real kinds 3, 4, and 8. +// bit 24: FZ -- single, double precision flush to zero bit +// bit 19: FZ16 -- half precision flush to zero bit [not currently relevant] +#define _FPU_FPCR_FZ_MASK_ 0x01080000 +#endif + +bool RTNAME(GetUnderflowMode)(void) { +#if defined(_MM_FLUSH_ZERO_MASK) + return _MM_GET_FLUSH_ZERO_MODE() == _MM_FLUSH_ZERO_OFF; +#elif defined(_FPU_GETCW) + uint64_t fpcr; + _FPU_GETCW(fpcr); + return (fpcr & _FPU_FPCR_FZ_MASK_) == 0; +#else + return false; +#endif +} +void RTNAME(SetUnderflowMode)(bool flag) { +#if defined(_MM_FLUSH_ZERO_MASK) + _MM_SET_FLUSH_ZERO_MODE(flag ? _MM_FLUSH_ZERO_OFF : _MM_FLUSH_ZERO_ON); +#elif defined(_FPU_GETCW) + uint64_t fpcr; + _FPU_GETCW(fpcr); + if (flag) { + fpcr &= ~_FPU_FPCR_FZ_MASK_; + } else { + fpcr |= _FPU_FPCR_FZ_MASK_; + } + _FPU_SETCW(fpcr); +#endif +} + +size_t RTNAME(GetModesTypeSize)(void) { +#ifdef __GLIBC_USE_IEC_60559_BFP_EXT + return sizeof(femode_t); // byte size of ieee_modes_type data +#else + return 8; // femode_t is not defined +#endif +} +size_t RTNAME(GetStatusTypeSize)(void) { + return sizeof(fenv_t); // byte size of ieee_status_type data +} + +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/execute.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/execute.cpp new file mode 100644 index 00000000000..779e040bebe --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/execute.cpp @@ -0,0 +1,287 @@ +//===-- lib/runtime/execute.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/execute.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include <cstdlib> +#include <errno.h> +#include <future> +#include <limits> + +#ifdef _WIN32 +#include "flang/Common/windows-include.h" +#else +#include <signal.h> +#include <sys/wait.h> +#include <unistd.h> +#endif + +namespace Fortran::runtime { + +// cmdstat specified in 16.9.73 +// −1 if the processor does not support command line execution, +// a processor-dependent positive value if an error condition occurs +// −2 if no error condition occurs but WAIT is present with the value false +// and the processor does not support asynchronous execution. Otherwise it is +// assigned the value 0 +enum CMD_STAT { + ASYNC_NO_SUPPORT_ERR = -2, // system returns -1 with ENOENT + NO_SUPPORT_ERR = -1, // Linux setsid() returns -1 + CMD_EXECUTED = 0, // command executed with no error + FORK_ERR = 1, // Linux fork() returns < 0 + EXECL_ERR = 2, // system returns -1 with other errno + COMMAND_EXECUTION_ERR = 3, // exit code 1 + COMMAND_CANNOT_EXECUTE_ERR = 4, // Linux exit code 126 + COMMAND_NOT_FOUND_ERR = 5, // Linux exit code 127 + INVALID_CL_ERR = 6, // cover all other non-zero exit code + SIGNAL_ERR = 7 +}; + +// Override CopyCharsToDescriptor in tools.h, pass string directly +void CopyCharsToDescriptor(const Descriptor &value, const char *rawValue) { + CopyCharsToDescriptor(value, rawValue, std::strlen(rawValue)); +} + +void CheckAndCopyCharsToDescriptor( + const Descriptor *value, const char *rawValue) { + if (value) { + CopyCharsToDescriptor(*value, rawValue); + } +} + +void CheckAndStoreIntToDescriptor( + const Descriptor *intVal, std::int64_t value, Terminator &terminator) { + if (intVal) { + StoreIntToDescriptor(intVal, value, terminator); + } +} + +// If a condition occurs that would assign a nonzero value to CMDSTAT but +// the CMDSTAT variable is not present, error termination is initiated. +std::int64_t TerminationCheck(std::int64_t status, const Descriptor *cmdstat, + const Descriptor *cmdmsg, Terminator &terminator) { + // On both Windows and Linux, errno is set when system returns -1. + if (status == -1) { + // On Windows, ENOENT means the command interpreter can't be found. + // On Linux, system calls execl with filepath "/bin/sh", ENOENT means the + // file pathname does not exist. + if (errno == ENOENT) { + if (!cmdstat) { + terminator.Crash("Command line execution is not supported, system " + "returns -1 with errno ENOENT."); + } else { + StoreIntToDescriptor(cmdstat, NO_SUPPORT_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, + "Command line execution is not supported, system returns -1 with " + "errno ENOENT."); + } + } else { + char err_buffer[30]; + char msg[]{"Execution error with system status code: -1, errno: "}; +#ifdef _WIN32 + if (strerror_s(err_buffer, sizeof(err_buffer), errno) != 0) +#else + if (strerror_r(errno, err_buffer, sizeof(err_buffer)) != 0) +#endif + terminator.Crash("errno to char msg failed."); + char *newMsg{static_cast<char *>(AllocateMemoryOrCrash( + terminator, std::strlen(msg) + std::strlen(err_buffer) + 1))}; + std::strcat(newMsg, err_buffer); + + if (!cmdstat) { + terminator.Crash(newMsg); + } else { + StoreIntToDescriptor(cmdstat, EXECL_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, newMsg); + } + FreeMemory(newMsg); + } + } + +#ifdef _WIN32 + // On WIN32 API std::system returns exit status directly + std::int64_t exitStatusVal{status}; + if (exitStatusVal != 0) { + if (!cmdstat) { + terminator.Crash( + "Invalid command quit with exit status code: %d", exitStatusVal); + } else { + StoreIntToDescriptor(cmdstat, INVALID_CL_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, "Invalid command line"); + } + } +#else + std::int64_t exitStatusVal{WEXITSTATUS(status)}; + if (exitStatusVal == 1) { + if (!cmdstat) { + terminator.Crash("Command line execution failed with exit code: 1."); + } else { + StoreIntToDescriptor(cmdstat, COMMAND_EXECUTION_ERR, terminator); + CheckAndCopyCharsToDescriptor( + cmdmsg, "Command line execution failed with exit code: 1."); + } + } else if (exitStatusVal == 126) { + if (!cmdstat) { + terminator.Crash("Command cannot be executed with exit code: 126."); + } else { + StoreIntToDescriptor(cmdstat, COMMAND_CANNOT_EXECUTE_ERR, terminator); + CheckAndCopyCharsToDescriptor( + cmdmsg, "Command cannot be executed with exit code: 126."); + } + } else if (exitStatusVal == 127) { + if (!cmdstat) { + terminator.Crash("Command not found with exit code: 127."); + } else { + StoreIntToDescriptor(cmdstat, COMMAND_NOT_FOUND_ERR, terminator); + CheckAndCopyCharsToDescriptor( + cmdmsg, "Command not found with exit code: 127."); + } + // capture all other nonzero exit code + } else if (exitStatusVal != 0) { + if (!cmdstat) { + terminator.Crash( + "Invalid command quit with exit status code: %d", exitStatusVal); + } else { + StoreIntToDescriptor(cmdstat, INVALID_CL_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, "Invalid command line"); + } + } +#endif + +#if defined(WIFSIGNALED) && defined(WTERMSIG) + if (WIFSIGNALED(status)) { + if (!cmdstat) { + terminator.Crash("Killed by signal: %d", WTERMSIG(status)); + } else { + StoreIntToDescriptor(cmdstat, SIGNAL_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, "Killed by signal"); + } + } +#endif + +#if defined(WIFSTOPPED) && defined(WSTOPSIG) + if (WIFSTOPPED(status)) { + if (!cmdstat) { + terminator.Crash("Stopped by signal: %d", WSTOPSIG(status)); + } else { + StoreIntToDescriptor(cmdstat, SIGNAL_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, "Stopped by signal"); + } + } +#endif + return exitStatusVal; +} + +void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait, + const Descriptor *exitstat, const Descriptor *cmdstat, + const Descriptor *cmdmsg, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + char *newCmd{EnsureNullTerminated( + command.OffsetElement(), command.ElementBytes(), terminator)}; + + if (exitstat) { + RUNTIME_CHECK(terminator, IsValidIntDescriptor(exitstat)); + } + + if (cmdstat) { + RUNTIME_CHECK(terminator, IsValidIntDescriptor(cmdstat)); + // Assigned 0 as specifed in standard, if error then overwrite + StoreIntToDescriptor(cmdstat, CMD_EXECUTED, terminator); + } + + if (cmdmsg) { + RUNTIME_CHECK(terminator, IsValidCharDescriptor(cmdmsg)); + } + + if (wait) { + // either wait is not specified or wait is true: synchronous mode + std::int64_t status{std::system(newCmd)}; + std::int64_t exitStatusVal{ + TerminationCheck(status, cmdstat, cmdmsg, terminator)}; + // If sync, assigned processor-dependent exit status. Otherwise unchanged + CheckAndStoreIntToDescriptor(exitstat, exitStatusVal, terminator); + } else { +// Asynchronous mode +#ifdef _WIN32 + STARTUPINFOW si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + // add "cmd.exe /c " to the beginning of command + const char *prefix{"cmd.exe /c "}; + char *newCmdWin{static_cast<char *>(AllocateMemoryOrCrash( + terminator, std::strlen(prefix) + std::strlen(newCmd) + 1))}; + std::strcpy(newCmdWin, prefix); + std::strcat(newCmdWin, newCmd); + + // Convert the char to wide char + const size_t sizeNeeded{mbstowcs(NULL, newCmdWin, 0) + 1}; + wchar_t *wcmd{static_cast<wchar_t *>( + AllocateMemoryOrCrash(terminator, sizeNeeded * sizeof(wchar_t)))}; + if (std::mbstowcs(wcmd, newCmdWin, sizeNeeded) == static_cast<size_t>(-1)) { + terminator.Crash("Char to wide char failed for newCmd"); + } + FreeMemory(newCmdWin); + + if (CreateProcessW(nullptr, wcmd, nullptr, nullptr, FALSE, 0, nullptr, + nullptr, &si, &pi)) { + // Close handles so it will be removed when terminated + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } else { + if (!cmdstat) { + terminator.Crash( + "CreateProcess failed with error code: %lu.", GetLastError()); + } else { + StoreIntToDescriptor(cmdstat, ASYNC_NO_SUPPORT_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, "CreateProcess failed."); + } + } + FreeMemory(wcmd); +#else + pid_t pid{fork()}; + if (pid < 0) { + if (!cmdstat) { + terminator.Crash("Fork failed with pid: %d.", pid); + } else { + StoreIntToDescriptor(cmdstat, FORK_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, "Fork failed"); + } + } else if (pid == 0) { + // Create a new session, let init process take care of zombie child + if (setsid() == -1) { + if (!cmdstat) { + terminator.Crash("setsid() failed with errno: %d, asynchronous " + "process initiation failed.", + errno); + } else { + StoreIntToDescriptor(cmdstat, ASYNC_NO_SUPPORT_ERR, terminator); + CheckAndCopyCharsToDescriptor(cmdmsg, + "setsid() failed, asynchronous process initiation failed."); + } + exit(EXIT_FAILURE); + } + std::int64_t status{std::system(newCmd)}; + TerminationCheck(status, cmdstat, cmdmsg, terminator); + exit(status); + } +#endif + } + // Deallocate memory if EnsureNullTerminated dynamically allocated memory + if (newCmd != command.OffsetElement()) { + FreeMemory(newCmd); + } +} + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/extensions.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/extensions.cpp new file mode 100644 index 00000000000..e70dff39972 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/extensions.cpp @@ -0,0 +1,341 @@ +//===-- lib/runtime/extensions.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// These C-coded entry points with Fortran-mangled names implement legacy +// extensions that will eventually be implemented in Fortran. + +#include "flang/Runtime/extensions.h" +#include "unit.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Runtime/command.h" +#include "flang/Runtime/entry-names.h" +#include "flang/Runtime/io-api.h" +#include "flang/Runtime/iostat-consts.h" +#include <chrono> +#include <cstdio> +#include <cstring> +#include <ctime> +#include <signal.h> +#include <stdlib.h> +#include <thread> + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include <windows.h> + +#include <synchapi.h> + +inline void CtimeBuffer(char *buffer, size_t bufsize, const time_t cur_time, + Fortran::runtime::Terminator terminator) { + int error{ctime_s(buffer, bufsize, &cur_time)}; + RUNTIME_CHECK(terminator, error == 0); +} +#elif _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || \ + defined(_POSIX_SOURCE) +inline void CtimeBuffer(char *buffer, size_t bufsize, const time_t cur_time, + Fortran::runtime::Terminator terminator) { + const char *res{ctime_r(&cur_time, buffer)}; + RUNTIME_CHECK(terminator, res != nullptr); +} +#else +inline void CtimeBuffer(char *buffer, size_t bufsize, const time_t cur_time, + Fortran::runtime::Terminator terminator) { + buffer[0] = '\0'; + terminator.Crash("fdate is not supported."); +} +#endif + +#ifndef _WIN32 +// posix-compliant and has getlogin_r and F_OK +#include <unistd.h> +#else +#include <direct.h> +#endif + +extern "C" { + +namespace Fortran::runtime { + +gid_t RTNAME(GetGID)() { +#ifdef _WIN32 + // Group IDs don't exist on Windows, return 1 to avoid errors + return 1; +#else + return getgid(); +#endif +} + +uid_t RTNAME(GetUID)() { +#ifdef _WIN32 + // User IDs don't exist on Windows, return 1 to avoid errors + return 1; +#else + return getuid(); +#endif +} + +void GetUsernameEnvVar(const char *envName, char *arg, std::int64_t length) { + Descriptor name{*Descriptor::Create( + 1, std::strlen(envName) + 1, const_cast<char *>(envName), 0)}; + Descriptor value{*Descriptor::Create(1, length, arg, 0)}; + + RTNAME(GetEnvVariable) + (name, &value, nullptr, false, nullptr, __FILE__, __LINE__); +} + +namespace io { +// SUBROUTINE FLUSH(N) +// FLUSH N +// END +void FORTRAN_PROCEDURE_NAME(flush)(const int &unit) { + Cookie cookie{IONAME(BeginFlush)(unit, __FILE__, __LINE__)}; + IONAME(EndIoStatement)(cookie); +} +} // namespace io + +// CALL FDATE(DATE) +void FORTRAN_PROCEDURE_NAME(fdate)(char *arg, std::int64_t length) { + // Day Mon dd hh:mm:ss yyyy\n\0 is 26 characters, e.g. + // Tue May 26 21:51:03 2015\n\0 + char str[26]; + // Insufficient space, fill with spaces and return. + if (length < 24) { + std::memset(arg, ' ', length); + return; + } + + Terminator terminator{__FILE__, __LINE__}; + std::time_t current_time; + std::time(¤t_time); + CtimeBuffer(str, sizeof(str), current_time, terminator); + + // Pad space on the last two byte `\n\0`, start at index 24 included. + CopyAndPad(arg, str, length, 24); +} + +std::intptr_t RTNAME(Malloc)(std::size_t size) { + return reinterpret_cast<std::intptr_t>(std::malloc(size)); +} + +// RESULT = IARGC() +std::int32_t FORTRAN_PROCEDURE_NAME(iargc)() { return RTNAME(ArgumentCount)(); } + +// CALL GETARG(N, ARG) +void FORTRAN_PROCEDURE_NAME(getarg)( + std::int32_t &n, char *arg, std::int64_t length) { + Descriptor value{*Descriptor::Create(1, length, arg, 0)}; + (void)RTNAME(GetCommandArgument)( + n, &value, nullptr, nullptr, __FILE__, __LINE__); +} + +// CALL GETLOG(USRNAME) +void FORTRAN_PROCEDURE_NAME(getlog)(char *arg, std::int64_t length) { +#if _REENTRANT || _POSIX_C_SOURCE >= 199506L + if (length >= 1 && getlogin_r(arg, length) == 0) { + auto loginLen{std::strlen(arg)}; + std::memset( + arg + loginLen, ' ', static_cast<std::size_t>(length) - loginLen); + return; + } +#endif +#if _WIN32 + GetUsernameEnvVar("USERNAME", arg, length); +#else + GetUsernameEnvVar("LOGNAME", arg, length); +#endif +} + +void RTNAME(Free)(std::intptr_t ptr) { + std::free(reinterpret_cast<void *>(ptr)); +} + +std::int64_t RTNAME(Signal)(std::int64_t number, void (*handler)(int)) { + // using auto for portability: + // on Windows, this is a void * + // on POSIX, this has the same type as handler + auto result = signal(number, handler); + + // GNU defines the intrinsic as returning an integer, not a pointer. So we + // have to reinterpret_cast + return static_cast<int64_t>(reinterpret_cast<std::uintptr_t>(result)); +} + +// CALL SLEEP(SECONDS) +void RTNAME(Sleep)(std::int64_t seconds) { + // ensure that conversion to unsigned makes sense, + // sleep(0) is an immidiate return anyway + if (seconds < 1) { + return; + } +#if _WIN32 + Sleep(seconds * 1000); +#else + sleep(seconds); +#endif +} + +// TODO: not supported on Windows +#ifndef _WIN32 +std::int64_t FORTRAN_PROCEDURE_NAME(access)(const char *name, + std::int64_t nameLength, const char *mode, std::int64_t modeLength) { + std::int64_t ret{-1}; + if (nameLength <= 0 || modeLength <= 0 || !name || !mode) { + return ret; + } + + // ensure name is null terminated + char *newName{nullptr}; + if (name[nameLength - 1] != '\0') { + newName = static_cast<char *>(std::malloc(nameLength + 1)); + std::memcpy(newName, name, nameLength); + newName[nameLength] = '\0'; + name = newName; + } + + // calculate mode + bool read{false}; + bool write{false}; + bool execute{false}; + bool exists{false}; + int imode{0}; + + for (std::int64_t i = 0; i < modeLength; ++i) { + switch (mode[i]) { + case 'r': + read = true; + break; + case 'w': + write = true; + break; + case 'x': + execute = true; + break; + case ' ': + exists = true; + break; + default: + // invalid mode + goto cleanup; + } + } + if (!read && !write && !execute && !exists) { + // invalid mode + goto cleanup; + } + + if (!read && !write && !execute) { + imode = F_OK; + } else { + if (read) { + imode |= R_OK; + } + if (write) { + imode |= W_OK; + } + if (execute) { + imode |= X_OK; + } + } + ret = access(name, imode); + +cleanup: + if (newName) { + free(newName); + } + return ret; +} +#endif + +// CHDIR(DIR) +int RTNAME(Chdir)(const char *name) { +// chdir alias seems to be deprecated on Windows. +#ifndef _WIN32 + return chdir(name); +#else + return _chdir(name); +#endif +} + +int FORTRAN_PROCEDURE_NAME(hostnm)(char *hn, int length) { + std::int32_t status{0}; + + if (!hn || length < 0) { + return EINVAL; + } + +#ifdef _WIN32 + DWORD dwSize{static_cast<DWORD>(length)}; + + // Note: Winsock has gethostname(), but use Win32 API GetComputerNameEx(), + // in order to avoid adding dependency on Winsock. + if (!GetComputerNameExA(ComputerNameDnsHostname, hn, &dwSize)) { + status = GetLastError(); + } +#else + if (gethostname(hn, length) < 0) { + status = errno; + } +#endif + + if (status == 0) { + // Find zero terminator and fill the string from the + // zero terminator to the end with spaces + char *str_end{hn + length}; + char *str_zero{std::find(hn, str_end, '\0')}; + std::fill(str_zero, str_end, ' '); + } + + return status; +} + +int FORTRAN_PROCEDURE_NAME(ierrno)() { return errno; } + +void FORTRAN_PROCEDURE_NAME(qsort)(int *array, int *len, int *isize, + int (*compar)(const void *, const void *)) { + qsort(array, *len, *isize, compar); +} + +// PERROR(STRING) +void RTNAME(Perror)(const char *str) { perror(str); } + +// GNU extension function TIME() +std::int64_t RTNAME(time)() { return time(nullptr); } + +// Extension procedures related to I/O + +namespace io { +std::int32_t RTNAME(Fseek)(int unitNumber, std::int64_t zeroBasedPos, + int whence, const char *sourceFileName, int lineNumber) { + if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { + Terminator terminator{sourceFileName, lineNumber}; + IoErrorHandler handler{terminator}; + if (unit->Fseek( + zeroBasedPos, static_cast<enum FseekWhence>(whence), handler)) { + return IostatOk; + } else { + return IostatCannotReposition; + } + } else { + return IostatBadUnitNumber; + } +} + +std::int64_t RTNAME(Ftell)(int unitNumber) { + if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { + return unit->InquirePos() - 1; // zero-based result + } else { + return -1; + } +} +} // namespace io + +} // namespace Fortran::runtime +} // extern "C" diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/external-unit.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/external-unit.cpp new file mode 100644 index 00000000000..b8004d63159 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/external-unit.cpp @@ -0,0 +1,355 @@ +//===-- lib/runtime/external-unit.cpp ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Implemenation of ExternalFileUnit for RT_USE_PSEUDO_FILE_UNIT=0. +// +//===----------------------------------------------------------------------===// + +#include "unit-map.h" +#include "unit.h" +#include "flang-rt/runtime/io-error.h" +#include "flang-rt/runtime/lock.h" +#include "flang-rt/runtime/tools.h" + +// NOTE: the header files above may define OpenMP declare target +// variables, so they have to be included unconditionally +// so that the offload entries are consistent between host and device. +#if !defined(RT_USE_PSEUDO_FILE_UNIT) + +#include <cstdio> +#include <limits> + +namespace Fortran::runtime::io { + +// The per-unit data structures are created on demand so that Fortran I/O +// should work without a Fortran main program. +static Lock unitMapLock; +static Lock createOpenLock; +static UnitMap *unitMap{nullptr}; + +void FlushOutputOnCrash(const Terminator &terminator) { + if (!defaultOutput && !errorOutput) { + return; + } + IoErrorHandler handler{terminator}; + handler.HasIoStat(); // prevent nested crash if flush has error + CriticalSection critical{unitMapLock}; + if (defaultOutput) { + defaultOutput->FlushOutput(handler); + } + if (errorOutput) { + errorOutput->FlushOutput(handler); + } +} + +ExternalFileUnit *ExternalFileUnit::LookUp(int unit) { + return GetUnitMap().LookUp(unit); +} + +ExternalFileUnit *ExternalFileUnit::LookUpOrCreate( + int unit, const Terminator &terminator, bool &wasExtant) { + return GetUnitMap().LookUpOrCreate(unit, terminator, wasExtant); +} + +ExternalFileUnit *ExternalFileUnit::LookUpOrCreateAnonymous(int unit, + Direction dir, Fortran::common::optional<bool> isUnformatted, + IoErrorHandler &handler) { + // Make sure that the returned anonymous unit has been opened, + // not just created in the unitMap. + CriticalSection critical{createOpenLock}; + bool exists{false}; + ExternalFileUnit *result{GetUnitMap().LookUpOrCreate(unit, handler, exists)}; + if (result && !exists) { + common::optional<Action> action; + if (dir == Direction::Output) { + action = Action::ReadWrite; + } + if (!result->OpenAnonymousUnit( + dir == Direction::Input ? OpenStatus::Unknown : OpenStatus::Replace, + action, Position::Rewind, Convert::Unknown, handler)) { + // fort.N isn't a writable file + if (ExternalFileUnit * closed{LookUpForClose(result->unitNumber())}) { + closed->DestroyClosed(); + } + result = nullptr; + } else { + result->isUnformatted = isUnformatted; + } + } + return result; +} + +ExternalFileUnit *ExternalFileUnit::LookUp( + const char *path, std::size_t pathLen) { + return GetUnitMap().LookUp(path, pathLen); +} + +ExternalFileUnit &ExternalFileUnit::CreateNew( + int unit, const Terminator &terminator) { + bool wasExtant{false}; + ExternalFileUnit *result{ + GetUnitMap().LookUpOrCreate(unit, terminator, wasExtant)}; + RUNTIME_CHECK(terminator, result && !wasExtant); + return *result; +} + +ExternalFileUnit *ExternalFileUnit::LookUpForClose(int unit) { + return GetUnitMap().LookUpForClose(unit); +} + +ExternalFileUnit &ExternalFileUnit::NewUnit( + const Terminator &terminator, bool forChildIo) { + ExternalFileUnit &unit{GetUnitMap().NewUnit(terminator)}; + unit.createdForInternalChildIo_ = forChildIo; + return unit; +} + +bool ExternalFileUnit::OpenUnit(Fortran::common::optional<OpenStatus> status, + Fortran::common::optional<Action> action, Position position, + OwningPtr<char> &&newPath, std::size_t newPathLength, Convert convert, + IoErrorHandler &handler) { + if (convert == Convert::Unknown) { + convert = executionEnvironment.conversion; + } + swapEndianness_ = convert == Convert::Swap || + (convert == Convert::LittleEndian && !isHostLittleEndian) || + (convert == Convert::BigEndian && isHostLittleEndian); + bool impliedClose{false}; + if (IsConnected()) { + bool isSamePath{newPath.get() && path() && pathLength() == newPathLength && + std::memcmp(path(), newPath.get(), newPathLength) == 0}; + if (status && *status != OpenStatus::Old && isSamePath) { + handler.SignalError("OPEN statement for connected unit may not have " + "explicit STATUS= other than 'OLD'"); + return impliedClose; + } + if (!newPath.get() || isSamePath) { + // OPEN of existing unit, STATUS='OLD' or unspecified, not new FILE= + newPath.reset(); + return impliedClose; + } + // Otherwise, OPEN on open unit with new FILE= implies CLOSE + DoImpliedEndfile(handler); + FlushOutput(handler); + TruncateFrame(0, handler); + Close(CloseStatus::Keep, handler); + impliedClose = true; + } + if (newPath.get() && newPathLength > 0) { + if (const auto *already{ + GetUnitMap().LookUp(newPath.get(), newPathLength)}) { + handler.SignalError(IostatOpenAlreadyConnected, + "OPEN(UNIT=%d,FILE='%.*s'): file is already connected to unit %d", + unitNumber_, static_cast<int>(newPathLength), newPath.get(), + already->unitNumber_); + return impliedClose; + } + } + set_path(std::move(newPath), newPathLength); + Open(status.value_or(OpenStatus::Unknown), action, position, handler); + if (handler.InError()) { + return impliedClose; + } + auto totalBytes{knownSize()}; + if (access == Access::Direct) { + if (!openRecl) { + handler.SignalError(IostatOpenBadRecl, + "OPEN(UNIT=%d,ACCESS='DIRECT'): record length is not known", + unitNumber()); + } else if (*openRecl <= 0) { + handler.SignalError(IostatOpenBadRecl, + "OPEN(UNIT=%d,ACCESS='DIRECT',RECL=%jd): record length is invalid", + unitNumber(), static_cast<std::intmax_t>(*openRecl)); + } else if (totalBytes && (*totalBytes % *openRecl != 0)) { + handler.SignalError(IostatOpenBadRecl, + "OPEN(UNIT=%d,ACCESS='DIRECT',RECL=%jd): record length is not an " + "even divisor of the file size %jd", + unitNumber(), static_cast<std::intmax_t>(*openRecl), + static_cast<std::intmax_t>(*totalBytes)); + } + recordLength = openRecl; + } + endfileRecordNumber.reset(); + currentRecordNumber = 1; + if (totalBytes && access == Access::Direct && openRecl.value_or(0) > 0) { + endfileRecordNumber = 1 + (*totalBytes / *openRecl); + } + if (position == Position::Append) { + if (totalBytes) { + frameOffsetInFile_ = *totalBytes; + } + if (access != Access::Stream) { + if (!endfileRecordNumber) { + // Fake it so that we can backspace relative from the end + endfileRecordNumber = std::numeric_limits<std::int64_t>::max() - 2; + } + currentRecordNumber = *endfileRecordNumber; + } + } + return impliedClose; +} + +bool ExternalFileUnit::OpenAnonymousUnit( + Fortran::common::optional<OpenStatus> status, + Fortran::common::optional<Action> action, Position position, + Convert convert, IoErrorHandler &handler) { + // I/O to an unconnected unit reads/creates a local file, e.g. fort.7 + std::size_t pathMaxLen{32}; + auto path{SizedNew<char>{handler}(pathMaxLen)}; + std::snprintf(path.get(), pathMaxLen, "fort.%d", unitNumber_); + OpenUnit(status, action, position, std::move(path), std::strlen(path.get()), + convert, handler); + return IsConnected(); +} + +void ExternalFileUnit::CloseUnit(CloseStatus status, IoErrorHandler &handler) { + DoImpliedEndfile(handler); + FlushOutput(handler); + Close(status, handler); +} + +void ExternalFileUnit::DestroyClosed() { + GetUnitMap().DestroyClosed(*this); // destroys *this +} + +Iostat ExternalFileUnit::SetDirection(Direction direction) { + if (direction == Direction::Input) { + if (mayRead()) { + direction_ = Direction::Input; + return IostatOk; + } else { + return IostatReadFromWriteOnly; + } + } else { + if (mayWrite()) { + if (direction_ == Direction::Input) { + // Don't retain any input data from previous record, like a + // variable-length unformatted record footer, in the frame, + // since we're going start writing frames. + frameOffsetInFile_ += recordOffsetInFrame_; + recordOffsetInFrame_ = 0; + } + direction_ = Direction::Output; + return IostatOk; + } else { + return IostatWriteToReadOnly; + } + } +} + +UnitMap &ExternalFileUnit::CreateUnitMap() { + Terminator terminator{__FILE__, __LINE__}; + IoErrorHandler handler{terminator}; + UnitMap &newUnitMap{*New<UnitMap>{terminator}().release()}; + + bool wasExtant{false}; + ExternalFileUnit &out{*newUnitMap.LookUpOrCreate( + FORTRAN_DEFAULT_OUTPUT_UNIT, terminator, wasExtant)}; + RUNTIME_CHECK(terminator, !wasExtant); + out.Predefine(1); + handler.SignalError(out.SetDirection(Direction::Output)); + out.isUnformatted = false; + defaultOutput = &out; + + ExternalFileUnit &in{*newUnitMap.LookUpOrCreate( + FORTRAN_DEFAULT_INPUT_UNIT, terminator, wasExtant)}; + RUNTIME_CHECK(terminator, !wasExtant); + in.Predefine(0); + handler.SignalError(in.SetDirection(Direction::Input)); + in.isUnformatted = false; + defaultInput = ∈ + + ExternalFileUnit &error{ + *newUnitMap.LookUpOrCreate(FORTRAN_ERROR_UNIT, terminator, wasExtant)}; + RUNTIME_CHECK(terminator, !wasExtant); + error.Predefine(2); + handler.SignalError(error.SetDirection(Direction::Output)); + error.isUnformatted = false; + errorOutput = &error; + + return newUnitMap; +} + +// A back-up atexit() handler for programs that don't terminate with a main +// program END or a STOP statement or other Fortran-initiated program shutdown, +// such as programs with a C main() that terminate normally. It flushes all +// external I/O units. It is registered once the first time that any external +// I/O is attempted. +static void CloseAllExternalUnits() { + IoErrorHandler handler{"Fortran program termination"}; + ExternalFileUnit::CloseAll(handler); +} + +UnitMap &ExternalFileUnit::GetUnitMap() { + if (unitMap) { + return *unitMap; + } + { + CriticalSection critical{unitMapLock}; + if (unitMap) { + return *unitMap; + } + unitMap = &CreateUnitMap(); + } + std::atexit(CloseAllExternalUnits); + return *unitMap; +} + +void ExternalFileUnit::CloseAll(IoErrorHandler &handler) { + CriticalSection critical{unitMapLock}; + if (unitMap) { + unitMap->CloseAll(handler); + FreeMemoryAndNullify(unitMap); + } + defaultOutput = nullptr; + defaultInput = nullptr; + errorOutput = nullptr; +} + +void ExternalFileUnit::FlushAll(IoErrorHandler &handler) { + CriticalSection critical{unitMapLock}; + if (unitMap) { + unitMap->FlushAll(handler); + } +} + +int ExternalFileUnit::GetAsynchronousId(IoErrorHandler &handler) { + if (!mayAsynchronous()) { + handler.SignalError(IostatBadAsynchronous); + return -1; + } else { + for (int j{0}; 64 * j < maxAsyncIds; ++j) { + if (auto least{asyncIdAvailable_[j].LeastElement()}) { + asyncIdAvailable_[j].reset(*least); + return 64 * j + static_cast<int>(*least); + } + } + handler.SignalError(IostatTooManyAsyncOps); + return -1; + } +} + +bool ExternalFileUnit::Wait(int id) { + if (static_cast<std::size_t>(id) >= maxAsyncIds || + asyncIdAvailable_[id / 64].test(id % 64)) { + return false; + } else { + if (id == 0) { // means "all IDs" + for (int j{0}; 64 * j < maxAsyncIds; ++j) { + asyncIdAvailable_[j].set(); + } + asyncIdAvailable_[0].reset(0); + } else { + asyncIdAvailable_[id / 64].set(id % 64); + } + return true; + } +} + +} // namespace Fortran::runtime::io +#endif // !defined(RT_USE_PSEUDO_FILE_UNIT) diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/extrema.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/extrema.cpp new file mode 100644 index 00000000000..03e574a8fbf --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/extrema.cpp @@ -0,0 +1,888 @@ +//===-- lib/runtime/extrema.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements MAXLOC, MINLOC, MAXVAL, & MINVAL for all required operand types +// and shapes and (for MAXLOC & MINLOC) result integer kinds. Also implements +// NORM2 using common infrastructure. + +#include "flang-rt/runtime/reduction-templates.h" +#include "flang/Common/float128.h" +#include "flang/Runtime/character.h" +#include "flang/Runtime/reduction.h" +#include <algorithm> +#include <cfloat> +#include <cinttypes> +#include <cmath> +#include <type_traits> + +namespace Fortran::runtime { + +// MAXLOC & MINLOC + +template <typename T, bool IS_MAX, bool BACK> struct NumericCompare { + using Type = T; + explicit RT_API_ATTRS NumericCompare(std::size_t /*elemLen; ignored*/) {} + RT_API_ATTRS bool operator()(const T &value, const T &previous) const { + if (std::is_floating_point_v<T> && previous != previous) { + return BACK || value == value; // replace NaN + } else if (value == previous) { + return BACK; + } else if constexpr (IS_MAX) { + return value > previous; + } else { + return value < previous; + } + } +}; + +template <typename T, bool IS_MAX, bool BACK> class CharacterCompare { +public: + using Type = T; + explicit RT_API_ATTRS CharacterCompare(std::size_t elemLen) + : chars_{elemLen / sizeof(T)} {} + RT_API_ATTRS bool operator()(const T &value, const T &previous) const { + int cmp{CharacterScalarCompare<T>(&value, &previous, chars_, chars_)}; + if (cmp == 0) { + return BACK; + } else if constexpr (IS_MAX) { + return cmp > 0; + } else { + return cmp < 0; + } + } + +private: + std::size_t chars_; +}; + +template <typename COMPARE> class ExtremumLocAccumulator { +public: + using Type = typename COMPARE::Type; + RT_API_ATTRS ExtremumLocAccumulator(const Descriptor &array) + : array_{array}, argRank_{array.rank()}, compare_{array.ElementBytes()} { + Reinitialize(); + } + RT_API_ATTRS void Reinitialize() { + // per standard: result indices are all zero if no data + for (int j{0}; j < argRank_; ++j) { + extremumLoc_[j] = 0; + } + previous_ = nullptr; + } + RT_API_ATTRS int argRank() const { return argRank_; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int zeroBasedDim = -1) { + if (zeroBasedDim >= 0) { + *p = extremumLoc_[zeroBasedDim]; + } else { + for (int j{0}; j < argRank_; ++j) { + p[j] = extremumLoc_[j]; + } + } + } + template <typename IGNORED> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + const auto &value{*array_.Element<Type>(at)}; + if (!previous_ || compare_(value, *previous_)) { + previous_ = &value; + for (int j{0}; j < argRank_; ++j) { + extremumLoc_[j] = at[j] - array_.GetDimension(j).LowerBound() + 1; + } + } + return true; + } + +private: + const Descriptor &array_; + int argRank_; + SubscriptValue extremumLoc_[maxRank]; + const Type *previous_{nullptr}; + COMPARE compare_; +}; + +template <typename ACCUMULATOR, typename CPPTYPE> +static RT_API_ATTRS void LocationHelper(const char *intrinsic, + Descriptor &result, const Descriptor &x, int kind, const Descriptor *mask, + Terminator &terminator) { + ACCUMULATOR accumulator{x}; + DoTotalReduction<CPPTYPE>(x, 0, mask, accumulator, intrinsic, terminator); + ApplyIntegerKind<LocationResultHelper<ACCUMULATOR>::template Functor, void>( + kind, terminator, accumulator, result); +} + +template <TypeCategory CAT, int KIND, bool IS_MAX, + template <typename, bool, bool> class COMPARE> +inline RT_API_ATTRS void DoMaxOrMinLoc(const char *intrinsic, + Descriptor &result, const Descriptor &x, int kind, const char *source, + int line, const Descriptor *mask, bool back) { + using CppType = CppTypeFor<CAT, KIND>; + Terminator terminator{source, line}; + if (back) { + LocationHelper<ExtremumLocAccumulator<COMPARE<CppType, IS_MAX, true>>, + CppType>(intrinsic, result, x, kind, mask, terminator); + } else { + LocationHelper<ExtremumLocAccumulator<COMPARE<CppType, IS_MAX, false>>, + CppType>(intrinsic, result, x, kind, mask, terminator); + } +} + +template <bool IS_MAX> struct CharacterMaxOrMinLocHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()(const char *intrinsic, Descriptor &result, + const Descriptor &x, int kind, const char *source, int line, + const Descriptor *mask, bool back) const { + DoMaxOrMinLoc<TypeCategory::Character, KIND, IS_MAX, CharacterCompare>( + intrinsic, result, x, kind, source, line, mask, back); + } + }; +}; + +template <bool IS_MAX> +inline RT_API_ATTRS void CharacterMaxOrMinLoc(const char *intrinsic, + Descriptor &result, const Descriptor &x, int kind, const char *source, + int line, const Descriptor *mask, bool back) { + int rank{x.rank()}; + SubscriptValue extent[1]{rank}; + result.Establish(TypeCategory::Integer, kind, nullptr, 1, extent, + CFI_attribute_allocatable); + result.GetDimension(0).SetBounds(1, extent[0]); + Terminator terminator{source, line}; + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "%s: could not allocate memory for result; STAT=%d", intrinsic, stat); + } + CheckIntegerKind(terminator, kind, intrinsic); + auto catKind{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, catKind.has_value()); + switch (catKind->first) { + case TypeCategory::Character: + ApplyCharacterKind<CharacterMaxOrMinLocHelper<IS_MAX>::template Functor, + void>(catKind->second, terminator, intrinsic, result, x, kind, source, + line, mask, back); + break; + default: + terminator.Crash( + "%s: bad data type code (%d) for array", intrinsic, x.type().raw()); + } +} + +template <TypeCategory CAT, int KIND, bool IS_MAXVAL> +inline RT_API_ATTRS void TotalNumericMaxOrMinLoc(const char *intrinsic, + Descriptor &result, const Descriptor &x, int kind, const char *source, + int line, const Descriptor *mask, bool back) { + int rank{x.rank()}; + SubscriptValue extent[1]{rank}; + result.Establish(TypeCategory::Integer, kind, nullptr, 1, extent, + CFI_attribute_allocatable); + result.GetDimension(0).SetBounds(1, extent[0]); + Terminator terminator{source, line}; + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "%s: could not allocate memory for result; STAT=%d", intrinsic, stat); + } + CheckIntegerKind(terminator, kind, intrinsic); + RUNTIME_CHECK(terminator, TypeCode(CAT, KIND) == x.type()); + DoMaxOrMinLoc<CAT, KIND, IS_MAXVAL, NumericCompare>( + intrinsic, result, x, kind, source, line, mask, back); +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(MaxlocCharacter)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + CharacterMaxOrMinLoc<true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocInteger1)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 1, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocInteger2)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 2, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocInteger4)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 4, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocInteger8)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 8, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +#ifdef __SIZEOF_INT128__ +void RTDEF(MaxlocInteger16)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 16, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +#endif +void RTDEF(MaxlocUnsigned1)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 1, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocUnsigned2)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 2, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocUnsigned4)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 4, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocUnsigned8)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 8, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +#ifdef __SIZEOF_INT128__ +void RTDEF(MaxlocUnsigned16)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 16, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +#endif +void RTDEF(MaxlocReal4)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 4, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MaxlocReal8)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 8, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +#if HAS_FLOAT80 +void RTDEF(MaxlocReal10)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 10, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(MaxlocReal16)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 16, true>( + "MAXLOC", result, x, kind, source, line, mask, back); +} +#endif +void RTDEF(MinlocCharacter)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + CharacterMaxOrMinLoc<false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocInteger1)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 1, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocInteger2)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 2, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocInteger4)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 4, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocInteger8)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 8, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +#ifdef __SIZEOF_INT128__ +void RTDEF(MinlocInteger16)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Integer, 16, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +#endif +void RTDEF(MinlocUnsigned1)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 1, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocUnsigned2)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 2, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocUnsigned4)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 4, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocUnsigned8)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 8, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +#ifdef __SIZEOF_INT128__ +void RTDEF(MinlocUnsigned16)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Unsigned, 16, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +#endif +void RTDEF(MinlocReal4)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 4, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +void RTDEF(MinlocReal8)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 8, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +#if HAS_FLOAT80 +void RTDEF(MinlocReal10)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 10, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(MinlocReal16)(Descriptor &result, const Descriptor &x, int kind, + const char *source, int line, const Descriptor *mask, bool back) { + TotalNumericMaxOrMinLoc<TypeCategory::Real, 16, false>( + "MINLOC", result, x, kind, source, line, mask, back); +} +#endif + +RT_EXT_API_GROUP_END +} // extern "C" + +// MAXLOC/MINLOC with DIM= + +template <TypeCategory CAT, int KIND, bool IS_MAX, + template <typename, bool, bool> class COMPARE, bool BACK> +static RT_API_ATTRS void DoPartialMaxOrMinLocDirection(const char *intrinsic, + Descriptor &result, const Descriptor &x, int kind, int dim, + const Descriptor *mask, Terminator &terminator) { + using CppType = CppTypeFor<CAT, KIND>; + using Accumulator = ExtremumLocAccumulator<COMPARE<CppType, IS_MAX, BACK>>; + Accumulator accumulator{x}; + ApplyIntegerKind<PartialLocationHelper<Accumulator>::template Functor, void>( + kind, terminator, result, x, dim, mask, terminator, intrinsic, + accumulator); +} + +template <TypeCategory CAT, int KIND, bool IS_MAX, + template <typename, bool, bool> class COMPARE> +inline RT_API_ATTRS void DoPartialMaxOrMinLoc(const char *intrinsic, + Descriptor &result, const Descriptor &x, int kind, int dim, + const Descriptor *mask, bool back, Terminator &terminator) { + if (back) { + DoPartialMaxOrMinLocDirection<CAT, KIND, IS_MAX, COMPARE, true>( + intrinsic, result, x, kind, dim, mask, terminator); + } else { + DoPartialMaxOrMinLocDirection<CAT, KIND, IS_MAX, COMPARE, false>( + intrinsic, result, x, kind, dim, mask, terminator); + } +} + +template <TypeCategory CAT, bool IS_MAX, + template <typename, bool, bool> class COMPARE> +struct DoPartialMaxOrMinLocHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()(const char *intrinsic, Descriptor &result, + const Descriptor &x, int kind, int dim, const Descriptor *mask, + bool back, Terminator &terminator) const { + DoPartialMaxOrMinLoc<CAT, KIND, IS_MAX, COMPARE>( + intrinsic, result, x, kind, dim, mask, back, terminator); + } + }; +}; + +template <bool IS_MAX> +inline RT_API_ATTRS void TypedPartialMaxOrMinLoc(const char *intrinsic, + Descriptor &result, const Descriptor &x, int kind, int dim, + const char *source, int line, const Descriptor *mask, bool back) { + Terminator terminator{source, line}; + CheckIntegerKind(terminator, kind, intrinsic); + auto catKind{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, catKind.has_value()); + const Descriptor *maskToUse{mask}; + SubscriptValue maskAt[maxRank]; // contents unused + if (mask && mask->rank() == 0) { + if (IsLogicalElementTrue(*mask, maskAt)) { + // A scalar MASK that's .TRUE. In this case, just get rid of the MASK. + maskToUse = nullptr; + } else { + // For scalar MASK arguments that are .FALSE., return all zeroes + + // Element size of the destination descriptor is the size + // of {TypeCategory::Integer, kind}. + CreatePartialReductionResult(result, x, + Descriptor::BytesFor(TypeCategory::Integer, kind), dim, terminator, + intrinsic, TypeCode{TypeCategory::Integer, kind}); + std::memset( + result.OffsetElement(), 0, result.Elements() * result.ElementBytes()); + return; + } + } + switch (catKind->first) { + case TypeCategory::Integer: + ApplyIntegerKind<DoPartialMaxOrMinLocHelper<TypeCategory::Integer, IS_MAX, + NumericCompare>::template Functor, + void>(catKind->second, terminator, intrinsic, result, x, kind, dim, + maskToUse, back, terminator); + break; + case TypeCategory::Unsigned: + ApplyIntegerKind<DoPartialMaxOrMinLocHelper<TypeCategory::Unsigned, IS_MAX, + NumericCompare>::template Functor, + void>(catKind->second, terminator, intrinsic, result, x, kind, dim, + maskToUse, back, terminator); + break; + case TypeCategory::Real: + ApplyFloatingPointKind<DoPartialMaxOrMinLocHelper<TypeCategory::Real, + IS_MAX, NumericCompare>::template Functor, + void>(catKind->second, terminator, intrinsic, result, x, kind, dim, + maskToUse, back, terminator); + break; + case TypeCategory::Character: + ApplyCharacterKind<DoPartialMaxOrMinLocHelper<TypeCategory::Character, + IS_MAX, CharacterCompare>::template Functor, + void>(catKind->second, terminator, intrinsic, result, x, kind, dim, + maskToUse, back, terminator); + break; + default: + terminator.Crash( + "%s: bad data type code (%d) for array", intrinsic, x.type().raw()); + } +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(MaxlocDim)(Descriptor &result, const Descriptor &x, int kind, + int dim, const char *source, int line, const Descriptor *mask, bool back) { + TypedPartialMaxOrMinLoc<true>( + "MAXLOC", result, x, kind, dim, source, line, mask, back); +} +void RTDEF(MinlocDim)(Descriptor &result, const Descriptor &x, int kind, + int dim, const char *source, int line, const Descriptor *mask, bool back) { + TypedPartialMaxOrMinLoc<false>( + "MINLOC", result, x, kind, dim, source, line, mask, back); +} + +RT_EXT_API_GROUP_END +} // extern "C" + +// MAXVAL and MINVAL + +template <TypeCategory CAT, int KIND, bool IS_MAXVAL> +class NumericExtremumAccumulator { +public: + using Type = CppTypeFor<CAT, KIND>; + explicit RT_API_ATTRS NumericExtremumAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { + any_ = false; + extremum_ = MaxOrMinIdentity<CAT, KIND, IS_MAXVAL>::Value(); + } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + *p = extremum_; + } + RT_API_ATTRS bool Accumulate(Type x) { + if (!any_) { + extremum_ = x; + any_ = true; + } else if (CAT == TypeCategory::Real && extremum_ != extremum_) { + extremum_ = x; // replace NaN + } else if constexpr (IS_MAXVAL) { + if (x > extremum_) { + extremum_ = x; + } + } else if (x < extremum_) { + extremum_ = x; + } + return true; + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + return Accumulate(*array_.Element<A>(at)); + } + +private: + const Descriptor &array_; + bool any_{false}; + Type extremum_{MaxOrMinIdentity<CAT, KIND, IS_MAXVAL>::Value()}; +}; + +template <TypeCategory CAT, int KIND, bool IS_MAXVAL> +inline RT_API_ATTRS CppTypeFor<CAT, KIND> TotalNumericMaxOrMin( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask, const char *intrinsic) { + return GetTotalReduction<CAT, KIND>(x, source, line, dim, mask, + NumericExtremumAccumulator<CAT, KIND, IS_MAXVAL>{x}, intrinsic); +} + +template <TypeCategory CAT, bool IS_MAXVAL> struct MaxOrMinHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + int dim, const Descriptor *mask, const char *intrinsic, + Terminator &terminator) const { + DoMaxMinNorm2<CAT, KIND, + NumericExtremumAccumulator<CAT, KIND, IS_MAXVAL>>( + result, x, dim, mask, intrinsic, terminator); + } + }; +}; + +template <bool IS_MAXVAL> +inline RT_API_ATTRS void NumericMaxOrMin(Descriptor &result, + const Descriptor &x, int dim, const char *source, int line, + const Descriptor *mask, const char *intrinsic) { + Terminator terminator{source, line}; + auto type{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, type); + switch (type->first) { + case TypeCategory::Integer: + ApplyIntegerKind< + MaxOrMinHelper<TypeCategory::Integer, IS_MAXVAL>::template Functor, + void>( + type->second, terminator, result, x, dim, mask, intrinsic, terminator); + break; + case TypeCategory::Unsigned: + ApplyIntegerKind< + MaxOrMinHelper<TypeCategory::Unsigned, IS_MAXVAL>::template Functor, + void>( + type->second, terminator, result, x, dim, mask, intrinsic, terminator); + break; + case TypeCategory::Real: + ApplyFloatingPointKind< + MaxOrMinHelper<TypeCategory::Real, IS_MAXVAL>::template Functor, void>( + type->second, terminator, result, x, dim, mask, intrinsic, terminator); + break; + default: + terminator.Crash("%s: bad type code %d", intrinsic, x.type().raw()); + } +} + +template <int KIND, bool IS_MAXVAL> class CharacterExtremumAccumulator { +public: + using Type = CppTypeFor<TypeCategory::Character, KIND>; + explicit RT_API_ATTRS CharacterExtremumAccumulator(const Descriptor &array) + : array_{array}, charLen_{array_.ElementBytes() / KIND} {} + RT_API_ATTRS void Reinitialize() { extremum_ = nullptr; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + static_assert(std::is_same_v<A, Type>); + std::size_t byteSize{array_.ElementBytes()}; + if (extremum_) { + std::memcpy(p, extremum_, byteSize); + } else { + // Empty array; fill with character 0 for MAXVAL. + // For MINVAL, set all of the bits. + std::memset(p, IS_MAXVAL ? 0 : 255, byteSize); + } + } + RT_API_ATTRS bool Accumulate(const Type *x) { + if (!extremum_) { + extremum_ = x; + } else { + int cmp{CharacterScalarCompare(x, extremum_, charLen_, charLen_)}; + if (IS_MAXVAL == (cmp > 0)) { + extremum_ = x; + } + } + return true; + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + return Accumulate(array_.Element<A>(at)); + } + +private: + const Descriptor &array_; + std::size_t charLen_; + const Type *extremum_{nullptr}; +}; + +template <bool IS_MAXVAL> struct CharacterMaxOrMinHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + int dim, const Descriptor *mask, const char *intrinsic, + Terminator &terminator) const { + DoMaxMinNorm2<TypeCategory::Character, KIND, + CharacterExtremumAccumulator<KIND, IS_MAXVAL>>( + result, x, dim, mask, intrinsic, terminator); + } + }; +}; + +template <bool IS_MAXVAL> +inline RT_API_ATTRS void CharacterMaxOrMin(Descriptor &result, + const Descriptor &x, int dim, const char *source, int line, + const Descriptor *mask, const char *intrinsic) { + Terminator terminator{source, line}; + auto type{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, type && type->first == TypeCategory::Character); + ApplyCharacterKind<CharacterMaxOrMinHelper<IS_MAXVAL>::template Functor, + void>( + type->second, terminator, result, x, dim, mask, intrinsic, terminator); +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(MaxvalInteger1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 1, true>( + x, source, line, dim, mask, "MAXVAL"); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(MaxvalInteger2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 2, true>( + x, source, line, dim, mask, "MAXVAL"); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(MaxvalInteger4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 4, true>( + x, source, line, dim, mask, "MAXVAL"); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(MaxvalInteger8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 8, true>( + x, source, line, dim, mask, "MAXVAL"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(MaxvalInteger16)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 16, true>( + x, source, line, dim, mask, "MAXVAL"); +} +#endif + +CppTypeFor<TypeCategory::Unsigned, 1> RTDEF(MaxvalUnsigned1)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 1, true>( + x, source, line, dim, mask, "MAXVAL"); +} +CppTypeFor<TypeCategory::Unsigned, 2> RTDEF(MaxvalUnsigned2)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 2, true>( + x, source, line, dim, mask, "MAXVAL"); +} +CppTypeFor<TypeCategory::Unsigned, 4> RTDEF(MaxvalUnsigned4)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 4, true>( + x, source, line, dim, mask, "MAXVAL"); +} +CppTypeFor<TypeCategory::Unsigned, 8> RTDEF(MaxvalUnsigned8)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 8, true>( + x, source, line, dim, mask, "MAXVAL"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Unsigned, 16> RTDEF(MaxvalUnsigned16)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 16, true>( + x, source, line, dim, mask, "MAXVAL"); +} +#endif + +// TODO: REAL(2 & 3) +CppTypeFor<TypeCategory::Real, 4> RTDEF(MaxvalReal4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 4, true>( + x, source, line, dim, mask, "MAXVAL"); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(MaxvalReal8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 8, true>( + x, source, line, dim, mask, "MAXVAL"); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(MaxvalReal10)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 10, true>( + x, source, line, dim, mask, "MAXVAL"); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(MaxvalReal16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 16, true>( + x, source, line, dim, mask, "MAXVAL"); +} +#endif + +void RTDEF(MaxvalCharacter)(Descriptor &result, const Descriptor &x, + const char *source, int line, const Descriptor *mask) { + CharacterMaxOrMin<true>(result, x, 0, source, line, mask, "MAXVAL"); +} + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(MinvalInteger1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 1, false>( + x, source, line, dim, mask, "MINVAL"); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(MinvalInteger2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 2, false>( + x, source, line, dim, mask, "MINVAL"); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(MinvalInteger4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 4, false>( + x, source, line, dim, mask, "MINVAL"); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(MinvalInteger8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 8, false>( + x, source, line, dim, mask, "MINVAL"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(MinvalInteger16)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Integer, 16, false>( + x, source, line, dim, mask, "MINVAL"); +} +#endif + +CppTypeFor<TypeCategory::Unsigned, 1> RTDEF(MinvalUnsigned1)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 1, false>( + x, source, line, dim, mask, "MINVAL"); +} +CppTypeFor<TypeCategory::Unsigned, 2> RTDEF(MinvalUnsigned2)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 2, false>( + x, source, line, dim, mask, "MINVAL"); +} +CppTypeFor<TypeCategory::Unsigned, 4> RTDEF(MinvalUnsigned4)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 4, false>( + x, source, line, dim, mask, "MINVAL"); +} +CppTypeFor<TypeCategory::Unsigned, 8> RTDEF(MinvalUnsigned8)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 8, false>( + x, source, line, dim, mask, "MINVAL"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Unsigned, 16> RTDEF(MinvalUnsigned16)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Unsigned, 16, false>( + x, source, line, dim, mask, "MINVAL"); +} +#endif + +// TODO: REAL(2 & 3) +CppTypeFor<TypeCategory::Real, 4> RTDEF(MinvalReal4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 4, false>( + x, source, line, dim, mask, "MINVAL"); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(MinvalReal8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 8, false>( + x, source, line, dim, mask, "MINVAL"); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(MinvalReal10)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 10, false>( + x, source, line, dim, mask, "MINVAL"); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(MinvalReal16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return TotalNumericMaxOrMin<TypeCategory::Real, 16, false>( + x, source, line, dim, mask, "MINVAL"); +} +#endif + +void RTDEF(MinvalCharacter)(Descriptor &result, const Descriptor &x, + const char *source, int line, const Descriptor *mask) { + CharacterMaxOrMin<false>(result, x, 0, source, line, mask, "MINVAL"); +} + +void RTDEF(MaxvalDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line, const Descriptor *mask) { + if (x.type().IsCharacter()) { + CharacterMaxOrMin<true>(result, x, dim, source, line, mask, "MAXVAL"); + } else { + NumericMaxOrMin<true>(result, x, dim, source, line, mask, "MAXVAL"); + } +} +void RTDEF(MinvalDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line, const Descriptor *mask) { + if (x.type().IsCharacter()) { + CharacterMaxOrMin<false>(result, x, dim, source, line, mask, "MINVAL"); + } else { + NumericMaxOrMin<false>(result, x, dim, source, line, mask, "MINVAL"); + } +} + +RT_EXT_API_GROUP_END +} // extern "C" + +// NORM2 + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +// TODO: REAL(2 & 3) +CppTypeFor<TypeCategory::Real, 4> RTDEF(Norm2_4)( + const Descriptor &x, const char *source, int line, int dim) { + return GetTotalReduction<TypeCategory::Real, 4>( + x, source, line, dim, nullptr, Norm2Accumulator<4>{x}, "NORM2"); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(Norm2_8)( + const Descriptor &x, const char *source, int line, int dim) { + return GetTotalReduction<TypeCategory::Real, 8>( + x, source, line, dim, nullptr, Norm2Accumulator<8>{x}, "NORM2"); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(Norm2_10)( + const Descriptor &x, const char *source, int line, int dim) { + return GetTotalReduction<TypeCategory::Real, 10>( + x, source, line, dim, nullptr, Norm2Accumulator<10>{x}, "NORM2"); +} +#endif + +void RTDEF(Norm2Dim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line) { + Terminator terminator{source, line}; + auto type{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, type); + if (type->first == TypeCategory::Real) { + ApplyFloatingPointKind<Norm2Helper, void, true>( + type->second, terminator, result, x, dim, nullptr, terminator); + } else { + terminator.Crash("NORM2: bad type code %d", x.type().raw()); + } +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/file.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/file.cpp new file mode 100644 index 00000000000..16e73db4887 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/file.cpp @@ -0,0 +1,480 @@ +//===-- lib/runtime/file.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/file.h" +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Runtime/magic-numbers.h" +#include <algorithm> +#include <cerrno> +#include <cstring> +#include <fcntl.h> +#include <stdlib.h> +#include <sys/stat.h> +#ifdef _WIN32 +#include "flang/Common/windows-include.h" +#include <io.h> +#else +#include <unistd.h> +#endif + +namespace Fortran::runtime::io { + +void OpenFile::set_path(OwningPtr<char> &&path, std::size_t bytes) { + path_ = std::move(path); + pathLength_ = bytes; +} + +static int openfile_mkstemp(IoErrorHandler &handler) { +#ifdef _WIN32 + const unsigned int uUnique{0}; + // GetTempFileNameA needs a directory name < MAX_PATH-14 characters in length. + // https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettempfilenamea + char tempDirName[MAX_PATH - 14]; + char tempFileName[MAX_PATH]; + unsigned long nBufferLength{sizeof(tempDirName)}; + nBufferLength = ::GetTempPathA(nBufferLength, tempDirName); + if (nBufferLength > sizeof(tempDirName) || nBufferLength == 0) { + return -1; + } + if (::GetTempFileNameA(tempDirName, "Fortran", uUnique, tempFileName) == 0) { + return -1; + } + int fd{::_open(tempFileName, _O_CREAT | _O_BINARY | _O_TEMPORARY | _O_RDWR, + _S_IREAD | _S_IWRITE)}; +#else + char path[]{"/tmp/Fortran-Scratch-XXXXXX"}; + int fd{::mkstemp(path)}; +#endif + if (fd < 0) { + handler.SignalErrno(); + } +#ifndef _WIN32 + ::unlink(path); +#endif + return fd; +} + +void OpenFile::Open(OpenStatus status, Fortran::common::optional<Action> action, + Position position, IoErrorHandler &handler) { + if (fd_ >= 0 && + (status == OpenStatus::Old || status == OpenStatus::Unknown)) { + return; + } + CloseFd(handler); + if (status == OpenStatus::Scratch) { + if (path_.get()) { + handler.SignalError("FILE= must not appear with STATUS='SCRATCH'"); + path_.reset(); + } + if (!action) { + action = Action::ReadWrite; + } + fd_ = openfile_mkstemp(handler); + } else { + if (!path_.get()) { + handler.SignalError("FILE= is required"); + return; + } + int flags{0}; +#ifdef _WIN32 + // We emit explicit CR+LF line endings and cope with them on input + // for formatted files, since we can't yet always know now at OPEN + // time whether the file is formatted or not. + flags |= O_BINARY; +#endif + if (status != OpenStatus::Old) { + flags |= O_CREAT; + } + if (status == OpenStatus::New) { + flags |= O_EXCL; + } else if (status == OpenStatus::Replace) { + flags |= O_TRUNC; + } + if (!action) { + // Try to open read/write, back off to read-only or even write-only + // on failure + fd_ = ::open(path_.get(), flags | O_RDWR, 0600); + if (fd_ >= 0) { + action = Action::ReadWrite; + } else { + fd_ = ::open(path_.get(), flags | O_RDONLY, 0600); + if (fd_ >= 0) { + action = Action::Read; + } else { + action = Action::Write; + } + } + } + if (fd_ < 0) { + switch (*action) { + case Action::Read: + flags |= O_RDONLY; + break; + case Action::Write: + flags |= O_WRONLY; + break; + case Action::ReadWrite: + flags |= O_RDWR; + break; + } + fd_ = ::open(path_.get(), flags, 0600); + if (fd_ < 0) { + handler.SignalErrno(); + } + } + } + RUNTIME_CHECK(handler, action.has_value()); + pending_.reset(); + if (fd_ >= 0 && position == Position::Append && !RawSeekToEnd()) { + handler.SignalError(IostatOpenBadAppend); + } + isTerminal_ = fd_ >= 0 && IsATerminal(fd_); + mayRead_ = *action != Action::Write; + mayWrite_ = *action != Action::Read; + if (status == OpenStatus::Old || status == OpenStatus::Unknown) { + knownSize_.reset(); +#ifndef _WIN32 + struct stat buf; + if (fd_ >= 0 && ::fstat(fd_, &buf) == 0) { + mayPosition_ = S_ISREG(buf.st_mode); + knownSize_ = buf.st_size; + } +#else // TODO: _WIN32 + mayPosition_ = true; +#endif + } else { + knownSize_ = 0; + mayPosition_ = true; + } + openPosition_ = position; // for INQUIRE(POSITION=) +} + +void OpenFile::Predefine(int fd) { + fd_ = fd; + path_.reset(); + pathLength_ = 0; + position_ = 0; + knownSize_.reset(); + nextId_ = 0; + pending_.reset(); + isTerminal_ = fd == 2 || IsATerminal(fd_); + mayRead_ = fd == 0; + mayWrite_ = fd != 0; + mayPosition_ = false; +#ifdef _WIN32 + isWindowsTextFile_ = true; +#endif +} + +void OpenFile::Close(CloseStatus status, IoErrorHandler &handler) { + pending_.reset(); + knownSize_.reset(); + switch (status) { + case CloseStatus::Keep: + break; + case CloseStatus::Delete: + if (path_.get()) { + ::unlink(path_.get()); + } + break; + } + path_.reset(); + CloseFd(handler); +} + +std::size_t OpenFile::Read(FileOffset at, char *buffer, std::size_t minBytes, + std::size_t maxBytes, IoErrorHandler &handler) { + if (maxBytes == 0) { + return 0; + } + CheckOpen(handler); + if (!Seek(at, handler)) { + return 0; + } + minBytes = std::min(minBytes, maxBytes); + std::size_t got{0}; + while (got < minBytes) { + auto chunk{::read(fd_, buffer + got, maxBytes - got)}; + if (chunk == 0) { + break; + } else if (chunk < 0) { + auto err{errno}; + if (err != EAGAIN && err != EWOULDBLOCK && err != EINTR) { + handler.SignalError(err); + break; + } + } else { + SetPosition(position_ + chunk); + got += chunk; + } + } + return got; +} + +std::size_t OpenFile::Write(FileOffset at, const char *buffer, + std::size_t bytes, IoErrorHandler &handler) { + if (bytes == 0) { + return 0; + } + CheckOpen(handler); + if (!Seek(at, handler)) { + return 0; + } + std::size_t put{0}; + while (put < bytes) { + auto chunk{::write(fd_, buffer + put, bytes - put)}; + if (chunk >= 0) { + SetPosition(position_ + chunk); + put += chunk; + } else { + auto err{errno}; + if (err != EAGAIN && err != EWOULDBLOCK && err != EINTR) { + handler.SignalError(err); + break; + } + } + } + if (knownSize_ && position_ > *knownSize_) { + knownSize_ = position_; + } + return put; +} + +inline static int openfile_ftruncate(int fd, OpenFile::FileOffset at) { +#ifdef _WIN32 + return ::_chsize(fd, at); +#else + return ::ftruncate(fd, at); +#endif +} + +void OpenFile::Truncate(FileOffset at, IoErrorHandler &handler) { + CheckOpen(handler); + if (!knownSize_ || *knownSize_ != at) { + if (openfile_ftruncate(fd_, at) != 0) { + handler.SignalErrno(); + } + knownSize_ = at; + } +} + +// The operation is performed immediately; the results are saved +// to be claimed by a later WAIT statement. +// TODO: True asynchronicity +int OpenFile::ReadAsynchronously( + FileOffset at, char *buffer, std::size_t bytes, IoErrorHandler &handler) { + CheckOpen(handler); + int iostat{0}; + for (std::size_t got{0}; got < bytes;) { +#if _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200809L + auto chunk{::pread(fd_, buffer + got, bytes - got, at)}; +#else + auto chunk{Seek(at, handler) ? ::read(fd_, buffer + got, bytes - got) : -1}; +#endif + if (chunk == 0) { + iostat = FORTRAN_RUNTIME_IOSTAT_END; + break; + } + if (chunk < 0) { + auto err{errno}; + if (err != EAGAIN && err != EWOULDBLOCK && err != EINTR) { + iostat = err; + break; + } + } else { + at += chunk; + got += chunk; + } + } + return PendingResult(handler, iostat); +} + +// TODO: True asynchronicity +int OpenFile::WriteAsynchronously(FileOffset at, const char *buffer, + std::size_t bytes, IoErrorHandler &handler) { + CheckOpen(handler); + int iostat{0}; + for (std::size_t put{0}; put < bytes;) { +#if _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200809L + auto chunk{::pwrite(fd_, buffer + put, bytes - put, at)}; +#else + auto chunk{ + Seek(at, handler) ? ::write(fd_, buffer + put, bytes - put) : -1}; +#endif + if (chunk >= 0) { + at += chunk; + put += chunk; + } else { + auto err{errno}; + if (err != EAGAIN && err != EWOULDBLOCK && err != EINTR) { + iostat = err; + break; + } + } + } + return PendingResult(handler, iostat); +} + +void OpenFile::Wait(int id, IoErrorHandler &handler) { + Fortran::common::optional<int> ioStat; + Pending *prev{nullptr}; + for (Pending *p{pending_.get()}; p; p = (prev = p)->next.get()) { + if (p->id == id) { + ioStat = p->ioStat; + if (prev) { + prev->next.reset(p->next.release()); + } else { + pending_.reset(p->next.release()); + } + break; + } + } + if (ioStat) { + handler.SignalError(*ioStat); + } +} + +void OpenFile::WaitAll(IoErrorHandler &handler) { + while (true) { + int ioStat; + if (pending_) { + ioStat = pending_->ioStat; + pending_.reset(pending_->next.release()); + } else { + return; + } + handler.SignalError(ioStat); + } +} + +Position OpenFile::InquirePosition() const { + if (openPosition_) { // from OPEN statement + return *openPosition_; + } else { // unit has been repositioned since opening + if (position_ == knownSize_.value_or(position_ + 1)) { + return Position::Append; + } else if (position_ == 0 && mayPosition_) { + return Position::Rewind; + } else { + return Position::AsIs; // processor-dependent & no common behavior + } + } +} + +void OpenFile::CheckOpen(const Terminator &terminator) { + RUNTIME_CHECK(terminator, fd_ >= 0); +} + +bool OpenFile::Seek(FileOffset at, IoErrorHandler &handler) { + if (at == position_) { + return true; + } else if (RawSeek(at)) { + SetPosition(at); + return true; + } else { + handler.SignalError(IostatCannotReposition); + return false; + } +} + +bool OpenFile::RawSeek(FileOffset at) { +#ifdef _LARGEFILE64_SOURCE + return ::lseek64(fd_, at, SEEK_SET) == at; +#else + return ::lseek(fd_, at, SEEK_SET) == at; +#endif +} + +bool OpenFile::RawSeekToEnd() { +#ifdef _LARGEFILE64_SOURCE + std::int64_t at{::lseek64(fd_, 0, SEEK_END)}; +#else + std::int64_t at{::lseek(fd_, 0, SEEK_END)}; +#endif + if (at >= 0) { + knownSize_ = at; + return true; + } else { + return false; + } +} + +int OpenFile::PendingResult(const Terminator &terminator, int iostat) { + int id{nextId_++}; + pending_ = New<Pending>{terminator}(id, iostat, std::move(pending_)); + return id; +} + +void OpenFile::CloseFd(IoErrorHandler &handler) { + if (fd_ >= 0) { + if (fd_ <= 2) { + // don't actually close a standard file descriptor, we might need it + } else { + if (::close(fd_) != 0) { + handler.SignalErrno(); + } + } + fd_ = -1; + } +} + +#if !defined(RT_DEVICE_COMPILATION) +bool IsATerminal(int fd) { return ::isatty(fd); } + +#if defined(_WIN32) && !defined(F_OK) +// Access flags are normally defined in unistd.h, which unavailable under +// Windows. Instead, define the flags as documented at +// https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/access-waccess +// On Mingw, io.h does define these same constants - so check whether they +// already are defined before defining these. +#define F_OK 00 +#define W_OK 02 +#define R_OK 04 +#endif + +bool IsExtant(const char *path) { return ::access(path, F_OK) == 0; } +bool MayRead(const char *path) { return ::access(path, R_OK) == 0; } +bool MayWrite(const char *path) { return ::access(path, W_OK) == 0; } +bool MayReadAndWrite(const char *path) { + return ::access(path, R_OK | W_OK) == 0; +} + +std::int64_t SizeInBytes(const char *path) { +#ifndef _WIN32 + struct stat buf; + if (::stat(path, &buf) == 0) { + return buf.st_size; + } +#else // TODO: _WIN32 +#endif + // No Fortran compiler signals an error + return -1; +} +#else // defined(RT_DEVICE_COMPILATION) +RT_API_ATTRS bool IsATerminal(int fd) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} +RT_API_ATTRS bool IsExtant(const char *path) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} +RT_API_ATTRS bool MayRead(const char *path) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} +RT_API_ATTRS bool MayWrite(const char *path) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} +RT_API_ATTRS bool MayReadAndWrite(const char *path) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} +RT_API_ATTRS std::int64_t SizeInBytes(const char *path) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} +#endif // defined(RT_DEVICE_COMPILATION) + +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/findloc.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/findloc.cpp new file mode 100644 index 00000000000..5485f4b97bd --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/findloc.cpp @@ -0,0 +1,362 @@ +//===-- lib/runtime/findloc.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements FINDLOC for all required operand types and shapes and result +// integer kinds. + +#include "flang-rt/runtime/reduction-templates.h" +#include "flang/Runtime/character.h" +#include "flang/Runtime/reduction.h" +#include <cinttypes> +#include <complex> + +namespace Fortran::runtime { + +template <TypeCategory CAT1, int KIND1, TypeCategory CAT2, int KIND2> +struct Equality { + using Type1 = CppTypeFor<CAT1, KIND1>; + using Type2 = CppTypeFor<CAT2, KIND2>; + RT_API_ATTRS bool operator()(const Descriptor &array, + const SubscriptValue at[], const Descriptor &target) const { + if constexpr (KIND1 >= KIND2) { + return *array.Element<Type1>(at) == + static_cast<Type1>(*target.OffsetElement<Type2>()); + } else { + return static_cast<Type2>(*array.Element<Type1>(at)) == + *target.OffsetElement<Type2>(); + } + } +}; + +template <int KIND1, int KIND2> +struct Equality<TypeCategory::Complex, KIND1, TypeCategory::Complex, KIND2> { + using Type1 = CppTypeFor<TypeCategory::Complex, KIND1>; + using Type2 = CppTypeFor<TypeCategory::Complex, KIND2>; + RT_API_ATTRS bool operator()(const Descriptor &array, + const SubscriptValue at[], const Descriptor &target) const { + const Type1 &xz{*array.Element<Type1>(at)}; + const Type2 &tz{*target.OffsetElement<Type2>()}; + return xz.real() == tz.real() && xz.imag() == tz.imag(); + } +}; + +template <int KIND1, TypeCategory CAT2, int KIND2> +struct Equality<TypeCategory::Complex, KIND1, CAT2, KIND2> { + using Type1 = CppTypeFor<TypeCategory::Complex, KIND1>; + using Type2 = CppTypeFor<CAT2, KIND2>; + RT_API_ATTRS bool operator()(const Descriptor &array, + const SubscriptValue at[], const Descriptor &target) const { + const Type1 &z{*array.Element<Type1>(at)}; + return z.imag() == 0 && z.real() == *target.OffsetElement<Type2>(); + } +}; + +template <TypeCategory CAT1, int KIND1, int KIND2> +struct Equality<CAT1, KIND1, TypeCategory::Complex, KIND2> { + using Type1 = CppTypeFor<CAT1, KIND1>; + using Type2 = CppTypeFor<TypeCategory::Complex, KIND2>; + RT_API_ATTRS bool operator()(const Descriptor &array, + const SubscriptValue at[], const Descriptor &target) const { + const Type2 &z{*target.OffsetElement<Type2>()}; + return *array.Element<Type1>(at) == z.real() && z.imag() == 0; + } +}; + +template <int KIND> struct CharacterEquality { + using Type = CppTypeFor<TypeCategory::Character, KIND>; + RT_API_ATTRS bool operator()(const Descriptor &array, + const SubscriptValue at[], const Descriptor &target) const { + return CharacterScalarCompare<Type>(array.Element<Type>(at), + target.OffsetElement<Type>(), + array.ElementBytes() / static_cast<unsigned>(KIND), + target.ElementBytes() / static_cast<unsigned>(KIND)) == 0; + } +}; + +struct LogicalEquivalence { + RT_API_ATTRS bool operator()(const Descriptor &array, + const SubscriptValue at[], const Descriptor &target) const { + return IsLogicalElementTrue(array, at) == + IsLogicalElementTrue(target, at /*ignored*/); + } +}; + +template <typename EQUALITY> class LocationAccumulator { +public: + RT_API_ATTRS LocationAccumulator( + const Descriptor &array, const Descriptor &target, bool back) + : array_{array}, target_{target}, back_{back} {} + RT_API_ATTRS void Reinitialize() { gotAnything_ = false; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int zeroBasedDim = -1) { + if (zeroBasedDim >= 0) { + *p = gotAnything_ ? location_[zeroBasedDim] - + array_.GetDimension(zeroBasedDim).LowerBound() + 1 + : 0; + } else if (gotAnything_) { + for (int j{0}; j < rank_; ++j) { + p[j] = location_[j] - array_.GetDimension(j).LowerBound() + 1; + } + } else { + // no unmasked hits? result is all zeroes + for (int j{0}; j < rank_; ++j) { + p[j] = 0; + } + } + } + template <typename IGNORED> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + if (equality_(array_, at, target_)) { + gotAnything_ = true; + for (int j{0}; j < rank_; ++j) { + location_[j] = at[j]; + } + return back_; + } else { + return true; + } + } + +private: + const Descriptor &array_; + const Descriptor &target_; + const bool back_{false}; + const int rank_{array_.rank()}; + bool gotAnything_{false}; + SubscriptValue location_[maxRank]; + const EQUALITY equality_{}; +}; + +template <TypeCategory XCAT, int XKIND, TypeCategory TARGET_CAT> +struct TotalNumericFindlocHelper { + template <int TARGET_KIND> struct Functor { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + const Descriptor &target, int kind, int dim, const Descriptor *mask, + bool back, Terminator &terminator) const { + using Eq = Equality<XCAT, XKIND, TARGET_CAT, TARGET_KIND>; + using Accumulator = LocationAccumulator<Eq>; + Accumulator accumulator{x, target, back}; + DoTotalReduction<void>(x, dim, mask, accumulator, "FINDLOC", terminator); + ApplyIntegerKind<LocationResultHelper<Accumulator>::template Functor, + void>(kind, terminator, accumulator, result); + } + }; +}; + +template <TypeCategory CAT, + template <TypeCategory XCAT, int XKIND, TypeCategory TARGET_CAT> + class HELPER> +struct NumericFindlocHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()(TypeCategory targetCat, int targetKind, + Descriptor &result, const Descriptor &x, const Descriptor &target, + int kind, int dim, const Descriptor *mask, bool back, + Terminator &terminator) const { + switch (targetCat) { + case TypeCategory::Integer: + case TypeCategory::Unsigned: + ApplyIntegerKind< + HELPER<CAT, KIND, TypeCategory::Integer>::template Functor, void>( + targetKind, terminator, result, x, target, kind, dim, mask, back, + terminator); + break; + case TypeCategory::Real: + ApplyFloatingPointKind< + HELPER<CAT, KIND, TypeCategory::Real>::template Functor, void>( + targetKind, terminator, result, x, target, kind, dim, mask, back, + terminator); + break; + case TypeCategory::Complex: + ApplyFloatingPointKind< + HELPER<CAT, KIND, TypeCategory::Complex>::template Functor, void>( + targetKind, terminator, result, x, target, kind, dim, mask, back, + terminator); + break; + default: + terminator.Crash( + "FINDLOC: bad target category %d for array category %d", + static_cast<int>(targetCat), static_cast<int>(CAT)); + } + } + }; +}; + +template <int KIND> struct CharacterFindlocHelper { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + const Descriptor &target, int kind, const Descriptor *mask, bool back, + Terminator &terminator) { + using Accumulator = LocationAccumulator<CharacterEquality<KIND>>; + Accumulator accumulator{x, target, back}; + DoTotalReduction<void>(x, 0, mask, accumulator, "FINDLOC", terminator); + ApplyIntegerKind<LocationResultHelper<Accumulator>::template Functor, void>( + kind, terminator, accumulator, result); + } +}; + +static RT_API_ATTRS void LogicalFindlocHelper(Descriptor &result, + const Descriptor &x, const Descriptor &target, int kind, + const Descriptor *mask, bool back, Terminator &terminator) { + using Accumulator = LocationAccumulator<LogicalEquivalence>; + Accumulator accumulator{x, target, back}; + DoTotalReduction<void>(x, 0, mask, accumulator, "FINDLOC", terminator); + ApplyIntegerKind<LocationResultHelper<Accumulator>::template Functor, void>( + kind, terminator, accumulator, result); +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(Findloc)(Descriptor &result, const Descriptor &x, + const Descriptor &target, int kind, const char *source, int line, + const Descriptor *mask, bool back) { + int rank{x.rank()}; + SubscriptValue extent[1]{rank}; + result.Establish(TypeCategory::Integer, kind, nullptr, 1, extent, + CFI_attribute_allocatable); + result.GetDimension(0).SetBounds(1, extent[0]); + Terminator terminator{source, line}; + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "FINDLOC: could not allocate memory for result; STAT=%d", stat); + } + CheckIntegerKind(terminator, kind, "FINDLOC"); + auto xType{x.type().GetCategoryAndKind()}; + auto targetType{target.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, xType.has_value() && targetType.has_value()); + switch (xType->first) { + case TypeCategory::Integer: + case TypeCategory::Unsigned: + ApplyIntegerKind<NumericFindlocHelper<TypeCategory::Integer, + TotalNumericFindlocHelper>::template Functor, + void>(xType->second, terminator, targetType->first, targetType->second, + result, x, target, kind, 0, mask, back, terminator); + break; + case TypeCategory::Real: + ApplyFloatingPointKind<NumericFindlocHelper<TypeCategory::Real, + TotalNumericFindlocHelper>::template Functor, + void>(xType->second, terminator, targetType->first, targetType->second, + result, x, target, kind, 0, mask, back, terminator); + break; + case TypeCategory::Complex: + ApplyFloatingPointKind<NumericFindlocHelper<TypeCategory::Complex, + TotalNumericFindlocHelper>::template Functor, + void>(xType->second, terminator, targetType->first, targetType->second, + result, x, target, kind, 0, mask, back, terminator); + break; + case TypeCategory::Character: + RUNTIME_CHECK(terminator, + targetType->first == TypeCategory::Character && + targetType->second == xType->second); + ApplyCharacterKind<CharacterFindlocHelper, void>(xType->second, terminator, + result, x, target, kind, mask, back, terminator); + break; + case TypeCategory::Logical: + RUNTIME_CHECK(terminator, targetType->first == TypeCategory::Logical); + LogicalFindlocHelper(result, x, target, kind, mask, back, terminator); + break; + default: + terminator.Crash( + "FINDLOC: bad data type code (%d) for array", x.type().raw()); + } +} + +RT_EXT_API_GROUP_END +} // extern "C" + +// FINDLOC with DIM= + +template <TypeCategory XCAT, int XKIND, TypeCategory TARGET_CAT> +struct PartialNumericFindlocHelper { + template <int TARGET_KIND> struct Functor { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + const Descriptor &target, int kind, int dim, const Descriptor *mask, + bool back, Terminator &terminator) const { + using Eq = Equality<XCAT, XKIND, TARGET_CAT, TARGET_KIND>; + using Accumulator = LocationAccumulator<Eq>; + Accumulator accumulator{x, target, back}; + ApplyIntegerKind<PartialLocationHelper<Accumulator>::template Functor, + void>(kind, terminator, result, x, dim, mask, terminator, "FINDLOC", + accumulator); + } + }; +}; + +template <int KIND> struct PartialCharacterFindlocHelper { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + const Descriptor &target, int kind, int dim, const Descriptor *mask, + bool back, Terminator &terminator) { + using Accumulator = LocationAccumulator<CharacterEquality<KIND>>; + Accumulator accumulator{x, target, back}; + ApplyIntegerKind<PartialLocationHelper<Accumulator>::template Functor, + void>(kind, terminator, result, x, dim, mask, terminator, "FINDLOC", + accumulator); + } +}; + +static RT_API_ATTRS void PartialLogicalFindlocHelper(Descriptor &result, + const Descriptor &x, const Descriptor &target, int kind, int dim, + const Descriptor *mask, bool back, Terminator &terminator) { + using Accumulator = LocationAccumulator<LogicalEquivalence>; + Accumulator accumulator{x, target, back}; + ApplyIntegerKind<PartialLocationHelper<Accumulator>::template Functor, void>( + kind, terminator, result, x, dim, mask, terminator, "FINDLOC", + accumulator); +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(FindlocDim)(Descriptor &result, const Descriptor &x, + const Descriptor &target, int kind, int dim, const char *source, int line, + const Descriptor *mask, bool back) { + Terminator terminator{source, line}; + CheckIntegerKind(terminator, kind, "FINDLOC"); + auto xType{x.type().GetCategoryAndKind()}; + auto targetType{target.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, xType.has_value() && targetType.has_value()); + switch (xType->first) { + case TypeCategory::Integer: + case TypeCategory::Unsigned: + ApplyIntegerKind<NumericFindlocHelper<TypeCategory::Integer, + PartialNumericFindlocHelper>::template Functor, + void>(xType->second, terminator, targetType->first, targetType->second, + result, x, target, kind, dim, mask, back, terminator); + break; + case TypeCategory::Real: + ApplyFloatingPointKind<NumericFindlocHelper<TypeCategory::Real, + PartialNumericFindlocHelper>::template Functor, + void>(xType->second, terminator, targetType->first, targetType->second, + result, x, target, kind, dim, mask, back, terminator); + break; + case TypeCategory::Complex: + ApplyFloatingPointKind<NumericFindlocHelper<TypeCategory::Complex, + PartialNumericFindlocHelper>::template Functor, + void>(xType->second, terminator, targetType->first, targetType->second, + result, x, target, kind, dim, mask, back, terminator); + break; + case TypeCategory::Character: + RUNTIME_CHECK(terminator, + targetType->first == TypeCategory::Character && + targetType->second == xType->second); + ApplyCharacterKind<PartialCharacterFindlocHelper, void>(xType->second, + terminator, result, x, target, kind, dim, mask, back, terminator); + break; + case TypeCategory::Logical: + RUNTIME_CHECK(terminator, targetType->first == TypeCategory::Logical); + PartialLogicalFindlocHelper( + result, x, target, kind, dim, mask, back, terminator); + break; + default: + terminator.Crash( + "FINDLOC: bad data type code (%d) for array", x.type().raw()); + } +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/format.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/format.cpp new file mode 100644 index 00000000000..ee0059f5f07 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/format.cpp @@ -0,0 +1,24 @@ +//===-- lib/runtime/format.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/format-implementation.h" + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN +template class FormatControl< + InternalFormattedIoStatementState<Direction::Output>>; +template class FormatControl< + InternalFormattedIoStatementState<Direction::Input>>; +template class FormatControl< + ExternalFormattedIoStatementState<Direction::Output>>; +template class FormatControl< + ExternalFormattedIoStatementState<Direction::Input>>; +template class FormatControl<ChildFormattedIoStatementState<Direction::Output>>; +template class FormatControl<ChildFormattedIoStatementState<Direction::Input>>; +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/inquiry.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/inquiry.cpp new file mode 100644 index 00000000000..b6a7fce7a1e --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/inquiry.cpp @@ -0,0 +1,97 @@ +//===-- lib/runtime/inquiry.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements the inquiry intrinsic functions of Fortran 2018 that +// inquire about shape information of arrays -- LBOUND and SIZE. + +#include "flang/Runtime/inquiry.h" +#include "copy.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include <algorithm> + +namespace Fortran::runtime { + +template <int KIND> struct RawStoreIntegerAt { + RT_API_ATTRS void operator()( + void *contiguousIntegerArray, std::size_t at, std::int64_t value) const { + reinterpret_cast<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Integer, KIND> *>( + contiguousIntegerArray)[at] = value; + } +}; + +extern "C" { +std::int64_t RTDEF(LboundDim)( + const Descriptor &array, int dim, const char *sourceFile, int line) { + if (dim < 1 || dim > array.rank()) { + Terminator terminator{sourceFile, line}; + terminator.Crash( + "SIZE: bad DIM=%d for ARRAY with rank=%d", dim, array.rank()); + } + const Dimension &dimension{array.GetDimension(dim - 1)}; + return static_cast<std::int64_t>(dimension.LowerBound()); +} + +void RTDEF(Ubound)(void *result, const Descriptor &array, int kind, + const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + INTERNAL_CHECK(array.rank() <= common::maxRank); + for (SubscriptValue i{0}; i < array.rank(); ++i) { + const Dimension &dimension{array.GetDimension(i)}; + Fortran::runtime::ApplyIntegerKind<RawStoreIntegerAt, void>( + kind, terminator, result, i, dimension.UpperBound()); + } +} + +std::int64_t RTDEF(Size)( + const Descriptor &array, const char *sourceFile, int line) { + std::int64_t result{1}; + for (int i = 0; i < array.rank(); ++i) { + const Dimension &dimension{array.GetDimension(i)}; + result *= dimension.Extent(); + } + return result; +} + +std::int64_t RTDEF(SizeDim)( + const Descriptor &array, int dim, const char *sourceFile, int line) { + if (dim < 1 || dim > array.rank()) { + Terminator terminator{sourceFile, line}; + terminator.Crash( + "SIZE: bad DIM=%d for ARRAY with rank=%d", dim, array.rank()); + } + const Dimension &dimension{array.GetDimension(dim - 1)}; + return static_cast<std::int64_t>(dimension.Extent()); +} + +void RTDEF(Shape)(void *result, const Descriptor &array, int kind, + const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + INTERNAL_CHECK(array.rank() <= common::maxRank); + for (SubscriptValue i{0}; i < array.rank(); ++i) { + const Dimension &dimension{array.GetDimension(i)}; + Fortran::runtime::ApplyIntegerKind<RawStoreIntegerAt, void>( + kind, terminator, result, i, dimension.Extent()); + } +} + +void RTDEF(Lbound)(void *result, const Descriptor &array, int kind, + const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + INTERNAL_CHECK(array.rank() <= common::maxRank); + for (SubscriptValue i{0}; i < array.rank(); ++i) { + const Dimension &dimension{array.GetDimension(i)}; + Fortran::runtime::ApplyIntegerKind<RawStoreIntegerAt, void>( + kind, terminator, result, i, dimension.LowerBound()); + } +} + +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/internal-unit.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/internal-unit.cpp new file mode 100644 index 00000000000..e344b01e8b3 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/internal-unit.cpp @@ -0,0 +1,192 @@ +//===-- lib/runtime/internal-unit.cpp ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/internal-unit.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/io-error.h" +#include "flang/Runtime/freestanding-tools.h" +#include <algorithm> +#include <type_traits> + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +template <Direction DIR> +RT_API_ATTRS InternalDescriptorUnit<DIR>::InternalDescriptorUnit( + Scalar scalar, std::size_t length, int kind) { + internalIoCharKind = kind; + recordLength = length; + endfileRecordNumber = 2; + void *pointer{reinterpret_cast<void *>(const_cast<char *>(scalar))}; + descriptor().Establish(TypeCode{TypeCategory::Character, kind}, length * kind, + pointer, 0, nullptr, CFI_attribute_pointer); +} + +template <Direction DIR> +RT_API_ATTRS InternalDescriptorUnit<DIR>::InternalDescriptorUnit( + const Descriptor &that, const Terminator &terminator) { + auto thatType{that.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, thatType.has_value()); + RUNTIME_CHECK(terminator, thatType->first == TypeCategory::Character); + Descriptor &d{descriptor()}; + RUNTIME_CHECK( + terminator, that.SizeInBytes() <= d.SizeInBytes(maxRank, true, 0)); + RUNTIME_CHECK(terminator, + that.SizeInBytes() <= MaxDescriptorSizeInBytes(maxRank, true, 0)); + new (&d) Descriptor{that}; + d.Check(); + internalIoCharKind = thatType->second; + recordLength = d.ElementBytes(); + endfileRecordNumber = d.Elements() + 1; +} + +template <Direction DIR> +RT_API_ATTRS bool InternalDescriptorUnit<DIR>::Emit( + const char *data, std::size_t bytes, IoErrorHandler &handler) { + if constexpr (DIR == Direction::Input) { + handler.Crash("InternalDescriptorUnit<Direction::Input>::Emit() called"); + return false && data[bytes] != 0; // bogus compare silences GCC warning + } else { + if (bytes <= 0) { + return true; + } + char *record{CurrentRecord()}; + if (!record) { + handler.SignalError(IostatInternalWriteOverrun); + return false; + } + auto furthestAfter{std::max(furthestPositionInRecord, + positionInRecord + static_cast<std::int64_t>(bytes))}; + bool ok{true}; + if (furthestAfter > static_cast<std::int64_t>(recordLength.value_or(0))) { + handler.SignalError(IostatRecordWriteOverrun); + furthestAfter = recordLength.value_or(0); + bytes = std::max(std::int64_t{0}, furthestAfter - positionInRecord); + ok = false; + } else if (positionInRecord > furthestPositionInRecord) { + BlankFill(record + furthestPositionInRecord, + positionInRecord - furthestPositionInRecord); + } + std::memcpy(record + positionInRecord, data, bytes); + positionInRecord += bytes; + furthestPositionInRecord = furthestAfter; + return ok; + } +} + +template <Direction DIR> +RT_API_ATTRS std::size_t InternalDescriptorUnit<DIR>::GetNextInputBytes( + const char *&p, IoErrorHandler &handler) { + p = nullptr; + if constexpr (DIR == Direction::Output) { + handler.Crash("InternalDescriptorUnit<Direction::Output>::" + "GetNextInputBytes() called"); + return 0; + } else { + const char *record{CurrentRecord()}; + if (!record) { + handler.SignalEnd(); + return 0; + } else if (positionInRecord >= recordLength.value_or(positionInRecord)) { + return 0; + } else { + p = &record[positionInRecord]; + return *recordLength - positionInRecord; + } + } +} + +template <Direction DIR> +RT_API_ATTRS std::size_t InternalDescriptorUnit<DIR>::ViewBytesInRecord( + const char *&p, bool forward) const { + p = nullptr; + auto recl{recordLength.value_or(positionInRecord)}; + const char *record{CurrentRecord()}; + if (forward) { + if (positionInRecord < recl) { + if (record) { + p = &record[positionInRecord]; + } + return recl - positionInRecord; + } + } else { + if (record && positionInRecord <= recl) { + p = &record[positionInRecord]; + } + return positionInRecord - leftTabLimit.value_or(0); + } + return 0; +} + +template <Direction DIR> +RT_API_ATTRS bool InternalDescriptorUnit<DIR>::AdvanceRecord( + IoErrorHandler &handler) { + if (currentRecordNumber >= endfileRecordNumber.value_or(0)) { + if constexpr (DIR == Direction::Input) { + handler.SignalEnd(); + } else { + handler.SignalError(IostatInternalWriteOverrun); + } + return false; + } + if constexpr (DIR == Direction::Output) { + BlankFillOutputRecord(); + } + ++currentRecordNumber; + BeginRecord(); + return true; +} + +template <Direction DIR> +RT_API_ATTRS void InternalDescriptorUnit<DIR>::BlankFill( + char *at, std::size_t bytes) { + switch (internalIoCharKind) { + case 2: + Fortran::runtime::fill_n(reinterpret_cast<char16_t *>(at), bytes / 2, + static_cast<char16_t>(' ')); + break; + case 4: + Fortran::runtime::fill_n(reinterpret_cast<char32_t *>(at), bytes / 4, + static_cast<char32_t>(' ')); + break; + default: + Fortran::runtime::fill_n(at, bytes, ' '); + break; + } +} + +template <Direction DIR> +RT_API_ATTRS void InternalDescriptorUnit<DIR>::BlankFillOutputRecord() { + if constexpr (DIR == Direction::Output) { + if (furthestPositionInRecord < + recordLength.value_or(furthestPositionInRecord)) { + BlankFill(CurrentRecord() + furthestPositionInRecord, + *recordLength - furthestPositionInRecord); + } + } +} + +template <Direction DIR> +RT_API_ATTRS void InternalDescriptorUnit<DIR>::BackspaceRecord( + IoErrorHandler &handler) { + RUNTIME_CHECK(handler, currentRecordNumber > 1); + --currentRecordNumber; + BeginRecord(); +} + +template <Direction DIR> +RT_API_ATTRS std::int64_t InternalDescriptorUnit<DIR>::InquirePos() { + return (currentRecordNumber - 1) * recordLength.value_or(0) + + positionInRecord + 1; +} + +template class InternalDescriptorUnit<Direction::Output>; +template class InternalDescriptorUnit<Direction::Input>; + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api-common.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api-common.h new file mode 100644 index 00000000000..b91ff9ff168 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api-common.h @@ -0,0 +1,97 @@ +//===-- lib/runtime/io-api-common.h -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FLANG_RT_RUNTIME_IO_API_COMMON_H_ +#define FLANG_RT_RUNTIME_IO_API_COMMON_H_ + +#include "unit.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang-rt/runtime/terminator.h" +#include "flang/Common/api-attrs.h" +#include "flang/Common/optional.h" +#include "flang/Runtime/io-api.h" + +namespace Fortran::runtime::io { + +static inline RT_API_ATTRS Cookie NoopUnit(const Terminator &terminator, + int unitNumber, enum Iostat iostat = IostatOk) { + Cookie cookie{&New<NoopStatementState>{terminator}( + terminator.sourceFileName(), terminator.sourceLine(), unitNumber) + .release() + ->ioStatementState()}; + if (iostat != IostatOk) { + cookie->GetIoErrorHandler().SetPendingError(iostat); + } + return cookie; +} + +static inline RT_API_ATTRS ExternalFileUnit *GetOrCreateUnit(int unitNumber, + Direction direction, Fortran::common::optional<bool> isUnformatted, + const Terminator &terminator, Cookie &errorCookie) { + IoErrorHandler handler{terminator}; + handler.HasIoStat(); + if (ExternalFileUnit * + unit{ExternalFileUnit::LookUpOrCreateAnonymous( + unitNumber, direction, isUnformatted, handler)}) { + errorCookie = nullptr; + return unit; + } else { + auto iostat{static_cast<enum Iostat>(handler.GetIoStat())}; + errorCookie = NoopUnit(terminator, unitNumber, + iostat != IostatOk ? iostat : IostatBadUnitNumber); + return nullptr; + } +} + +template <Direction DIR, template <Direction> class STATE, typename... A> +RT_API_ATTRS Cookie BeginExternalListIO( + int unitNumber, const char *sourceFile, int sourceLine, A &&...xs) { + Terminator terminator{sourceFile, sourceLine}; + Cookie errorCookie{nullptr}; + ExternalFileUnit *unit{GetOrCreateUnit( + unitNumber, DIR, false /*!unformatted*/, terminator, errorCookie)}; + if (!unit) { + return errorCookie; + } + if (!unit->isUnformatted.has_value()) { + unit->isUnformatted = false; + } + Iostat iostat{IostatOk}; + if (*unit->isUnformatted) { + iostat = IostatFormattedIoOnUnformattedUnit; + } + if (ChildIo * child{unit->GetChildIo()}) { + if (iostat == IostatOk) { + iostat = child->CheckFormattingAndDirection(false, DIR); + } + if (iostat == IostatOk) { + return &child->BeginIoStatement<ChildListIoStatementState<DIR>>( + *child, sourceFile, sourceLine); + } else { + return &child->BeginIoStatement<ErroneousIoStatementState>( + iostat, nullptr /* no unit */, sourceFile, sourceLine); + } + } else { + if (iostat == IostatOk && unit->access == Access::Direct) { + iostat = IostatListIoOnDirectAccessUnit; + } + if (iostat == IostatOk) { + iostat = unit->SetDirection(DIR); + } + if (iostat == IostatOk) { + return &unit->BeginIoStatement<STATE<DIR>>( + terminator, std::forward<A>(xs)..., *unit, sourceFile, sourceLine); + } else { + return &unit->BeginIoStatement<ErroneousIoStatementState>( + terminator, iostat, unit, sourceFile, sourceLine); + } + } +} + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_IO_API_COMMON_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api-minimal.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api-minimal.cpp new file mode 100644 index 00000000000..fdf7183ed51 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api-minimal.cpp @@ -0,0 +1,164 @@ +//===-- lib/runtime/io-api-minimal.cpp --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements the subset of the I/O statement API needed for basic +// list-directed output (PRINT *) of intrinsic types. + +#include "edit-output.h" +#include "io-api-common.h" +#include "unit.h" +#include "flang-rt/runtime/format.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Runtime/io-api.h" + +namespace Fortran::runtime::io { +RT_EXT_API_GROUP_BEGIN + +Cookie IODEF(BeginExternalListOutput)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + return BeginExternalListIO<Direction::Output, ExternalListIoStatementState>( + unitNumber, sourceFile, sourceLine); +} + +enum Iostat IODEF(EndIoStatement)(Cookie cookie) { + IoStatementState &io{*cookie}; + return static_cast<enum Iostat>(io.EndIoStatement()); +} + +template <int KIND, typename INT = CppTypeFor<TypeCategory::Integer, KIND>> +inline RT_API_ATTRS bool FormattedScalarIntegerOutput( + IoStatementState &io, INT x, const char *whence) { + if (io.CheckFormattedStmtType<Direction::Output>(whence)) { + auto edit{io.GetNextDataEdit()}; + return edit && EditIntegerOutput<KIND>(io, *edit, x, /*isSigned=*/true); + } else { + return false; + } +} + +bool IODEF(OutputInteger8)(Cookie cookie, std::int8_t n) { + return FormattedScalarIntegerOutput<1>(*cookie, n, "OutputInteger8"); +} + +bool IODEF(OutputInteger16)(Cookie cookie, std::int16_t n) { + return FormattedScalarIntegerOutput<2>(*cookie, n, "OutputInteger16"); +} + +bool IODEF(OutputInteger32)(Cookie cookie, std::int32_t n) { + return FormattedScalarIntegerOutput<4>(*cookie, n, "OutputInteger32"); +} + +bool IODEF(OutputInteger64)(Cookie cookie, std::int64_t n) { + return FormattedScalarIntegerOutput<8>(*cookie, n, "OutputInteger64"); +} + +#ifdef __SIZEOF_INT128__ +bool IODEF(OutputInteger128)(Cookie cookie, common::int128_t n) { + return FormattedScalarIntegerOutput<16>(*cookie, n, "OutputInteger128"); +} +#endif + +template <int KIND, + typename REAL = typename RealOutputEditing<KIND>::BinaryFloatingPoint> +inline RT_API_ATTRS bool FormattedScalarRealOutput( + IoStatementState &io, REAL x, const char *whence) { + if (io.CheckFormattedStmtType<Direction::Output>(whence)) { + auto edit{io.GetNextDataEdit()}; + return edit && RealOutputEditing<KIND>{io, x}.Edit(*edit); + } else { + return false; + } +} + +bool IODEF(OutputReal32)(Cookie cookie, float x) { + return FormattedScalarRealOutput<4>(*cookie, x, "OutputReal32"); +} + +bool IODEF(OutputReal64)(Cookie cookie, double x) { + return FormattedScalarRealOutput<8>(*cookie, x, "OutputReal64"); +} + +template <int KIND, + typename REAL = typename RealOutputEditing<KIND>::BinaryFloatingPoint> +inline RT_API_ATTRS bool FormattedScalarComplexOutput( + IoStatementState &io, REAL re, REAL im, const char *whence) { + if (io.CheckFormattedStmtType<Direction::Output>(whence)) { + if (io.get_if<ListDirectedStatementState<Direction::Output>>() != nullptr) { + DataEdit rEdit, iEdit; + rEdit.descriptor = DataEdit::ListDirectedRealPart; + iEdit.descriptor = DataEdit::ListDirectedImaginaryPart; + rEdit.modes = iEdit.modes = io.mutableModes(); + return RealOutputEditing<KIND>{io, re}.Edit(rEdit) && + RealOutputEditing<KIND>{io, im}.Edit(iEdit); + } else { + auto reEdit{io.GetNextDataEdit()}; + if (reEdit && RealOutputEditing<KIND>{io, re}.Edit(*reEdit)) { + auto imEdit{io.GetNextDataEdit()}; + return imEdit && RealOutputEditing<KIND>{io, im}.Edit(*imEdit); + } + } + } + return false; +} + +bool IODEF(OutputComplex32)(Cookie cookie, float re, float im) { + return FormattedScalarComplexOutput<4>(*cookie, re, im, "OutputComplex32"); +} + +bool IODEF(OutputComplex64)(Cookie cookie, double re, double im) { + return FormattedScalarComplexOutput<8>(*cookie, re, im, "OutputComplex64"); +} + +bool IODEF(OutputAscii)(Cookie cookie, const char *x, std::size_t length) { + IoStatementState &io{*cookie}; + if (!x) { + io.GetIoErrorHandler().Crash("Null address for character output item"); + } else if (auto *listOutput{ + io.get_if<ListDirectedStatementState<Direction::Output>>()}) { + return ListDirectedCharacterOutput(io, *listOutput, x, length); + } else if (io.CheckFormattedStmtType<Direction::Output>("OutputAscii")) { + auto edit{io.GetNextDataEdit()}; + return edit && EditCharacterOutput(io, *edit, x, length); + } else { + return false; + } +} + +bool IODEF(OutputLogical)(Cookie cookie, bool truth) { + IoStatementState &io{*cookie}; + if (auto *listOutput{ + io.get_if<ListDirectedStatementState<Direction::Output>>()}) { + return ListDirectedLogicalOutput(io, *listOutput, truth); + } else if (io.CheckFormattedStmtType<Direction::Output>("OutputAscii")) { + auto edit{io.GetNextDataEdit()}; + return edit && EditLogicalOutput(io, *edit, truth); + } else { + return false; + } +} + +} // namespace Fortran::runtime::io + +#if defined(_LIBCPP_VERBOSE_ABORT) +// Provide own definition for `std::__libcpp_verbose_abort` to avoid dependency +// on the version provided by libc++. + +void std::__libcpp_verbose_abort(char const *format, ...) noexcept( + noexcept(std::__libcpp_verbose_abort(""))) { + va_list list; + va_start(list, format); + std::vfprintf(stderr, format, list); + va_end(list); + + std::abort(); +} +#endif + +RT_EXT_API_GROUP_END diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api.cpp new file mode 100644 index 00000000000..6af0121437c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-api.cpp @@ -0,0 +1,1303 @@ +//===-- lib/runtime/io-api.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements the I/O statement API + +// template function BeginExternalListIo<> is in runtime/io-api-common.h. +// APIs BeginExternalListOutput, OutputInteger{8,16,32,64,128}, +// OutputReal{32,64}, OutputComplex{32,64}, OutputAscii, & EndIoStatement() +// are in runtime/io-api-minimal.cpp. + +#include "flang/Runtime/io-api.h" +#include "descriptor-io.h" +#include "edit-input.h" +#include "edit-output.h" +#include "io-api-common.h" +#include "unit.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/format.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Common/optional.h" +#include <cstdlib> +#include <memory> + +namespace Fortran::runtime::io { +RT_EXT_API_GROUP_BEGIN + +template <Direction DIR> +RT_API_ATTRS Cookie BeginInternalArrayListIO(const Descriptor &descriptor, + void ** /*scratchArea*/, std::size_t /*scratchBytes*/, + const char *sourceFile, int sourceLine) { + Terminator oom{sourceFile, sourceLine}; + return &New<InternalListIoStatementState<DIR>>{oom}( + descriptor, sourceFile, sourceLine) + .release() + ->ioStatementState(); +} + +Cookie IODEF(BeginInternalArrayListOutput)(const Descriptor &descriptor, + void **scratchArea, std::size_t scratchBytes, const char *sourceFile, + int sourceLine) { + return BeginInternalArrayListIO<Direction::Output>( + descriptor, scratchArea, scratchBytes, sourceFile, sourceLine); +} + +Cookie IODEF(BeginInternalArrayListInput)(const Descriptor &descriptor, + void **scratchArea, std::size_t scratchBytes, const char *sourceFile, + int sourceLine) { + return BeginInternalArrayListIO<Direction::Input>( + descriptor, scratchArea, scratchBytes, sourceFile, sourceLine); +} + +template <Direction DIR> +RT_API_ATTRS Cookie BeginInternalArrayFormattedIO(const Descriptor &descriptor, + const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor, void ** /*scratchArea*/, + std::size_t /*scratchBytes*/, const char *sourceFile, int sourceLine) { + Terminator oom{sourceFile, sourceLine}; + return &New<InternalFormattedIoStatementState<DIR>>{oom}(descriptor, format, + formatLength, formatDescriptor, sourceFile, sourceLine) + .release() + ->ioStatementState(); +} + +Cookie IODEF(BeginInternalArrayFormattedOutput)(const Descriptor &descriptor, + const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor, void **scratchArea, + std::size_t scratchBytes, const char *sourceFile, int sourceLine) { + return BeginInternalArrayFormattedIO<Direction::Output>(descriptor, format, + formatLength, formatDescriptor, scratchArea, scratchBytes, sourceFile, + sourceLine); +} + +Cookie IODEF(BeginInternalArrayFormattedInput)(const Descriptor &descriptor, + const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor, void **scratchArea, + std::size_t scratchBytes, const char *sourceFile, int sourceLine) { + return BeginInternalArrayFormattedIO<Direction::Input>(descriptor, format, + formatLength, formatDescriptor, scratchArea, scratchBytes, sourceFile, + sourceLine); +} + +template <Direction DIR> +RT_API_ATTRS Cookie BeginInternalListIO( + std::conditional_t<DIR == Direction::Input, const char, char> *internal, + std::size_t internalLength, void ** /*scratchArea*/, + std::size_t /*scratchBytes*/, const char *sourceFile, int sourceLine) { + Terminator oom{sourceFile, sourceLine}; + return &New<InternalListIoStatementState<DIR>>{oom}( + internal, internalLength, sourceFile, sourceLine) + .release() + ->ioStatementState(); +} + +Cookie IODEF(BeginInternalListOutput)(char *internal, + std::size_t internalLength, void **scratchArea, std::size_t scratchBytes, + const char *sourceFile, int sourceLine) { + return BeginInternalListIO<Direction::Output>(internal, internalLength, + scratchArea, scratchBytes, sourceFile, sourceLine); +} + +Cookie IODEF(BeginInternalListInput)(const char *internal, + std::size_t internalLength, void **scratchArea, std::size_t scratchBytes, + const char *sourceFile, int sourceLine) { + return BeginInternalListIO<Direction::Input>(internal, internalLength, + scratchArea, scratchBytes, sourceFile, sourceLine); +} + +template <Direction DIR> +RT_API_ATTRS Cookie BeginInternalFormattedIO( + std::conditional_t<DIR == Direction::Input, const char, char> *internal, + std::size_t internalLength, const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor, void ** /*scratchArea*/, + std::size_t /*scratchBytes*/, const char *sourceFile, int sourceLine) { + Terminator oom{sourceFile, sourceLine}; + return &New<InternalFormattedIoStatementState<DIR>>{oom}(internal, + internalLength, format, formatLength, formatDescriptor, sourceFile, + sourceLine) + .release() + ->ioStatementState(); +} + +Cookie IODEF(BeginInternalFormattedOutput)(char *internal, + std::size_t internalLength, const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor, void **scratchArea, + std::size_t scratchBytes, const char *sourceFile, int sourceLine) { + return BeginInternalFormattedIO<Direction::Output>(internal, internalLength, + format, formatLength, formatDescriptor, scratchArea, scratchBytes, + sourceFile, sourceLine); +} + +Cookie IODEF(BeginInternalFormattedInput)(const char *internal, + std::size_t internalLength, const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor, void **scratchArea, + std::size_t scratchBytes, const char *sourceFile, int sourceLine) { + return BeginInternalFormattedIO<Direction::Input>(internal, internalLength, + format, formatLength, formatDescriptor, scratchArea, scratchBytes, + sourceFile, sourceLine); +} + +Cookie IODEF(BeginExternalListInput)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + return BeginExternalListIO<Direction::Input, ExternalListIoStatementState>( + unitNumber, sourceFile, sourceLine); +} + +template <Direction DIR> +RT_API_ATTRS Cookie BeginExternalFormattedIO(const char *format, + std::size_t formatLength, const Descriptor *formatDescriptor, + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + Cookie errorCookie{nullptr}; + ExternalFileUnit *unit{GetOrCreateUnit( + unitNumber, DIR, false /*!unformatted*/, terminator, errorCookie)}; + if (!unit) { + return errorCookie; + } + Iostat iostat{IostatOk}; + if (!unit->isUnformatted.has_value()) { + unit->isUnformatted = false; + } + if (*unit->isUnformatted) { + iostat = IostatFormattedIoOnUnformattedUnit; + } + if (ChildIo * child{unit->GetChildIo()}) { + if (iostat == IostatOk) { + iostat = child->CheckFormattingAndDirection(false, DIR); + } + if (iostat == IostatOk) { + return &child->BeginIoStatement<ChildFormattedIoStatementState<DIR>>( + *child, format, formatLength, formatDescriptor, sourceFile, + sourceLine); + } else { + return &child->BeginIoStatement<ErroneousIoStatementState>( + iostat, nullptr /* no unit */, sourceFile, sourceLine); + } + } else { + if (iostat == IostatOk) { + iostat = unit->SetDirection(DIR); + } + if (iostat == IostatOk) { + return &unit->BeginIoStatement<ExternalFormattedIoStatementState<DIR>>( + terminator, *unit, format, formatLength, formatDescriptor, sourceFile, + sourceLine); + } else { + return &unit->BeginIoStatement<ErroneousIoStatementState>( + terminator, iostat, unit, sourceFile, sourceLine); + } + } +} + +Cookie IODEF(BeginExternalFormattedOutput)(const char *format, + std::size_t formatLength, const Descriptor *formatDescriptor, + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + return BeginExternalFormattedIO<Direction::Output>(format, formatLength, + formatDescriptor, unitNumber, sourceFile, sourceLine); +} + +Cookie IODEF(BeginExternalFormattedInput)(const char *format, + std::size_t formatLength, const Descriptor *formatDescriptor, + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + return BeginExternalFormattedIO<Direction::Input>(format, formatLength, + formatDescriptor, unitNumber, sourceFile, sourceLine); +} + +template <Direction DIR> +RT_API_ATTRS Cookie BeginUnformattedIO( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + Cookie errorCookie{nullptr}; + ExternalFileUnit *unit{GetOrCreateUnit( + unitNumber, DIR, true /*unformatted*/, terminator, errorCookie)}; + if (!unit) { + return errorCookie; + } + Iostat iostat{IostatOk}; + if (!unit->isUnformatted.has_value()) { + unit->isUnformatted = true; + } + if (!*unit->isUnformatted) { + iostat = IostatUnformattedIoOnFormattedUnit; + } + if (ChildIo * child{unit->GetChildIo()}) { + if (iostat == IostatOk) { + iostat = child->CheckFormattingAndDirection(true, DIR); + } + if (iostat == IostatOk) { + return &child->BeginIoStatement<ChildUnformattedIoStatementState<DIR>>( + *child, sourceFile, sourceLine); + } else { + return &child->BeginIoStatement<ErroneousIoStatementState>( + iostat, nullptr /* no unit */, sourceFile, sourceLine); + } + } else { + if (iostat == IostatOk) { + iostat = unit->SetDirection(DIR); + } + if (iostat == IostatOk) { + IoStatementState &io{ + unit->BeginIoStatement<ExternalUnformattedIoStatementState<DIR>>( + terminator, *unit, sourceFile, sourceLine)}; + if constexpr (DIR == Direction::Output) { + if (unit->access == Access::Sequential) { + // Create space for (sub)record header to be completed by + // ExternalFileUnit::AdvanceRecord() + unit->recordLength.reset(); // in case of prior BACKSPACE + io.Emit("\0\0\0\0", 4); // placeholder for record length header + } + } + return &io; + } else { + return &unit->BeginIoStatement<ErroneousIoStatementState>( + terminator, iostat, unit, sourceFile, sourceLine); + } + } +} + +Cookie IODEF(BeginUnformattedOutput)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + return BeginUnformattedIO<Direction::Output>( + unitNumber, sourceFile, sourceLine); +} + +Cookie IODEF(BeginUnformattedInput)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + return BeginUnformattedIO<Direction::Input>( + unitNumber, sourceFile, sourceLine); +} + +Cookie IODEF(BeginOpenUnit)( // OPEN(without NEWUNIT=) + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + bool wasExtant{false}; + if (ExternalFileUnit * + unit{ExternalFileUnit::LookUpOrCreate( + unitNumber, terminator, wasExtant)}) { + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<ErroneousIoStatementState>( + IostatBadOpOnChildUnit, nullptr /* no unit */, sourceFile, + sourceLine); + } else { + return &unit->BeginIoStatement<OpenStatementState>(terminator, *unit, + wasExtant, false /*not NEWUNIT=*/, sourceFile, sourceLine); + } + } else { + return NoopUnit(terminator, unitNumber, IostatBadUnitNumber); + } +} + +Cookie IODEF(BeginOpenNewUnit)( // OPEN(NEWUNIT=j) + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + ExternalFileUnit &unit{ + ExternalFileUnit::NewUnit(terminator, false /*not child I/O*/)}; + return &unit.BeginIoStatement<OpenStatementState>(terminator, unit, + false /*was an existing file*/, true /*NEWUNIT=*/, sourceFile, + sourceLine); +} + +Cookie IODEF(BeginWait)(ExternalUnit unitNumber, AsynchronousId id, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { + if (unit->Wait(id)) { + return &unit->BeginIoStatement<ExternalMiscIoStatementState>(terminator, + *unit, ExternalMiscIoStatementState::Wait, sourceFile, sourceLine); + } else { + return &unit->BeginIoStatement<ErroneousIoStatementState>( + terminator, IostatBadWaitId, unit, sourceFile, sourceLine); + } + } else { + return NoopUnit( + terminator, unitNumber, id == 0 ? IostatOk : IostatBadWaitUnit); + } +} +Cookie IODEF(BeginWaitAll)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + return IONAME(BeginWait)(unitNumber, 0 /*no ID=*/, sourceFile, sourceLine); +} + +Cookie IODEF(BeginClose)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<ErroneousIoStatementState>( + IostatBadOpOnChildUnit, nullptr /* no unit */, sourceFile, + sourceLine); + } + } + if (ExternalFileUnit * unit{ExternalFileUnit::LookUpForClose(unitNumber)}) { + return &unit->BeginIoStatement<CloseStatementState>( + terminator, *unit, sourceFile, sourceLine); + } else { + // CLOSE(UNIT=bad unit) is just a no-op + return NoopUnit(terminator, unitNumber); + } +} + +Cookie IODEF(BeginFlush)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<ExternalMiscIoStatementState>( + *unit, ExternalMiscIoStatementState::Flush, sourceFile, sourceLine); + } else { + return &unit->BeginIoStatement<ExternalMiscIoStatementState>(terminator, + *unit, ExternalMiscIoStatementState::Flush, sourceFile, sourceLine); + } + } else { + // FLUSH(UNIT=bad unit) is an error; an unconnected unit is a no-op + return NoopUnit(terminator, unitNumber, + unitNumber >= 0 ? IostatOk : IostatBadFlushUnit); + } +} + +Cookie IODEF(BeginBackspace)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<ErroneousIoStatementState>( + IostatBadOpOnChildUnit, nullptr /* no unit */, sourceFile, + sourceLine); + } else { + return &unit->BeginIoStatement<ExternalMiscIoStatementState>(terminator, + *unit, ExternalMiscIoStatementState::Backspace, sourceFile, + sourceLine); + } + } else { + return NoopUnit(terminator, unitNumber, IostatBadBackspaceUnit); + } +} + +Cookie IODEF(BeginEndfile)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + Cookie errorCookie{nullptr}; + if (ExternalFileUnit * + unit{GetOrCreateUnit(unitNumber, Direction::Output, + Fortran::common::nullopt, terminator, errorCookie)}) { + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<ErroneousIoStatementState>( + IostatBadOpOnChildUnit, nullptr /* no unit */, sourceFile, + sourceLine); + } else { + return &unit->BeginIoStatement<ExternalMiscIoStatementState>(terminator, + *unit, ExternalMiscIoStatementState::Endfile, sourceFile, sourceLine); + } + } else { + return errorCookie; + } +} + +Cookie IODEF(BeginRewind)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + Cookie errorCookie{nullptr}; + if (ExternalFileUnit * + unit{GetOrCreateUnit(unitNumber, Direction::Input, + Fortran::common::nullopt, terminator, errorCookie)}) { + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<ErroneousIoStatementState>( + IostatBadOpOnChildUnit, nullptr /* no unit */, sourceFile, + sourceLine); + } else { + return &unit->BeginIoStatement<ExternalMiscIoStatementState>(terminator, + *unit, ExternalMiscIoStatementState::Rewind, sourceFile, sourceLine); + } + } else { + return errorCookie; + } +} + +Cookie IODEF(BeginInquireUnit)( + ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<InquireUnitState>( + *unit, sourceFile, sourceLine); + } else { + return &unit->BeginIoStatement<InquireUnitState>( + terminator, *unit, sourceFile, sourceLine); + } + } else { + // INQUIRE(UNIT=unrecognized unit) + return &New<InquireNoUnitState>{terminator}( + sourceFile, sourceLine, unitNumber) + .release() + ->ioStatementState(); + } +} + +Cookie IODEF(BeginInquireFile)(const char *path, std::size_t pathLength, + const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + auto trimmed{SaveDefaultCharacter( + path, TrimTrailingSpaces(path, pathLength), terminator)}; + if (ExternalFileUnit * + unit{ExternalFileUnit::LookUp( + trimmed.get(), Fortran::runtime::strlen(trimmed.get()))}) { + // INQUIRE(FILE=) to a connected unit + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement<InquireUnitState>( + *unit, sourceFile, sourceLine); + } else { + return &unit->BeginIoStatement<InquireUnitState>( + terminator, *unit, sourceFile, sourceLine); + } + } else { + return &New<InquireUnconnectedFileState>{terminator}( + std::move(trimmed), sourceFile, sourceLine) + .release() + ->ioStatementState(); + } +} + +Cookie IODEF(BeginInquireIoLength)(const char *sourceFile, int sourceLine) { + Terminator oom{sourceFile, sourceLine}; + return &New<InquireIOLengthState>{oom}(sourceFile, sourceLine) + .release() + ->ioStatementState(); +} + +// Control list items + +void IODEF(EnableHandlers)(Cookie cookie, bool hasIoStat, bool hasErr, + bool hasEnd, bool hasEor, bool hasIoMsg) { + IoErrorHandler &handler{cookie->GetIoErrorHandler()}; + if (hasIoStat) { + handler.HasIoStat(); + } + if (hasErr) { + handler.HasErrLabel(); + } + if (hasEnd) { + handler.HasEndLabel(); + } + if (hasEor) { + handler.HasEorLabel(); + } + if (hasIoMsg) { + handler.HasIoMsg(); + } +} + +static RT_API_ATTRS bool YesOrNo(const char *keyword, std::size_t length, + const char *what, IoErrorHandler &handler) { + static const char *keywords[]{"YES", "NO", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + return true; + case 1: + return false; + default: + handler.SignalError(IostatErrorInKeyword, "Invalid %s='%.*s'", what, + static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetAdvance)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + bool nonAdvancing{!YesOrNo(keyword, length, "ADVANCE", handler)}; + if (nonAdvancing && io.GetConnectionState().access == Access::Direct) { + handler.SignalError("Non-advancing I/O attempted on direct access file"); + } else { + auto *unit{io.GetExternalFileUnit()}; + if (unit && unit->GetChildIo()) { + // ADVANCE= is ignored for child I/O (12.6.4.8.3 p3) + } else { + io.mutableModes().nonAdvancing = nonAdvancing; + } + } + return !handler.InError(); +} + +bool IODEF(SetBlank)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + static const char *keywords[]{"NULL", "ZERO", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + io.mutableModes().editingFlags &= ~blankZero; + return true; + case 1: + io.mutableModes().editingFlags |= blankZero; + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid BLANK='%.*s'", static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetDecimal)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + static const char *keywords[]{"COMMA", "POINT", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + io.mutableModes().editingFlags |= decimalComma; + return true; + case 1: + io.mutableModes().editingFlags &= ~decimalComma; + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid DECIMAL='%.*s'", static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetDelim)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + static const char *keywords[]{"APOSTROPHE", "QUOTE", "NONE", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + io.mutableModes().delim = '\''; + return true; + case 1: + io.mutableModes().delim = '"'; + return true; + case 2: + io.mutableModes().delim = '\0'; + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid DELIM='%.*s'", static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetPad)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + io.mutableModes().pad = YesOrNo(keyword, length, "PAD", handler); + return !handler.InError(); +} + +bool IODEF(SetPos)(Cookie cookie, std::int64_t pos) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + if (auto *unit{io.GetExternalFileUnit()}) { + return unit->SetStreamPos(pos, handler); + } else if (!io.get_if<ErroneousIoStatementState>()) { + handler.Crash("SetPos() called on internal unit"); + } + return false; +} + +bool IODEF(SetRec)(Cookie cookie, std::int64_t rec) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + if (auto *unit{io.GetExternalFileUnit()}) { + if (unit->GetChildIo()) { + handler.SignalError( + IostatBadOpOnChildUnit, "REC= specifier on child I/O"); + } else { + handler.HasRec(); + unit->SetDirectRec(rec, handler); + } + } else if (!io.get_if<ErroneousIoStatementState>()) { + handler.Crash("SetRec() called on internal unit"); + } + return true; +} + +bool IODEF(SetRound)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + static const char *keywords[]{"UP", "DOWN", "ZERO", "NEAREST", "COMPATIBLE", + "PROCESSOR_DEFINED", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + io.mutableModes().round = decimal::RoundUp; + return true; + case 1: + io.mutableModes().round = decimal::RoundDown; + return true; + case 2: + io.mutableModes().round = decimal::RoundToZero; + return true; + case 3: + io.mutableModes().round = decimal::RoundNearest; + return true; + case 4: + io.mutableModes().round = decimal::RoundCompatible; + return true; + case 5: + io.mutableModes().round = executionEnvironment.defaultOutputRoundingMode; + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid ROUND='%.*s'", static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetSign)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + static const char *keywords[]{ + "PLUS", "SUPPRESS", "PROCESSOR_DEFINED", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + io.mutableModes().editingFlags |= signPlus; + return true; + case 1: + case 2: // processor default is SS + io.mutableModes().editingFlags &= ~signPlus; + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid SIGN='%.*s'", static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetAccess)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetAccess() called when not in an OPEN statement"); + } + return false; + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetAccess() called after GetNewUnit() for an OPEN statement"); + } + static const char *keywords[]{ + "SEQUENTIAL", "DIRECT", "STREAM", "APPEND", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + open->set_access(Access::Sequential); + break; + case 1: + open->set_access(Access::Direct); + break; + case 2: + open->set_access(Access::Stream); + break; + case 3: // Sun Fortran extension ACCESS=APPEND: treat as if POSITION=APPEND + open->set_position(Position::Append); + break; + default: + open->SignalError(IostatErrorInKeyword, "Invalid ACCESS='%.*s'", + static_cast<int>(length), keyword); + } + return true; +} + +bool IODEF(SetAction)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetAction() called when not in an OPEN statement"); + } + return false; + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetAction() called after GetNewUnit() for an OPEN statement"); + } + Fortran::common::optional<Action> action; + static const char *keywords[]{"READ", "WRITE", "READWRITE", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + action = Action::Read; + break; + case 1: + action = Action::Write; + break; + case 2: + action = Action::ReadWrite; + break; + default: + open->SignalError(IostatErrorInKeyword, "Invalid ACTION='%.*s'", + static_cast<int>(length), keyword); + return false; + } + RUNTIME_CHECK(io.GetIoErrorHandler(), action.has_value()); + if (open->wasExtant()) { + if ((*action != Action::Write) != open->unit().mayRead() || + (*action != Action::Read) != open->unit().mayWrite()) { + open->SignalError("ACTION= may not be changed on an open unit"); + } + } + open->set_action(*action); + return true; +} + +bool IODEF(SetAsynchronous)( + Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + bool isYes{YesOrNo(keyword, length, "ASYNCHRONOUS", handler)}; + if (auto *open{io.get_if<OpenStatementState>()}) { + if (open->completedOperation()) { + handler.Crash( + "SetAsynchronous() called after GetNewUnit() for an OPEN statement"); + } + open->unit().set_mayAsynchronous(isYes); + } else if (!isYes) { + // ASYNCHRONOUS='NO' is the default, so this is a no-op + } else if (auto *ext{io.get_if<ExternalIoStatementBase>()}) { + if (ext->unit().mayAsynchronous()) { + ext->SetAsynchronous(); + } else { + handler.SignalError(IostatBadAsynchronous); + } + } else if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + handler.Crash("SetAsynchronous('YES') called when not in an OPEN or " + "external I/O statement"); + } + return !handler.InError(); +} + +bool IODEF(SetCarriagecontrol)( + Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetCarriageControl() called when not in an OPEN statement"); + } + return false; + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetCarriageControl() called after GetNewUnit() for an OPEN statement"); + } + static const char *keywords[]{"LIST", "FORTRAN", "NONE", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + return true; + case 1: + case 2: + open->SignalError(IostatErrorInKeyword, + "Unimplemented CARRIAGECONTROL='%.*s'", static_cast<int>(length), + keyword); + return false; + default: + open->SignalError(IostatErrorInKeyword, "Invalid CARRIAGECONTROL='%.*s'", + static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetConvert)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetConvert() called when not in an OPEN statement"); + } + return false; + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetConvert() called after GetNewUnit() for an OPEN statement"); + } + if (auto convert{GetConvertFromString(keyword, length)}) { + open->set_convert(*convert); + return true; + } else { + open->SignalError(IostatErrorInKeyword, "Invalid CONVERT='%.*s'", + static_cast<int>(length), keyword); + return false; + } +} + +bool IODEF(SetEncoding)( + Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetEncoding() called when not in an OPEN statement"); + } + return false; + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetEncoding() called after GetNewUnit() for an OPEN statement"); + } + // Allow the encoding to be changed on an open unit -- it's + // useful and safe. + static const char *keywords[]{"UTF-8", "DEFAULT", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + open->unit().isUTF8 = true; + break; + case 1: + open->unit().isUTF8 = false; + break; + default: + open->SignalError(IostatErrorInKeyword, "Invalid ENCODING='%.*s'", + static_cast<int>(length), keyword); + } + return true; +} + +bool IODEF(SetForm)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetForm() called when not in an OPEN statement"); + } + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetForm() called after GetNewUnit() for an OPEN statement"); + } + static const char *keywords[]{"FORMATTED", "UNFORMATTED", "BINARY", nullptr}; + switch (IdentifyValue(keyword, length, keywords)) { + case 0: + open->set_isUnformatted(false); + break; + case 1: + open->set_isUnformatted(true); + break; + case 2: // legacy FORM='BINARY' means an unformatted stream + open->set_isUnformatted(true); + open->set_access(Access::Stream); + break; + default: + open->SignalError(IostatErrorInKeyword, "Invalid FORM='%.*s'", + static_cast<int>(length), keyword); + } + return true; +} + +bool IODEF(SetPosition)( + Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetPosition() called when not in an OPEN statement"); + } + return false; + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetPosition() called after GetNewUnit() for an OPEN statement"); + } + static const char *positions[]{"ASIS", "REWIND", "APPEND", nullptr}; + switch (IdentifyValue(keyword, length, positions)) { + case 0: + open->set_position(Position::AsIs); + return true; + case 1: + open->set_position(Position::Rewind); + return true; + case 2: + open->set_position(Position::Append); + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid POSITION='%.*s'", static_cast<int>(length), keyword); + } + return true; +} + +bool IODEF(SetRecl)(Cookie cookie, std::size_t n) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetRecl() called when not in an OPEN statement"); + } + return false; + } else if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetRecl() called after GetNewUnit() for an OPEN statement"); + } + if (static_cast<std::int64_t>(n) <= 0) { + io.GetIoErrorHandler().SignalError("RECL= must be greater than zero"); + return false; + } else if (open->wasExtant() && + open->unit().openRecl.value_or(0) != static_cast<std::int64_t>(n)) { + open->SignalError("RECL= may not be changed for an open unit"); + return false; + } else { + open->unit().openRecl = n; + return true; + } +} + +bool IODEF(SetStatus)(Cookie cookie, const char *keyword, std::size_t length) { + IoStatementState &io{*cookie}; + if (auto *open{io.get_if<OpenStatementState>()}) { + if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetStatus() called after GetNewUnit() for an OPEN statement"); + } + static const char *statuses[]{ + "OLD", "NEW", "SCRATCH", "REPLACE", "UNKNOWN", nullptr}; + switch (IdentifyValue(keyword, length, statuses)) { + case 0: + open->set_status(OpenStatus::Old); + return true; + case 1: + open->set_status(OpenStatus::New); + return true; + case 2: + open->set_status(OpenStatus::Scratch); + return true; + case 3: + open->set_status(OpenStatus::Replace); + return true; + case 4: + open->set_status(OpenStatus::Unknown); + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid STATUS='%.*s'", static_cast<int>(length), keyword); + } + return false; + } + if (auto *close{io.get_if<CloseStatementState>()}) { + static const char *statuses[]{"KEEP", "DELETE", nullptr}; + switch (IdentifyValue(keyword, length, statuses)) { + case 0: + close->set_status(CloseStatus::Keep); + return true; + case 1: + close->set_status(CloseStatus::Delete); + return true; + default: + io.GetIoErrorHandler().SignalError(IostatErrorInKeyword, + "Invalid STATUS='%.*s'", static_cast<int>(length), keyword); + } + return false; + } + if (io.get_if<NoopStatementState>() || + io.get_if<ErroneousIoStatementState>()) { + return true; // don't bother validating STATUS= in a no-op CLOSE + } + io.GetIoErrorHandler().Crash( + "SetStatus() called when not in an OPEN or CLOSE statement"); +} + +bool IODEF(SetFile)(Cookie cookie, const char *path, std::size_t chars) { + IoStatementState &io{*cookie}; + if (auto *open{io.get_if<OpenStatementState>()}) { + if (open->completedOperation()) { + io.GetIoErrorHandler().Crash( + "SetFile() called after GetNewUnit() for an OPEN statement"); + } + open->set_path(path, chars); + return true; + } else if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "SetFile() called when not in an OPEN statement"); + } + return false; +} + +bool IODEF(GetNewUnit)(Cookie cookie, int &unit, int kind) { + IoStatementState &io{*cookie}; + auto *open{io.get_if<OpenStatementState>()}; + if (!open) { + if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + io.GetIoErrorHandler().Crash( + "GetNewUnit() called when not in an OPEN statement"); + } + return false; + } else if (!open->InError()) { + open->CompleteOperation(); + } + if (open->InError()) { + // A failed OPEN(NEWUNIT=n) does not modify 'n' + return false; + } + std::int64_t result{open->unit().unitNumber()}; + if (!SetInteger(unit, kind, result)) { + open->SignalError("GetNewUnit(): bad INTEGER kind(%d) or out-of-range " + "value(%jd) for result", + kind, static_cast<std::intmax_t>(result)); + } + return true; +} + +// Data transfers + +bool IODEF(OutputDescriptor)(Cookie cookie, const Descriptor &descriptor) { + return descr::DescriptorIO<Direction::Output>(*cookie, descriptor); +} + +bool IODEF(InputDescriptor)(Cookie cookie, const Descriptor &descriptor) { + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor); +} + +bool IODEF(InputInteger)(Cookie cookie, std::int64_t &n, int kind) { + IoStatementState &io{*cookie}; + if (io.BeginReadingRecord()) { + if (auto edit{io.GetNextDataEdit()}) { + return edit->descriptor == DataEdit::ListDirectedNullValue || + EditIntegerInput(io, *edit, reinterpret_cast<void *>(&n), kind, + /*isSigned=*/true); + } + } + return false; +} + +bool IODEF(InputReal32)(Cookie cookie, float &x) { + if (!cookie->CheckFormattedStmtType<Direction::Input>("InputReal32")) { + return false; + } + StaticDescriptor<0> staticDescriptor; + Descriptor &descriptor{staticDescriptor.descriptor()}; + descriptor.Establish(TypeCategory::Real, 4, reinterpret_cast<void *>(&x), 0); + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor); +} + +bool IODEF(InputReal64)(Cookie cookie, double &x) { + if (!cookie->CheckFormattedStmtType<Direction::Input>("InputReal64")) { + return false; + } + StaticDescriptor<0> staticDescriptor; + Descriptor &descriptor{staticDescriptor.descriptor()}; + descriptor.Establish(TypeCategory::Real, 8, reinterpret_cast<void *>(&x), 0); + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor); +} + +bool IODEF(InputComplex32)(Cookie cookie, float z[2]) { + if (!cookie->CheckFormattedStmtType<Direction::Input>("InputComplex32")) { + return false; + } + StaticDescriptor<0> staticDescriptor; + Descriptor &descriptor{staticDescriptor.descriptor()}; + descriptor.Establish( + TypeCategory::Complex, 4, reinterpret_cast<void *>(z), 0); + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor); +} + +bool IODEF(InputComplex64)(Cookie cookie, double z[2]) { + if (!cookie->CheckFormattedStmtType<Direction::Input>("InputComplex64")) { + return false; + } + StaticDescriptor<0> staticDescriptor; + Descriptor &descriptor{staticDescriptor.descriptor()}; + descriptor.Establish( + TypeCategory::Complex, 8, reinterpret_cast<void *>(z), 0); + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor); +} + +bool IODEF(OutputCharacter)( + Cookie cookie, const char *x, std::size_t length, int kind) { + if (!cookie->CheckFormattedStmtType<Direction::Output>("OutputCharacter")) { + return false; + } + StaticDescriptor<0> staticDescriptor; + Descriptor &descriptor{staticDescriptor.descriptor()}; + descriptor.Establish( + kind, length, reinterpret_cast<void *>(const_cast<char *>(x)), 0); + return descr::DescriptorIO<Direction::Output>(*cookie, descriptor); +} + +bool IODEF(InputCharacter)( + Cookie cookie, char *x, std::size_t length, int kind) { + if (!cookie->CheckFormattedStmtType<Direction::Input>("InputCharacter")) { + return false; + } + StaticDescriptor<0> staticDescriptor; + Descriptor &descriptor{staticDescriptor.descriptor()}; + descriptor.Establish(kind, length, reinterpret_cast<void *>(x), 0); + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor); +} + +bool IODEF(InputAscii)(Cookie cookie, char *x, std::size_t length) { + return IONAME(InputCharacter)(cookie, x, length, 1); +} + +bool IODEF(InputLogical)(Cookie cookie, bool &truth) { + if (!cookie->CheckFormattedStmtType<Direction::Input>("InputLogical")) { + return false; + } + StaticDescriptor<0> staticDescriptor; + Descriptor &descriptor{staticDescriptor.descriptor()}; + descriptor.Establish( + TypeCategory::Logical, sizeof truth, reinterpret_cast<void *>(&truth), 0); + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor); +} + +bool IODEF(OutputDerivedType)(Cookie cookie, const Descriptor &descriptor, + const NonTbpDefinedIoTable *table) { + return descr::DescriptorIO<Direction::Output>(*cookie, descriptor, table); +} + +bool IODEF(InputDerivedType)(Cookie cookie, const Descriptor &descriptor, + const NonTbpDefinedIoTable *table) { + return descr::DescriptorIO<Direction::Input>(*cookie, descriptor, table); +} + +std::size_t IODEF(GetSize)(Cookie cookie) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + if (!handler.InError()) { + io.CompleteOperation(); + } + if (const auto *formatted{ + io.get_if<FormattedIoStatementState<Direction::Input>>()}) { + return formatted->GetEditDescriptorChars(); + } else if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + handler.Crash("GetIoSize() called for an I/O statement that is not a " + "formatted READ()"); + } + return 0; +} + +std::size_t IODEF(GetIoLength)(Cookie cookie) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + if (!handler.InError()) { + io.CompleteOperation(); + } + if (const auto *inq{io.get_if<InquireIOLengthState>()}) { + return inq->bytes(); + } else if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + handler.Crash("GetIoLength() called for an I/O statement that is not " + "INQUIRE(IOLENGTH=)"); + } + return 0; +} + +void IODEF(GetIoMsg)(Cookie cookie, char *msg, std::size_t length) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + if (!handler.InError()) { + io.CompleteOperation(); + } + if (handler.InError()) { // leave "msg" alone when no error + handler.GetIoMsg(msg, length); + } +} + +AsynchronousId IODEF(GetAsynchronousId)(Cookie cookie) { + IoStatementState &io{*cookie}; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + if (auto *ext{io.get_if<ExternalIoStatementBase>()}) { + return ext->asynchronousID(); + } else if (!io.get_if<NoopStatementState>() && + !io.get_if<ErroneousIoStatementState>()) { + handler.Crash( + "GetAsynchronousId() called when not in an external I/O statement"); + } + return 0; +} + +bool IODEF(InquireCharacter)(Cookie cookie, InquiryKeywordHash inquiry, + char *result, std::size_t length) { + IoStatementState &io{*cookie}; + return io.Inquire(inquiry, result, length); +} + +bool IODEF(InquireLogical)( + Cookie cookie, InquiryKeywordHash inquiry, bool &result) { + IoStatementState &io{*cookie}; + return io.Inquire(inquiry, result); +} + +bool IODEF(InquirePendingId)(Cookie cookie, AsynchronousId id, bool &result) { + IoStatementState &io{*cookie}; + return io.Inquire(HashInquiryKeyword("PENDING"), id, result); +} + +bool IODEF(InquireInteger64)( + Cookie cookie, InquiryKeywordHash inquiry, std::int64_t &result, int kind) { + IoStatementState &io{*cookie}; + std::int64_t n{0}; // safe "undefined" value + if (io.Inquire(inquiry, n)) { + if (SetInteger(result, kind, n)) { + return true; + } + io.GetIoErrorHandler().SignalError( + "InquireInteger64(): bad INTEGER kind(%d) or out-of-range " + "value(%jd) for result", + kind, static_cast<std::intmax_t>(n)); + } + return false; +} + +template <typename INT> +static RT_API_ATTRS enum Iostat CheckUnitNumberInRangeImpl(INT unit, + bool handleError, char *ioMsg, std::size_t ioMsgLength, + const char *sourceFile, int sourceLine) { + static_assert(sizeof(INT) >= sizeof(ExternalUnit), + "only intended to be used when the INT to ExternalUnit conversion is " + "narrowing"); + if (unit != static_cast<ExternalUnit>(unit)) { + Terminator oom{sourceFile, sourceLine}; + IoErrorHandler errorHandler{oom}; + if (handleError) { + errorHandler.HasIoStat(); + if (ioMsg) { + errorHandler.HasIoMsg(); + } + } + // Only provide the bad unit number in the message if SignalError can print + // it accurately. Otherwise, the generic IostatUnitOverflow message will be + // used. + if constexpr (sizeof(INT) > sizeof(std::intmax_t)) { + errorHandler.SignalError(IostatUnitOverflow); + } else if (static_cast<std::intmax_t>(unit) == unit) { + errorHandler.SignalError(IostatUnitOverflow, + "UNIT number %jd is out of range", static_cast<std::intmax_t>(unit)); + } else { + errorHandler.SignalError(IostatUnitOverflow); + } + if (ioMsg) { + errorHandler.GetIoMsg(ioMsg, ioMsgLength); + } + return static_cast<enum Iostat>(errorHandler.GetIoStat()); + } + return IostatOk; +} + +enum Iostat IODEF(CheckUnitNumberInRange64)(std::int64_t unit, bool handleError, + char *ioMsg, std::size_t ioMsgLength, const char *sourceFile, + int sourceLine) { + return CheckUnitNumberInRangeImpl( + unit, handleError, ioMsg, ioMsgLength, sourceFile, sourceLine); +} + +#ifdef __SIZEOF_INT128__ +enum Iostat IODEF(CheckUnitNumberInRange128)(common::int128_t unit, + bool handleError, char *ioMsg, std::size_t ioMsgLength, + const char *sourceFile, int sourceLine) { + return CheckUnitNumberInRangeImpl( + unit, handleError, ioMsg, ioMsgLength, sourceFile, sourceLine); +} +#endif + +RT_EXT_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-error.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-error.cpp new file mode 100644 index 00000000000..b350fb66fc2 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-error.cpp @@ -0,0 +1,165 @@ +//===-- lib/runtime/io-error.cpp --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/io-error.h" +#include "config.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Runtime/magic-numbers.h" +#include <cerrno> +#include <cstdarg> +#include <cstdio> +#include <cstring> + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +void IoErrorHandler::SignalError(int iostatOrErrno, const char *msg, ...) { + // Note that IOMSG= alone without IOSTAT=/END=/EOR=/ERR= does not suffice + // for error recovery (see F'2018 subclause 12.11). + switch (iostatOrErrno) { + case IostatOk: + return; + case IostatEnd: + if ((flags_ & (hasIoStat | hasEnd)) || + ((flags_ & hasErr) && (flags_ & hasRec))) { + // EOF goes to ERR= when REC= is present + if (ioStat_ == IostatOk || ioStat_ < IostatEnd) { + ioStat_ = IostatEnd; + } + return; + } + break; + case IostatEor: + if (flags_ & (hasIoStat | hasEor)) { + if (ioStat_ == IostatOk || ioStat_ < IostatEor) { + ioStat_ = IostatEor; // least priority + } + return; + } + break; + default: + if (flags_ & (hasIoStat | hasErr)) { + if (ioStat_ <= 0) { + ioStat_ = iostatOrErrno; // priority over END=/EOR= + if (msg && (flags_ & hasIoMsg)) { +#if !defined(RT_DEVICE_COMPILATION) + char buffer[256]; + va_list ap; + va_start(ap, msg); + std::vsnprintf(buffer, sizeof buffer, msg, ap); + va_end(ap); +#else + const char *buffer = "not implemented yet: IOSTAT with varargs"; +#endif + ioMsg_ = SaveDefaultCharacter( + buffer, Fortran::runtime::strlen(buffer) + 1, *this); + } + } + return; + } + break; + } + // I/O error not caught! + if (msg) { +#if !defined(RT_DEVICE_COMPILATION) + va_list ap; + va_start(ap, msg); + CrashArgs(msg, ap); + va_end(ap); +#else + Crash("not implemented yet: IOSTAT with varargs"); +#endif + } else if (const char *errstr{IostatErrorString(iostatOrErrno)}) { + Crash(errstr); + } else { +#if !defined(RT_DEVICE_COMPILATION) + Crash("I/O error (errno=%d): %s", iostatOrErrno, + std::strerror(iostatOrErrno)); +#else + Crash("I/O error (errno=%d)", iostatOrErrno); +#endif + } +} + +void IoErrorHandler::SignalError(int iostatOrErrno) { + SignalError(iostatOrErrno, nullptr); +} + +void IoErrorHandler::Forward( + int ioStatOrErrno, const char *msg, std::size_t length) { + if (ioStatOrErrno != IostatOk) { + if (msg) { + SignalError(ioStatOrErrno, "%.*s", static_cast<int>(length), msg); + } else { + SignalError(ioStatOrErrno); + } + } +} + +void IoErrorHandler::SignalEnd() { SignalError(IostatEnd); } + +void IoErrorHandler::SignalEor() { SignalError(IostatEor); } + +void IoErrorHandler::SignalPendingError() { + int error{pendingError_}; + pendingError_ = IostatOk; + SignalError(error); +} + +void IoErrorHandler::SignalErrno() { SignalError(errno); } + +bool IoErrorHandler::GetIoMsg(char *buffer, std::size_t bufferLength) { + const char *msg{ioMsg_.get()}; + if (!msg) { + msg = IostatErrorString(ioStat_ == IostatOk ? pendingError_ : ioStat_); + } + if (msg) { + ToFortranDefaultCharacter(buffer, bufferLength, msg); + return true; + } + + // Following code is taken from llvm/lib/Support/Errno.cpp + // in LLVM v9.0.1 with inadequate modification for Fortran, + // since rectified. + bool ok{false}; +#if defined(RT_DEVICE_COMPILATION) + // strerror_r is not available on device. + msg = "errno description is not available on device"; +#elif HAVE_STRERROR_R + // strerror_r is thread-safe. +#if defined(__GLIBC__) && defined(_GNU_SOURCE) + // glibc defines its own incompatible version of strerror_r + // which may not use the buffer supplied. + msg = ::strerror_r(ioStat_, buffer, bufferLength); +#else + ok = ::strerror_r(ioStat_, buffer, bufferLength) == 0; +#endif +#elif HAVE_DECL_STRERROR_S // "Windows Secure API" + ok = ::strerror_s(buffer, bufferLength, ioStat_) == 0; +#else + // Copy the thread un-safe result of strerror into + // the buffer as fast as possible to minimize impact + // of collision of strerror in multiple threads. + msg = strerror(ioStat_); +#endif + if (msg) { + ToFortranDefaultCharacter(buffer, bufferLength, msg); + return true; + } else if (ok) { + std::size_t copied{Fortran::runtime::strlen(buffer)}; + if (copied < bufferLength) { + std::memset(buffer + copied, ' ', bufferLength - copied); + } + return true; + } else { + return false; + } +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-stmt.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-stmt.cpp new file mode 100644 index 00000000000..8056c8db852 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/io-stmt.cpp @@ -0,0 +1,1618 @@ +//===-- lib/runtime/io-stmt.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/io-stmt.h" +#include "unit.h" +#include "flang-rt/runtime/connection.h" +#include "flang-rt/runtime/emit-encoded.h" +#include "flang-rt/runtime/format.h" +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/utf.h" +#include <algorithm> +#include <cstdio> +#include <cstring> +#include <limits> +#include <type_traits> + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +bool IoStatementBase::Emit(const char *, std::size_t, std::size_t) { + return false; +} + +std::size_t IoStatementBase::GetNextInputBytes(const char *&p) { + p = nullptr; + return 0; +} + +std::size_t IoStatementBase::ViewBytesInRecord( + const char *&p, bool forward) const { + p = nullptr; + return 0; +} + +bool IoStatementBase::AdvanceRecord(int) { return false; } + +void IoStatementBase::BackspaceRecord() {} + +bool IoStatementBase::Receive(char *, std::size_t, std::size_t) { + return false; +} + +Fortran::common::optional<DataEdit> IoStatementBase::GetNextDataEdit( + IoStatementState &, int) { + return Fortran::common::nullopt; +} + +bool IoStatementBase::BeginReadingRecord() { return true; } + +void IoStatementBase::FinishReadingRecord() {} + +void IoStatementBase::HandleAbsolutePosition(std::int64_t) {} + +void IoStatementBase::HandleRelativePosition(std::int64_t) {} + +std::int64_t IoStatementBase::InquirePos() { return 0; } + +ExternalFileUnit *IoStatementBase::GetExternalFileUnit() const { + return nullptr; +} + +bool IoStatementBase::Inquire(InquiryKeywordHash, char *, std::size_t) { + return false; +} + +bool IoStatementBase::Inquire(InquiryKeywordHash, bool &) { return false; } + +bool IoStatementBase::Inquire(InquiryKeywordHash, std::int64_t, bool &) { + return false; +} + +bool IoStatementBase::Inquire(InquiryKeywordHash, std::int64_t &) { + return false; +} + +RT_API_ATTRS static const char *InquiryKeywordHashDecode( + char *buffer, std::size_t n, InquiryKeywordHash hash) { + if (n < 1) { + return nullptr; + } + char *p{buffer + n}; + *--p = '\0'; + while (hash > 1) { + if (p < buffer) { + return nullptr; + } + *--p = 'A' + (hash % 26); + hash /= 26; + } + return hash == 1 ? p : nullptr; +} + +void IoStatementBase::BadInquiryKeywordHashCrash(InquiryKeywordHash inquiry) { + char buffer[16]; + const char *decode{InquiryKeywordHashDecode(buffer, sizeof buffer, inquiry)}; + Crash("Bad InquiryKeywordHash 0x%x (%s)", inquiry, + decode ? decode : "(cannot decode)"); +} + +template <Direction DIR> +InternalIoStatementState<DIR>::InternalIoStatementState( + Buffer scalar, std::size_t length, const char *sourceFile, int sourceLine) + : IoStatementBase{sourceFile, sourceLine}, unit_{scalar, length, 1} {} + +template <Direction DIR> +InternalIoStatementState<DIR>::InternalIoStatementState( + const Descriptor &d, const char *sourceFile, int sourceLine) + : IoStatementBase{sourceFile, sourceLine}, unit_{d, *this} {} + +template <Direction DIR> +bool InternalIoStatementState<DIR>::Emit( + const char *data, std::size_t bytes, std::size_t /*elementBytes*/) { + if constexpr (DIR == Direction::Input) { + Crash("InternalIoStatementState<Direction::Input>::Emit() called"); + return false; + } + return unit_.Emit(data, bytes, *this); +} + +template <Direction DIR> +std::size_t InternalIoStatementState<DIR>::GetNextInputBytes(const char *&p) { + return unit_.GetNextInputBytes(p, *this); +} + +// InternalIoStatementState<DIR>::ViewBytesInRecord() not needed or defined + +template <Direction DIR> +bool InternalIoStatementState<DIR>::AdvanceRecord(int n) { + while (n-- > 0) { + if (!unit_.AdvanceRecord(*this)) { + return false; + } + } + return true; +} + +template <Direction DIR> void InternalIoStatementState<DIR>::BackspaceRecord() { + unit_.BackspaceRecord(*this); +} + +template <Direction DIR> int InternalIoStatementState<DIR>::EndIoStatement() { + auto result{IoStatementBase::EndIoStatement()}; + if (free_) { + FreeMemory(this); + } + return result; +} + +template <Direction DIR> +void InternalIoStatementState<DIR>::HandleAbsolutePosition(std::int64_t n) { + return unit_.HandleAbsolutePosition(n); +} + +template <Direction DIR> +void InternalIoStatementState<DIR>::HandleRelativePosition(std::int64_t n) { + return unit_.HandleRelativePosition(n); +} + +template <Direction DIR> +std::int64_t InternalIoStatementState<DIR>::InquirePos() { + return unit_.InquirePos(); +} + +template <Direction DIR, typename CHAR> +RT_API_ATTRS +InternalFormattedIoStatementState<DIR, CHAR>::InternalFormattedIoStatementState( + Buffer buffer, std::size_t length, const CharType *format, + std::size_t formatLength, const Descriptor *formatDescriptor, + const char *sourceFile, int sourceLine) + : InternalIoStatementState<DIR>{buffer, length, sourceFile, sourceLine}, + ioStatementState_{*this}, + format_{*this, format, formatLength, formatDescriptor} {} + +template <Direction DIR, typename CHAR> +RT_API_ATTRS +InternalFormattedIoStatementState<DIR, CHAR>::InternalFormattedIoStatementState( + const Descriptor &d, const CharType *format, std::size_t formatLength, + const Descriptor *formatDescriptor, const char *sourceFile, int sourceLine) + : InternalIoStatementState<DIR>{d, sourceFile, sourceLine}, + ioStatementState_{*this}, + format_{*this, format, formatLength, formatDescriptor} {} + +template <Direction DIR, typename CHAR> +void InternalFormattedIoStatementState<DIR, CHAR>::CompleteOperation() { + if (!this->completedOperation()) { + if constexpr (DIR == Direction::Output) { + format_.Finish(*this); + unit_.AdvanceRecord(*this); + } + IoStatementBase::CompleteOperation(); + } +} + +template <Direction DIR, typename CHAR> +int InternalFormattedIoStatementState<DIR, CHAR>::EndIoStatement() { + CompleteOperation(); + return InternalIoStatementState<DIR>::EndIoStatement(); +} + +template <Direction DIR> +InternalListIoStatementState<DIR>::InternalListIoStatementState( + Buffer buffer, std::size_t length, const char *sourceFile, int sourceLine) + : InternalIoStatementState<DIR>{buffer, length, sourceFile, sourceLine}, + ioStatementState_{*this} {} + +template <Direction DIR> +InternalListIoStatementState<DIR>::InternalListIoStatementState( + const Descriptor &d, const char *sourceFile, int sourceLine) + : InternalIoStatementState<DIR>{d, sourceFile, sourceLine}, + ioStatementState_{*this} {} + +template <Direction DIR> +void InternalListIoStatementState<DIR>::CompleteOperation() { + if (!this->completedOperation()) { + if constexpr (DIR == Direction::Output) { + if (unit_.furthestPositionInRecord > 0) { + unit_.AdvanceRecord(*this); + } + } + IoStatementBase::CompleteOperation(); + } +} + +template <Direction DIR> +int InternalListIoStatementState<DIR>::EndIoStatement() { + CompleteOperation(); + if constexpr (DIR == Direction::Input) { + if (int status{ListDirectedStatementState<DIR>::EndIoStatement()}; + status != IostatOk) { + return status; + } + } + return InternalIoStatementState<DIR>::EndIoStatement(); +} + +ExternalIoStatementBase::ExternalIoStatementBase( + ExternalFileUnit &unit, const char *sourceFile, int sourceLine) + : IoStatementBase{sourceFile, sourceLine}, unit_{unit} {} + +MutableModes &ExternalIoStatementBase::mutableModes() { + if (const ChildIo * child{unit_.GetChildIo()}) { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child->parent().mutableModes(); +#else + ReportUnsupportedChildIo(); +#endif + } + return unit_.modes; +} + +ConnectionState &ExternalIoStatementBase::GetConnectionState() { return unit_; } + +int ExternalIoStatementBase::EndIoStatement() { + CompleteOperation(); + auto result{IoStatementBase::EndIoStatement()}; +#if !defined(RT_USE_PSEUDO_FILE_UNIT) + auto unitNumber{unit_.unitNumber()}; + unit_.EndIoStatement(); // annihilates *this in unit_.u_ + if (destroy_) { + if (ExternalFileUnit * + toClose{ExternalFileUnit::LookUpForClose(unitNumber)}) { + toClose->Close(CloseStatus::Delete, *this); + toClose->DestroyClosed(); + } + } +#else + // Fetch the unit pointer before *this disappears. + ExternalFileUnit *unitPtr{&unit_}; + // The pseudo file units are dynamically allocated + // and are not tracked in the unit map. + // They have to be destructed and deallocated here. + unitPtr->~ExternalFileUnit(); + FreeMemory(unitPtr); +#endif + return result; +} + +void ExternalIoStatementBase::SetAsynchronous() { + asynchronousID_ = unit().GetAsynchronousId(*this); +} + +std::int64_t ExternalIoStatementBase::InquirePos() { + return unit_.InquirePos(); +} + +void OpenStatementState::set_path(const char *path, std::size_t length) { + pathLength_ = TrimTrailingSpaces(path, length); + path_ = SaveDefaultCharacter(path, pathLength_, *this); +} + +void OpenStatementState::CompleteOperation() { + if (completedOperation()) { + return; + } + if (position_) { + if (access_ && *access_ == Access::Direct) { + SignalError("POSITION= may not be set with ACCESS='DIRECT'"); + position_.reset(); + } + } + if (status_) { // 12.5.6.10 + if ((*status_ == OpenStatus::New || *status_ == OpenStatus::Replace) && + !path_.get()) { + SignalError("FILE= required on OPEN with STATUS='NEW' or 'REPLACE'"); + } else if (*status_ == OpenStatus::Scratch && path_.get()) { + SignalError("FILE= may not appear on OPEN with STATUS='SCRATCH'"); + } + } + // F'2023 12.5.6.13 - NEWUNIT= requires either FILE= or STATUS='SCRATCH' + if (isNewUnit_ && !path_.get() && + status_.value_or(OpenStatus::Unknown) != OpenStatus::Scratch) { + SignalError(IostatBadNewUnit); + status_ = OpenStatus::Scratch; // error recovery + } + if (path_.get() || wasExtant_ || + (status_ && *status_ == OpenStatus::Scratch)) { + if (unit().OpenUnit(status_, action_, position_.value_or(Position::AsIs), + std::move(path_), pathLength_, convert_, *this)) { + wasExtant_ = false; // existing unit was closed + } + } else { + unit().OpenAnonymousUnit( + status_, action_, position_.value_or(Position::AsIs), convert_, *this); + } + if (access_) { + if (*access_ != unit().access) { + if (wasExtant_) { + SignalError("ACCESS= may not be changed on an open unit"); + access_.reset(); + } + } + if (access_) { + unit().access = *access_; + } + } + if (!unit().isUnformatted) { + unit().isUnformatted = isUnformatted_; + } + if (isUnformatted_ && *isUnformatted_ != *unit().isUnformatted) { + if (wasExtant_) { + SignalError("FORM= may not be changed on an open unit"); + } + unit().isUnformatted = *isUnformatted_; + } + if (!unit().isUnformatted) { + // Set default format (C.7.4 point 2). + unit().isUnformatted = unit().access != Access::Sequential; + } + if (!wasExtant_ && InError()) { + // Release the new unit on failure + set_destroy(); + } + IoStatementBase::CompleteOperation(); +} + +int OpenStatementState::EndIoStatement() { + CompleteOperation(); + return ExternalIoStatementBase::EndIoStatement(); +} + +int CloseStatementState::EndIoStatement() { + CompleteOperation(); + int result{ExternalIoStatementBase::EndIoStatement()}; + unit().CloseUnit(status_, *this); + unit().DestroyClosed(); + return result; +} + +void NoUnitIoStatementState::CompleteOperation() { + SignalPendingError(); + IoStatementBase::CompleteOperation(); +} + +int NoUnitIoStatementState::EndIoStatement() { + CompleteOperation(); + auto result{IoStatementBase::EndIoStatement()}; + FreeMemory(this); + return result; +} + +template <Direction DIR> +ExternalIoStatementState<DIR>::ExternalIoStatementState( + ExternalFileUnit &unit, const char *sourceFile, int sourceLine) + : ExternalIoStatementBase{unit, sourceFile, sourceLine}, mutableModes_{ + unit.modes} { + if constexpr (DIR == Direction::Output) { + // If the last statement was a non-advancing IO input statement, the unit + // furthestPositionInRecord was not advanced, but the positionInRecord may + // have been advanced. Advance furthestPositionInRecord here to avoid + // overwriting the part of the record that has been read with blanks. + unit.furthestPositionInRecord = + std::max(unit.furthestPositionInRecord, unit.positionInRecord); + } +} + +template <Direction DIR> +void ExternalIoStatementState<DIR>::CompleteOperation() { + if (completedOperation()) { + return; + } + if constexpr (DIR == Direction::Input) { + BeginReadingRecord(); // in case there were no I/O items + if (mutableModes().nonAdvancing && !InError()) { + unit().leftTabLimit = unit().furthestPositionInRecord; + } else { + FinishReadingRecord(); + } + } else { // output + if (mutableModes().nonAdvancing) { + // Make effects of positioning past the last Emit() visible with blanks. + if (unit().positionInRecord > unit().furthestPositionInRecord) { + unit().Emit("", 0, 1, *this); // Emit() will pad + } + unit().leftTabLimit = unit().positionInRecord; + } else { + unit().AdvanceRecord(*this); + } + unit().FlushIfTerminal(*this); + } + return IoStatementBase::CompleteOperation(); +} + +template <Direction DIR> int ExternalIoStatementState<DIR>::EndIoStatement() { + CompleteOperation(); + return ExternalIoStatementBase::EndIoStatement(); +} + +template <Direction DIR> +bool ExternalIoStatementState<DIR>::Emit( + const char *data, std::size_t bytes, std::size_t elementBytes) { + if constexpr (DIR == Direction::Input) { + Crash("ExternalIoStatementState::Emit(char) called for input statement"); + } + return unit().Emit(data, bytes, elementBytes, *this); +} + +template <Direction DIR> +std::size_t ExternalIoStatementState<DIR>::GetNextInputBytes(const char *&p) { + return unit().GetNextInputBytes(p, *this); +} + +template <Direction DIR> +std::size_t ExternalIoStatementState<DIR>::ViewBytesInRecord( + const char *&p, bool forward) const { + return unit().ViewBytesInRecord(p, forward); +} + +template <Direction DIR> +bool ExternalIoStatementState<DIR>::AdvanceRecord(int n) { + while (n-- > 0) { + if (!unit().AdvanceRecord(*this)) { + return false; + } + } + return true; +} + +template <Direction DIR> void ExternalIoStatementState<DIR>::BackspaceRecord() { + unit().BackspaceRecord(*this); +} + +template <Direction DIR> +void ExternalIoStatementState<DIR>::HandleAbsolutePosition(std::int64_t n) { + return unit().HandleAbsolutePosition(n); +} + +template <Direction DIR> +void ExternalIoStatementState<DIR>::HandleRelativePosition(std::int64_t n) { + return unit().HandleRelativePosition(n); +} + +template <Direction DIR> +bool ExternalIoStatementState<DIR>::BeginReadingRecord() { + if constexpr (DIR == Direction::Input) { + return unit().BeginReadingRecord(*this); + } else { + Crash("ExternalIoStatementState<Direction::Output>::BeginReadingRecord() " + "called"); + return false; + } +} + +template <Direction DIR> +void ExternalIoStatementState<DIR>::FinishReadingRecord() { + if constexpr (DIR == Direction::Input) { + unit().FinishReadingRecord(*this); + } else { + Crash("ExternalIoStatementState<Direction::Output>::FinishReadingRecord() " + "called"); + } +} + +template <Direction DIR, typename CHAR> +ExternalFormattedIoStatementState<DIR, CHAR>::ExternalFormattedIoStatementState( + ExternalFileUnit &unit, const CHAR *format, std::size_t formatLength, + const Descriptor *formatDescriptor, const char *sourceFile, int sourceLine) + : ExternalIoStatementState<DIR>{unit, sourceFile, sourceLine}, + format_{*this, format, formatLength, formatDescriptor} {} + +template <Direction DIR, typename CHAR> +void ExternalFormattedIoStatementState<DIR, CHAR>::CompleteOperation() { + if (this->completedOperation()) { + return; + } + if constexpr (DIR == Direction::Input) { + this->BeginReadingRecord(); // in case there were no I/O items + } + format_.Finish(*this); + return ExternalIoStatementState<DIR>::CompleteOperation(); +} + +template <Direction DIR, typename CHAR> +int ExternalFormattedIoStatementState<DIR, CHAR>::EndIoStatement() { + CompleteOperation(); + return ExternalIoStatementState<DIR>::EndIoStatement(); +} + +Fortran::common::optional<DataEdit> IoStatementState::GetNextDataEdit(int n) { + return common::visit( + [&](auto &x) { return x.get().GetNextDataEdit(*this, n); }, u_); +} + +bool IoStatementState::Emit( + const char *data, std::size_t bytes, std::size_t elementBytes) { + return common::visit( + [=](auto &x) { return x.get().Emit(data, bytes, elementBytes); }, u_); +} + +bool IoStatementState::Receive( + char *data, std::size_t n, std::size_t elementBytes) { + return common::visit( + [=](auto &x) { return x.get().Receive(data, n, elementBytes); }, u_); +} + +std::size_t IoStatementState::GetNextInputBytes(const char *&p) { + return common::visit( + [&](auto &x) { return x.get().GetNextInputBytes(p); }, u_); +} + +bool IoStatementState::AdvanceRecord(int n) { + return common::visit([=](auto &x) { return x.get().AdvanceRecord(n); }, u_); +} + +void IoStatementState::BackspaceRecord() { + common::visit([](auto &x) { x.get().BackspaceRecord(); }, u_); +} + +void IoStatementState::HandleRelativePosition(std::int64_t n) { + common::visit([=](auto &x) { x.get().HandleRelativePosition(n); }, u_); +} + +void IoStatementState::HandleAbsolutePosition(std::int64_t n) { + common::visit([=](auto &x) { x.get().HandleAbsolutePosition(n); }, u_); +} + +void IoStatementState::CompleteOperation() { + common::visit([](auto &x) { x.get().CompleteOperation(); }, u_); +} + +int IoStatementState::EndIoStatement() { + return common::visit([](auto &x) { return x.get().EndIoStatement(); }, u_); +} + +ConnectionState &IoStatementState::GetConnectionState() { + return common::visit( + [](auto &x) -> ConnectionState & { return x.get().GetConnectionState(); }, + u_); +} + +MutableModes &IoStatementState::mutableModes() { + return common::visit( + [](auto &x) -> MutableModes & { return x.get().mutableModes(); }, u_); +} + +bool IoStatementState::BeginReadingRecord() { + return common::visit( + [](auto &x) { return x.get().BeginReadingRecord(); }, u_); +} + +IoErrorHandler &IoStatementState::GetIoErrorHandler() const { + return common::visit( + [](auto &x) -> IoErrorHandler & { + return static_cast<IoErrorHandler &>(x.get()); + }, + u_); +} + +ExternalFileUnit *IoStatementState::GetExternalFileUnit() const { + return common::visit( + [](auto &x) { return x.get().GetExternalFileUnit(); }, u_); +} + +Fortran::common::optional<char32_t> IoStatementState::GetCurrentCharSlow( + std::size_t &byteCount) { + const char *p{nullptr}; + std::size_t bytes{GetNextInputBytes(p)}; + if (bytes == 0) { + byteCount = 0; + return Fortran::common::nullopt; + } else { + const ConnectionState &connection{GetConnectionState()}; + if (connection.isUTF8) { + std::size_t length{MeasureUTF8Bytes(*p)}; + if (length <= bytes) { + if (auto result{DecodeUTF8(p)}) { + byteCount = length; + return result; + } + } + GetIoErrorHandler().SignalError(IostatUTF8Decoding); + // Error recovery: return the next byte + } else if (connection.internalIoCharKind > 1) { + byteCount = connection.internalIoCharKind; + if (byteCount == 2) { + return *reinterpret_cast<const char16_t *>(p); + } else { + return *reinterpret_cast<const char32_t *>(p); + } + } + byteCount = 1; + return *p; + } +} + +IoStatementState::FastAsciiField IoStatementState::GetUpcomingFastAsciiField() { + ConnectionState &connection{GetConnectionState()}; + if (!connection.isUTF8 && connection.internalIoCharKind <= 1) { + const char *p{nullptr}; + if (std::size_t bytes{GetNextInputBytes(p)}) { + return FastAsciiField(connection, p, bytes); + } + } + return FastAsciiField(connection); +} + +Fortran::common::optional<char32_t> IoStatementState::NextInField( + Fortran::common::optional<int> &remaining, const DataEdit &edit, + FastAsciiField *field) { + std::size_t byteCount{0}; + if (!remaining) { // Stream, list-directed, NAMELIST, &c. + if (auto next{GetCurrentChar(byteCount, field)}) { + if ((*next < '0' || *next == ';') && edit.width.value_or(0) == 0) { + // list-directed, NAMELIST, I0 &c., or width-free I/G: + // check for separator character + switch (*next) { + case ' ': + case '\t': + case '/': + case '(': + case ')': + case '\'': + case '"': + case '*': + case '\n': // for stream access + return Fortran::common::nullopt; + case '&': + case '$': + if (edit.IsNamelist()) { + return Fortran::common::nullopt; + } + break; + case ',': + if (!(edit.modes.editingFlags & decimalComma)) { + return Fortran::common::nullopt; + } + break; + case ';': + if (edit.modes.editingFlags & decimalComma) { + return Fortran::common::nullopt; + } + break; + default: + break; + } + } + if (field) { + field->Advance(1, byteCount); + } else { + HandleRelativePosition(byteCount); + GotChar(byteCount); + } + return next; + } + } else if (*remaining > 0) { + if (auto next{GetCurrentChar(byteCount, field)}) { + if (byteCount > static_cast<std::size_t>(*remaining)) { + return Fortran::common::nullopt; + } + *remaining -= byteCount; + if (field) { + field->Advance(1, byteCount); + } else { + HandleRelativePosition(byteCount); + GotChar(byteCount); + } + return next; + } + if (CheckForEndOfRecord(0, + field ? field->connection() : GetConnectionState())) { // do padding + --*remaining; + return Fortran::common::optional<char32_t>{' '}; + } + } + return Fortran::common::nullopt; +} + +bool IoStatementState::CheckForEndOfRecord( + std::size_t afterReading, const ConnectionState &connection) { + if (!connection.IsAtEOF()) { + if (auto length{connection.EffectiveRecordLength()}) { + if (connection.positionInRecord + + static_cast<std::int64_t>(afterReading) >= + *length) { + IoErrorHandler &handler{GetIoErrorHandler()}; + const auto &modes{mutableModes()}; + if (modes.nonAdvancing) { + if (connection.access == Access::Stream && + connection.unterminatedRecord) { + // Reading final unterminated record left by a + // non-advancing WRITE on a stream file prior to + // positioning or ENDFILE. + handler.SignalEnd(); + } else { + handler.SignalEor(); + } + } else if (!modes.pad) { + handler.SignalError(IostatRecordReadOverrun); + } + return modes.pad; // PAD='YES' + } + } + } + return false; +} + +bool IoStatementState::Inquire( + InquiryKeywordHash inquiry, char *out, std::size_t chars) { + return common::visit( + [&](auto &x) { return x.get().Inquire(inquiry, out, chars); }, u_); +} + +bool IoStatementState::Inquire(InquiryKeywordHash inquiry, bool &out) { + return common::visit( + [&](auto &x) { return x.get().Inquire(inquiry, out); }, u_); +} + +bool IoStatementState::Inquire( + InquiryKeywordHash inquiry, std::int64_t id, bool &out) { + return common::visit( + [&](auto &x) { return x.get().Inquire(inquiry, id, out); }, u_); +} + +bool IoStatementState::Inquire(InquiryKeywordHash inquiry, std::int64_t &n) { + return common::visit( + [&](auto &x) { return x.get().Inquire(inquiry, n); }, u_); +} + +std::int64_t IoStatementState::InquirePos() { + return common::visit([&](auto &x) { return x.get().InquirePos(); }, u_); +} + +void IoStatementState::GotChar(int n) { + if (auto *formattedIn{ + get_if<FormattedIoStatementState<Direction::Input>>()}) { + formattedIn->GotChar(n); + } else { + GetIoErrorHandler().Crash("IoStatementState::GotChar() called for " + "statement that is not formatted input"); + } +} + +std::size_t +FormattedIoStatementState<Direction::Input>::GetEditDescriptorChars() const { + return chars_; +} + +void FormattedIoStatementState<Direction::Input>::GotChar(int n) { + chars_ += n; +} + +bool ListDirectedStatementState<Direction::Output>::EmitLeadingSpaceOrAdvance( + IoStatementState &io, std::size_t length, bool isCharacter) { + const ConnectionState &connection{io.GetConnectionState()}; + int space{connection.positionInRecord == 0 || + !(isCharacter && lastWasUndelimitedCharacter())}; + set_lastWasUndelimitedCharacter(false); + if (connection.NeedAdvance(space + length)) { + return io.AdvanceRecord(); + } + if (space) { + return EmitAscii(io, " ", 1); + } + return true; +} + +Fortran::common::optional<DataEdit> +ListDirectedStatementState<Direction::Output>::GetNextDataEdit( + IoStatementState &io, int maxRepeat) { + DataEdit edit; + edit.descriptor = DataEdit::ListDirected; + edit.repeat = maxRepeat; + edit.modes = io.mutableModes(); + return edit; +} + +int ListDirectedStatementState<Direction::Input>::EndIoStatement() { + if (repeatPosition_) { + repeatPosition_->Cancel(); + } + return IostatOk; +} + +Fortran::common::optional<DataEdit> +ListDirectedStatementState<Direction::Input>::GetNextDataEdit( + IoStatementState &io, int maxRepeat) { + // N.B. list-directed transfers cannot be nonadvancing (C1221) + DataEdit edit; + edit.descriptor = DataEdit::ListDirected; + edit.repeat = 1; // may be overridden below + edit.modes = io.mutableModes(); + if (hitSlash_) { // everything after '/' is nullified + edit.descriptor = DataEdit::ListDirectedNullValue; + return edit; + } + char32_t comma{','}; + if (edit.modes.editingFlags & decimalComma) { + comma = ';'; + } + std::size_t byteCount{0}; + if (remaining_ > 0 && !realPart_) { // "r*c" repetition in progress + RUNTIME_CHECK(io.GetIoErrorHandler(), repeatPosition_.has_value()); + repeatPosition_.reset(); // restores the saved position + if (!imaginaryPart_) { + edit.repeat = std::min<int>(remaining_, maxRepeat); + auto ch{io.GetCurrentChar(byteCount)}; + if (!ch || *ch == ' ' || *ch == '\t' || *ch == comma) { + // "r*" repeated null + edit.descriptor = DataEdit::ListDirectedNullValue; + } + } + remaining_ -= edit.repeat; + if (remaining_ > 0) { + repeatPosition_.emplace(io); + } + if (!imaginaryPart_) { + return edit; + } + } + // Skip separators, handle a "r*c" repeat count; see 13.10.2 in Fortran 2018 + if (imaginaryPart_) { + imaginaryPart_ = false; + } else if (realPart_) { + realPart_ = false; + imaginaryPart_ = true; + edit.descriptor = DataEdit::ListDirectedImaginaryPart; + } + auto fastField{io.GetUpcomingFastAsciiField()}; + auto ch{io.GetNextNonBlank(byteCount, &fastField)}; + if (ch && *ch == comma && eatComma_) { + // Consume comma & whitespace after previous item. + // This includes the comma between real and imaginary components + // in list-directed/NAMELIST complex input. + // (When DECIMAL='COMMA', the comma is actually a semicolon.) + fastField.Advance(0, byteCount); + ch = io.GetNextNonBlank(byteCount, &fastField); + } + eatComma_ = true; + if (!ch) { + return Fortran::common::nullopt; + } + if (*ch == '/') { + hitSlash_ = true; + edit.descriptor = DataEdit::ListDirectedNullValue; + return edit; + } + if (*ch == comma) { // separator: null value + edit.descriptor = DataEdit::ListDirectedNullValue; + return edit; + } + if (imaginaryPart_) { // can't repeat components + return edit; + } + if (*ch >= '0' && *ch <= '9' && fastField.MightHaveAsterisk()) { + // look for "r*" repetition count + auto start{fastField.connection().positionInRecord}; + int r{0}; + do { + static auto constexpr clamp{(std::numeric_limits<int>::max() - '9') / 10}; + if (r >= clamp) { + r = 0; + break; + } + r = 10 * r + (*ch - '0'); + fastField.Advance(0, byteCount); + ch = io.GetCurrentChar(byteCount, &fastField); + } while (ch && *ch >= '0' && *ch <= '9'); + if (r > 0 && ch && *ch == '*') { // subtle: r must be nonzero + fastField.Advance(0, byteCount); + ch = io.GetCurrentChar(byteCount, &fastField); + if (ch && *ch == '/') { // r*/ + hitSlash_ = true; + edit.descriptor = DataEdit::ListDirectedNullValue; + return edit; + } + if (!ch || *ch == ' ' || *ch == '\t' || *ch == comma) { // "r*" null + edit.descriptor = DataEdit::ListDirectedNullValue; + } + edit.repeat = std::min<int>(r, maxRepeat); + remaining_ = r - edit.repeat; + if (remaining_ > 0) { + repeatPosition_.emplace(io); + } + } else { // not a repetition count, just an integer value; rewind + fastField.connection().positionInRecord = start; + } + } + if (!imaginaryPart_ && ch && *ch == '(') { + realPart_ = true; + fastField.connection().HandleRelativePosition(byteCount); + edit.descriptor = DataEdit::ListDirectedRealPart; + } + return edit; +} + +template <Direction DIR> +int ExternalListIoStatementState<DIR>::EndIoStatement() { + if constexpr (DIR == Direction::Input) { + if (auto status{ListDirectedStatementState<DIR>::EndIoStatement()}; + status != IostatOk) { + return status; + } + } + return ExternalIoStatementState<DIR>::EndIoStatement(); +} + +template <Direction DIR> +bool ExternalUnformattedIoStatementState<DIR>::Receive( + char *data, std::size_t bytes, std::size_t elementBytes) { + if constexpr (DIR == Direction::Output) { + this->Crash("ExternalUnformattedIoStatementState::Receive() called for " + "output statement"); + } + return this->unit().Receive(data, bytes, elementBytes, *this); +} + +template <Direction DIR> +ChildIoStatementState<DIR>::ChildIoStatementState( + ChildIo &child, const char *sourceFile, int sourceLine) + : IoStatementBase{sourceFile, sourceLine}, child_{child} {} + +template <Direction DIR> +MutableModes &ChildIoStatementState<DIR>::mutableModes() { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().mutableModes(); +#else + ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> +ConnectionState &ChildIoStatementState<DIR>::GetConnectionState() { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().GetConnectionState(); +#else + ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> +ExternalFileUnit *ChildIoStatementState<DIR>::GetExternalFileUnit() const { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().GetExternalFileUnit(); +#else + ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> int ChildIoStatementState<DIR>::EndIoStatement() { + CompleteOperation(); + auto result{IoStatementBase::EndIoStatement()}; + child_.EndIoStatement(); // annihilates *this in child_.u_ + return result; +} + +template <Direction DIR> +bool ChildIoStatementState<DIR>::Emit( + const char *data, std::size_t bytes, std::size_t elementBytes) { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().Emit(data, bytes, elementBytes); +#else + ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> +std::size_t ChildIoStatementState<DIR>::GetNextInputBytes(const char *&p) { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().GetNextInputBytes(p); +#else + ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> +void ChildIoStatementState<DIR>::HandleAbsolutePosition(std::int64_t n) { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().HandleAbsolutePosition(n); +#else + ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> +void ChildIoStatementState<DIR>::HandleRelativePosition(std::int64_t n) { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return child_.parent().HandleRelativePosition(n); +#else + ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR, typename CHAR> +ChildFormattedIoStatementState<DIR, CHAR>::ChildFormattedIoStatementState( + ChildIo &child, const CHAR *format, std::size_t formatLength, + const Descriptor *formatDescriptor, const char *sourceFile, int sourceLine) + : ChildIoStatementState<DIR>{child, sourceFile, sourceLine}, + mutableModes_{child.parent().mutableModes()}, format_{*this, format, + formatLength, + formatDescriptor} {} + +template <Direction DIR, typename CHAR> +void ChildFormattedIoStatementState<DIR, CHAR>::CompleteOperation() { + if (!this->completedOperation()) { + format_.Finish(*this); + ChildIoStatementState<DIR>::CompleteOperation(); + } +} + +template <Direction DIR, typename CHAR> +int ChildFormattedIoStatementState<DIR, CHAR>::EndIoStatement() { + CompleteOperation(); + return ChildIoStatementState<DIR>::EndIoStatement(); +} + +template <Direction DIR, typename CHAR> +bool ChildFormattedIoStatementState<DIR, CHAR>::AdvanceRecord(int n) { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return this->child().parent().AdvanceRecord(n); +#else + this->ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> +bool ChildUnformattedIoStatementState<DIR>::Receive( + char *data, std::size_t bytes, std::size_t elementBytes) { +#if !defined(RT_DEVICE_AVOID_RECURSION) + return this->child().parent().Receive(data, bytes, elementBytes); +#else + this->ReportUnsupportedChildIo(); +#endif +} + +template <Direction DIR> int ChildListIoStatementState<DIR>::EndIoStatement() { + if constexpr (DIR == Direction::Input) { + if (int status{ListDirectedStatementState<DIR>::EndIoStatement()}; + status != IostatOk) { + return status; + } + } + return ChildIoStatementState<DIR>::EndIoStatement(); +} + +template class InternalIoStatementState<Direction::Output>; +template class InternalIoStatementState<Direction::Input>; +template class InternalFormattedIoStatementState<Direction::Output>; +template class InternalFormattedIoStatementState<Direction::Input>; +template class InternalListIoStatementState<Direction::Output>; +template class InternalListIoStatementState<Direction::Input>; +template class ExternalIoStatementState<Direction::Output>; +template class ExternalIoStatementState<Direction::Input>; +template class ExternalFormattedIoStatementState<Direction::Output>; +template class ExternalFormattedIoStatementState<Direction::Input>; +template class ExternalListIoStatementState<Direction::Output>; +template class ExternalListIoStatementState<Direction::Input>; +template class ExternalUnformattedIoStatementState<Direction::Output>; +template class ExternalUnformattedIoStatementState<Direction::Input>; +template class ChildIoStatementState<Direction::Output>; +template class ChildIoStatementState<Direction::Input>; +template class ChildFormattedIoStatementState<Direction::Output>; +template class ChildFormattedIoStatementState<Direction::Input>; +template class ChildListIoStatementState<Direction::Output>; +template class ChildListIoStatementState<Direction::Input>; +template class ChildUnformattedIoStatementState<Direction::Output>; +template class ChildUnformattedIoStatementState<Direction::Input>; + +void ExternalMiscIoStatementState::CompleteOperation() { + if (completedOperation()) { + return; + } + ExternalFileUnit &ext{unit()}; + switch (which_) { + case Flush: + ext.FlushOutput(*this); +#if !defined(RT_DEVICE_COMPILATION) + std::fflush(nullptr); // flushes C stdio output streams (12.9(2)) +#endif + break; + case Backspace: + ext.BackspaceRecord(*this); + break; + case Endfile: + ext.Endfile(*this); + break; + case Rewind: + ext.Rewind(*this); + break; + case Wait: + break; // handled in io-api.cpp BeginWait + } + return IoStatementBase::CompleteOperation(); +} + +int ExternalMiscIoStatementState::EndIoStatement() { + CompleteOperation(); + return ExternalIoStatementBase::EndIoStatement(); +} + +InquireUnitState::InquireUnitState( + ExternalFileUnit &unit, const char *sourceFile, int sourceLine) + : ExternalIoStatementBase{unit, sourceFile, sourceLine} {} + +bool InquireUnitState::Inquire( + InquiryKeywordHash inquiry, char *result, std::size_t length) { + if (unit().createdForInternalChildIo()) { + SignalError(IostatInquireInternalUnit, + "INQUIRE of unit created for defined derived type I/O of an internal " + "unit"); + return false; + } + const char *str{nullptr}; + switch (inquiry) { + case HashInquiryKeyword("ACCESS"): + if (!unit().IsConnected()) { + str = "UNDEFINED"; + } else { + switch (unit().access) { + case Access::Sequential: + str = "SEQUENTIAL"; + break; + case Access::Direct: + str = "DIRECT"; + break; + case Access::Stream: + str = "STREAM"; + break; + } + } + break; + case HashInquiryKeyword("ACTION"): + str = !unit().IsConnected() ? "UNDEFINED" + : unit().mayWrite() ? unit().mayRead() ? "READWRITE" : "WRITE" + : "READ"; + break; + case HashInquiryKeyword("ASYNCHRONOUS"): + str = !unit().IsConnected() ? "UNDEFINED" + : unit().mayAsynchronous() ? "YES" + : "NO"; + break; + case HashInquiryKeyword("BLANK"): + str = !unit().IsConnected() || unit().isUnformatted.value_or(true) + ? "UNDEFINED" + : mutableModes().editingFlags & blankZero ? "ZERO" + : "NULL"; + break; + case HashInquiryKeyword("CARRIAGECONTROL"): + str = "LIST"; + break; + case HashInquiryKeyword("CONVERT"): + str = unit().swapEndianness() ? "SWAP" : "NATIVE"; + break; + case HashInquiryKeyword("DECIMAL"): + str = !unit().IsConnected() || unit().isUnformatted.value_or(true) + ? "UNDEFINED" + : mutableModes().editingFlags & decimalComma ? "COMMA" + : "POINT"; + break; + case HashInquiryKeyword("DELIM"): + if (!unit().IsConnected() || unit().isUnformatted.value_or(true)) { + str = "UNDEFINED"; + } else { + switch (mutableModes().delim) { + case '\'': + str = "APOSTROPHE"; + break; + case '"': + str = "QUOTE"; + break; + default: + str = "NONE"; + break; + } + } + break; + case HashInquiryKeyword("DIRECT"): + str = !unit().IsConnected() ? "UNKNOWN" + : unit().access == Access::Direct || + (unit().mayPosition() && unit().openRecl) + ? "YES" + : "NO"; + break; + case HashInquiryKeyword("ENCODING"): + str = !unit().IsConnected() ? "UNKNOWN" + : unit().isUnformatted.value_or(true) ? "UNDEFINED" + : unit().isUTF8 ? "UTF-8" + : "ASCII"; + break; + case HashInquiryKeyword("FORM"): + str = !unit().IsConnected() || !unit().isUnformatted ? "UNDEFINED" + : *unit().isUnformatted ? "UNFORMATTED" + : "FORMATTED"; + break; + case HashInquiryKeyword("FORMATTED"): + str = !unit().IsConnected() ? "UNDEFINED" + : !unit().isUnformatted ? "UNKNOWN" + : *unit().isUnformatted ? "NO" + : "YES"; + break; + case HashInquiryKeyword("NAME"): + str = unit().path(); + if (!str) { + return true; // result is undefined + } + break; + case HashInquiryKeyword("PAD"): + str = !unit().IsConnected() || unit().isUnformatted.value_or(true) + ? "UNDEFINED" + : mutableModes().pad ? "YES" + : "NO"; + break; + case HashInquiryKeyword("POSITION"): + if (!unit().IsConnected() || unit().access == Access::Direct) { + str = "UNDEFINED"; + } else { + switch (unit().InquirePosition()) { + case Position::Rewind: + str = "REWIND"; + break; + case Position::Append: + str = "APPEND"; + break; + case Position::AsIs: + str = "ASIS"; + break; + } + } + break; + case HashInquiryKeyword("READ"): + str = !unit().IsConnected() ? "UNDEFINED" : unit().mayRead() ? "YES" : "NO"; + break; + case HashInquiryKeyword("READWRITE"): + str = !unit().IsConnected() ? "UNDEFINED" + : unit().mayRead() && unit().mayWrite() ? "YES" + : "NO"; + break; + case HashInquiryKeyword("ROUND"): + if (!unit().IsConnected() || unit().isUnformatted.value_or(true)) { + str = "UNDEFINED"; + } else { + switch (mutableModes().round) { + case decimal::FortranRounding::RoundNearest: + str = "NEAREST"; + break; + case decimal::FortranRounding::RoundUp: + str = "UP"; + break; + case decimal::FortranRounding::RoundDown: + str = "DOWN"; + break; + case decimal::FortranRounding::RoundToZero: + str = "ZERO"; + break; + case decimal::FortranRounding::RoundCompatible: + str = "COMPATIBLE"; + break; + } + } + break; + case HashInquiryKeyword("SEQUENTIAL"): + // "NO" for Direct, since Sequential would not work if + // the unit were reopened without RECL=. + str = !unit().IsConnected() ? "UNKNOWN" + : unit().access == Access::Sequential ? "YES" + : "NO"; + break; + case HashInquiryKeyword("SIGN"): + str = !unit().IsConnected() || unit().isUnformatted.value_or(true) + ? "UNDEFINED" + : mutableModes().editingFlags & signPlus ? "PLUS" + : "SUPPRESS"; + break; + case HashInquiryKeyword("STREAM"): + str = !unit().IsConnected() ? "UNKNOWN" + : unit().access == Access::Stream ? "YES" + : "NO"; + break; + case HashInquiryKeyword("UNFORMATTED"): + str = !unit().IsConnected() || !unit().isUnformatted ? "UNKNOWN" + : *unit().isUnformatted ? "YES" + : "NO"; + break; + case HashInquiryKeyword("WRITE"): + str = !unit().IsConnected() ? "UNKNOWN" : unit().mayWrite() ? "YES" : "NO"; + break; + } + if (str) { + ToFortranDefaultCharacter(result, length, str); + return true; + } else { + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireUnitState::Inquire(InquiryKeywordHash inquiry, bool &result) { + switch (inquiry) { + case HashInquiryKeyword("EXIST"): + result = true; + return true; + case HashInquiryKeyword("NAMED"): + result = unit().path() != nullptr; + return true; + case HashInquiryKeyword("OPENED"): + result = unit().IsConnected(); + return true; + case HashInquiryKeyword("PENDING"): + result = false; // asynchronous I/O is not implemented + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireUnitState::Inquire( + InquiryKeywordHash inquiry, std::int64_t, bool &result) { + switch (inquiry) { + case HashInquiryKeyword("PENDING"): + result = false; // asynchronous I/O is not implemented + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireUnitState::Inquire( + InquiryKeywordHash inquiry, std::int64_t &result) { + switch (inquiry) { + case HashInquiryKeyword("NEXTREC"): + if (unit().access == Access::Direct) { + result = unit().currentRecordNumber; + } + return true; + case HashInquiryKeyword("NUMBER"): + result = unit().unitNumber(); + return true; + case HashInquiryKeyword("POS"): + result = unit().InquirePos(); + return true; + case HashInquiryKeyword("RECL"): + if (!unit().IsConnected()) { + result = -1; + } else if (unit().access == Access::Stream) { + result = -2; + } else if (unit().openRecl) { + result = *unit().openRecl; + } else { + result = std::numeric_limits<std::int32_t>::max(); + } + return true; + case HashInquiryKeyword("SIZE"): + result = -1; + if (unit().IsConnected()) { + unit().FlushOutput(*this); + if (auto size{unit().knownSize()}) { + result = *size; + } + } + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +InquireNoUnitState::InquireNoUnitState( + const char *sourceFile, int sourceLine, int badUnitNumber) + : NoUnitIoStatementState{*this, sourceFile, sourceLine, badUnitNumber} {} + +bool InquireNoUnitState::Inquire( + InquiryKeywordHash inquiry, char *result, std::size_t length) { + switch (inquiry) { + case HashInquiryKeyword("ACCESS"): + case HashInquiryKeyword("ACTION"): + case HashInquiryKeyword("ASYNCHRONOUS"): + case HashInquiryKeyword("BLANK"): + case HashInquiryKeyword("CARRIAGECONTROL"): + case HashInquiryKeyword("CONVERT"): + case HashInquiryKeyword("DECIMAL"): + case HashInquiryKeyword("DELIM"): + case HashInquiryKeyword("FORM"): + case HashInquiryKeyword("NAME"): + case HashInquiryKeyword("PAD"): + case HashInquiryKeyword("POSITION"): + case HashInquiryKeyword("ROUND"): + case HashInquiryKeyword("SIGN"): + ToFortranDefaultCharacter(result, length, "UNDEFINED"); + return true; + case HashInquiryKeyword("DIRECT"): + case HashInquiryKeyword("ENCODING"): + case HashInquiryKeyword("FORMATTED"): + case HashInquiryKeyword("READ"): + case HashInquiryKeyword("READWRITE"): + case HashInquiryKeyword("SEQUENTIAL"): + case HashInquiryKeyword("STREAM"): + case HashInquiryKeyword("WRITE"): + case HashInquiryKeyword("UNFORMATTED"): + ToFortranDefaultCharacter(result, length, "UNKNOWN"); + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireNoUnitState::Inquire(InquiryKeywordHash inquiry, bool &result) { + switch (inquiry) { + case HashInquiryKeyword("EXIST"): + result = badUnitNumber() >= 0; + return true; + case HashInquiryKeyword("NAMED"): + case HashInquiryKeyword("OPENED"): + case HashInquiryKeyword("PENDING"): + result = false; + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireNoUnitState::Inquire( + InquiryKeywordHash inquiry, std::int64_t, bool &result) { + switch (inquiry) { + case HashInquiryKeyword("PENDING"): + result = false; + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireNoUnitState::Inquire( + InquiryKeywordHash inquiry, std::int64_t &result) { + switch (inquiry) { + case HashInquiryKeyword("NUMBER"): + result = badUnitNumber(); + return true; + case HashInquiryKeyword("NEXTREC"): + case HashInquiryKeyword("POS"): + case HashInquiryKeyword("RECL"): + case HashInquiryKeyword("SIZE"): + result = -1; + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +InquireUnconnectedFileState::InquireUnconnectedFileState( + OwningPtr<char> &&path, const char *sourceFile, int sourceLine) + : NoUnitIoStatementState{*this, sourceFile, sourceLine}, path_{std::move( + path)} {} + +bool InquireUnconnectedFileState::Inquire( + InquiryKeywordHash inquiry, char *result, std::size_t length) { + const char *str{nullptr}; + switch (inquiry) { + case HashInquiryKeyword("ACCESS"): + case HashInquiryKeyword("ACTION"): + case HashInquiryKeyword("ASYNCHRONOUS"): + case HashInquiryKeyword("BLANK"): + case HashInquiryKeyword("CARRIAGECONTROL"): + case HashInquiryKeyword("CONVERT"): + case HashInquiryKeyword("DECIMAL"): + case HashInquiryKeyword("DELIM"): + case HashInquiryKeyword("FORM"): + case HashInquiryKeyword("PAD"): + case HashInquiryKeyword("POSITION"): + case HashInquiryKeyword("ROUND"): + case HashInquiryKeyword("SIGN"): + str = "UNDEFINED"; + break; + case HashInquiryKeyword("DIRECT"): + case HashInquiryKeyword("ENCODING"): + case HashInquiryKeyword("FORMATTED"): + case HashInquiryKeyword("SEQUENTIAL"): + case HashInquiryKeyword("STREAM"): + case HashInquiryKeyword("UNFORMATTED"): + str = "UNKNOWN"; + break; + case HashInquiryKeyword("READ"): + str = + IsExtant(path_.get()) ? MayRead(path_.get()) ? "YES" : "NO" : "UNKNOWN"; + break; + case HashInquiryKeyword("READWRITE"): + str = IsExtant(path_.get()) ? MayReadAndWrite(path_.get()) ? "YES" : "NO" + : "UNKNOWN"; + break; + case HashInquiryKeyword("WRITE"): + str = IsExtant(path_.get()) ? MayWrite(path_.get()) ? "YES" : "NO" + : "UNKNOWN"; + break; + case HashInquiryKeyword("NAME"): + str = path_.get(); + if (!str) { + return true; // result is undefined + } + break; + } + if (str) { + ToFortranDefaultCharacter(result, length, str); + return true; + } else { + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireUnconnectedFileState::Inquire( + InquiryKeywordHash inquiry, bool &result) { + switch (inquiry) { + case HashInquiryKeyword("EXIST"): + result = IsExtant(path_.get()); + return true; + case HashInquiryKeyword("NAMED"): + result = true; + return true; + case HashInquiryKeyword("OPENED"): + result = false; + return true; + case HashInquiryKeyword("PENDING"): + result = false; + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireUnconnectedFileState::Inquire( + InquiryKeywordHash inquiry, std::int64_t, bool &result) { + switch (inquiry) { + case HashInquiryKeyword("PENDING"): + result = false; + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +bool InquireUnconnectedFileState::Inquire( + InquiryKeywordHash inquiry, std::int64_t &result) { + switch (inquiry) { + case HashInquiryKeyword("NEXTREC"): + case HashInquiryKeyword("NUMBER"): + case HashInquiryKeyword("POS"): + case HashInquiryKeyword("RECL"): + result = -1; + return true; + case HashInquiryKeyword("SIZE"): + result = SizeInBytes(path_.get()); + return true; + default: + BadInquiryKeywordHashCrash(inquiry); + return false; + } +} + +InquireIOLengthState::InquireIOLengthState( + const char *sourceFile, int sourceLine) + : NoUnitIoStatementState{*this, sourceFile, sourceLine} {} + +bool InquireIOLengthState::Emit(const char *, std::size_t bytes, std::size_t) { + bytes_ += bytes; + return true; +} + +int ErroneousIoStatementState::EndIoStatement() { + SignalPendingError(); + if (unit_) { + unit_->EndIoStatement(); + } + return IoStatementBase::EndIoStatement(); +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/iostat.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/iostat.cpp new file mode 100644 index 00000000000..0f8bfb884e5 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/iostat.cpp @@ -0,0 +1,129 @@ +//===-- lib/runtime/iostat.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/iostat.h" + +namespace Fortran::runtime::io { +RT_OFFLOAD_API_GROUP_BEGIN + +const char *IostatErrorString(int iostat) { + switch (iostat) { + case IostatOk: + return "No error"; + case IostatEnd: + return "End of file during input"; + case IostatEor: + return "End of record during non-advancing input"; + case IostatUnflushable: + return "FLUSH not possible"; + case IostatInquireInternalUnit: + return "INQUIRE on internal unit"; + case IostatGenericError: + return "I/O error"; // dummy value, there's always a message + case IostatRecordWriteOverrun: + return "Excessive output to fixed-size record"; + case IostatRecordReadOverrun: + return "Excessive input from fixed-size record"; + case IostatInternalWriteOverrun: + return "Internal write overran available records"; + case IostatErrorInFormat: + return "Bad FORMAT"; + case IostatErrorInKeyword: + return "Bad keyword argument value"; + case IostatEndfileDirect: + return "ENDFILE on direct-access file"; + case IostatEndfileUnwritable: + return "ENDFILE on read-only file"; + case IostatOpenBadRecl: + return "OPEN with bad RECL= value"; + case IostatOpenUnknownSize: + return "OPEN of file of unknown size"; + case IostatOpenBadAppend: + return "OPEN(POSITION='APPEND') of unpositionable file"; + case IostatWriteToReadOnly: + return "Attempted output to read-only file"; + case IostatReadFromWriteOnly: + return "Attempted input from write-only file"; + case IostatBackspaceNonSequential: + return "BACKSPACE on non-sequential file"; + case IostatBackspaceAtFirstRecord: + return "BACKSPACE at first record"; + case IostatRewindNonSequential: + return "REWIND on non-sequential file"; + case IostatWriteAfterEndfile: + return "WRITE after ENDFILE"; + case IostatFormattedIoOnUnformattedUnit: + return "Formatted I/O on unformatted file"; + case IostatUnformattedIoOnFormattedUnit: + return "Unformatted I/O on formatted file"; + case IostatListIoOnDirectAccessUnit: + return "List-directed or NAMELIST I/O on direct-access file"; + case IostatUnformattedChildOnFormattedParent: + return "Unformatted child I/O on formatted parent unit"; + case IostatFormattedChildOnUnformattedParent: + return "Formatted child I/O on unformatted parent unit"; + case IostatChildInputFromOutputParent: + return "Child input from output parent unit"; + case IostatChildOutputToInputParent: + return "Child output to input parent unit"; + case IostatShortRead: + return "Read from external unit returned insufficient data"; + case IostatMissingTerminator: + return "Sequential record missing its terminator"; + case IostatBadUnformattedRecord: + return "Erroneous unformatted sequential file record structure"; + case IostatUTF8Decoding: + return "UTF-8 decoding error"; + case IostatUnitOverflow: + return "UNIT number is out of range"; + case IostatBadRealInput: + return "Bad REAL input value"; + case IostatBadScaleFactor: + return "Bad REAL output scale factor (kP)"; + case IostatBadAsynchronous: + return "READ/WRITE(ASYNCHRONOUS='YES') on unit without " + "OPEN(ASYNCHRONOUS='YES')"; + case IostatBadWaitUnit: + return "WAIT(UNIT=) for a bad or unconnected unit number"; + case IostatBOZInputOverflow: + return "B/O/Z input value overflows variable"; + case IostatIntegerInputOverflow: + return "Integer input value overflows variable"; + case IostatRealInputOverflow: + return "Real or complex input value overflows type"; + case IostatCannotReposition: + return "Attempt to reposition a unit which is connected to a file that can " + "only be processed sequentially"; + case IostatOpenAlreadyConnected: + return "OPEN of file already connected to another unit"; + case IostatBadWaitId: + return "WAIT(ID=nonzero) for an ID value that is not a pending operation"; + case IostatTooManyAsyncOps: + return "Too many asynchronous operations pending on unit"; + case IostatBadBackspaceUnit: + return "BACKSPACE on unconnected unit"; + case IostatBadUnitNumber: + return "Negative unit number is not allowed"; + case IostatBadFlushUnit: + return "FLUSH attempted on a bad or unconnected unit number"; + case IostatBadOpOnChildUnit: + return "Impermissible I/O statement on child I/O unit"; + case IostatBadNewUnit: + return "NEWUNIT= without FILE= or STATUS='SCRATCH'"; + case IostatBadListDirectedInputSeparator: + return "List-directed input value has trailing unused characters"; + case IostatNonExternalDefinedUnformattedIo: + return "Defined unformatted I/O without an external unit"; + default: + return nullptr; + } +} + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/main.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/main.cpp new file mode 100644 index 00000000000..b3f066cda37 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/main.cpp @@ -0,0 +1,48 @@ +//===-- lib/runtime/main.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/main.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/terminator.h" +#include <cfenv> +#include <cstdio> +#include <cstdlib> + +static void ConfigureFloatingPoint() { +#ifdef feclearexcept // a macro in some environments; omit std:: + feclearexcept(FE_ALL_EXCEPT); +#else + std::feclearexcept(FE_ALL_EXCEPT); +#endif +#ifdef fesetround + fesetround(FE_TONEAREST); +#else + std::fesetround(FE_TONEAREST); +#endif +} + +extern "C" { +void RTNAME(ProgramStart)(int argc, const char *argv[], const char *envp[], + const EnvironmentDefaultList *envDefaults) { + std::atexit(Fortran::runtime::NotifyOtherImagesOfNormalEnd); + Fortran::runtime::executionEnvironment.Configure( + argc, argv, envp, envDefaults); + ConfigureFloatingPoint(); + // I/O is initialized on demand so that it works for non-Fortran main(). +} + +void RTNAME(ByteswapOption)() { + if (Fortran::runtime::executionEnvironment.conversion == + Fortran::runtime::Convert::Unknown) { + // The environment variable overrides the command-line option; + // either of them take precedence over explicit OPEN(CONVERT=) specifiers. + Fortran::runtime::executionEnvironment.conversion = + Fortran::runtime::Convert::Swap; + } +} +} diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/matmul-transpose.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/matmul-transpose.cpp new file mode 100644 index 00000000000..c9e21502b62 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/matmul-transpose.cpp @@ -0,0 +1,381 @@ +//===-- lib/runtime/matmul-transpose.cpp ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements a fused matmul-transpose operation +// +// There are two main entry points; one establishes a descriptor for the +// result and allocates it, and the other expects a result descriptor that +// points to existing storage. +// +// This implementation must handle all combinations of numeric types and +// kinds (100 - 165 cases depending on the target), plus all combinations +// of logical kinds (16). A single template undergoes many instantiations +// to cover all of the valid possibilities. +// +// The usefulness of this optimization should be reviewed once Matmul is swapped +// to use the faster BLAS routines. + +#include "flang/Runtime/matmul-transpose.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Common/optional.h" +#include "flang/Runtime/c-or-cpp.h" +#include "flang/Runtime/cpp-type.h" +#include <cstring> + +namespace { +using namespace Fortran::runtime; + +// Contiguous numeric TRANSPOSE(matrix)*matrix multiplication +// TRANSPOSE(matrix(n, rows)) * matrix(n,cols) -> +// matrix(rows, n) * matrix(n,cols) -> matrix(rows,cols) +// The transpose is implemented by swapping the indices of accesses into the LHS +// +// Straightforward algorithm: +// DO 1 I = 1, NROWS +// DO 1 J = 1, NCOLS +// RES(I,J) = 0 +// DO 1 K = 1, N +// 1 RES(I,J) = RES(I,J) + X(K,I)*Y(K,J) +// +// With loop distribution and transposition to avoid the inner sum +// reduction and to avoid non-unit strides: +// DO 1 I = 1, NROWS +// DO 1 J = 1, NCOLS +// 1 RES(I,J) = 0 +// DO 2 J = 1, NCOLS +// DO 2 I = 1, NROWS +// DO 2 K = 1, N +// 2 RES(I,J) = RES(I,J) + X(K,I)*Y(K,J) ! loop-invariant last term +template <TypeCategory RCAT, int RKIND, typename XT, typename YT, + bool X_HAS_STRIDED_COLUMNS, bool Y_HAS_STRIDED_COLUMNS> +inline static RT_API_ATTRS void MatrixTransposedTimesMatrix( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue cols, const XT *RESTRICT x, const YT *RESTRICT y, + SubscriptValue n, std::size_t xColumnByteStride = 0, + std::size_t yColumnByteStride = 0) { + using ResultType = CppTypeFor<RCAT, RKIND>; + + std::memset(product, 0, rows * cols * sizeof *product); + for (SubscriptValue j{0}; j < cols; ++j) { + for (SubscriptValue i{0}; i < rows; ++i) { + for (SubscriptValue k{0}; k < n; ++k) { + ResultType x_ki; + if constexpr (!X_HAS_STRIDED_COLUMNS) { + x_ki = static_cast<ResultType>(x[i * n + k]); + } else { + x_ki = static_cast<ResultType>(reinterpret_cast<const XT *>( + reinterpret_cast<const char *>(x) + i * xColumnByteStride)[k]); + } + ResultType y_kj; + if constexpr (!Y_HAS_STRIDED_COLUMNS) { + y_kj = static_cast<ResultType>(y[j * n + k]); + } else { + y_kj = static_cast<ResultType>(reinterpret_cast<const YT *>( + reinterpret_cast<const char *>(y) + j * yColumnByteStride)[k]); + } + product[j * rows + i] += x_ki * y_kj; + } + } + } +} + +template <TypeCategory RCAT, int RKIND, typename XT, typename YT> +inline static RT_API_ATTRS void MatrixTransposedTimesMatrixHelper( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue cols, const XT *RESTRICT x, const YT *RESTRICT y, + SubscriptValue n, Fortran::common::optional<std::size_t> xColumnByteStride, + Fortran::common::optional<std::size_t> yColumnByteStride) { + if (!xColumnByteStride) { + if (!yColumnByteStride) { + MatrixTransposedTimesMatrix<RCAT, RKIND, XT, YT, false, false>( + product, rows, cols, x, y, n); + } else { + MatrixTransposedTimesMatrix<RCAT, RKIND, XT, YT, false, true>( + product, rows, cols, x, y, n, 0, *yColumnByteStride); + } + } else { + if (!yColumnByteStride) { + MatrixTransposedTimesMatrix<RCAT, RKIND, XT, YT, true, false>( + product, rows, cols, x, y, n, *xColumnByteStride); + } else { + MatrixTransposedTimesMatrix<RCAT, RKIND, XT, YT, true, true>( + product, rows, cols, x, y, n, *xColumnByteStride, *yColumnByteStride); + } + } +} + +// Contiguous numeric matrix*vector multiplication +// matrix(rows,n) * column vector(n) -> column vector(rows) +// Straightforward algorithm: +// DO 1 I = 1, NROWS +// RES(I) = 0 +// DO 1 K = 1, N +// 1 RES(I) = RES(I) + X(K,I)*Y(K) +// With loop distribution and transposition to avoid the inner +// sum reduction and to avoid non-unit strides: +// DO 1 I = 1, NROWS +// 1 RES(I) = 0 +// DO 2 I = 1, NROWS +// DO 2 K = 1, N +// 2 RES(I) = RES(I) + X(K,I)*Y(K) +template <TypeCategory RCAT, int RKIND, typename XT, typename YT, + bool X_HAS_STRIDED_COLUMNS> +inline static RT_API_ATTRS void MatrixTransposedTimesVector( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue n, const XT *RESTRICT x, const YT *RESTRICT y, + std::size_t xColumnByteStride = 0) { + using ResultType = CppTypeFor<RCAT, RKIND>; + std::memset(product, 0, rows * sizeof *product); + for (SubscriptValue i{0}; i < rows; ++i) { + for (SubscriptValue k{0}; k < n; ++k) { + ResultType x_ki; + if constexpr (!X_HAS_STRIDED_COLUMNS) { + x_ki = static_cast<ResultType>(x[i * n + k]); + } else { + x_ki = static_cast<ResultType>(reinterpret_cast<const XT *>( + reinterpret_cast<const char *>(x) + i * xColumnByteStride)[k]); + } + ResultType y_k = static_cast<ResultType>(y[k]); + product[i] += x_ki * y_k; + } + } +} + +template <TypeCategory RCAT, int RKIND, typename XT, typename YT> +inline static RT_API_ATTRS void MatrixTransposedTimesVectorHelper( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue n, const XT *RESTRICT x, const YT *RESTRICT y, + Fortran::common::optional<std::size_t> xColumnByteStride) { + if (!xColumnByteStride) { + MatrixTransposedTimesVector<RCAT, RKIND, XT, YT, false>( + product, rows, n, x, y); + } else { + MatrixTransposedTimesVector<RCAT, RKIND, XT, YT, true>( + product, rows, n, x, y, *xColumnByteStride); + } +} + +// Implements an instance of MATMUL for given argument types. +template <bool IS_ALLOCATING, TypeCategory RCAT, int RKIND, typename XT, + typename YT> +inline static RT_API_ATTRS void DoMatmulTranspose( + std::conditional_t<IS_ALLOCATING, Descriptor, const Descriptor> &result, + const Descriptor &x, const Descriptor &y, Terminator &terminator) { + int xRank{x.rank()}; + int yRank{y.rank()}; + int resRank{xRank + yRank - 2}; + if (xRank * yRank != 2 * resRank) { + terminator.Crash( + "MATMUL-TRANSPOSE: bad argument ranks (%d * %d)", xRank, yRank); + } + SubscriptValue extent[2]{x.GetDimension(1).Extent(), + resRank == 2 ? y.GetDimension(1).Extent() : 0}; + if constexpr (IS_ALLOCATING) { + result.Establish( + RCAT, RKIND, nullptr, resRank, extent, CFI_attribute_allocatable); + for (int j{0}; j < resRank; ++j) { + result.GetDimension(j).SetBounds(1, extent[j]); + } + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "MATMUL-TRANSPOSE: could not allocate memory for result; STAT=%d", + stat); + } + } else { + RUNTIME_CHECK(terminator, resRank == result.rank()); + RUNTIME_CHECK( + terminator, result.ElementBytes() == static_cast<std::size_t>(RKIND)); + RUNTIME_CHECK(terminator, result.GetDimension(0).Extent() == extent[0]); + RUNTIME_CHECK(terminator, + resRank == 1 || result.GetDimension(1).Extent() == extent[1]); + } + SubscriptValue n{x.GetDimension(0).Extent()}; + if (n != y.GetDimension(0).Extent()) { + terminator.Crash( + "MATMUL-TRANSPOSE: unacceptable operand shapes (%jdx%jd, %jdx%jd)", + static_cast<std::intmax_t>(x.GetDimension(0).Extent()), + static_cast<std::intmax_t>(x.GetDimension(1).Extent()), + static_cast<std::intmax_t>(y.GetDimension(0).Extent()), + static_cast<std::intmax_t>(y.GetDimension(1).Extent())); + } + using WriteResult = + CppTypeFor<RCAT == TypeCategory::Logical ? TypeCategory::Integer : RCAT, + RKIND>; + const SubscriptValue rows{extent[0]}; + const SubscriptValue cols{extent[1]}; + if constexpr (RCAT != TypeCategory::Logical) { + if (x.IsContiguous(1) && y.IsContiguous(1) && + (IS_ALLOCATING || result.IsContiguous())) { + // Contiguous numeric matrices (maybe with columns + // separated by a stride). + Fortran::common::optional<std::size_t> xColumnByteStride; + if (!x.IsContiguous()) { + // X's columns are strided. + SubscriptValue xAt[2]{}; + x.GetLowerBounds(xAt); + xAt[1]++; + xColumnByteStride = x.SubscriptsToByteOffset(xAt); + } + Fortran::common::optional<std::size_t> yColumnByteStride; + if (!y.IsContiguous()) { + // Y's columns are strided. + SubscriptValue yAt[2]{}; + y.GetLowerBounds(yAt); + yAt[1]++; + yColumnByteStride = y.SubscriptsToByteOffset(yAt); + } + if (resRank == 2) { // M*M -> M + // TODO: use BLAS-3 GEMM for supported types. + MatrixTransposedTimesMatrixHelper<RCAT, RKIND, XT, YT>( + result.template OffsetElement<WriteResult>(), rows, cols, + x.OffsetElement<XT>(), y.OffsetElement<YT>(), n, xColumnByteStride, + yColumnByteStride); + return; + } + if (xRank == 2) { // M*V -> V + // TODO: use BLAS-2 GEMM for supported types. + MatrixTransposedTimesVectorHelper<RCAT, RKIND, XT, YT>( + result.template OffsetElement<WriteResult>(), rows, n, + x.OffsetElement<XT>(), y.OffsetElement<YT>(), xColumnByteStride); + return; + } + // else V*M -> V (not allowed because TRANSPOSE() is only defined for rank + // 1 matrices + terminator.Crash( + "MATMUL-TRANSPOSE: unacceptable operand shapes (%jdx%jd, %jdx%jd)", + static_cast<std::intmax_t>(x.GetDimension(0).Extent()), + static_cast<std::intmax_t>(n), + static_cast<std::intmax_t>(y.GetDimension(0).Extent()), + static_cast<std::intmax_t>(y.GetDimension(1).Extent())); + return; + } + } + // General algorithms for LOGICAL and noncontiguity + SubscriptValue xLB[2], yLB[2], resLB[2]; + x.GetLowerBounds(xLB); + y.GetLowerBounds(yLB); + result.GetLowerBounds(resLB); + using ResultType = CppTypeFor<RCAT, RKIND>; + if (resRank == 2) { // M*M -> M + for (SubscriptValue i{0}; i < rows; ++i) { + for (SubscriptValue j{0}; j < cols; ++j) { + ResultType res_ij; + if constexpr (RCAT == TypeCategory::Logical) { + res_ij = false; + } else { + res_ij = 0; + } + + for (SubscriptValue k{0}; k < n; ++k) { + SubscriptValue xAt[2]{k + xLB[0], i + xLB[1]}; + SubscriptValue yAt[2]{k + yLB[0], j + yLB[1]}; + if constexpr (RCAT == TypeCategory::Logical) { + ResultType x_ki = IsLogicalElementTrue(x, xAt); + ResultType y_kj = IsLogicalElementTrue(y, yAt); + res_ij = res_ij || (x_ki && y_kj); + } else { + ResultType x_ki = static_cast<ResultType>(*x.Element<XT>(xAt)); + ResultType y_kj = static_cast<ResultType>(*y.Element<YT>(yAt)); + res_ij += x_ki * y_kj; + } + } + SubscriptValue resAt[2]{i + resLB[0], j + resLB[1]}; + *result.template Element<WriteResult>(resAt) = res_ij; + } + } + } else if (xRank == 2) { // M*V -> V + for (SubscriptValue i{0}; i < rows; ++i) { + ResultType res_i; + if constexpr (RCAT == TypeCategory::Logical) { + res_i = false; + } else { + res_i = 0; + } + + for (SubscriptValue k{0}; k < n; ++k) { + SubscriptValue xAt[2]{k + xLB[0], i + xLB[1]}; + SubscriptValue yAt[1]{k + yLB[0]}; + if constexpr (RCAT == TypeCategory::Logical) { + ResultType x_ki = IsLogicalElementTrue(x, xAt); + ResultType y_k = IsLogicalElementTrue(y, yAt); + res_i = res_i || (x_ki && y_k); + } else { + ResultType x_ki = static_cast<ResultType>(*x.Element<XT>(xAt)); + ResultType y_k = static_cast<ResultType>(*y.Element<YT>(yAt)); + res_i += x_ki * y_k; + } + } + SubscriptValue resAt[1]{i + resLB[0]}; + *result.template Element<WriteResult>(resAt) = res_i; + } + } else { // V*M -> V + // TRANSPOSE(V) not allowed by fortran standard + terminator.Crash( + "MATMUL-TRANSPOSE: unacceptable operand shapes (%jdx%jd, %jdx%jd)", + static_cast<std::intmax_t>(x.GetDimension(0).Extent()), + static_cast<std::intmax_t>(n), + static_cast<std::intmax_t>(y.GetDimension(0).Extent()), + static_cast<std::intmax_t>(y.GetDimension(1).Extent())); + } +} + +template <bool IS_ALLOCATING, TypeCategory XCAT, int XKIND, TypeCategory YCAT, + int YKIND> +struct MatmulTransposeHelper { + using ResultDescriptor = + std::conditional_t<IS_ALLOCATING, Descriptor, const Descriptor>; + using ResultTy = Fortran::common::optional<std::pair<TypeCategory, int>>; + RT_API_ATTRS void operator()(ResultDescriptor &result, const Descriptor &x, + const Descriptor &y, const char *sourceFile, int line) const { + Terminator terminator{sourceFile, line}; + auto xCatKind{x.type().GetCategoryAndKind()}; + auto yCatKind{y.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, xCatKind.has_value() && yCatKind.has_value()); + RUNTIME_CHECK(terminator, xCatKind->first == XCAT); + RUNTIME_CHECK(terminator, yCatKind->first == YCAT); + if constexpr (constexpr ResultTy resultType{ + GetResultType(XCAT, XKIND, YCAT, YKIND)}) { + return DoMatmulTranspose<IS_ALLOCATING, resultType->first, + resultType->second, CppTypeFor<XCAT, XKIND>, CppTypeFor<YCAT, YKIND>>( + result, x, y, terminator); + } + terminator.Crash("MATMUL-TRANSPOSE: bad operand types (%d(%d), %d(%d))", + static_cast<int>(XCAT), XKIND, static_cast<int>(YCAT), YKIND); + } +}; +} // namespace + +namespace Fortran::runtime { +extern "C" { +RT_EXT_API_GROUP_BEGIN + +#define MATMUL_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDEF(MatmulTranspose##XCAT##XKIND##YCAT##YKIND)(Descriptor & result, \ + const Descriptor &x, const Descriptor &y, const char *sourceFile, \ + int line) { \ + MatmulTransposeHelper<true, TypeCategory::XCAT, XKIND, TypeCategory::YCAT, \ + YKIND>{}(result, x, y, sourceFile, line); \ + } + +#define MATMUL_DIRECT_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDEF(MatmulTransposeDirect##XCAT##XKIND##YCAT##YKIND)( \ + Descriptor & result, const Descriptor &x, const Descriptor &y, \ + const char *sourceFile, int line) { \ + MatmulTransposeHelper<false, TypeCategory::XCAT, XKIND, \ + TypeCategory::YCAT, YKIND>{}(result, x, y, sourceFile, line); \ + } + +#define MATMUL_FORCE_ALL_TYPES 0 + +#include "flang/Runtime/matmul-instances.inc" + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/matmul.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/matmul.cpp new file mode 100644 index 00000000000..5acb3457252 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/matmul.cpp @@ -0,0 +1,481 @@ +//===-- lib/runtime/matmul.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements all forms of MATMUL (Fortran 2018 16.9.124) +// +// There are two main entry points; one establishes a descriptor for the +// result and allocates it, and the other expects a result descriptor that +// points to existing storage. +// +// This implementation must handle all combinations of numeric types and +// kinds (100 - 165 cases depending on the target), plus all combinations +// of logical kinds (16). A single template undergoes many instantiations +// to cover all of the valid possibilities. +// +// Places where BLAS routines could be called are marked as TODO items. + +#include "flang/Runtime/matmul.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Common/optional.h" +#include "flang/Runtime/c-or-cpp.h" +#include "flang/Runtime/cpp-type.h" +#include <cstring> + +namespace { +using namespace Fortran::runtime; + +// General accumulator for any type and stride; this is not used for +// contiguous numeric cases. +template <TypeCategory RCAT, int RKIND, typename XT, typename YT> +class Accumulator { +public: + using Result = AccumulationType<RCAT, RKIND>; + RT_API_ATTRS Accumulator(const Descriptor &x, const Descriptor &y) + : x_{x}, y_{y} {} + RT_API_ATTRS void Accumulate( + const SubscriptValue xAt[], const SubscriptValue yAt[]) { + if constexpr (RCAT == TypeCategory::Logical) { + sum_ = sum_ || + (IsLogicalElementTrue(x_, xAt) && IsLogicalElementTrue(y_, yAt)); + } else { + sum_ += static_cast<Result>(*x_.Element<XT>(xAt)) * + static_cast<Result>(*y_.Element<YT>(yAt)); + } + } + RT_API_ATTRS Result GetResult() const { return sum_; } + +private: + const Descriptor &x_, &y_; + Result sum_{}; +}; + +// Contiguous numeric matrix*matrix multiplication +// matrix(rows,n) * matrix(n,cols) -> matrix(rows,cols) +// Straightforward algorithm: +// DO 1 I = 1, NROWS +// DO 1 J = 1, NCOLS +// RES(I,J) = 0 +// DO 1 K = 1, N +// 1 RES(I,J) = RES(I,J) + X(I,K)*Y(K,J) +// With loop distribution and transposition to avoid the inner sum +// reduction and to avoid non-unit strides: +// DO 1 I = 1, NROWS +// DO 1 J = 1, NCOLS +// 1 RES(I,J) = 0 +// DO 2 K = 1, N +// DO 2 J = 1, NCOLS +// DO 2 I = 1, NROWS +// 2 RES(I,J) = RES(I,J) + X(I,K)*Y(K,J) ! loop-invariant last term +template <TypeCategory RCAT, int RKIND, typename XT, typename YT, + bool X_HAS_STRIDED_COLUMNS, bool Y_HAS_STRIDED_COLUMNS> +inline RT_API_ATTRS void MatrixTimesMatrix( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue cols, const XT *RESTRICT x, const YT *RESTRICT y, + SubscriptValue n, std::size_t xColumnByteStride = 0, + std::size_t yColumnByteStride = 0) { + using ResultType = CppTypeFor<RCAT, RKIND>; + std::memset(product, 0, rows * cols * sizeof *product); + const XT *RESTRICT xp0{x}; + for (SubscriptValue k{0}; k < n; ++k) { + ResultType *RESTRICT p{product}; + for (SubscriptValue j{0}; j < cols; ++j) { + const XT *RESTRICT xp{xp0}; + ResultType yv; + if constexpr (!Y_HAS_STRIDED_COLUMNS) { + yv = static_cast<ResultType>(y[k + j * n]); + } else { + yv = static_cast<ResultType>(reinterpret_cast<const YT *>( + reinterpret_cast<const char *>(y) + j * yColumnByteStride)[k]); + } + for (SubscriptValue i{0}; i < rows; ++i) { + *p++ += static_cast<ResultType>(*xp++) * yv; + } + } + if constexpr (!X_HAS_STRIDED_COLUMNS) { + xp0 += rows; + } else { + xp0 = reinterpret_cast<const XT *>( + reinterpret_cast<const char *>(xp0) + xColumnByteStride); + } + } +} + +template <TypeCategory RCAT, int RKIND, typename XT, typename YT> +inline RT_API_ATTRS void MatrixTimesMatrixHelper( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue cols, const XT *RESTRICT x, const YT *RESTRICT y, + SubscriptValue n, Fortran::common::optional<std::size_t> xColumnByteStride, + Fortran::common::optional<std::size_t> yColumnByteStride) { + if (!xColumnByteStride) { + if (!yColumnByteStride) { + MatrixTimesMatrix<RCAT, RKIND, XT, YT, false, false>( + product, rows, cols, x, y, n); + } else { + MatrixTimesMatrix<RCAT, RKIND, XT, YT, false, true>( + product, rows, cols, x, y, n, 0, *yColumnByteStride); + } + } else { + if (!yColumnByteStride) { + MatrixTimesMatrix<RCAT, RKIND, XT, YT, true, false>( + product, rows, cols, x, y, n, *xColumnByteStride); + } else { + MatrixTimesMatrix<RCAT, RKIND, XT, YT, true, true>( + product, rows, cols, x, y, n, *xColumnByteStride, *yColumnByteStride); + } + } +} + +// Contiguous numeric matrix*vector multiplication +// matrix(rows,n) * column vector(n) -> column vector(rows) +// Straightforward algorithm: +// DO 1 J = 1, NROWS +// RES(J) = 0 +// DO 1 K = 1, N +// 1 RES(J) = RES(J) + X(J,K)*Y(K) +// With loop distribution and transposition to avoid the inner +// sum reduction and to avoid non-unit strides: +// DO 1 J = 1, NROWS +// 1 RES(J) = 0 +// DO 2 K = 1, N +// DO 2 J = 1, NROWS +// 2 RES(J) = RES(J) + X(J,K)*Y(K) +template <TypeCategory RCAT, int RKIND, typename XT, typename YT, + bool X_HAS_STRIDED_COLUMNS> +inline RT_API_ATTRS void MatrixTimesVector( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue n, const XT *RESTRICT x, const YT *RESTRICT y, + std::size_t xColumnByteStride = 0) { + using ResultType = CppTypeFor<RCAT, RKIND>; + std::memset(product, 0, rows * sizeof *product); + [[maybe_unused]] const XT *RESTRICT xp0{x}; + for (SubscriptValue k{0}; k < n; ++k) { + ResultType *RESTRICT p{product}; + auto yv{static_cast<ResultType>(*y++)}; + for (SubscriptValue j{0}; j < rows; ++j) { + *p++ += static_cast<ResultType>(*x++) * yv; + } + if constexpr (X_HAS_STRIDED_COLUMNS) { + xp0 = reinterpret_cast<const XT *>( + reinterpret_cast<const char *>(xp0) + xColumnByteStride); + x = xp0; + } + } +} + +template <TypeCategory RCAT, int RKIND, typename XT, typename YT> +inline RT_API_ATTRS void MatrixTimesVectorHelper( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue rows, + SubscriptValue n, const XT *RESTRICT x, const YT *RESTRICT y, + Fortran::common::optional<std::size_t> xColumnByteStride) { + if (!xColumnByteStride) { + MatrixTimesVector<RCAT, RKIND, XT, YT, false>(product, rows, n, x, y); + } else { + MatrixTimesVector<RCAT, RKIND, XT, YT, true>( + product, rows, n, x, y, *xColumnByteStride); + } +} + +// Contiguous numeric vector*matrix multiplication +// row vector(n) * matrix(n,cols) -> row vector(cols) +// Straightforward algorithm: +// DO 1 J = 1, NCOLS +// RES(J) = 0 +// DO 1 K = 1, N +// 1 RES(J) = RES(J) + X(K)*Y(K,J) +// With loop distribution and transposition to avoid the inner +// sum reduction and one non-unit stride (the other remains): +// DO 1 J = 1, NCOLS +// 1 RES(J) = 0 +// DO 2 K = 1, N +// DO 2 J = 1, NCOLS +// 2 RES(J) = RES(J) + X(K)*Y(K,J) +template <TypeCategory RCAT, int RKIND, typename XT, typename YT, + bool Y_HAS_STRIDED_COLUMNS> +inline RT_API_ATTRS void VectorTimesMatrix( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue n, + SubscriptValue cols, const XT *RESTRICT x, const YT *RESTRICT y, + std::size_t yColumnByteStride = 0) { + using ResultType = CppTypeFor<RCAT, RKIND>; + std::memset(product, 0, cols * sizeof *product); + for (SubscriptValue k{0}; k < n; ++k) { + ResultType *RESTRICT p{product}; + auto xv{static_cast<ResultType>(*x++)}; + const YT *RESTRICT yp{&y[k]}; + for (SubscriptValue j{0}; j < cols; ++j) { + *p++ += xv * static_cast<ResultType>(*yp); + if constexpr (!Y_HAS_STRIDED_COLUMNS) { + yp += n; + } else { + yp = reinterpret_cast<const YT *>( + reinterpret_cast<const char *>(yp) + yColumnByteStride); + } + } + } +} + +template <TypeCategory RCAT, int RKIND, typename XT, typename YT, + bool SPARSE_COLUMNS = false> +inline RT_API_ATTRS void VectorTimesMatrixHelper( + CppTypeFor<RCAT, RKIND> *RESTRICT product, SubscriptValue n, + SubscriptValue cols, const XT *RESTRICT x, const YT *RESTRICT y, + Fortran::common::optional<std::size_t> yColumnByteStride) { + if (!yColumnByteStride) { + VectorTimesMatrix<RCAT, RKIND, XT, YT, false>(product, n, cols, x, y); + } else { + VectorTimesMatrix<RCAT, RKIND, XT, YT, true>( + product, n, cols, x, y, *yColumnByteStride); + } +} + +// Implements an instance of MATMUL for given argument types. +template <bool IS_ALLOCATING, TypeCategory RCAT, int RKIND, typename XT, + typename YT> +static inline RT_API_ATTRS void DoMatmul( + std::conditional_t<IS_ALLOCATING, Descriptor, const Descriptor> &result, + const Descriptor &x, const Descriptor &y, Terminator &terminator) { + int xRank{x.rank()}; + int yRank{y.rank()}; + int resRank{xRank + yRank - 2}; + if (xRank * yRank != 2 * resRank) { + terminator.Crash("MATMUL: bad argument ranks (%d * %d)", xRank, yRank); + } + SubscriptValue extent[2]{ + xRank == 2 ? x.GetDimension(0).Extent() : y.GetDimension(1).Extent(), + resRank == 2 ? y.GetDimension(1).Extent() : 0}; + if constexpr (IS_ALLOCATING) { + result.Establish( + RCAT, RKIND, nullptr, resRank, extent, CFI_attribute_allocatable); + for (int j{0}; j < resRank; ++j) { + result.GetDimension(j).SetBounds(1, extent[j]); + } + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "MATMUL: could not allocate memory for result; STAT=%d", stat); + } + } else { + RUNTIME_CHECK(terminator, resRank == result.rank()); + RUNTIME_CHECK( + terminator, result.ElementBytes() == static_cast<std::size_t>(RKIND)); + RUNTIME_CHECK(terminator, result.GetDimension(0).Extent() == extent[0]); + RUNTIME_CHECK(terminator, + resRank == 1 || result.GetDimension(1).Extent() == extent[1]); + } + SubscriptValue n{x.GetDimension(xRank - 1).Extent()}; + if (n != y.GetDimension(0).Extent()) { + // At this point, we know that there's a shape error. There are three + // possibilities, x is rank 1, y is rank 1, or both are rank 2. + if (xRank == 1) { + terminator.Crash("MATMUL: unacceptable operand shapes (%jd, %jdx%jd)", + static_cast<std::intmax_t>(n), + static_cast<std::intmax_t>(y.GetDimension(0).Extent()), + static_cast<std::intmax_t>(y.GetDimension(1).Extent())); + } else if (yRank == 1) { + terminator.Crash("MATMUL: unacceptable operand shapes (%jdx%jd, %jd)", + static_cast<std::intmax_t>(x.GetDimension(0).Extent()), + static_cast<std::intmax_t>(n), + static_cast<std::intmax_t>(y.GetDimension(0).Extent())); + } else { + terminator.Crash("MATMUL: unacceptable operand shapes (%jdx%jd, %jdx%jd)", + static_cast<std::intmax_t>(x.GetDimension(0).Extent()), + static_cast<std::intmax_t>(n), + static_cast<std::intmax_t>(y.GetDimension(0).Extent()), + static_cast<std::intmax_t>(y.GetDimension(1).Extent())); + } + } + using WriteResult = + CppTypeFor<RCAT == TypeCategory::Logical ? TypeCategory::Integer : RCAT, + RKIND>; + if constexpr (RCAT != TypeCategory::Logical) { + if (x.IsContiguous(1) && y.IsContiguous(1) && + (IS_ALLOCATING || result.IsContiguous())) { + // Contiguous numeric matrices (maybe with columns + // separated by a stride). + Fortran::common::optional<std::size_t> xColumnByteStride; + if (!x.IsContiguous()) { + // X's columns are strided. + SubscriptValue xAt[2]{}; + x.GetLowerBounds(xAt); + xAt[1]++; + xColumnByteStride = x.SubscriptsToByteOffset(xAt); + } + Fortran::common::optional<std::size_t> yColumnByteStride; + if (!y.IsContiguous()) { + // Y's columns are strided. + SubscriptValue yAt[2]{}; + y.GetLowerBounds(yAt); + yAt[1]++; + yColumnByteStride = y.SubscriptsToByteOffset(yAt); + } + // Note that BLAS GEMM can be used for the strided + // columns by setting proper leading dimension size. + // This implies that the column stride is divisible + // by the element size, which is usually true. + if (resRank == 2) { // M*M -> M + if (std::is_same_v<XT, YT>) { + if constexpr (std::is_same_v<XT, float>) { + // TODO: call BLAS-3 SGEMM + // TODO: try using CUTLASS for device. + } else if constexpr (std::is_same_v<XT, double>) { + // TODO: call BLAS-3 DGEMM + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<float>>) { + // TODO: call BLAS-3 CGEMM + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<double>>) { + // TODO: call BLAS-3 ZGEMM + } + } + MatrixTimesMatrixHelper<RCAT, RKIND, XT, YT>( + result.template OffsetElement<WriteResult>(), extent[0], extent[1], + x.OffsetElement<XT>(), y.OffsetElement<YT>(), n, xColumnByteStride, + yColumnByteStride); + return; + } else if (xRank == 2) { // M*V -> V + if (std::is_same_v<XT, YT>) { + if constexpr (std::is_same_v<XT, float>) { + // TODO: call BLAS-2 SGEMV(x,y) + } else if constexpr (std::is_same_v<XT, double>) { + // TODO: call BLAS-2 DGEMV(x,y) + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<float>>) { + // TODO: call BLAS-2 CGEMV(x,y) + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<double>>) { + // TODO: call BLAS-2 ZGEMV(x,y) + } + } + MatrixTimesVectorHelper<RCAT, RKIND, XT, YT>( + result.template OffsetElement<WriteResult>(), extent[0], n, + x.OffsetElement<XT>(), y.OffsetElement<YT>(), xColumnByteStride); + return; + } else { // V*M -> V + if (std::is_same_v<XT, YT>) { + if constexpr (std::is_same_v<XT, float>) { + // TODO: call BLAS-2 SGEMV(y,x) + } else if constexpr (std::is_same_v<XT, double>) { + // TODO: call BLAS-2 DGEMV(y,x) + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<float>>) { + // TODO: call BLAS-2 CGEMV(y,x) + } else if constexpr (std::is_same_v<XT, rtcmplx::complex<double>>) { + // TODO: call BLAS-2 ZGEMV(y,x) + } + } + VectorTimesMatrixHelper<RCAT, RKIND, XT, YT>( + result.template OffsetElement<WriteResult>(), n, extent[0], + x.OffsetElement<XT>(), y.OffsetElement<YT>(), yColumnByteStride); + return; + } + } + } + // General algorithms for LOGICAL and noncontiguity + SubscriptValue xAt[2], yAt[2], resAt[2]; + x.GetLowerBounds(xAt); + y.GetLowerBounds(yAt); + result.GetLowerBounds(resAt); + if (resRank == 2) { // M*M -> M + SubscriptValue x1{xAt[1]}, y0{yAt[0]}, y1{yAt[1]}, res1{resAt[1]}; + for (SubscriptValue i{0}; i < extent[0]; ++i) { + for (SubscriptValue j{0}; j < extent[1]; ++j) { + Accumulator<RCAT, RKIND, XT, YT> accumulator{x, y}; + yAt[1] = y1 + j; + for (SubscriptValue k{0}; k < n; ++k) { + xAt[1] = x1 + k; + yAt[0] = y0 + k; + accumulator.Accumulate(xAt, yAt); + } + resAt[1] = res1 + j; + *result.template Element<WriteResult>(resAt) = accumulator.GetResult(); + } + ++resAt[0]; + ++xAt[0]; + } + } else if (xRank == 2) { // M*V -> V + SubscriptValue x1{xAt[1]}, y0{yAt[0]}; + for (SubscriptValue j{0}; j < extent[0]; ++j) { + Accumulator<RCAT, RKIND, XT, YT> accumulator{x, y}; + for (SubscriptValue k{0}; k < n; ++k) { + xAt[1] = x1 + k; + yAt[0] = y0 + k; + accumulator.Accumulate(xAt, yAt); + } + *result.template Element<WriteResult>(resAt) = accumulator.GetResult(); + ++resAt[0]; + ++xAt[0]; + } + } else { // V*M -> V + SubscriptValue x0{xAt[0]}, y0{yAt[0]}; + for (SubscriptValue j{0}; j < extent[0]; ++j) { + Accumulator<RCAT, RKIND, XT, YT> accumulator{x, y}; + for (SubscriptValue k{0}; k < n; ++k) { + xAt[0] = x0 + k; + yAt[0] = y0 + k; + accumulator.Accumulate(xAt, yAt); + } + *result.template Element<WriteResult>(resAt) = accumulator.GetResult(); + ++resAt[0]; + ++yAt[1]; + } + } +} + +template <bool IS_ALLOCATING, TypeCategory XCAT, int XKIND, TypeCategory YCAT, + int YKIND> +struct MatmulHelper { + using ResultTy = Fortran::common::optional<std::pair<TypeCategory, int>>; + using ResultDescriptor = + std::conditional_t<IS_ALLOCATING, Descriptor, const Descriptor>; + RT_API_ATTRS void operator()(ResultDescriptor &result, const Descriptor &x, + const Descriptor &y, const char *sourceFile, int line) const { + Terminator terminator{sourceFile, line}; + auto xCatKind{x.type().GetCategoryAndKind()}; + auto yCatKind{y.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, xCatKind.has_value() && yCatKind.has_value()); + RUNTIME_CHECK(terminator, + (xCatKind->first == XCAT && yCatKind->first == YCAT) || + (XCAT == TypeCategory::Integer && YCAT == TypeCategory::Integer && + ((xCatKind->first == TypeCategory::Integer || + xCatKind->first == TypeCategory::Unsigned) && + (yCatKind->first == TypeCategory::Integer || + yCatKind->first == TypeCategory::Unsigned)))); + if constexpr (constexpr ResultTy resultType{ + GetResultType(XCAT, XKIND, YCAT, YKIND)}) { + return DoMatmul<IS_ALLOCATING, resultType->first, resultType->second, + CppTypeFor<XCAT, XKIND>, CppTypeFor<YCAT, YKIND>>( + result, x, y, terminator); + } + terminator.Crash("MATMUL: bad operand types (%d(%d), %d(%d))", + static_cast<int>(XCAT), XKIND, static_cast<int>(YCAT), YKIND); + } +}; +} // namespace + +namespace Fortran::runtime { +extern "C" { +RT_EXT_API_GROUP_BEGIN + +#define MATMUL_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDEF(Matmul##XCAT##XKIND##YCAT##YKIND)(Descriptor & result, \ + const Descriptor &x, const Descriptor &y, const char *sourceFile, \ + int line) { \ + MatmulHelper<true, TypeCategory::XCAT, XKIND, TypeCategory::YCAT, \ + YKIND>{}(result, x, y, sourceFile, line); \ + } + +#define MATMUL_DIRECT_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDEF(MatmulDirect##XCAT##XKIND##YCAT##YKIND)(Descriptor & result, \ + const Descriptor &x, const Descriptor &y, const char *sourceFile, \ + int line) { \ + MatmulHelper<false, TypeCategory::XCAT, XKIND, TypeCategory::YCAT, \ + YKIND>{}(result, x, y, sourceFile, line); \ + } + +#define MATMUL_FORCE_ALL_TYPES 0 + +#include "flang/Runtime/matmul-instances.inc" + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/memory.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/memory.cpp new file mode 100644 index 00000000000..79c7e337775 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/memory.cpp @@ -0,0 +1,46 @@ +//===-- lib/runtime/memory.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Runtime/freestanding-tools.h" +#include <cstdlib> + +namespace Fortran::runtime { +RT_OFFLOAD_API_GROUP_BEGIN + +void *AllocateMemoryOrCrash(const Terminator &terminator, std::size_t bytes) { + if (void *p{std::malloc(bytes)}) { + return p; + } + if (bytes > 0) { + terminator.Crash( + "Fortran runtime internal error: out of memory, needed %zd bytes", + bytes); + } + return nullptr; +} + +void *ReallocateMemoryOrCrash( + const Terminator &terminator, void *ptr, std::size_t newByteSize) { + if (void *p{Fortran::runtime::realloc(ptr, newByteSize)}) { + return p; + } + if (newByteSize > 0) { + terminator.Crash("Fortran runtime internal error: memory realloc returned " + "null, needed %zd bytes", + newByteSize); + } + return nullptr; +} + +void FreeMemory(void *p) { std::free(p); } + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/misc-intrinsic.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/misc-intrinsic.cpp new file mode 100644 index 00000000000..a8797f48fa6 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/misc-intrinsic.cpp @@ -0,0 +1,121 @@ +//===-- lib/runtime/misc-intrinsic.cpp --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/misc-intrinsic.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Common/optional.h" +#include <algorithm> +#include <cstdio> +#include <cstring> + +namespace Fortran::runtime { + +static RT_API_ATTRS void TransferImpl(Descriptor &result, + const Descriptor &source, const Descriptor &mold, const char *sourceFile, + int line, Fortran::common::optional<std::int64_t> resultExtent) { + int rank{resultExtent.has_value() ? 1 : 0}; + std::size_t elementBytes{mold.ElementBytes()}; + result.Establish(mold.type(), elementBytes, nullptr, rank, nullptr, + CFI_attribute_allocatable, mold.Addendum() != nullptr); + if (resultExtent) { + result.GetDimension(0).SetBounds(1, *resultExtent); + } + if (const DescriptorAddendum * addendum{mold.Addendum()}) { + *result.Addendum() = *addendum; + } + if (int stat{result.Allocate(kNoAsyncObject)}) { + Terminator{sourceFile, line}.Crash( + "TRANSFER: could not allocate memory for result; STAT=%d", stat); + } + char *to{result.OffsetElement<char>()}; + std::size_t resultBytes{result.Elements() * result.ElementBytes()}; + const std::size_t sourceElementBytes{source.ElementBytes()}; + std::size_t sourceElements{source.Elements()}; + SubscriptValue sourceAt[maxRank]; + source.GetLowerBounds(sourceAt); + while (resultBytes > 0 && sourceElements > 0) { + std::size_t toMove{std::min(resultBytes, sourceElementBytes)}; + std::memcpy(to, source.Element<char>(sourceAt), toMove); + to += toMove; + resultBytes -= toMove; + --sourceElements; + source.IncrementSubscripts(sourceAt); + } + if (resultBytes > 0) { + std::memset(to, 0, resultBytes); + } +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(Rename)(const Descriptor &path1, const Descriptor &path2, + const Descriptor *status, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; +#if !defined(RT_DEVICE_COMPILATION) + char *pathSrc{EnsureNullTerminated( + path1.OffsetElement(), path1.ElementBytes(), terminator)}; + char *pathDst{EnsureNullTerminated( + path2.OffsetElement(), path2.ElementBytes(), terminator)}; + + // We simply call rename(2) from POSIX + int result{rename(pathSrc, pathDst)}; + if (status) { + // When an error has happened, + int errorCode{0}; // Assume success + if (result != 0) { + // The rename operation has failed, so return the error code as status. + errorCode = errno; + } + StoreIntToDescriptor(status, errorCode, terminator); + } + + // Deallocate memory if EnsureNullTerminated dynamically allocated memory + if (pathSrc != path1.OffsetElement()) { + FreeMemory(pathSrc); + } + if (pathDst != path2.OffsetElement()) { + FreeMemory(pathDst); + } +#else // !defined(RT_DEVICE_COMPILATION) + terminator.Crash("RENAME intrinsic is only supported on host devices"); +#endif // !defined(RT_DEVICE_COMPILATION) +} + +void RTDEF(Transfer)(Descriptor &result, const Descriptor &source, + const Descriptor &mold, const char *sourceFile, int line) { + Fortran::common::optional<std::int64_t> elements; + if (mold.rank() > 0) { + if (std::size_t sourceElementBytes{ + source.Elements() * source.ElementBytes()}) { + if (std::size_t moldElementBytes{mold.ElementBytes()}) { + elements = static_cast<std::int64_t>( + (sourceElementBytes + moldElementBytes - 1) / moldElementBytes); + } else { + Terminator{sourceFile, line}.Crash("TRANSFER: zero-sized type of MOLD= " + "when SOURCE= is not zero-sized"); + } + } else { + elements = std::int64_t{0}; + } + } + return TransferImpl( + result, source, mold, sourceFile, line, std::move(elements)); +} + +void RTDEF(TransferSize)(Descriptor &result, const Descriptor &source, + const Descriptor &mold, const char *sourceFile, int line, + std::int64_t size) { + return TransferImpl(result, source, mold, sourceFile, line, size); +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/namelist.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/namelist.cpp new file mode 100644 index 00000000000..1bef387a977 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/namelist.cpp @@ -0,0 +1,626 @@ +//===-- lib/runtime/namelist.cpp --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/namelist.h" +#include "descriptor-io.h" +#include "flang-rt/runtime/emit-encoded.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Runtime/io-api.h" +#include <algorithm> +#include <cstring> +#include <limits> + +namespace Fortran::runtime::io { + +RT_VAR_GROUP_BEGIN +// Max size of a group, symbol or component identifier that can appear in +// NAMELIST input, plus a byte for NUL termination. +static constexpr RT_CONST_VAR_ATTRS std::size_t nameBufferSize{201}; +RT_VAR_GROUP_END + +RT_OFFLOAD_API_GROUP_BEGIN + +static inline RT_API_ATTRS char32_t GetComma(IoStatementState &io) { + return io.mutableModes().editingFlags & decimalComma ? char32_t{';'} + : char32_t{','}; +} + +bool IODEF(OutputNamelist)(Cookie cookie, const NamelistGroup &group) { + IoStatementState &io{*cookie}; + io.CheckFormattedStmtType<Direction::Output>("OutputNamelist"); + io.mutableModes().inNamelist = true; + ConnectionState &connection{io.GetConnectionState()}; + // The following lambda definition violates the conding style, + // but cuda-11.8 nvcc hits an internal error with the brace initialization. + + // Internal function to advance records and convert case + const auto EmitUpperCase = [&](const char *prefix, std::size_t prefixLen, + const char *str, char suffix) -> bool { + if ((connection.NeedAdvance(prefixLen) && + !(io.AdvanceRecord() && EmitAscii(io, " ", 1))) || + !EmitAscii(io, prefix, prefixLen) || + (connection.NeedAdvance( + Fortran::runtime::strlen(str) + (suffix != ' ')) && + !(io.AdvanceRecord() && EmitAscii(io, " ", 1)))) { + return false; + } + for (; *str; ++str) { + char up{*str >= 'a' && *str <= 'z' ? static_cast<char>(*str - 'a' + 'A') + : *str}; + if (!EmitAscii(io, &up, 1)) { + return false; + } + } + return suffix == ' ' || EmitAscii(io, &suffix, 1); + }; + // &GROUP + if (!EmitUpperCase(" &", 2, group.groupName, ' ')) { + return false; + } + auto *listOutput{io.get_if<ListDirectedStatementState<Direction::Output>>()}; + char comma{static_cast<char>(GetComma(io))}; + char prefix{' '}; + for (std::size_t j{0}; j < group.items; ++j) { + // [,]ITEM=... + const NamelistGroup::Item &item{group.item[j]}; + if (listOutput) { + listOutput->set_lastWasUndelimitedCharacter(false); + } + if (!EmitUpperCase(&prefix, 1, item.name, '=')) { + return false; + } + prefix = comma; + if (const auto *addendum{item.descriptor.Addendum()}; + addendum && addendum->derivedType()) { + const NonTbpDefinedIoTable *table{group.nonTbpDefinedIo}; + if (!IONAME(OutputDerivedType)(cookie, item.descriptor, table)) { + return false; + } + } else if (!descr::DescriptorIO<Direction::Output>(io, item.descriptor)) { + return false; + } + } + // terminal / + return EmitUpperCase("/", 1, "", ' '); +} + +static constexpr RT_API_ATTRS bool IsLegalIdStart(char32_t ch) { + return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '_' || + ch == '@'; +} + +static constexpr RT_API_ATTRS bool IsLegalIdChar(char32_t ch) { + return IsLegalIdStart(ch) || (ch >= '0' && ch <= '9'); +} + +static constexpr RT_API_ATTRS char NormalizeIdChar(char32_t ch) { + return static_cast<char>(ch >= 'A' && ch <= 'Z' ? ch - 'A' + 'a' : ch); +} + +static RT_API_ATTRS bool GetLowerCaseName( + IoStatementState &io, char buffer[], std::size_t maxLength) { + std::size_t byteLength{0}; + if (auto ch{io.GetNextNonBlank(byteLength)}) { + if (IsLegalIdStart(*ch)) { + std::size_t j{0}; + do { + buffer[j] = NormalizeIdChar(*ch); + io.HandleRelativePosition(byteLength); + ch = io.GetCurrentChar(byteLength); + } while (++j < maxLength && ch && IsLegalIdChar(*ch)); + buffer[j++] = '\0'; + if (j <= maxLength) { + return true; + } + io.GetIoErrorHandler().SignalError( + "Identifier '%s...' in NAMELIST input group is too long", buffer); + } + } + return false; +} + +static RT_API_ATTRS Fortran::common::optional<SubscriptValue> GetSubscriptValue( + IoStatementState &io) { + Fortran::common::optional<SubscriptValue> value; + std::size_t byteCount{0}; + Fortran::common::optional<char32_t> ch{io.GetCurrentChar(byteCount)}; + bool negate{ch && *ch == '-'}; + if ((ch && *ch == '+') || negate) { + io.HandleRelativePosition(byteCount); + ch = io.GetCurrentChar(byteCount); + } + bool overflow{false}; + while (ch && *ch >= '0' && *ch <= '9') { + SubscriptValue was{value.value_or(0)}; + overflow |= was >= std::numeric_limits<SubscriptValue>::max() / 10; + value = 10 * was + *ch - '0'; + io.HandleRelativePosition(byteCount); + ch = io.GetCurrentChar(byteCount); + } + if (overflow) { + io.GetIoErrorHandler().SignalError( + "NAMELIST input subscript value overflow"); + return Fortran::common::nullopt; + } + if (negate) { + if (value) { + return -*value; + } else { + io.HandleRelativePosition(-byteCount); // give back '-' with no digits + } + } + return value; +} + +static RT_API_ATTRS bool HandleSubscripts(IoStatementState &io, + Descriptor &desc, const Descriptor &source, const char *name) { + IoErrorHandler &handler{io.GetIoErrorHandler()}; + // Allow for blanks in subscripts; they're nonstandard, but not + // ambiguous within the parentheses. + SubscriptValue lower[maxRank], upper[maxRank], stride[maxRank]; + int j{0}; + std::size_t contiguousStride{source.ElementBytes()}; + bool ok{true}; + std::size_t byteCount{0}; + Fortran::common::optional<char32_t> ch{io.GetNextNonBlank(byteCount)}; + char32_t comma{GetComma(io)}; + for (; ch && *ch != ')'; ++j) { + SubscriptValue dimLower{0}, dimUpper{0}, dimStride{0}; + if (j < maxRank && j < source.rank()) { + const Dimension &dim{source.GetDimension(j)}; + dimLower = dim.LowerBound(); + dimUpper = dim.UpperBound(); + dimStride = + dim.ByteStride() / std::max<SubscriptValue>(contiguousStride, 1); + contiguousStride *= dim.Extent(); + } else if (ok) { + handler.SignalError( + "Too many subscripts for rank-%d NAMELIST group item '%s'", + source.rank(), name); + ok = false; + } + if (auto low{GetSubscriptValue(io)}) { + if (*low < dimLower || (dimUpper >= dimLower && *low > dimUpper)) { + if (ok) { + handler.SignalError("Subscript %jd out of range %jd..%jd in NAMELIST " + "group item '%s' dimension %d", + static_cast<std::intmax_t>(*low), + static_cast<std::intmax_t>(dimLower), + static_cast<std::intmax_t>(dimUpper), name, j + 1); + ok = false; + } + } else { + dimLower = *low; + } + ch = io.GetNextNonBlank(byteCount); + } + if (ch && *ch == ':') { + io.HandleRelativePosition(byteCount); + ch = io.GetNextNonBlank(byteCount); + if (auto high{GetSubscriptValue(io)}) { + if (*high > dimUpper) { + if (ok) { + handler.SignalError( + "Subscript triplet upper bound %jd out of range (>%jd) in " + "NAMELIST group item '%s' dimension %d", + static_cast<std::intmax_t>(*high), + static_cast<std::intmax_t>(dimUpper), name, j + 1); + ok = false; + } + } else { + dimUpper = *high; + } + ch = io.GetNextNonBlank(byteCount); + } + if (ch && *ch == ':') { + io.HandleRelativePosition(byteCount); + ch = io.GetNextNonBlank(byteCount); + if (auto str{GetSubscriptValue(io)}) { + dimStride = *str; + ch = io.GetNextNonBlank(byteCount); + } + } + } else { // scalar + dimUpper = dimLower; + dimStride = 0; + } + if (ch && *ch == comma) { + io.HandleRelativePosition(byteCount); + ch = io.GetNextNonBlank(byteCount); + } + if (ok) { + lower[j] = dimLower; + upper[j] = dimUpper; + stride[j] = dimStride; + } + } + if (ok) { + if (ch && *ch == ')') { + io.HandleRelativePosition(byteCount); + if (desc.EstablishPointerSection(source, lower, upper, stride)) { + return true; + } else { + handler.SignalError( + "Bad subscripts for NAMELIST input group item '%s'", name); + } + } else { + handler.SignalError( + "Bad subscripts (missing ')') for NAMELIST input group item '%s'", + name); + } + } + return false; +} + +static RT_API_ATTRS void StorageSequenceExtension( + Descriptor &desc, const Descriptor &source) { + // Support the near-universal extension of NAMELIST input into a + // designatable storage sequence identified by its initial scalar array + // element. For example, treat "A(1) = 1. 2. 3." as if it had been + // "A(1:) = 1. 2. 3.". + if (desc.rank() == 0 && (source.rank() == 1 || source.IsContiguous())) { + if (auto stride{source.rank() == 1 + ? source.GetDimension(0).ByteStride() + : static_cast<SubscriptValue>(source.ElementBytes())}; + stride != 0) { + desc.raw().attribute = CFI_attribute_pointer; + desc.raw().rank = 1; + desc.GetDimension(0) + .SetBounds(1, + source.Elements() - + ((source.OffsetElement() - desc.OffsetElement()) / stride)) + .SetByteStride(stride); + } + } +} + +static RT_API_ATTRS bool HandleSubstring( + IoStatementState &io, Descriptor &desc, const char *name) { + IoErrorHandler &handler{io.GetIoErrorHandler()}; + auto pair{desc.type().GetCategoryAndKind()}; + if (!pair || pair->first != TypeCategory::Character) { + handler.SignalError("Substring reference to non-character item '%s'", name); + return false; + } + int kind{pair->second}; + SubscriptValue chars{static_cast<SubscriptValue>(desc.ElementBytes()) / kind}; + // Allow for blanks in substring bounds; they're nonstandard, but not + // ambiguous within the parentheses. + Fortran::common::optional<SubscriptValue> lower, upper; + std::size_t byteCount{0}; + Fortran::common::optional<char32_t> ch{io.GetNextNonBlank(byteCount)}; + if (ch) { + if (*ch == ':') { + lower = 1; + } else { + lower = GetSubscriptValue(io); + ch = io.GetNextNonBlank(byteCount); + } + } + if (ch && *ch == ':') { + io.HandleRelativePosition(byteCount); + ch = io.GetNextNonBlank(byteCount); + if (ch) { + if (*ch == ')') { + upper = chars; + } else { + upper = GetSubscriptValue(io); + ch = io.GetNextNonBlank(byteCount); + } + } + } + if (ch && *ch == ')') { + io.HandleRelativePosition(byteCount); + if (lower && upper) { + if (*lower > *upper) { + // An empty substring, whatever the values are + desc.raw().elem_len = 0; + return true; + } + if (*lower >= 1 && *upper <= chars) { + // Offset the base address & adjust the element byte length + desc.raw().elem_len = (*upper - *lower + 1) * kind; + desc.set_base_addr(reinterpret_cast<void *>( + reinterpret_cast<char *>(desc.raw().base_addr) + + kind * (*lower - 1))); + return true; + } + } + handler.SignalError( + "Bad substring bounds for NAMELIST input group item '%s'", name); + } else { + handler.SignalError( + "Bad substring (missing ')') for NAMELIST input group item '%s'", name); + } + return false; +} + +static RT_API_ATTRS bool HandleComponent(IoStatementState &io, Descriptor &desc, + const Descriptor &source, const char *name) { + IoErrorHandler &handler{io.GetIoErrorHandler()}; + char compName[nameBufferSize]; + if (GetLowerCaseName(io, compName, sizeof compName)) { + const DescriptorAddendum *addendum{source.Addendum()}; + if (const typeInfo::DerivedType * + type{addendum ? addendum->derivedType() : nullptr}) { + if (const typeInfo::Component * + comp{type->FindDataComponent( + compName, Fortran::runtime::strlen(compName))}) { + bool createdDesc{false}; + if (comp->rank() > 0 && source.rank() > 0) { + // If base and component are both arrays, the component name + // must be followed by subscripts; process them now. + std::size_t byteCount{0}; + if (Fortran::common::optional<char32_t> next{ + io.GetNextNonBlank(byteCount)}; + next && *next == '(') { + io.HandleRelativePosition(byteCount); // skip over '(' + StaticDescriptor<maxRank, true, 16> staticDesc; + Descriptor &tmpDesc{staticDesc.descriptor()}; + comp->CreatePointerDescriptor(tmpDesc, source, handler); + if (!HandleSubscripts(io, desc, tmpDesc, compName)) { + return false; + } + createdDesc = true; + } + } + if (!createdDesc) { + comp->CreatePointerDescriptor(desc, source, handler); + } + if (source.rank() > 0) { + if (desc.rank() > 0) { + handler.SignalError( + "NAMELIST component reference '%%%s' of input group " + "item %s cannot be an array when its base is not scalar", + compName, name); + return false; + } + desc.raw().rank = source.rank(); + for (int j{0}; j < source.rank(); ++j) { + const auto &srcDim{source.GetDimension(j)}; + desc.GetDimension(j) + .SetBounds(1, srcDim.UpperBound()) + .SetByteStride(srcDim.ByteStride()); + } + } + return true; + } else { + handler.SignalError( + "NAMELIST component reference '%%%s' of input group item %s is not " + "a component of its derived type", + compName, name); + } + } else if (source.type().IsDerived()) { + handler.Crash("Derived type object '%s' in NAMELIST is missing its " + "derived type information!", + name); + } else { + handler.SignalError("NAMELIST component reference '%%%s' of input group " + "item %s for non-derived type", + compName, name); + } + } else { + handler.SignalError("NAMELIST component reference of input group item %s " + "has no name after '%%'", + name); + } + return false; +} + +// Advance to the terminal '/' of a namelist group or leading '&'/'$' +// of the next. +static RT_API_ATTRS void SkipNamelistGroup(IoStatementState &io) { + std::size_t byteCount{0}; + while (auto ch{io.GetNextNonBlank(byteCount)}) { + io.HandleRelativePosition(byteCount); + if (*ch == '/' || *ch == '&' || *ch == '$') { + break; + } else if (*ch == '\'' || *ch == '"') { + // Skip quoted character literal + char32_t quote{*ch}; + while (true) { + if ((ch = io.GetCurrentChar(byteCount))) { + io.HandleRelativePosition(byteCount); + if (*ch == quote) { + break; + } + } else if (!io.AdvanceRecord()) { + return; + } + } + } + } +} + +bool IODEF(InputNamelist)(Cookie cookie, const NamelistGroup &group) { + IoStatementState &io{*cookie}; + io.CheckFormattedStmtType<Direction::Input>("InputNamelist"); + io.mutableModes().inNamelist = true; + IoErrorHandler &handler{io.GetIoErrorHandler()}; + auto *listInput{io.get_if<ListDirectedStatementState<Direction::Input>>()}; + RUNTIME_CHECK(handler, listInput != nullptr); + // Find this namelist group's header in the input + io.BeginReadingRecord(); + Fortran::common::optional<char32_t> next; + char name[nameBufferSize]; + RUNTIME_CHECK(handler, group.groupName != nullptr); + char32_t comma{GetComma(io)}; + std::size_t byteCount{0}; + while (true) { + next = io.GetNextNonBlank(byteCount); + while (next && *next != '&' && *next != '$') { + // Extension: comment lines without ! before namelist groups + if (!io.AdvanceRecord()) { + next.reset(); + } else { + next = io.GetNextNonBlank(byteCount); + } + } + if (!next) { + handler.SignalEnd(); + return false; + } + if (*next != '&' && *next != '$') { + handler.SignalError( + "NAMELIST input group does not begin with '&' or '$' (at '%lc')", + *next); + return false; + } + io.HandleRelativePosition(byteCount); + if (!GetLowerCaseName(io, name, sizeof name)) { + handler.SignalError("NAMELIST input group has no name"); + return false; + } + if (Fortran::runtime::strcmp(group.groupName, name) == 0) { + break; // found it + } + SkipNamelistGroup(io); + } + // Read the group's items + while (true) { + next = io.GetNextNonBlank(byteCount); + if (!next || *next == '/' || *next == '&' || *next == '$') { + break; + } + if (!GetLowerCaseName(io, name, sizeof name)) { + handler.SignalError( + "NAMELIST input group '%s' was not terminated at '%c'", + group.groupName, static_cast<char>(*next)); + return false; + } + std::size_t itemIndex{0}; + for (; itemIndex < group.items; ++itemIndex) { + if (Fortran::runtime::strcmp(name, group.item[itemIndex].name) == 0) { + break; + } + } + if (itemIndex >= group.items) { + handler.SignalError( + "'%s' is not an item in NAMELIST group '%s'", name, group.groupName); + return false; + } + // Handle indexing and components, if any. No spaces are allowed. + // A copy of the descriptor is made if necessary. + const Descriptor &itemDescriptor{group.item[itemIndex].descriptor}; + const Descriptor *useDescriptor{&itemDescriptor}; + StaticDescriptor<maxRank, true, 16> staticDesc[2]; + int whichStaticDesc{0}; + next = io.GetCurrentChar(byteCount); + bool hadSubscripts{false}; + bool hadSubstring{false}; + if (next && (*next == '(' || *next == '%')) { + const Descriptor *lastSubscriptBase{nullptr}; + Descriptor *lastSubscriptDescriptor{nullptr}; + do { + Descriptor &mutableDescriptor{staticDesc[whichStaticDesc].descriptor()}; + whichStaticDesc ^= 1; + io.HandleRelativePosition(byteCount); // skip over '(' or '%' + lastSubscriptDescriptor = nullptr; + lastSubscriptBase = nullptr; + if (*next == '(') { + if (!hadSubstring && (hadSubscripts || useDescriptor->rank() == 0)) { + mutableDescriptor = *useDescriptor; + mutableDescriptor.raw().attribute = CFI_attribute_pointer; + if (!HandleSubstring(io, mutableDescriptor, name)) { + return false; + } + hadSubstring = true; + } else if (hadSubscripts) { + handler.SignalError("Multiple sets of subscripts for item '%s' in " + "NAMELIST group '%s'", + name, group.groupName); + return false; + } else if (HandleSubscripts( + io, mutableDescriptor, *useDescriptor, name)) { + lastSubscriptBase = useDescriptor; + lastSubscriptDescriptor = &mutableDescriptor; + } else { + return false; + } + hadSubscripts = true; + } else { + if (!HandleComponent(io, mutableDescriptor, *useDescriptor, name)) { + return false; + } + hadSubscripts = false; + hadSubstring = false; + } + useDescriptor = &mutableDescriptor; + next = io.GetCurrentChar(byteCount); + } while (next && (*next == '(' || *next == '%')); + if (lastSubscriptDescriptor) { + StorageSequenceExtension(*lastSubscriptDescriptor, *lastSubscriptBase); + } + } + // Skip the '=' + next = io.GetNextNonBlank(byteCount); + if (!next || *next != '=') { + handler.SignalError("No '=' found after item '%s' in NAMELIST group '%s'", + name, group.groupName); + return false; + } + io.HandleRelativePosition(byteCount); + // Read the values into the descriptor. An array can be short. + if (const auto *addendum{useDescriptor->Addendum()}; + addendum && addendum->derivedType()) { + const NonTbpDefinedIoTable *table{group.nonTbpDefinedIo}; + listInput->ResetForNextNamelistItem(/*inNamelistSequence=*/true); + if (!IONAME(InputDerivedType)(cookie, *useDescriptor, table)) { + return false; + } + } else { + listInput->ResetForNextNamelistItem(useDescriptor->rank() > 0); + if (!descr::DescriptorIO<Direction::Input>(io, *useDescriptor)) { + return false; + } + } + next = io.GetNextNonBlank(byteCount); + if (next && *next == comma) { + io.HandleRelativePosition(byteCount); + } + } + if (next && *next == '/') { + io.HandleRelativePosition(byteCount); + } else if (*next && (*next == '&' || *next == '$')) { + // stop at beginning of next group + } else { + handler.SignalError( + "No '/' found after NAMELIST group '%s'", group.groupName); + return false; + } + return true; +} + +RT_API_ATTRS bool IsNamelistNameOrSlash(IoStatementState &io) { + if (auto *listInput{ + io.get_if<ListDirectedStatementState<Direction::Input>>()}) { + if (listInput->inNamelistSequence()) { + SavedPosition savedPosition{io}; + std::size_t byteCount{0}; + if (auto ch{io.GetNextNonBlank(byteCount)}) { + if (IsLegalIdStart(*ch)) { + do { + io.HandleRelativePosition(byteCount); + ch = io.GetCurrentChar(byteCount); + } while (ch && IsLegalIdChar(*ch)); + ch = io.GetNextNonBlank(byteCount); + // TODO: how to deal with NaN(...) ambiguity? + return ch && (*ch == '=' || *ch == '(' || *ch == '%'); + } else { + return *ch == '/' || *ch == '&' || *ch == '$'; + } + } + } + } + return false; +} + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/non-tbp-dio.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/non-tbp-dio.cpp new file mode 100644 index 00000000000..72101b06e0c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/non-tbp-dio.cpp @@ -0,0 +1,32 @@ +//===-- lib/runtime/non-tbp-dio.cpp -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/non-tbp-dio.h" +#include "flang-rt/runtime/type-info.h" + +namespace Fortran::runtime::io { + +const NonTbpDefinedIo *NonTbpDefinedIoTable::Find( + const typeInfo::DerivedType &type, common::DefinedIo definedIo) const { + std::size_t j{items}; + for (const auto *p{item}; j-- > 0; ++p) { + if (&p->derivedType == &type && p->definedIo == definedIo) { + return p; + } else if (p->isDtvArgPolymorphic) { + for (const typeInfo::DerivedType *t{type.GetParentType()}; t; + t = t->GetParentType()) { + if (&p->derivedType == t && p->definedIo == definedIo) { + return p; + } + } + } + } + return nullptr; +} + +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/numeric.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/numeric.cpp new file mode 100644 index 00000000000..37638765dc6 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/numeric.cpp @@ -0,0 +1,938 @@ +//===-- lib/runtime/numeric.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/numeric.h" +#include "flang-rt/runtime/numeric-templates.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Common/float128.h" +#include <cfloat> +#include <climits> +#include <cmath> +#include <limits> + +namespace Fortran::runtime { + +template <typename RES> +inline RT_API_ATTRS RES GetIntArgValue(const char *source, int line, + const void *arg, int kind, std::int64_t defaultValue, int resKind) { + RES res; + if (!arg) { + res = static_cast<RES>(defaultValue); + } else if (kind == 1) { + res = static_cast<RES>( + *static_cast<const CppTypeFor<TypeCategory::Integer, 1> *>(arg)); + } else if (kind == 2) { + res = static_cast<RES>( + *static_cast<const CppTypeFor<TypeCategory::Integer, 2> *>(arg)); + } else if (kind == 4) { + res = static_cast<RES>( + *static_cast<const CppTypeFor<TypeCategory::Integer, 4> *>(arg)); + } else if (kind == 8) { + res = static_cast<RES>( + *static_cast<const CppTypeFor<TypeCategory::Integer, 8> *>(arg)); +#ifdef __SIZEOF_INT128__ + } else if (kind == 16) { + if (resKind != 16) { + Terminator{source, line}.Crash("Unexpected integer kind in runtime"); + } + res = static_cast<RES>( + *static_cast<const CppTypeFor<TypeCategory::Integer, 16> *>(arg)); +#endif + } else { + Terminator{source, line}.Crash("Unexpected integer kind in runtime"); + } + return res; +} + +// NINT (16.9.141) +template <typename RESULT, typename ARG> +inline RT_API_ATTRS RESULT Nint(ARG x) { + if (x >= 0) { + return std::trunc(x + ARG{0.5}); + } else { + return std::trunc(x - ARG{0.5}); + } +} + +// CEILING & FLOOR (16.9.43, .79) +template <typename RESULT, typename ARG> +inline RT_API_ATTRS RESULT Ceiling(ARG x) { + return std::ceil(x); +} +template <typename RESULT, typename ARG> +inline RT_API_ATTRS RESULT Floor(ARG x) { + return std::floor(x); +} + +// MOD & MODULO (16.9.135, .136) +template <bool IS_MODULO, typename T> +inline RT_API_ATTRS T IntMod(T x, T p, const char *sourceFile, int sourceLine) { + if (p == 0) { + Terminator{sourceFile, sourceLine}.Crash( + IS_MODULO ? "MODULO with P==0" : "MOD with P==0"); + } + auto mod{x - (x / p) * p}; + if (IS_MODULO && (x > 0) != (p > 0)) { + mod += p; + } + return mod; +} + +// SCALE (16.9.166) +template <typename T> inline RT_API_ATTRS T Scale(T x, std::int64_t p) { + auto ip{static_cast<int>(p)}; + if (ip != p) { + ip = p < 0 ? std::numeric_limits<int>::min() + : std::numeric_limits<int>::max(); + } + return std::ldexp(x, ip); // x*2**p +} + +// SELECTED_INT_KIND (16.9.169) and SELECTED_UNSIGNED_KIND extension +template <typename X, typename M> +inline RT_API_ATTRS CppTypeFor<TypeCategory::Integer, 4> SelectedIntKind( + X x, M mask) { +#if !defined __SIZEOF_INT128__ || defined FLANG_RUNTIME_NO_INTEGER_16 + mask &= ~(1 << 16); +#endif + if (x <= 2 && (mask & (1 << 1))) { + return 1; + } else if (x <= 4 && (mask & (1 << 2))) { + return 2; + } else if (x <= 9 && (mask & (1 << 4))) { + return 4; + } else if (x <= 18 && (mask & (1 << 8))) { + return 8; + } else if (x <= 38 && (mask & (1 << 16))) { + return 16; + } + return -1; +} + +// SELECTED_LOGICAL_KIND (F'2023 16.9.182) +template <typename T> +inline RT_API_ATTRS CppTypeFor<TypeCategory::Integer, 4> SelectedLogicalKind( + T x) { + if (x <= 8) { + return 1; + } else if (x <= 16) { + return 2; + } else if (x <= 32) { + return 4; + } else if (x <= 64) { + return 8; + } + return -1; +} + +// SELECTED_REAL_KIND (16.9.170) +template <typename P, typename R, typename D, typename M> +inline RT_API_ATTRS CppTypeFor<TypeCategory::Integer, 4> SelectedRealKind( + P p, R r, D d, M mask) { + if (d != 2) { + return -5; + } +#ifdef FLANG_RUNTIME_NO_REAL_2 + mask &= ~(1 << 2); +#endif +#ifdef FLANG_RUNTIME_NO_REAL_3 + mask &= ~(1 << 3); +#endif +#if !HAS_FLOAT80 || defined FLANG_RUNTIME_NO_REAL_10 + mask &= ~(1 << 10); +#endif +#if LDBL_MANT_DIG < 64 || defined FLANG_RUNTIME_NO_REAL_16 + mask &= ~(1 << 16); +#endif + + int error{0}; + int kind{0}; + if (p <= 3 && (mask & (1 << 2))) { + kind = 2; + } else if (p <= 6 && (mask & (1 << 4))) { + kind = 4; + } else if (p <= 15 && (mask & (1 << 8))) { + kind = 8; + } else if (p <= 18 && (mask & (1 << 10))) { + kind = 10; + } else if (p <= 33 && (mask & (1 << 16))) { + kind = 16; + } else { + error -= 1; + } + + if (r <= 4 && (mask & (1 << 2))) { + kind = kind < 2 ? 2 : kind; + } else if (r <= 37 && p != 3 && (mask & (1 << 3))) { + kind = kind < 3 ? 3 : kind; + } else if (r <= 37 && (mask & (1 << 4))) { + kind = kind < 4 ? 4 : kind; + } else if (r <= 307 && (mask & (1 << 8))) { + kind = kind < 8 ? 8 : kind; + } else if (r <= 4931 && (mask & (1 << 10))) { + kind = kind < 10 ? 10 : kind; + } else if (r <= 4931 && (mask & (1 << 16))) { + kind = kind < 16 ? 16 : kind; + } else { + error -= 2; + } + + return error ? error : kind; +} + +// NEAREST (16.9.139) +template <int PREC, typename T> +inline RT_API_ATTRS T Nearest(T x, bool positive) { + if (positive) { + return std::nextafter(x, std::numeric_limits<T>::infinity()); + } else { + return std::nextafter(x, -std::numeric_limits<T>::infinity()); + } +} + +// Exponentiation operator for (Real ** Integer) cases (10.1.5.2.1). +template <typename BTy, typename ETy> +RT_API_ATTRS BTy FPowI(BTy base, ETy exp) { + if (exp == ETy{0}) + return BTy{1}; + bool isNegativePower{exp < ETy{0}}; + bool isMinPower{exp == std::numeric_limits<ETy>::min()}; + if (isMinPower) { + exp = std::numeric_limits<ETy>::max(); + } else if (isNegativePower) { + exp = -exp; + } + BTy result{1}; + BTy origBase{base}; + while (true) { + if (exp & ETy{1}) { + result *= base; + } + exp >>= 1; + if (exp == ETy{0}) { + break; + } + base *= base; + } + if (isMinPower) { + result *= origBase; + } + if (isNegativePower) { + result = BTy{1} / result; + } + return result; +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling4_1)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling4_2)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling4_4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling4_8)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling4_16)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling8_1)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling8_2)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling8_4)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling8_8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling8_16)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling10_1)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling10_2)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling10_4)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling10_8)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling10_16)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#elif HAS_LDBL128 +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Ceiling16_1)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Ceiling16_2)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Ceiling16_4)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Ceiling16_8)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Ceiling16_16)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Ceiling<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(ErfcScaled4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return ErfcScaled(x); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(ErfcScaled8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return ErfcScaled(x); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(ErfcScaled10)( + CppTypeFor<TypeCategory::Real, 10> x) { + return ErfcScaled(x); +} +#endif +#if HAS_LDBL128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(ErfcScaled16)( + CppTypeFor<TypeCategory::Real, 16> x) { + return ErfcScaled(x); +} +#endif + +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Exponent4_4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Exponent4_8)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Exponent8_4)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Exponent8_8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Exponent10_4)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Exponent<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Exponent10_8)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Exponent<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#endif + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor4_1)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor4_2)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor4_4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor4_8)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor4_16)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor8_1)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor8_2)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor8_4)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor8_8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor8_16)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor10_1)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor10_2)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor10_4)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor10_8)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor10_16)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#elif HAS_LDBL128 +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Floor16_1)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Floor16_2)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Floor16_4)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Floor16_8)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Floor16_16)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Floor<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(Fraction4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Fraction(x); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(Fraction8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Fraction(x); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(Fraction10)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Fraction(x); +} +#endif + +bool RTDEF(IsFinite4)(CppTypeFor<TypeCategory::Real, 4> x) { + return std::isfinite(x); +} +bool RTDEF(IsFinite8)(CppTypeFor<TypeCategory::Real, 8> x) { + return std::isfinite(x); +} +#if HAS_FLOAT80 +bool RTDEF(IsFinite10)(CppTypeFor<TypeCategory::Real, 10> x) { + return std::isfinite(x); +} +#elif HAS_LDBL128 +bool RTDEF(IsFinite16)(CppTypeFor<TypeCategory::Real, 16> x) { + return std::isfinite(x); +} +#endif + +bool RTDEF(IsNaN4)(CppTypeFor<TypeCategory::Real, 4> x) { + return std::isnan(x); +} +bool RTDEF(IsNaN8)(CppTypeFor<TypeCategory::Real, 8> x) { + return std::isnan(x); +} +#if HAS_FLOAT80 +bool RTDEF(IsNaN10)(CppTypeFor<TypeCategory::Real, 10> x) { + return std::isnan(x); +} +#elif HAS_LDBL128 +bool RTDEF(IsNaN16)(CppTypeFor<TypeCategory::Real, 16> x) { + return std::isnan(x); +} +#endif + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(ModInteger1)( + CppTypeFor<TypeCategory::Integer, 1> x, + CppTypeFor<TypeCategory::Integer, 1> p, const char *sourceFile, + int sourceLine) { + return IntMod<false>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(ModInteger2)( + CppTypeFor<TypeCategory::Integer, 2> x, + CppTypeFor<TypeCategory::Integer, 2> p, const char *sourceFile, + int sourceLine) { + return IntMod<false>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(ModInteger4)( + CppTypeFor<TypeCategory::Integer, 4> x, + CppTypeFor<TypeCategory::Integer, 4> p, const char *sourceFile, + int sourceLine) { + return IntMod<false>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(ModInteger8)( + CppTypeFor<TypeCategory::Integer, 8> x, + CppTypeFor<TypeCategory::Integer, 8> p, const char *sourceFile, + int sourceLine) { + return IntMod<false>(x, p, sourceFile, sourceLine); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(ModInteger16)( + CppTypeFor<TypeCategory::Integer, 16> x, + CppTypeFor<TypeCategory::Integer, 16> p, const char *sourceFile, + int sourceLine) { + return IntMod<false>(x, p, sourceFile, sourceLine); +} +#endif +CppTypeFor<TypeCategory::Real, 4> RTDEF(ModReal4)( + CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> p, + const char *sourceFile, int sourceLine) { + return RealMod<false>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(ModReal8)( + CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> p, + const char *sourceFile, int sourceLine) { + return RealMod<false>(x, p, sourceFile, sourceLine); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(ModReal10)( + CppTypeFor<TypeCategory::Real, 10> x, CppTypeFor<TypeCategory::Real, 10> p, + const char *sourceFile, int sourceLine) { + return RealMod<false>(x, p, sourceFile, sourceLine); +} +#endif + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(ModuloInteger1)( + CppTypeFor<TypeCategory::Integer, 1> x, + CppTypeFor<TypeCategory::Integer, 1> p, const char *sourceFile, + int sourceLine) { + return IntMod<true>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(ModuloInteger2)( + CppTypeFor<TypeCategory::Integer, 2> x, + CppTypeFor<TypeCategory::Integer, 2> p, const char *sourceFile, + int sourceLine) { + return IntMod<true>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(ModuloInteger4)( + CppTypeFor<TypeCategory::Integer, 4> x, + CppTypeFor<TypeCategory::Integer, 4> p, const char *sourceFile, + int sourceLine) { + return IntMod<true>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(ModuloInteger8)( + CppTypeFor<TypeCategory::Integer, 8> x, + CppTypeFor<TypeCategory::Integer, 8> p, const char *sourceFile, + int sourceLine) { + return IntMod<true>(x, p, sourceFile, sourceLine); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(ModuloInteger16)( + CppTypeFor<TypeCategory::Integer, 16> x, + CppTypeFor<TypeCategory::Integer, 16> p, const char *sourceFile, + int sourceLine) { + return IntMod<true>(x, p, sourceFile, sourceLine); +} +#endif +CppTypeFor<TypeCategory::Real, 4> RTDEF(ModuloReal4)( + CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> p, + const char *sourceFile, int sourceLine) { + return RealMod<true>(x, p, sourceFile, sourceLine); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(ModuloReal8)( + CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> p, + const char *sourceFile, int sourceLine) { + return RealMod<true>(x, p, sourceFile, sourceLine); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(ModuloReal10)( + CppTypeFor<TypeCategory::Real, 10> x, CppTypeFor<TypeCategory::Real, 10> p, + const char *sourceFile, int sourceLine) { + return RealMod<true>(x, p, sourceFile, sourceLine); +} +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(Nearest4)( + CppTypeFor<TypeCategory::Real, 4> x, bool positive) { + return Nearest<24>(x, positive); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(Nearest8)( + CppTypeFor<TypeCategory::Real, 8> x, bool positive) { + return Nearest<53>(x, positive); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(Nearest10)( + CppTypeFor<TypeCategory::Real, 10> x, bool positive) { + return Nearest<64>(x, positive); +} +#endif + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint4_1)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint4_2)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint4_4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint4_8)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint4_16)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint8_1)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint8_2)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint8_4)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint8_8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint8_16)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint10_1)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint10_2)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint10_4)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint10_8)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint10_16)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#elif HAS_LDBL128 +CppTypeFor<TypeCategory::Integer, 1> RTDEF(Nint16_1)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 1>>(x); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(Nint16_2)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 2>>(x); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(Nint16_4)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 4>>(x); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(Nint16_8)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 8>>(x); +} +#if defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T +CppTypeFor<TypeCategory::Integer, 16> RTDEF(Nint16_16)( + CppTypeFor<TypeCategory::Real, 16> x) { + return Nint<CppTypeFor<TypeCategory::Integer, 16>>(x); +} +#endif +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(RRSpacing4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return RRSpacing<24>(x); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(RRSpacing8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return RRSpacing<53>(x); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(RRSpacing10)( + CppTypeFor<TypeCategory::Real, 10> x) { + return RRSpacing<64>(x); +} +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(SetExponent4)( + CppTypeFor<TypeCategory::Real, 4> x, std::int64_t p) { + return SetExponent(x, p); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(SetExponent8)( + CppTypeFor<TypeCategory::Real, 8> x, std::int64_t p) { + return SetExponent(x, p); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(SetExponent10)( + CppTypeFor<TypeCategory::Real, 10> x, std::int64_t p) { + return SetExponent(x, p); +} +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(Scale4)( + CppTypeFor<TypeCategory::Real, 4> x, std::int64_t p) { + return Scale(x, p); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(Scale8)( + CppTypeFor<TypeCategory::Real, 8> x, std::int64_t p) { + return Scale(x, p); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(Scale10)( + CppTypeFor<TypeCategory::Real, 10> x, std::int64_t p) { + return Scale(x, p); +} +#endif + +// SELECTED_CHAR_KIND +CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedCharKind)( + const char *source, int line, const char *x, std::size_t length) { + static const char *keywords[]{ + "ASCII", "DEFAULT", "UCS-2", "ISO_10646", "UCS-4", nullptr}; + switch (IdentifyValue(x, length, keywords)) { + case 0: // ASCII + case 1: // DEFAULT + return 1; + case 2: // UCS-2 + return 2; + case 3: // ISO_10646 + case 4: // UCS-4 + return 4; + default: + return -1; + } +} +// SELECTED_INT_KIND and SELECTED_UNSIGNED_KIND extension +CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedIntKind)( + const char *source, int line, void *x, int xKind) { + return RTNAME(SelectedIntKindMasked)(source, line, x, xKind, + (1 << 1) | (1 << 2) | (1 << 4) | (1 << 8) | (1 << 16)); +} + +CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedIntKindMasked)( + const char *source, int line, void *x, int xKind, int mask) { +#ifdef __SIZEOF_INT128__ + CppTypeFor<TypeCategory::Integer, 16> r = + GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>( + source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 16); +#else + std::int64_t r = GetIntArgValue<std::int64_t>( + source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 8); +#endif + return SelectedIntKind(r, mask); +} + +// SELECTED_LOGICAL_KIND +CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedLogicalKind)( + const char *source, int line, void *x, int xKind) { +#ifdef __SIZEOF_INT128__ + CppTypeFor<TypeCategory::Integer, 16> r = + GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>( + source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 16); +#else + std::int64_t r = GetIntArgValue<std::int64_t>( + source, line, x, xKind, /*defaultValue*/ 0, /*resKind*/ 8); +#endif + return SelectedLogicalKind(r); +} + +// SELECTED_REAL_KIND +CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedRealKind)(const char *source, + int line, void *precision, int pKind, void *range, int rKind, void *radix, + int dKind) { + return RTNAME(SelectedRealKindMasked)(source, line, precision, pKind, range, + rKind, radix, dKind, + (1 << 2) | (1 << 3) | (1 << 4) | (1 << 8) | (1 << 10) | (1 << 16)); +} + +CppTypeFor<TypeCategory::Integer, 4> RTDEF(SelectedRealKindMasked)( + const char *source, int line, void *precision, int pKind, void *range, + int rKind, void *radix, int dKind, int mask) { +#ifdef __SIZEOF_INT128__ + CppTypeFor<TypeCategory::Integer, 16> p = + GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>( + source, line, precision, pKind, /*defaultValue*/ 0, /*resKind*/ 16); + CppTypeFor<TypeCategory::Integer, 16> r = + GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>( + source, line, range, rKind, /*defaultValue*/ 0, /*resKind*/ 16); + CppTypeFor<TypeCategory::Integer, 16> d = + GetIntArgValue<CppTypeFor<TypeCategory::Integer, 16>>( + source, line, radix, dKind, /*defaultValue*/ 2, /*resKind*/ 16); +#else + std::int64_t p = GetIntArgValue<std::int64_t>( + source, line, precision, pKind, /*defaultValue*/ 0, /*resKind*/ 8); + std::int64_t r = GetIntArgValue<std::int64_t>( + source, line, range, rKind, /*defaultValue*/ 0, /*resKind*/ 8); + std::int64_t d = GetIntArgValue<std::int64_t>( + source, line, radix, dKind, /*defaultValue*/ 2, /*resKind*/ 8); +#endif + return SelectedRealKind(p, r, d, mask); +} + +#if HAS_FP16 +CppTypeFor<TypeCategory::Real, 2> RTDEF(Spacing2)( + CppTypeFor<TypeCategory::Real, 2> x) { + return Spacing<11>(x); +} +#endif +CppTypeFor<TypeCategory::Real, 4> RTDEF(Spacing2By4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Spacing<11>(x); +} +#if HAS_BF16 +CppTypeFor<TypeCategory::Real, 3> RTDEF(Spacing3)( + CppTypeFor<TypeCategory::Real, 3> x) { + return Spacing<8>(x); +} +#endif +CppTypeFor<TypeCategory::Real, 4> RTDEF(Spacing3By4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Spacing<8>(x); +} +CppTypeFor<TypeCategory::Real, 4> RTDEF(Spacing4)( + CppTypeFor<TypeCategory::Real, 4> x) { + return Spacing<24>(x); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(Spacing8)( + CppTypeFor<TypeCategory::Real, 8> x) { + return Spacing<53>(x); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(Spacing10)( + CppTypeFor<TypeCategory::Real, 10> x) { + return Spacing<64>(x); +} +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(FPow4i)( + CppTypeFor<TypeCategory::Real, 4> b, + CppTypeFor<TypeCategory::Integer, 4> e) { + return FPowI(b, e); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(FPow8i)( + CppTypeFor<TypeCategory::Real, 8> b, + CppTypeFor<TypeCategory::Integer, 4> e) { + return FPowI(b, e); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(FPow10i)( + CppTypeFor<TypeCategory::Real, 10> b, + CppTypeFor<TypeCategory::Integer, 4> e) { + return FPowI(b, e); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(FPow16i)( + CppTypeFor<TypeCategory::Real, 16> b, + CppTypeFor<TypeCategory::Integer, 4> e) { + return FPowI(b, e); +} +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDEF(FPow4k)( + CppTypeFor<TypeCategory::Real, 4> b, + CppTypeFor<TypeCategory::Integer, 8> e) { + return FPowI(b, e); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(FPow8k)( + CppTypeFor<TypeCategory::Real, 8> b, + CppTypeFor<TypeCategory::Integer, 8> e) { + return FPowI(b, e); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(FPow10k)( + CppTypeFor<TypeCategory::Real, 10> b, + CppTypeFor<TypeCategory::Integer, 8> e) { + return FPowI(b, e); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(FPow16k)( + CppTypeFor<TypeCategory::Real, 16> b, + CppTypeFor<TypeCategory::Integer, 8> e) { + return FPowI(b, e); +} +#endif + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/pointer.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/pointer.cpp new file mode 100644 index 00000000000..04487abd327 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/pointer.cpp @@ -0,0 +1,283 @@ +//===-- lib/runtime/pointer.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/pointer.h" +#include "flang-rt/runtime/allocator-registry.h" +#include "flang-rt/runtime/assign-impl.h" +#include "flang-rt/runtime/derived.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/type-info.h" + +namespace Fortran::runtime { +extern "C" { +RT_EXT_API_GROUP_BEGIN + +void RTDEF(PointerNullifyIntrinsic)(Descriptor &pointer, TypeCategory category, + int kind, int rank, int corank) { + INTERNAL_CHECK(corank == 0); + pointer.Establish(TypeCode{category, kind}, + Descriptor::BytesFor(category, kind), nullptr, rank, nullptr, + CFI_attribute_pointer); +} + +void RTDEF(PointerNullifyCharacter)(Descriptor &pointer, SubscriptValue length, + int kind, int rank, int corank) { + INTERNAL_CHECK(corank == 0); + pointer.Establish( + kind, length, nullptr, rank, nullptr, CFI_attribute_pointer); +} + +void RTDEF(PointerNullifyDerived)(Descriptor &pointer, + const typeInfo::DerivedType &derivedType, int rank, int corank) { + INTERNAL_CHECK(corank == 0); + pointer.Establish(derivedType, nullptr, rank, nullptr, CFI_attribute_pointer); +} + +void RTDEF(PointerSetBounds)(Descriptor &pointer, int zeroBasedDim, + SubscriptValue lower, SubscriptValue upper) { + INTERNAL_CHECK(zeroBasedDim >= 0 && zeroBasedDim < pointer.rank()); + pointer.GetDimension(zeroBasedDim).SetBounds(lower, upper); + // The byte strides are computed when the pointer is allocated. +} + +// TODO: PointerSetCoBounds + +void RTDEF(PointerSetDerivedLength)( + Descriptor &pointer, int which, SubscriptValue x) { + DescriptorAddendum *addendum{pointer.Addendum()}; + INTERNAL_CHECK(addendum != nullptr); + addendum->SetLenParameterValue(which, x); +} + +void RTDEF(PointerApplyMold)( + Descriptor &pointer, const Descriptor &mold, int rank) { + pointer.ApplyMold(mold, rank); +} + +void RTDEF(PointerAssociateScalar)(Descriptor &pointer, void *target) { + pointer.set_base_addr(target); +} + +void RTDEF(PointerAssociate)(Descriptor &pointer, const Descriptor &target) { + pointer = target; + pointer.raw().attribute = CFI_attribute_pointer; +} + +void RTDEF(PointerAssociateLowerBounds)(Descriptor &pointer, + const Descriptor &target, const Descriptor &lowerBounds) { + pointer = target; + pointer.raw().attribute = CFI_attribute_pointer; + int rank{pointer.rank()}; + Terminator terminator{__FILE__, __LINE__}; + std::size_t boundElementBytes{lowerBounds.ElementBytes()}; + for (int j{0}; j < rank; ++j) { + Dimension &dim{pointer.GetDimension(j)}; + dim.SetLowerBound(dim.Extent() == 0 + ? 1 + : GetInt64(lowerBounds.ZeroBasedIndexedElement<const char>(j), + boundElementBytes, terminator)); + } +} + +void RTDEF(PointerAssociateRemapping)(Descriptor &pointer, + const Descriptor &target, const Descriptor &bounds, const char *sourceFile, + int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + SubscriptValue byteStride{/*captured from first dimension*/}; + std::size_t boundElementBytes{bounds.ElementBytes()}; + std::size_t boundsRank{ + static_cast<std::size_t>(bounds.GetDimension(1).Extent())}; + // We cannot just assign target into pointer descriptor, because + // the ranks may mismatch. Use target as a mold for initializing + // the pointer descriptor. + INTERNAL_CHECK(static_cast<std::size_t>(pointer.rank()) == boundsRank); + pointer.ApplyMold(target, boundsRank); + pointer.set_base_addr(target.raw().base_addr); + pointer.raw().attribute = CFI_attribute_pointer; + for (unsigned j{0}; j < boundsRank; ++j) { + auto &dim{pointer.GetDimension(j)}; + dim.SetBounds(GetInt64(bounds.ZeroBasedIndexedElement<const char>(2 * j), + boundElementBytes, terminator), + GetInt64(bounds.ZeroBasedIndexedElement<const char>(2 * j + 1), + boundElementBytes, terminator)); + if (j == 0) { + byteStride = dim.ByteStride() * dim.Extent(); + } else { + dim.SetByteStride(byteStride); + byteStride *= dim.Extent(); + } + } + std::size_t pointerElements{pointer.Elements()}; + std::size_t targetElements{target.Elements()}; + if (pointerElements > targetElements) { + terminator.Crash("PointerAssociateRemapping: too many elements in remapped " + "pointer (%zd > %zd)", + pointerElements, targetElements); + } +} + +RT_API_ATTRS void *AllocateValidatedPointerPayload( + std::size_t byteSize, int allocatorIdx) { + // Add space for a footer to validate during deallocation. + constexpr std::size_t align{sizeof(std::uintptr_t)}; + byteSize = ((byteSize + align - 1) / align) * align; + std::size_t total{byteSize + sizeof(std::uintptr_t)}; + AllocFct alloc{allocatorRegistry.GetAllocator(allocatorIdx)}; + void *p{alloc(total, /*asyncObject=*/nullptr)}; + if (p && allocatorIdx == 0) { + // Fill the footer word with the XOR of the ones' complement of + // the base address, which is a value that would be highly unlikely + // to appear accidentally at the right spot. + std::uintptr_t *footer{ + reinterpret_cast<std::uintptr_t *>(static_cast<char *>(p) + byteSize)}; + *footer = ~reinterpret_cast<std::uintptr_t>(p); + } + return p; +} + +int RTDEF(PointerAllocate)(Descriptor &pointer, bool hasStat, + const Descriptor *errMsg, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (!pointer.IsPointer()) { + return ReturnError(terminator, StatInvalidDescriptor, errMsg, hasStat); + } + std::size_t elementBytes{pointer.ElementBytes()}; + if (static_cast<std::int64_t>(elementBytes) < 0) { + // F'2023 7.4.4.2 p5: "If the character length parameter value evaluates + // to a negative value, the length of character entities declared is zero." + elementBytes = pointer.raw().elem_len = 0; + } + std::size_t byteSize{pointer.Elements() * elementBytes}; + void *p{AllocateValidatedPointerPayload(byteSize, pointer.GetAllocIdx())}; + if (!p) { + return ReturnError(terminator, CFI_ERROR_MEM_ALLOCATION, errMsg, hasStat); + } + pointer.set_base_addr(p); + pointer.SetByteStrides(); + int stat{StatOk}; + if (const DescriptorAddendum * addendum{pointer.Addendum()}) { + if (const auto *derived{addendum->derivedType()}) { + if (!derived->noInitializationNeeded()) { + stat = Initialize(pointer, *derived, terminator, hasStat, errMsg); + } + } + } + return ReturnError(terminator, stat, errMsg, hasStat); +} + +int RTDEF(PointerAllocateSource)(Descriptor &pointer, const Descriptor &source, + bool hasStat, const Descriptor *errMsg, const char *sourceFile, + int sourceLine) { + int stat{RTNAME(PointerAllocate)( + pointer, hasStat, errMsg, sourceFile, sourceLine)}; + if (stat == StatOk) { + Terminator terminator{sourceFile, sourceLine}; + DoFromSourceAssign(pointer, source, terminator); + } + return stat; +} + +static RT_API_ATTRS std::size_t GetByteSize( + const ISO::CFI_cdesc_t &descriptor) { + std::size_t rank{descriptor.rank}; + const ISO::CFI_dim_t *dim{descriptor.dim}; + std::size_t byteSize{descriptor.elem_len}; + for (std::size_t j{0}; j < rank; ++j) { + byteSize *= dim[j].extent; + } + return byteSize; +} + +bool RT_API_ATTRS ValidatePointerPayload(const ISO::CFI_cdesc_t &desc) { + std::size_t byteSize{GetByteSize(desc)}; + constexpr std::size_t align{sizeof(std::uintptr_t)}; + byteSize = ((byteSize + align - 1) / align) * align; + const void *p{desc.base_addr}; + const std::uintptr_t *footer{reinterpret_cast<const std::uintptr_t *>( + static_cast<const char *>(p) + byteSize)}; + return *footer == ~reinterpret_cast<std::uintptr_t>(p); +} + +int RTDEF(PointerDeallocate)(Descriptor &pointer, bool hasStat, + const Descriptor *errMsg, const char *sourceFile, int sourceLine) { + Terminator terminator{sourceFile, sourceLine}; + if (!pointer.IsPointer()) { + return ReturnError(terminator, StatInvalidDescriptor, errMsg, hasStat); + } + if (!pointer.IsAllocated()) { + return ReturnError(terminator, StatBaseNull, errMsg, hasStat); + } + if (executionEnvironment.checkPointerDeallocation && + pointer.GetAllocIdx() == kDefaultAllocator && + !ValidatePointerPayload(pointer.raw())) { + return ReturnError(terminator, StatBadPointerDeallocation, errMsg, hasStat); + } + return ReturnError(terminator, + pointer.Destroy(/*finalize=*/true, /*destroyPointers=*/true, &terminator), + errMsg, hasStat); +} + +int RTDEF(PointerDeallocatePolymorphic)(Descriptor &pointer, + const typeInfo::DerivedType *derivedType, bool hasStat, + const Descriptor *errMsg, const char *sourceFile, int sourceLine) { + int stat{RTNAME(PointerDeallocate)( + pointer, hasStat, errMsg, sourceFile, sourceLine)}; + if (stat == StatOk) { + if (DescriptorAddendum * addendum{pointer.Addendum()}) { + addendum->set_derivedType(derivedType); + pointer.raw().type = derivedType ? CFI_type_struct : CFI_type_other; + } else { + // Unlimited polymorphic descriptors initialized with + // PointerNullifyIntrinsic do not have an addendum. Make sure the + // derivedType is null in that case. + INTERNAL_CHECK(!derivedType); + pointer.raw().type = CFI_type_other; + } + } + return stat; +} + +bool RTDEF(PointerIsAssociated)(const Descriptor &pointer) { + return pointer.raw().base_addr != nullptr; +} + +bool RTDEF(PointerIsAssociatedWith)( + const Descriptor &pointer, const Descriptor *target) { + if (!target) { + return pointer.raw().base_addr != nullptr; + } + if (!target->raw().base_addr || + (target->raw().type != CFI_type_struct && target->ElementBytes() == 0)) { + return false; + } + int rank{pointer.rank()}; + if (pointer.raw().base_addr != target->raw().base_addr || + pointer.ElementBytes() != target->ElementBytes() || + rank != target->rank()) { + return false; + } + for (int j{0}; j < rank; ++j) { + const Dimension &pDim{pointer.GetDimension(j)}; + const Dimension &tDim{target->GetDimension(j)}; + auto pExtent{pDim.Extent()}; + if (pExtent == 0 || pExtent != tDim.Extent() || + (pExtent != 1 && pDim.ByteStride() != tDim.ByteStride())) { + return false; + } + } + return true; +} + +// TODO: PointerCheckLengthParameter + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/product.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/product.cpp new file mode 100644 index 00000000000..02fdc2bfcd5 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/product.cpp @@ -0,0 +1,214 @@ +//===-- lib/runtime/product.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements PRODUCT for all required operand types and shapes. + +#include "flang-rt/runtime/reduction-templates.h" +#include "flang/Common/float128.h" +#include "flang/Runtime/reduction.h" +#include <cfloat> +#include <cinttypes> +#include <complex> + +namespace Fortran::runtime { +template <typename INTERMEDIATE> class NonComplexProductAccumulator { +public: + explicit RT_API_ATTRS NonComplexProductAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { product_ = 1; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + *p = static_cast<A>(product_); + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + product_ *= *array_.Element<A>(at); + return product_ != 0; + } + +private: + const Descriptor &array_; + INTERMEDIATE product_{1}; +}; + +template <typename PART> class ComplexProductAccumulator { +public: + explicit RT_API_ATTRS ComplexProductAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { product_ = rtcmplx::complex<PART>{1, 0}; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + using ResultPart = typename A::value_type; + *p = {static_cast<ResultPart>(product_.real()), + static_cast<ResultPart>(product_.imag())}; + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + product_ *= *array_.Element<A>(at); + return true; + } + +private: + const Descriptor &array_; + rtcmplx::complex<PART> product_{1, 0}; +}; + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(ProductInteger1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 1>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, + "PRODUCT"); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(ProductInteger2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 2>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, + "PRODUCT"); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(ProductInteger4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 4>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, + "PRODUCT"); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(ProductInteger8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 8>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Integer, 8>>{x}, + "PRODUCT"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(ProductInteger16)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 16>(x, source, line, dim, + mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Integer, 16>>{x}, + "PRODUCT"); +} +#endif + +CppTypeFor<TypeCategory::Unsigned, 1> RTDEF(ProductUnsigned1)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 1>(x, source, line, dim, + mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Unsigned, 4>>{x}, + "PRODUCT"); +} +CppTypeFor<TypeCategory::Unsigned, 2> RTDEF(ProductUnsigned2)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 2>(x, source, line, dim, + mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Unsigned, 4>>{x}, + "PRODUCT"); +} +CppTypeFor<TypeCategory::Unsigned, 4> RTDEF(ProductUnsigned4)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 4>(x, source, line, dim, + mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Unsigned, 4>>{x}, + "PRODUCT"); +} +CppTypeFor<TypeCategory::Unsigned, 8> RTDEF(ProductUnsigned8)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 8>(x, source, line, dim, + mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Unsigned, 8>>{x}, + "PRODUCT"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Unsigned, 16> RTDEF(ProductUnsigned16)( + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 16>(x, source, line, dim, + mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Unsigned, 16>>{x}, + "PRODUCT"); +} +#endif + +// TODO: real/complex(2 & 3) +CppTypeFor<TypeCategory::Real, 4> RTDEF(ProductReal4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 4>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 4>>{x}, + "PRODUCT"); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(ProductReal8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 8>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 8>>{x}, + "PRODUCT"); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(ProductReal10)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 10>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 10>>{x}, + "PRODUCT"); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(ProductReal16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 16>(x, source, line, dim, mask, + NonComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 16>>{x}, + "PRODUCT"); +} +#endif + +void RTDEF(CppProductComplex4)(CppTypeFor<TypeCategory::Complex, 4> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = GetTotalReduction<TypeCategory::Complex, 4>(x, source, line, dim, + mask, ComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 4>>{x}, + "PRODUCT"); +} +void RTDEF(CppProductComplex8)(CppTypeFor<TypeCategory::Complex, 8> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = GetTotalReduction<TypeCategory::Complex, 8>(x, source, line, dim, + mask, ComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 8>>{x}, + "PRODUCT"); +} +#if HAS_FLOAT80 +void RTDEF(CppProductComplex10)(CppTypeFor<TypeCategory::Complex, 10> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = GetTotalReduction<TypeCategory::Complex, 10>(x, source, line, dim, + mask, ComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 10>>{x}, + "PRODUCT"); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(CppProductComplex16)(CppTypeFor<TypeCategory::Complex, 16> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = GetTotalReduction<TypeCategory::Complex, 16>(x, source, line, dim, + mask, ComplexProductAccumulator<CppTypeFor<TypeCategory::Real, 16>>{x}, + "PRODUCT"); +} +#endif + +void RTDEF(ProductDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line, const Descriptor *mask) { + TypedPartialNumericReduction<NonComplexProductAccumulator, + NonComplexProductAccumulator, ComplexProductAccumulator, + /*MIN_REAL_KIND=*/4>(result, x, dim, source, line, mask, "PRODUCT"); +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/pseudo-unit.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/pseudo-unit.cpp new file mode 100644 index 00000000000..7e1f3bc86b2 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/pseudo-unit.cpp @@ -0,0 +1,169 @@ +//===-- lib/runtime/pseudo-unit.cpp -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Implemenation of ExternalFileUnit and PseudoOpenFile for +// RT_USE_PSEUDO_FILE_UNIT=1. +// +//===----------------------------------------------------------------------===// + +#include "unit.h" +#include "flang-rt/runtime/io-error.h" +#include "flang-rt/runtime/tools.h" + +// NOTE: the header files above may define OpenMP declare target +// variables, so they have to be included unconditionally +// so that the offload entries are consistent between host and device. +#if defined(RT_USE_PSEUDO_FILE_UNIT) +#include <cstdio> + +namespace Fortran::runtime::io { + +void FlushOutputOnCrash(const Terminator &) {} + +ExternalFileUnit *ExternalFileUnit::LookUp(int) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +ExternalFileUnit *ExternalFileUnit::LookUpOrCreate( + int, const Terminator &, bool &) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +ExternalFileUnit *ExternalFileUnit::LookUpOrCreateAnonymous(int unit, + Direction direction, Fortran::common::optional<bool>, + IoErrorHandler &handler) { + if (direction != Direction::Output) { + handler.Crash("ExternalFileUnit only supports output IO"); + } + return New<ExternalFileUnit>{handler}(unit).release(); +} + +ExternalFileUnit *ExternalFileUnit::LookUp(const char *, std::size_t) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +ExternalFileUnit &ExternalFileUnit::CreateNew(int, const Terminator &) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +ExternalFileUnit *ExternalFileUnit::LookUpForClose(int) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +ExternalFileUnit &ExternalFileUnit::NewUnit(const Terminator &, bool) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +bool ExternalFileUnit::OpenUnit(Fortran::common::optional<OpenStatus> status, + Fortran::common::optional<Action>, Position, OwningPtr<char> &&, + std::size_t, Convert, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +bool ExternalFileUnit::OpenAnonymousUnit(Fortran::common::optional<OpenStatus>, + Fortran::common::optional<Action>, Position, Convert convert, + IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +void ExternalFileUnit::CloseUnit(CloseStatus, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +void ExternalFileUnit::DestroyClosed() { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +Iostat ExternalFileUnit::SetDirection(Direction direction) { + if (direction != Direction::Output) { + return IostatReadFromWriteOnly; + } + direction_ = direction; + return IostatOk; +} + +void ExternalFileUnit::CloseAll(IoErrorHandler &) {} + +void ExternalFileUnit::FlushAll(IoErrorHandler &) {} + +int ExternalFileUnit::GetAsynchronousId(IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +bool ExternalFileUnit::Wait(int) { + Terminator{__FILE__, __LINE__}.Crash("unsupported"); +} + +void PseudoOpenFile::set_mayAsynchronous(bool yes) { + if (yes) { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); + } +} + +Fortran::common::optional<PseudoOpenFile::FileOffset> +PseudoOpenFile::knownSize() const { + Terminator{__FILE__, __LINE__}.Crash("unsupported"); +} + +void PseudoOpenFile::Open(OpenStatus, Fortran::common::optional<Action>, + Position, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +void PseudoOpenFile::Close(CloseStatus, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +std::size_t PseudoOpenFile::Read( + FileOffset, char *, std::size_t, std::size_t, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +std::size_t PseudoOpenFile::Write(FileOffset at, const char *buffer, + std::size_t bytes, IoErrorHandler &handler) { + if (at) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); + } + // TODO: use persistent string buffer that can be reallocated + // as needed, and only freed at destruction of *this. + auto string{SizedNew<char>{handler}(bytes + 1)}; + std::memcpy(string.get(), buffer, bytes); + string.get()[bytes] = '\0'; + std::printf("%s", string.get()); + return bytes; +} + +void PseudoOpenFile::Truncate(FileOffset, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +int PseudoOpenFile::ReadAsynchronously( + FileOffset, char *, std::size_t, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +int PseudoOpenFile::WriteAsynchronously( + FileOffset, const char *, std::size_t, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +void PseudoOpenFile::Wait(int, IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +void PseudoOpenFile::WaitAll(IoErrorHandler &handler) { + handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +Position PseudoOpenFile::InquirePosition() const { + Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); +} + +} // namespace Fortran::runtime::io + +#endif // defined(RT_USE_PSEUDO_FILE_UNIT) diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ragged.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ragged.cpp new file mode 100644 index 00000000000..dddc3ccdfd8 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/ragged.cpp @@ -0,0 +1,85 @@ +//===-- lib/runtime/ragged.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/ragged.h" +#include "flang-rt/runtime/tools.h" +#include <cstdlib> + +namespace Fortran::runtime { + +inline RT_API_ATTRS bool isIndirection(const RaggedArrayHeader *const header) { + return header->flags & 1; +} + +inline RT_API_ATTRS std::size_t rank(const RaggedArrayHeader *const header) { + return header->flags >> 1; +} + +RT_API_ATTRS RaggedArrayHeader *RaggedArrayAllocate(RaggedArrayHeader *header, + bool isHeader, std::int64_t rank, std::int64_t elementSize, + std::int64_t *extentVector) { + if (header && rank) { + std::int64_t size{1}; + for (std::int64_t counter{0}; counter < rank; ++counter) { + size *= extentVector[counter]; + if (size <= 0) { + return nullptr; + } + } + header->flags = (rank << 1) | isHeader; + header->extentPointer = extentVector; + if (isHeader) { + elementSize = sizeof(RaggedArrayHeader); + } + Terminator terminator{__FILE__, __LINE__}; + std::size_t bytes{static_cast<std::size_t>(elementSize * size)}; + header->bufferPointer = AllocateMemoryOrCrash(terminator, bytes); + if (header->bufferPointer) { + std::memset(header->bufferPointer, 0, bytes); + } + return header; + } else { + return nullptr; + } +} + +// Deallocate a ragged array from the heap. +RT_API_ATTRS void RaggedArrayDeallocate(RaggedArrayHeader *raggedArrayHeader) { + if (raggedArrayHeader) { + if (std::size_t end{rank(raggedArrayHeader)}) { + if (isIndirection(raggedArrayHeader)) { + std::size_t linearExtent{1u}; + for (std::size_t counter{0u}; counter < end && linearExtent > 0; + ++counter) { + linearExtent *= raggedArrayHeader->extentPointer[counter]; + } + for (std::size_t counter{0u}; counter < linearExtent; ++counter) { + RaggedArrayDeallocate(&static_cast<RaggedArrayHeader *>( + raggedArrayHeader->bufferPointer)[counter]); + } + } + std::free(raggedArrayHeader->bufferPointer); + std::free(raggedArrayHeader->extentPointer); + raggedArrayHeader->flags = 0u; + } + } +} + +extern "C" { +void *RTDEF(RaggedArrayAllocate)(void *header, bool isHeader, std::int64_t rank, + std::int64_t elementSize, std::int64_t *extentVector) { + auto *result = RaggedArrayAllocate(static_cast<RaggedArrayHeader *>(header), + isHeader, rank, elementSize, extentVector); + return static_cast<void *>(result); +} + +void RTDEF(RaggedArrayDeallocate)(void *raggedArrayHeader) { + RaggedArrayDeallocate(static_cast<RaggedArrayHeader *>(raggedArrayHeader)); +} +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/random.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/random.cpp new file mode 100644 index 00000000000..dc74f2725ed --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/random.cpp @@ -0,0 +1,228 @@ +//===-- lib/runtime/random.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements the intrinsic subroutines RANDOM_INIT, RANDOM_NUMBER, and +// RANDOM_SEED. + +#include "flang/Runtime/random.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/lock.h" +#include "flang-rt/runtime/random-templates.h" +#include "flang-rt/runtime/terminator.h" +#include "flang/Common/float128.h" +#include "flang/Common/leading-zero-bit-count.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/cpp-type.h" +#include <cmath> +#include <cstdint> +#include <limits> +#include <memory> +#include <time.h> + +namespace Fortran::runtime::random { + +Lock lock; +Generator generator; +Fortran::common::optional<GeneratedWord> nextValue; + +extern "C" { + +void RTNAME(RandomInit)(bool repeatable, bool /*image_distinct*/) { + // TODO: multiple images and image_distinct: add image number + { + CriticalSection critical{lock}; + if (repeatable) { + generator.seed(0); + } else { +#ifdef CLOCK_REALTIME + timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + generator.seed(ts.tv_sec ^ ts.tv_nsec); +#else + generator.seed(time(nullptr)); +#endif + } + } +} + +void RTNAME(RandomNumber)( + const Descriptor &harvest, const char *source, int line) { + Terminator terminator{source, line}; + auto typeCode{harvest.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + typeCode && + (typeCode->first == TypeCategory::Real || + typeCode->first == TypeCategory::Unsigned)); + int kind{typeCode->second}; + if (typeCode->first == TypeCategory::Real) { + switch (kind) { + // TODO: REAL (2 & 3) + case 4: + GenerateReal<CppTypeFor<TypeCategory::Real, 4>, 24>(harvest); + return; + case 8: + GenerateReal<CppTypeFor<TypeCategory::Real, 8>, 53>(harvest); + return; + case 10: + if constexpr (HasCppTypeFor<TypeCategory::Real, 10>) { +#if HAS_FLOAT80 + GenerateReal<CppTypeFor<TypeCategory::Real, 10>, 64>(harvest); + return; +#endif + } + break; + } + terminator.Crash( + "not yet implemented: intrinsic: REAL(KIND=%d) in RANDOM_NUMBER", kind); + } else if (typeCode->first == TypeCategory::Unsigned) { + switch (kind) { + case 1: + GenerateUnsigned<CppTypeFor<TypeCategory::Unsigned, 1>>(harvest); + return; + case 2: + GenerateUnsigned<CppTypeFor<TypeCategory::Unsigned, 2>>(harvest); + return; + case 4: + GenerateUnsigned<CppTypeFor<TypeCategory::Unsigned, 4>>(harvest); + return; + case 8: + GenerateUnsigned<CppTypeFor<TypeCategory::Unsigned, 8>>(harvest); + return; +#ifdef __SIZEOF_INT128__ + case 16: + if constexpr (HasCppTypeFor<TypeCategory::Unsigned, 16>) { + GenerateUnsigned<CppTypeFor<TypeCategory::Unsigned, 16>>(harvest); + return; + } + break; +#endif + } + terminator.Crash( + "not yet implemented: intrinsic: UNSIGNED(KIND=%d) in RANDOM_NUMBER", + kind); + } +} + +void RTNAME(RandomSeedSize)( + const Descriptor *size, const char *source, int line) { + if (!size || !size->raw().base_addr) { + RTNAME(RandomSeedDefaultPut)(); + return; + } + Terminator terminator{source, line}; + auto typeCode{size->type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + size->rank() == 0 && typeCode && + typeCode->first == TypeCategory::Integer); + int sizeArg{typeCode->second}; + switch (sizeArg) { + case 4: + *size->OffsetElement<CppTypeFor<TypeCategory::Integer, 4>>() = 1; + break; + case 8: + *size->OffsetElement<CppTypeFor<TypeCategory::Integer, 8>>() = 1; + break; + default: + terminator.Crash( + "not yet implemented: intrinsic: RANDOM_SEED(SIZE=): size %d\n", + sizeArg); + } +} + +void RTNAME(RandomSeedPut)( + const Descriptor *put, const char *source, int line) { + if (!put || !put->raw().base_addr) { + RTNAME(RandomSeedDefaultPut)(); + return; + } + Terminator terminator{source, line}; + auto typeCode{put->type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + put->rank() == 1 && typeCode && + typeCode->first == TypeCategory::Integer && + put->GetDimension(0).Extent() >= 1); + int putArg{typeCode->second}; + GeneratedWord seed; + switch (putArg) { + case 4: + seed = *put->OffsetElement<CppTypeFor<TypeCategory::Integer, 4>>(); + break; + case 8: + seed = *put->OffsetElement<CppTypeFor<TypeCategory::Integer, 8>>(); + break; + default: + terminator.Crash( + "not yet implemented: intrinsic: RANDOM_SEED(PUT=): put %d\n", putArg); + } + { + CriticalSection critical{lock}; + generator.seed(seed); + nextValue = seed; + } +} + +void RTNAME(RandomSeedDefaultPut)() { + // TODO: should this be time &/or image dependent? + { + CriticalSection critical{lock}; + generator.seed(0); + } +} + +void RTNAME(RandomSeedGet)( + const Descriptor *get, const char *source, int line) { + if (!get || !get->raw().base_addr) { + RTNAME(RandomSeedDefaultPut)(); + return; + } + Terminator terminator{source, line}; + auto typeCode{get->type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + get->rank() == 1 && typeCode && + typeCode->first == TypeCategory::Integer && + get->GetDimension(0).Extent() >= 1); + int getArg{typeCode->second}; + GeneratedWord seed; + { + CriticalSection critical{lock}; + seed = GetNextValue(); + nextValue = seed; + } + switch (getArg) { + case 4: + *get->OffsetElement<CppTypeFor<TypeCategory::Integer, 4>>() = seed; + break; + case 8: + *get->OffsetElement<CppTypeFor<TypeCategory::Integer, 8>>() = seed; + break; + default: + terminator.Crash( + "not yet implemented: intrinsic: RANDOM_SEED(GET=): get %d\n", getArg); + } +} + +void RTNAME(RandomSeed)(const Descriptor *size, const Descriptor *put, + const Descriptor *get, const char *source, int line) { + bool sizePresent = size && size->raw().base_addr; + bool putPresent = put && put->raw().base_addr; + bool getPresent = get && get->raw().base_addr; + if (sizePresent + putPresent + getPresent > 1) + Terminator{source, line}.Crash( + "RANDOM_SEED must have either 1 or no arguments"); + if (sizePresent) + RTNAME(RandomSeedSize)(size, source, line); + else if (putPresent) + RTNAME(RandomSeedPut)(put, source, line); + else if (getPresent) + RTNAME(RandomSeedGet)(get, source, line); + else + RTNAME(RandomSeedDefaultPut)(); +} + +} // extern "C" +} // namespace Fortran::runtime::random diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/reduce.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/reduce.cpp new file mode 100644 index 00000000000..3c5e815e32d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/reduce.cpp @@ -0,0 +1,1103 @@ +//===-- lib/runtime/reduce.cpp ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// REDUCE() implementation + +#include "flang/Runtime/reduce.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/reduction-templates.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" + +namespace Fortran::runtime { + +template <typename T, bool isByValue> class ReduceAccumulator { +public: + using Operation = std::conditional_t<isByValue, ValueReductionOperation<T>, + ReferenceReductionOperation<T>>; + RT_API_ATTRS ReduceAccumulator(const Descriptor &array, Operation operation, + const T *identity, Terminator &terminator) + : array_{array}, operation_{operation}, identity_{identity}, + terminator_{terminator} {} + RT_API_ATTRS void Reinitialize() { result_.reset(); } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + const auto *operand{array_.Element<A>(at)}; + if (result_) { + if constexpr (isByValue) { + result_ = operation_(*result_, *operand); + } else { + result_ = operation_(&*result_, operand); + } + } else { + result_ = *operand; + } + return true; + } + template <typename A> + RT_API_ATTRS void GetResult(A *to, int /*zeroBasedDim*/ = -1) { + if (result_) { + *to = *result_; + } else if (identity_) { + *to = *identity_; + } else { + terminator_.Crash("REDUCE() without IDENTITY= has no result"); + } + } + +private: + const Descriptor &array_; + common::optional<T> result_; + Operation operation_; + const T *identity_{nullptr}; + Terminator &terminator_; +}; + +template <typename T, typename OP, bool hasLength> +class BufferedReduceAccumulator { +public: + RT_API_ATTRS BufferedReduceAccumulator(const Descriptor &array, OP operation, + const T *identity, Terminator &terminator) + : array_{array}, operation_{operation}, identity_{identity}, + terminator_{terminator} {} + RT_API_ATTRS void Reinitialize() { activeTemp_ = -1; } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + const auto *operand{array_.Element<A>(at)}; + if (activeTemp_ >= 0) { + if constexpr (hasLength) { + operation_(&*temp_[1 - activeTemp_], length_, &*temp_[activeTemp_], + operand, length_, length_); + } else { + operation_(&*temp_[1 - activeTemp_], &*temp_[activeTemp_], operand); + } + activeTemp_ = 1 - activeTemp_; + } else { + activeTemp_ = 0; + std::memcpy(&*temp_[activeTemp_], operand, elementBytes_); + } + return true; + } + template <typename A> + RT_API_ATTRS void GetResult(A *to, int /*zeroBasedDim*/ = -1) { + if (activeTemp_ >= 0) { + std::memcpy(to, &*temp_[activeTemp_], elementBytes_); + } else if (identity_) { + std::memcpy(to, identity_, elementBytes_); + } else { + terminator_.Crash("REDUCE() without IDENTITY= has no result"); + } + } + +private: + const Descriptor &array_; + OP operation_; + const T *identity_{nullptr}; + Terminator &terminator_; + std::size_t elementBytes_{array_.ElementBytes()}; + OwningPtr<T> temp_[2]{SizedNew<T>{terminator_}(elementBytes_), + SizedNew<T>{terminator_}(elementBytes_)}; + int activeTemp_{-1}; + std::size_t length_{elementBytes_ / sizeof(T)}; +}; + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +std::int8_t RTDEF(ReduceInteger1Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 1>(array, source, line, dim, + mask, + ReduceAccumulator<std::int8_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int8_t RTDEF(ReduceInteger1Value)(const Descriptor &array, + ValueReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 1>(array, source, line, dim, + mask, + ReduceAccumulator<std::int8_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceInteger1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int8_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 1>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int8_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 1>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +std::int16_t RTDEF(ReduceInteger2Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 2>(array, source, line, dim, + mask, + ReduceAccumulator<std::int16_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int16_t RTDEF(ReduceInteger2Value)(const Descriptor &array, + ValueReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 2>(array, source, line, dim, + mask, + ReduceAccumulator<std::int16_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceInteger2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int16_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 2>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int16_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 2>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +std::int32_t RTDEF(ReduceInteger4Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 4>(array, source, line, dim, + mask, + ReduceAccumulator<std::int32_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int32_t RTDEF(ReduceInteger4Value)(const Descriptor &array, + ValueReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 4>(array, source, line, dim, + mask, + ReduceAccumulator<std::int32_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceInteger4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int32_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int32_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +std::int64_t RTDEF(ReduceInteger8Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 8>(array, source, line, dim, + mask, + ReduceAccumulator<std::int64_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::int64_t RTDEF(ReduceInteger8Value)(const Descriptor &array, + ValueReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 8>(array, source, line, dim, + mask, + ReduceAccumulator<std::int64_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceInteger8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int64_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::int64_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#ifdef __SIZEOF_INT128__ +common::int128_t RTDEF(ReduceInteger16Ref)(const Descriptor &array, + ReferenceReductionOperation<common::int128_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const common::int128_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 16>(array, source, line, dim, + mask, + ReduceAccumulator<common::int128_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +common::int128_t RTDEF(ReduceInteger16Value)(const Descriptor &array, + ValueReductionOperation<common::int128_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const common::int128_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Integer, 16>(array, source, line, dim, + mask, + ReduceAccumulator<common::int128_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceInteger16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<common::int128_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const common::int128_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<common::int128_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceInteger16DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<common::int128_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const common::int128_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<common::int128_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Integer, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#endif + +std::uint8_t RTDEF(ReduceUnsigned1Ref)(const Descriptor &array, + ReferenceReductionOperation<std::uint8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 1>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint8_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::uint8_t RTDEF(ReduceUnsigned1Value)(const Descriptor &array, + ValueReductionOperation<std::uint8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 1>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint8_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceUnsigned1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint8_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 1>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceUnsigned1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::uint8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint8_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint8_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 1>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +std::uint16_t RTDEF(ReduceUnsigned2Ref)(const Descriptor &array, + ReferenceReductionOperation<std::uint16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 2>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint16_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::uint16_t RTDEF(ReduceUnsigned2Value)(const Descriptor &array, + ValueReductionOperation<std::uint16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 2>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint16_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceUnsigned2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint16_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 2>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceUnsigned2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::uint16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint16_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint16_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 2>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +std::uint32_t RTDEF(ReduceUnsigned4Ref)(const Descriptor &array, + ReferenceReductionOperation<std::uint32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 4>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint32_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::uint32_t RTDEF(ReduceUnsigned4Value)(const Descriptor &array, + ValueReductionOperation<std::uint32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 4>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint32_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceUnsigned4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint32_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceUnsigned4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::uint32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint32_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint32_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +std::uint64_t RTDEF(ReduceUnsigned8Ref)(const Descriptor &array, + ReferenceReductionOperation<std::uint64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 8>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint64_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +std::uint64_t RTDEF(ReduceUnsigned8Value)(const Descriptor &array, + ValueReductionOperation<std::uint64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 8>(array, source, line, dim, + mask, + ReduceAccumulator<std::uint64_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceUnsigned8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint64_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceUnsigned8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::uint64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::uint64_t *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<std::uint64_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#ifdef __SIZEOF_INT128__ +common::uint128_t RTDEF(ReduceUnsigned16Ref)(const Descriptor &array, + ReferenceReductionOperation<common::uint128_t> operation, + const char *source, int line, int dim, const Descriptor *mask, + const common::uint128_t *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 16>(array, source, line, dim, + mask, + ReduceAccumulator<common::uint128_t, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +common::uint128_t RTDEF(ReduceUnsigned16Value)(const Descriptor &array, + ValueReductionOperation<common::uint128_t> operation, const char *source, + int line, int dim, const Descriptor *mask, + const common::uint128_t *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Unsigned, 16>(array, source, line, dim, + mask, + ReduceAccumulator<common::uint128_t, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceUnsigned16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<common::uint128_t> operation, + const char *source, int line, int dim, const Descriptor *mask, + const common::uint128_t *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<common::uint128_t, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceUnsigned16DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<common::uint128_t> operation, const char *source, + int line, int dim, const Descriptor *mask, + const common::uint128_t *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<common::uint128_t, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Unsigned, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#endif + +// TODO: real/complex(2 & 3) +float RTDEF(ReduceReal4Ref)(const Descriptor &array, + ReferenceReductionOperation<float> operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 4>(array, source, line, dim, + mask, + ReduceAccumulator<float, false>{array, operation, identity, terminator}, + "REDUCE"); +} +float RTDEF(ReduceReal4Value)(const Descriptor &array, + ValueReductionOperation<float> operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 4>(array, source, line, dim, + mask, + ReduceAccumulator<float, true>{array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceReal4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<float> operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<float, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<float> operation, const char *source, int line, + int dim, const Descriptor *mask, const float *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<float, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +double RTDEF(ReduceReal8Ref)(const Descriptor &array, + ReferenceReductionOperation<double> operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 8>(array, source, line, dim, + mask, + ReduceAccumulator<double, false>{array, operation, identity, terminator}, + "REDUCE"); +} +double RTDEF(ReduceReal8Value)(const Descriptor &array, + ValueReductionOperation<double> operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 8>(array, source, line, dim, + mask, + ReduceAccumulator<double, true>{array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceReal8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<double> operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<double, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<double> operation, const char *source, int line, + int dim, const Descriptor *mask, const double *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<double, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(ReduceReal10Ref)( + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Real, 10>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Real, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 10>(array, source, line, dim, + mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Real, 10>, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +CppTypeFor<TypeCategory::Real, 10> RTDEF(ReduceReal10Value)( + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Real, 10>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Real, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 10>(array, source, line, dim, + mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Real, 10>, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceReal10DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Real, 10>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Real, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Real, 10>, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 10>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal10DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Real, 10>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Real, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Real, 10>, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 10>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDEF(ReduceReal16Ref)(const Descriptor &array, + ReferenceReductionOperation<CppFloat128Type> operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 16>(array, source, line, dim, + mask, + ReduceAccumulator<CppFloat128Type, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +CppFloat128Type RTDEF(ReduceReal16Value)(const Descriptor &array, + ValueReductionOperation<CppFloat128Type> operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, + bool ordered) { + Terminator terminator{source, line}; + return GetTotalReduction<TypeCategory::Real, 16>(array, source, line, dim, + mask, + ReduceAccumulator<CppFloat128Type, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(ReduceReal16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<CppFloat128Type> operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<CppFloat128Type, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceReal16DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<CppFloat128Type> operation, const char *source, + int line, int dim, const Descriptor *mask, const CppFloat128Type *identity, + bool ordered) { + Terminator terminator{source, line}; + using Accumulator = ReduceAccumulator<CppFloat128Type, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Real, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#endif + +void RTDEF(CppReduceComplex4Ref)(CppTypeFor<TypeCategory::Complex, 4> &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 4> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 4>(array, source, line, dim, + mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 4>, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex4Value)(CppTypeFor<TypeCategory::Complex, 4> &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 4> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 4>(array, source, line, dim, + mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 4>, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 4> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 4>, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex4DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 4> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 4>, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex8Ref)(CppTypeFor<TypeCategory::Complex, 8> &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 8>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 8> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 8>(array, source, line, dim, + mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 8>, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex8Value)(CppTypeFor<TypeCategory::Complex, 8> &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 8>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 8> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 8>(array, source, line, dim, + mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 8>, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 8>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 8> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 8>, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex8DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 8>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 8> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 8>, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 8>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#if HAS_FLOAT80 +void RTDEF(CppReduceComplex10Ref)(CppTypeFor<TypeCategory::Complex, 10> &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 10>> + operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 10>(array, source, line, + dim, mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 10>, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex10Value)( + CppTypeFor<TypeCategory::Complex, 10> &result, const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 10>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 10>(array, source, line, + dim, mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 10>, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex10DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 10>> + operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 10>, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 10>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex10DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 10>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 10> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 10>, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 10>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(CppReduceComplex16Ref)(CppTypeFor<TypeCategory::Complex, 16> &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 16>> + operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 16> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 16>(array, source, line, + dim, mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 16>, false>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex16Value)( + CppTypeFor<TypeCategory::Complex, 16> &result, const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 16>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 16> *identity, bool ordered) { + Terminator terminator{source, line}; + result = GetTotalReduction<TypeCategory::Complex, 16>(array, source, line, + dim, mask, + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 16>, true>{ + array, operation, identity, terminator}, + "REDUCE"); +} +void RTDEF(CppReduceComplex16DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 16>> + operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 16> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 16>, false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(CppReduceComplex16DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 16>> operation, + const char *source, int line, int dim, const Descriptor *mask, + const CppTypeFor<TypeCategory::Complex, 16> *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = + ReduceAccumulator<CppTypeFor<TypeCategory::Complex, 16>, true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Complex, 16>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +#endif + +bool RTDEF(ReduceLogical1Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + return RTNAME(ReduceInteger1Ref)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +bool RTDEF(ReduceLogical1Value)(const Descriptor &array, + ValueReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + return RTNAME(ReduceInteger1Value)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +void RTDEF(ReduceLogical1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + RTNAME(ReduceInteger1DimRef) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +void RTDEF(ReduceLogical1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int8_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int8_t *identity, + bool ordered) { + RTNAME(ReduceInteger1DimValue) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +bool RTDEF(ReduceLogical2Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + return RTNAME(ReduceInteger2Ref)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +bool RTDEF(ReduceLogical2Value)(const Descriptor &array, + ValueReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + return RTNAME(ReduceInteger2Value)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +void RTDEF(ReduceLogical2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + RTNAME(ReduceInteger2DimRef) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +void RTDEF(ReduceLogical2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int16_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int16_t *identity, + bool ordered) { + RTNAME(ReduceInteger2DimValue) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +bool RTDEF(ReduceLogical4Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + return RTNAME(ReduceInteger4Ref)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +bool RTDEF(ReduceLogical4Value)(const Descriptor &array, + ValueReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + return RTNAME(ReduceInteger4Value)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +void RTDEF(ReduceLogical4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + RTNAME(ReduceInteger4DimRef) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +void RTDEF(ReduceLogical4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int32_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int32_t *identity, + bool ordered) { + RTNAME(ReduceInteger4DimValue) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +bool RTDEF(ReduceLogical8Ref)(const Descriptor &array, + ReferenceReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + return RTNAME(ReduceInteger8Ref)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +bool RTDEF(ReduceLogical8Value)(const Descriptor &array, + ValueReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + return RTNAME(ReduceInteger8Value)( + array, operation, source, line, dim, mask, identity, ordered) != 0; +} +void RTDEF(ReduceLogical8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + RTNAME(ReduceInteger8DimRef) + (result, array, operation, source, line, dim, mask, identity, ordered); +} +void RTDEF(ReduceLogical8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int64_t> operation, const char *source, + int line, int dim, const Descriptor *mask, const std::int64_t *identity, + bool ordered) { + RTNAME(ReduceInteger8DimValue) + (result, array, operation, source, line, dim, mask, identity, ordered); +} + +void RTDEF(ReduceChar1)(char *result, const Descriptor &array, + ReductionCharOperation<char> operation, const char *source, int line, + int dim, const Descriptor *mask, const char *identity, bool ordered) { + Terminator terminator{source, line}; + BufferedReduceAccumulator<char, ReductionCharOperation<char>, + /*hasLength=*/true> + accumulator{array, operation, identity, terminator}; + DoTotalReduction<char>(array, dim, mask, accumulator, "REDUCE", terminator); + accumulator.GetResult(result); +} +void RTDEF(ReduceCharacter1Dim)(Descriptor &result, const Descriptor &array, + ReductionCharOperation<char> operation, const char *source, int line, + int dim, const Descriptor *mask, const char *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = BufferedReduceAccumulator<char, + ReductionCharOperation<char>, /*hasLength=*/true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Character, 1>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceChar2)(char16_t *result, const Descriptor &array, + ReductionCharOperation<char16_t> operation, const char *source, int line, + int dim, const Descriptor *mask, const char16_t *identity, bool ordered) { + Terminator terminator{source, line}; + BufferedReduceAccumulator<char16_t, ReductionCharOperation<char16_t>, + /*hasLength=*/true> + accumulator{array, operation, identity, terminator}; + DoTotalReduction<char16_t>( + array, dim, mask, accumulator, "REDUCE", terminator); + accumulator.GetResult(result); +} +void RTDEF(ReduceCharacter2Dim)(Descriptor &result, const Descriptor &array, + ReductionCharOperation<char16_t> operation, const char *source, int line, + int dim, const Descriptor *mask, const char16_t *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = BufferedReduceAccumulator<char16_t, + ReductionCharOperation<char16_t>, /*hasLength=*/true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Character, 2>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} +void RTDEF(ReduceChar4)(char32_t *result, const Descriptor &array, + ReductionCharOperation<char32_t> operation, const char *source, int line, + int dim, const Descriptor *mask, const char32_t *identity, bool ordered) { + Terminator terminator{source, line}; + BufferedReduceAccumulator<char32_t, ReductionCharOperation<char32_t>, + /*hasLength=*/true> + accumulator{array, operation, identity, terminator}; + DoTotalReduction<char32_t>( + array, dim, mask, accumulator, "REDUCE", terminator); + accumulator.GetResult(result); +} +void RTDEF(ReduceCharacter4Dim)(Descriptor &result, const Descriptor &array, + ReductionCharOperation<char32_t> operation, const char *source, int line, + int dim, const Descriptor *mask, const char32_t *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = BufferedReduceAccumulator<char32_t, + ReductionCharOperation<char32_t>, /*hasLength=*/true>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Character, 4>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} + +void RTDEF(ReduceDerivedType)(char *result, const Descriptor &array, + ReductionDerivedTypeOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const char *identity, bool ordered) { + Terminator terminator{source, line}; + BufferedReduceAccumulator<char, ReductionDerivedTypeOperation, + /*hasLength=*/false> + accumulator{array, operation, identity, terminator}; + DoTotalReduction<char>(array, dim, mask, accumulator, "REDUCE", terminator); + accumulator.GetResult(result); +} +void RTDEF(ReduceDerivedTypeDim)(Descriptor &result, const Descriptor &array, + ReductionDerivedTypeOperation operation, const char *source, int line, + int dim, const Descriptor *mask, const char *identity, bool ordered) { + Terminator terminator{source, line}; + using Accumulator = BufferedReduceAccumulator<char, + ReductionDerivedTypeOperation, /*hasLength=*/false>; + Accumulator accumulator{array, operation, identity, terminator}; + PartialReduction<Accumulator, TypeCategory::Derived, 0>(result, array, + array.ElementBytes(), dim, mask, terminator, "REDUCE", accumulator); +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/reduction.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/reduction.cpp new file mode 100644 index 00000000000..6bb47a02ab6 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/reduction.cpp @@ -0,0 +1,409 @@ +//===-- lib/runtime/reduction.cpp -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements ALL, ANY, COUNT, IALL, IANY, IPARITY, & PARITY for all required +// operand types and shapes. +// +// DOT_PRODUCT, FINDLOC, MATMUL, SUM, and PRODUCT are in their own eponymous +// source files. +// NORM2, MAXLOC, MINLOC, MAXVAL, and MINVAL are in extrema.cpp. + +#include "flang/Runtime/reduction.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/reduction-templates.h" +#include <cinttypes> + +namespace Fortran::runtime { + +// IALL, IANY, IPARITY + +template <typename INTERMEDIATE> class IntegerAndAccumulator { +public: + explicit RT_API_ATTRS IntegerAndAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { and_ = ~INTERMEDIATE{0}; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + *p = static_cast<A>(and_); + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + and_ &= *array_.Element<A>(at); + return true; + } + +private: + const Descriptor &array_; + INTERMEDIATE and_{~INTERMEDIATE{0}}; +}; + +template <typename INTERMEDIATE> class IntegerOrAccumulator { +public: + explicit RT_API_ATTRS IntegerOrAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { or_ = 0; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + *p = static_cast<A>(or_); + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + or_ |= *array_.Element<A>(at); + return true; + } + +private: + const Descriptor &array_; + INTERMEDIATE or_{0}; +}; + +template <typename INTERMEDIATE> class IntegerXorAccumulator { +public: + explicit RT_API_ATTRS IntegerXorAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { xor_ = 0; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + *p = static_cast<A>(xor_); + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + xor_ ^= *array_.Element<A>(at); + return true; + } + +private: + const Descriptor &array_; + INTERMEDIATE xor_{0}; +}; + +extern "C" { +CppTypeFor<TypeCategory::Integer, 1> RTDEF(IAll1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 1>(x, source, line, dim, mask, + IntegerAndAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IALL", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(IAll2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 2>(x, source, line, dim, mask, + IntegerAndAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IALL", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(IAll4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 4>(x, source, line, dim, mask, + IntegerAndAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IALL", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(IAll8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 8>(x, source, line, dim, mask, + IntegerAndAccumulator<CppTypeFor<TypeCategory::Integer, 8>>{x}, "IALL", + /*allowUnsignedForInteger=*/true); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(IAll16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 16>(x, source, line, dim, + mask, IntegerAndAccumulator<CppTypeFor<TypeCategory::Integer, 16>>{x}, + "IALL", /*allowUnsignedForInteger=*/true); +} +#endif +void RTDEF(IAllDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line, const Descriptor *mask) { + Terminator terminator{source, line}; + auto catKind{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + catKind.has_value() && + (catKind->first == TypeCategory::Integer || + catKind->first == TypeCategory::Unsigned)); + PartialIntegerReduction<IntegerAndAccumulator>( + result, x, dim, catKind->second, mask, "IALL", terminator); +} + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(IAny1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 1>(x, source, line, dim, mask, + IntegerOrAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IANY", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(IAny2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 2>(x, source, line, dim, mask, + IntegerOrAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IANY", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(IAny4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 4>(x, source, line, dim, mask, + IntegerOrAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IANY", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(IAny8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 8>(x, source, line, dim, mask, + IntegerOrAccumulator<CppTypeFor<TypeCategory::Integer, 8>>{x}, "IANY", + /*allowUnsignedForInteger=*/true); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(IAny16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 16>(x, source, line, dim, + mask, IntegerOrAccumulator<CppTypeFor<TypeCategory::Integer, 16>>{x}, + "IANY", /*allowUnsignedForInteger=*/true); +} +#endif +void RTDEF(IAnyDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line, const Descriptor *mask) { + Terminator terminator{source, line}; + auto catKind{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + catKind.has_value() && + (catKind->first == TypeCategory::Integer || + catKind->first == TypeCategory::Unsigned)); + PartialIntegerReduction<IntegerOrAccumulator>( + result, x, dim, catKind->second, mask, "IANY", terminator); +} + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(IParity1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 1>(x, source, line, dim, mask, + IntegerXorAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IPARITY", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(IParity2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 2>(x, source, line, dim, mask, + IntegerXorAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IPARITY", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(IParity4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 4>(x, source, line, dim, mask, + IntegerXorAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "IPARITY", + /*allowUnsignedForInteger=*/true); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(IParity8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 8>(x, source, line, dim, mask, + IntegerXorAccumulator<CppTypeFor<TypeCategory::Integer, 8>>{x}, "IPARITY", + /*allowUnsignedForInteger=*/true); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(IParity16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 16>(x, source, line, dim, + mask, IntegerXorAccumulator<CppTypeFor<TypeCategory::Integer, 16>>{x}, + "IPARITY", /*allowUnsignedForInteger=*/true); +} +#endif +void RTDEF(IParityDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line, const Descriptor *mask) { + Terminator terminator{source, line}; + auto catKind{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + catKind.has_value() && + (catKind->first == TypeCategory::Integer || + catKind->first == TypeCategory::Unsigned)); + PartialIntegerReduction<IntegerXorAccumulator>( + result, x, dim, catKind->second, mask, "IPARITY", terminator); +} +} + +// ALL, ANY, COUNT, & PARITY + +enum class LogicalReduction { All, Any, Parity }; + +template <LogicalReduction REDUCTION> class LogicalAccumulator { +public: + using Type = bool; + RT_API_ATTRS explicit LogicalAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { + result_ = REDUCTION == LogicalReduction::All; + } + RT_API_ATTRS bool Result() const { return result_; } + RT_API_ATTRS bool Accumulate(bool x) { + if constexpr (REDUCTION == LogicalReduction::Parity) { + result_ = result_ != x; + } else if (x != (REDUCTION == LogicalReduction::All)) { + result_ = x; + return false; + } + return true; + } + template <typename IGNORED = void> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + return Accumulate(IsLogicalElementTrue(array_, at)); + } + +private: + const Descriptor &array_; + bool result_{REDUCTION == LogicalReduction::All}; +}; + +template <typename ACCUMULATOR> +RT_API_ATTRS inline auto GetTotalLogicalReduction(const Descriptor &x, + const char *source, int line, int dim, ACCUMULATOR &&accumulator, + const char *intrinsic) -> typename ACCUMULATOR::Type { + Terminator terminator{source, line}; + if (dim < 0 || dim > 1) { + terminator.Crash("%s: bad DIM=%d for ARRAY with rank=1", intrinsic, dim); + } + SubscriptValue xAt[maxRank]; + x.GetLowerBounds(xAt); + for (auto elements{x.Elements()}; elements--; x.IncrementSubscripts(xAt)) { + if (!accumulator.AccumulateAt(xAt)) { + break; // cut short, result is known + } + } + return accumulator.Result(); +} + +template <typename ACCUMULATOR> +RT_API_ATTRS inline auto ReduceLogicalDimToScalar( + const Descriptor &x, int zeroBasedDim, SubscriptValue subscripts[]) -> + typename ACCUMULATOR::Type { + ACCUMULATOR accumulator{x}; + SubscriptValue xAt[maxRank]; + GetExpandedSubscripts(xAt, x, zeroBasedDim, subscripts); + const auto &dim{x.GetDimension(zeroBasedDim)}; + SubscriptValue at{dim.LowerBound()}; + for (auto n{dim.Extent()}; n-- > 0; ++at) { + xAt[zeroBasedDim] = at; + if (!accumulator.AccumulateAt(xAt)) { + break; + } + } + return accumulator.Result(); +} + +template <LogicalReduction REDUCTION> struct LogicalReduceHelper { + template <int KIND> struct Functor { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, + int dim, Terminator &terminator, const char *intrinsic) const { + // Standard requires result to have same LOGICAL kind as argument. + CreatePartialReductionResult( + result, x, x.ElementBytes(), dim, terminator, intrinsic, x.type()); + SubscriptValue at[maxRank]; + result.GetLowerBounds(at); + INTERNAL_CHECK(result.rank() == 0 || at[0] == 1); + using CppType = CppTypeFor<TypeCategory::Logical, KIND>; + for (auto n{result.Elements()}; n-- > 0; result.IncrementSubscripts(at)) { + *result.Element<CppType>(at) = + ReduceLogicalDimToScalar<LogicalAccumulator<REDUCTION>>( + x, dim - 1, at); + } + } + }; +}; + +template <LogicalReduction REDUCTION> +RT_API_ATTRS inline void DoReduceLogicalDimension(Descriptor &result, + const Descriptor &x, int dim, Terminator &terminator, + const char *intrinsic) { + auto catKind{x.type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, catKind && catKind->first == TypeCategory::Logical); + ApplyLogicalKind<LogicalReduceHelper<REDUCTION>::template Functor, void>( + catKind->second, terminator, result, x, dim, terminator, intrinsic); +} + +// COUNT + +class CountAccumulator { +public: + using Type = std::int64_t; + RT_API_ATTRS explicit CountAccumulator(const Descriptor &array) + : array_{array} {} + RT_API_ATTRS void Reinitialize() { result_ = 0; } + RT_API_ATTRS Type Result() const { return result_; } + template <typename IGNORED = void> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + if (IsLogicalElementTrue(array_, at)) { + ++result_; + } + return true; + } + +private: + const Descriptor &array_; + Type result_{0}; +}; + +template <int KIND> struct CountDimension { + RT_API_ATTRS void operator()(Descriptor &result, const Descriptor &x, int dim, + Terminator &terminator) const { + // Element size of the descriptor descriptor is the size + // of {TypeCategory::Integer, KIND}. + CreatePartialReductionResult(result, x, + Descriptor::BytesFor(TypeCategory::Integer, KIND), dim, terminator, + "COUNT", TypeCode{TypeCategory::Integer, KIND}); + SubscriptValue at[maxRank]; + result.GetLowerBounds(at); + INTERNAL_CHECK(result.rank() == 0 || at[0] == 1); + using CppType = CppTypeFor<TypeCategory::Integer, KIND>; + for (auto n{result.Elements()}; n-- > 0; result.IncrementSubscripts(at)) { + *result.Element<CppType>(at) = + ReduceLogicalDimToScalar<CountAccumulator>(x, dim - 1, at); + } + } +}; + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +bool RTDEF(All)(const Descriptor &x, const char *source, int line, int dim) { + return GetTotalLogicalReduction(x, source, line, dim, + LogicalAccumulator<LogicalReduction::All>{x}, "ALL"); +} +void RTDEF(AllDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line) { + Terminator terminator{source, line}; + DoReduceLogicalDimension<LogicalReduction::All>( + result, x, dim, terminator, "ALL"); +} + +bool RTDEF(Any)(const Descriptor &x, const char *source, int line, int dim) { + return GetTotalLogicalReduction(x, source, line, dim, + LogicalAccumulator<LogicalReduction::Any>{x}, "ANY"); +} +void RTDEF(AnyDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line) { + Terminator terminator{source, line}; + DoReduceLogicalDimension<LogicalReduction::Any>( + result, x, dim, terminator, "ANY"); +} + +std::int64_t RTDEF(Count)( + const Descriptor &x, const char *source, int line, int dim) { + return GetTotalLogicalReduction( + x, source, line, dim, CountAccumulator{x}, "COUNT"); +} + +void RTDEF(CountDim)(Descriptor &result, const Descriptor &x, int dim, int kind, + const char *source, int line) { + Terminator terminator{source, line}; + ApplyIntegerKind<CountDimension, void>( + kind, terminator, result, x, dim, terminator); +} + +bool RTDEF(Parity)(const Descriptor &x, const char *source, int line, int dim) { + return GetTotalLogicalReduction(x, source, line, dim, + LogicalAccumulator<LogicalReduction::Parity>{x}, "PARITY"); +} +void RTDEF(ParityDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line) { + Terminator terminator{source, line}; + DoReduceLogicalDimension<LogicalReduction::Parity>( + result, x, dim, terminator, "PARITY"); +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stack.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stack.h new file mode 100644 index 00000000000..38364ff541f --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stack.h @@ -0,0 +1,136 @@ +//===-- lib/runtime/stack.h -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Trivial implementation of stack that can be used on all targets. +// It is a list based stack with dynamic allocation/deallocation +// of the list nodes. + +#ifndef FLANG_RT_RUNTIME_STACK_H_ +#define FLANG_RT_RUNTIME_STACK_H_ + +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/terminator.h" + +namespace Fortran::runtime { +// Storage for the Stack elements of type T. +template <typename T, unsigned N> struct StackStorage { + RT_API_ATTRS void *getElement(unsigned i) { + if (i < N) { + return storage[i]; + } else { + return nullptr; + } + } + RT_API_ATTRS const void *getElement(unsigned i) const { + if (i < N) { + return storage[i]; + } else { + return nullptr; + } + } + +private: + // Storage to hold N elements of type T. + // It is declared as an array of bytes to avoid + // default construction (if any is implied by type T). + alignas(T) char storage[N][sizeof(T)]; +}; + +// 0-size specialization that provides no storage. +template <typename T> struct alignas(T) StackStorage<T, 0> { + RT_API_ATTRS void *getElement(unsigned) { return nullptr; } + RT_API_ATTRS const void *getElement(unsigned) const { return nullptr; } +}; + +template <typename T, unsigned N = 0> class Stack : public StackStorage<T, N> { +public: + Stack() = delete; + Stack(const Stack &) = delete; + Stack(Stack &&) = delete; + RT_API_ATTRS Stack(Terminator &terminator) : terminator_{terminator} {} + RT_API_ATTRS ~Stack() { + while (!empty()) { + pop(); + } + } + RT_API_ATTRS void push(const T &object) { + if (void *ptr{this->getElement(size_)}) { + new (ptr) T{object}; + } else { + top_ = New<List>{terminator_}(top_, object).release(); + } + ++size_; + } + RT_API_ATTRS void push(T &&object) { + if (void *ptr{this->getElement(size_)}) { + new (ptr) T{std::move(object)}; + } else { + top_ = New<List>{terminator_}(top_, std::move(object)).release(); + } + ++size_; + } + template <typename... Args> RT_API_ATTRS void emplace(Args &&...args) { + if (void *ptr{this->getElement(size_)}) { + new (ptr) T{std::forward<Args>(args)...}; + } else { + top_ = + New<List>{terminator_}(top_, std::forward<Args>(args)...).release(); + } + ++size_; + } + RT_API_ATTRS T &top() { + RUNTIME_CHECK(terminator_, size_ > 0); + if (void *ptr{this->getElement(size_ - 1)}) { + return *reinterpret_cast<T *>(ptr); + } else { + RUNTIME_CHECK(terminator_, top_); + return top_->object_; + } + } + RT_API_ATTRS const T &top() const { + RUNTIME_CHECK(terminator_, size_ > 0); + if (void *ptr{this->getElement(size_ - 1)}) { + return *reinterpret_cast<const T *>(ptr); + } else { + RUNTIME_CHECK(terminator_, top_); + return top_->object_; + } + } + RT_API_ATTRS void pop() { + RUNTIME_CHECK(terminator_, size_ > 0); + if (void *ptr{this->getElement(size_ - 1)}) { + reinterpret_cast<T *>(ptr)->~T(); + } else { + RUNTIME_CHECK(terminator_, top_); + List *next{top_->next_}; + top_->~List(); + FreeMemory(top_); + top_ = next; + } + --size_; + } + RT_API_ATTRS bool empty() const { return size_ == 0; } + +private: + struct List { + template <typename... Args> + RT_API_ATTRS List(List *next, Args &&...args) + : next_(next), object_(std::forward<Args>(args)...) {} + RT_API_ATTRS List(List *next, const T &object) + : next_(next), object_(object) {} + RT_API_ATTRS List(List *next, T &&object) + : next_(next), object_(std::move(object)) {} + List *next_{nullptr}; + T object_; + }; + List *top_{nullptr}; + std::size_t size_{0}; + Terminator &terminator_; +}; +} // namespace Fortran::runtime +#endif // FLANG_RT_RUNTIME_STACK_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stat.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stat.cpp new file mode 100644 index 00000000000..322b7282b70 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stat.cpp @@ -0,0 +1,110 @@ +//===-- lib/runtime/stat.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/stat.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" + +namespace Fortran::runtime { +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS const char *StatErrorString(int stat) { + switch (stat) { + case StatOk: + return "No error"; + + case StatBaseNull: + return "Base address is null"; + case StatBaseNotNull: + return "Base address is not null"; + case StatInvalidElemLen: + return "Invalid element length"; + case StatInvalidRank: + return "Invalid rank"; + case StatInvalidType: + return "Invalid type"; + case StatInvalidAttribute: + return "Invalid attribute"; + case StatInvalidExtent: + return "Invalid extent"; + case StatInvalidDescriptor: + return "Invalid descriptor"; + case StatMemAllocation: + return "Memory allocation failed"; + case StatOutOfBounds: + return "Out of bounds"; + + case StatFailedImage: + return "Failed image"; + case StatLocked: + return "Locked"; + case StatLockedOtherImage: + return "Other image locked"; + case StatStoppedImage: + return "Image stopped"; + case StatUnlocked: + return "Unlocked"; + case StatUnlockedFailedImage: + return "Failed image unlocked"; + + case StatInvalidArgumentNumber: + return "Invalid argument number"; + case StatMissingArgument: + return "Missing argument"; + case StatValueTooShort: + return "Value too short"; + + case StatMissingEnvVariable: + return "Missing environment variable"; + + case StatMoveAllocSameAllocatable: + return "MOVE_ALLOC passed the same address as to and from"; + + case StatBadPointerDeallocation: + return "DEALLOCATE of a pointer that is not the whole content of a pointer " + "ALLOCATE"; + + default: + return nullptr; + } +} + +RT_API_ATTRS int ToErrmsg(const Descriptor *errmsg, int stat) { + if (stat != StatOk && errmsg && errmsg->raw().base_addr && + errmsg->type() == TypeCode(TypeCategory::Character, 1) && + errmsg->rank() == 0) { + if (const char *msg{StatErrorString(stat)}) { + char *buffer{errmsg->OffsetElement()}; + std::size_t bufferLength{errmsg->ElementBytes()}; + std::size_t msgLength{Fortran::runtime::strlen(msg)}; + if (msgLength >= bufferLength) { + std::memcpy(buffer, msg, bufferLength); + } else { + std::memcpy(buffer, msg, msgLength); + std::memset(buffer + msgLength, ' ', bufferLength - msgLength); + } + } + } + return stat; +} + +RT_API_ATTRS int ReturnError( + Terminator &terminator, int stat, const Descriptor *errmsg, bool hasStat) { + if (stat == StatOk || hasStat) { + return ToErrmsg(errmsg, stat); + } else if (const char *msg{StatErrorString(stat)}) { + terminator.Crash(msg); + } else { + terminator.Crash("Invalid Fortran runtime STAT= code %d", stat); + } + return stat; +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stop.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stop.cpp new file mode 100644 index 00000000000..66b3c1d2a9b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/stop.cpp @@ -0,0 +1,229 @@ +//===-- lib/runtime/stop.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/stop.h" +#include "config.h" +#include "unit.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/file.h" +#include "flang-rt/runtime/io-error.h" +#include "flang-rt/runtime/terminator.h" +#include <cfenv> +#include <cstdio> +#include <cstdlib> + +#ifdef HAVE_BACKTRACE +#include BACKTRACE_HEADER +#endif + +extern "C" { + +[[maybe_unused]] static void DescribeIEEESignaledExceptions() { +#ifdef fetestexcept // a macro in some environments; omit std:: + auto excepts{fetestexcept(FE_ALL_EXCEPT)}; +#else + auto excepts{std::fetestexcept(FE_ALL_EXCEPT)}; +#endif + if (excepts) { + std::fputs("IEEE arithmetic exceptions signaled:", stderr); +#ifdef FE_DIVBYZERO + if (excepts & FE_DIVBYZERO) { + std::fputs(" DIVBYZERO", stderr); + } +#endif +#ifdef FE_INEXACT + if (excepts & FE_INEXACT) { + std::fputs(" INEXACT", stderr); + } +#endif +#ifdef FE_INVALID + if (excepts & FE_INVALID) { + std::fputs(" INVALID", stderr); + } +#endif +#ifdef FE_OVERFLOW + if (excepts & FE_OVERFLOW) { + std::fputs(" OVERFLOW", stderr); + } +#endif +#ifdef FE_UNDERFLOW + if (excepts & FE_UNDERFLOW) { + std::fputs(" UNDERFLOW", stderr); + } +#endif + std::fputc('\n', stderr); + } +} + +static void CloseAllExternalUnits(const char *why) { + Fortran::runtime::io::IoErrorHandler handler{why}; + Fortran::runtime::io::ExternalFileUnit::CloseAll(handler); +} + +[[noreturn]] RT_API_ATTRS void RTNAME(StopStatement)( + int code, bool isErrorStop, bool quiet) { +#if defined(RT_DEVICE_COMPILATION) + if (Fortran::runtime::executionEnvironment.noStopMessage && code == 0) { + quiet = true; + } + if (!quiet) { + if (isErrorStop) { + std::printf("Fortran ERROR STOP"); + } else { + std::printf("Fortran STOP"); + } + if (code != EXIT_SUCCESS) { + std::printf(": code %d\n", code); + } + std::printf("\n"); + } + Fortran::runtime::DeviceTrap(); +#else + CloseAllExternalUnits("STOP statement"); + if (Fortran::runtime::executionEnvironment.noStopMessage && code == 0) { + quiet = true; + } + if (!quiet) { + std::fprintf(stderr, "Fortran %s", isErrorStop ? "ERROR STOP" : "STOP"); + if (code != EXIT_SUCCESS) { + std::fprintf(stderr, ": code %d\n", code); + } + std::fputc('\n', stderr); + DescribeIEEESignaledExceptions(); + } + std::exit(code); +#endif +} + +[[noreturn]] RT_API_ATTRS void RTNAME(StopStatementText)( + const char *code, std::size_t length, bool isErrorStop, bool quiet) { +#if defined(RT_DEVICE_COMPILATION) + if (!quiet) { + if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) { + std::printf("%s\n", code); + } else { + std::printf( + "Fortran %s: %s\n", isErrorStop ? "ERROR STOP" : "STOP", code); + } + } + Fortran::runtime::DeviceTrap(); +#else + CloseAllExternalUnits("STOP statement"); + if (!quiet) { + if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) { + std::fprintf(stderr, "%.*s\n", static_cast<int>(length), code); + } else { + std::fprintf(stderr, "Fortran %s: %.*s\n", + isErrorStop ? "ERROR STOP" : "STOP", static_cast<int>(length), code); + } + DescribeIEEESignaledExceptions(); + } + if (isErrorStop) { + std::exit(EXIT_FAILURE); + } else { + std::exit(EXIT_SUCCESS); + } +#endif +} + +static bool StartPause() { + if (Fortran::runtime::io::IsATerminal(0)) { + Fortran::runtime::io::IoErrorHandler handler{"PAUSE statement"}; + Fortran::runtime::io::ExternalFileUnit::FlushAll(handler); + return true; + } + return false; +} + +static void EndPause() { + std::fflush(nullptr); + if (std::fgetc(stdin) == EOF) { + CloseAllExternalUnits("PAUSE statement"); + std::exit(EXIT_SUCCESS); + } +} + +void RTNAME(PauseStatement)() { + if (StartPause()) { + std::fputs("Fortran PAUSE: hit RETURN to continue:", stderr); + EndPause(); + } +} + +void RTNAME(PauseStatementInt)(int code) { + if (StartPause()) { + std::fprintf(stderr, "Fortran PAUSE %d: hit RETURN to continue:", code); + EndPause(); + } +} + +void RTNAME(PauseStatementText)(const char *code, std::size_t length) { + if (StartPause()) { + std::fprintf(stderr, + "Fortran PAUSE %.*s: hit RETURN to continue:", static_cast<int>(length), + code); + EndPause(); + } +} + +[[noreturn]] void RTNAME(FailImageStatement)() { + Fortran::runtime::NotifyOtherImagesOfFailImageStatement(); + CloseAllExternalUnits("FAIL IMAGE statement"); + std::exit(EXIT_FAILURE); +} + +[[noreturn]] void RTNAME(ProgramEndStatement)() { + CloseAllExternalUnits("END statement"); + std::exit(EXIT_SUCCESS); +} + +[[noreturn]] void RTNAME(Exit)(int status) { + CloseAllExternalUnits("CALL EXIT()"); + std::exit(status); +} + +static RT_NOINLINE_ATTR void PrintBacktrace() { +#ifdef HAVE_BACKTRACE + // TODO: Need to parse DWARF information to print function line numbers + constexpr int MAX_CALL_STACK{999}; + void *buffer[MAX_CALL_STACK]; + int nptrs{(int)backtrace(buffer, MAX_CALL_STACK)}; + + if (char **symbols{backtrace_symbols(buffer, nptrs)}) { + // Skip the PrintBacktrace() frame, as it is just a utility. + // It makes sense to start printing the backtrace + // from Abort() or backtrace(). + for (int i = 1; i < nptrs; i++) { + Fortran::runtime::Terminator{}.PrintCrashArgs( + "#%d %s\n", i - 1, symbols[i]); + } + free(symbols); + } + +#else + + // TODO: Need to implement the version for other platforms. + Fortran::runtime::Terminator{}.PrintCrashArgs("backtrace is not supported."); + +#endif +} + +[[noreturn]] RT_OPTNONE_ATTR void RTNAME(Abort)() { +#ifdef HAVE_BACKTRACE + PrintBacktrace(); +#endif + std::abort(); +} + +RT_OPTNONE_ATTR void FORTRAN_PROCEDURE_NAME(backtrace)() { PrintBacktrace(); } + +[[noreturn]] RT_API_ATTRS void RTNAME(ReportFatalUserError)( + const char *message, const char *source, int line) { + Fortran::runtime::Terminator{source, line}.Crash(message); +} +} diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/sum.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/sum.cpp new file mode 100644 index 00000000000..a76e228f18a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/sum.cpp @@ -0,0 +1,232 @@ +//===-- lib/runtime/sum.cpp -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements SUM for all required operand types and shapes. +// +// Real and complex SUM reductions attempt to reduce floating-point +// cancellation on intermediate results by using "Kahan summation" +// (basically the same as manual "double-double"). + +#include "flang-rt/runtime/reduction-templates.h" +#include "flang/Common/float128.h" +#include "flang/Runtime/reduction.h" +#include <cfloat> +#include <cinttypes> +#include <complex> + +namespace Fortran::runtime { + +template <typename INTERMEDIATE> class IntegerSumAccumulator { +public: + explicit RT_API_ATTRS IntegerSumAccumulator(const Descriptor &array) + : array_{array} {} + void RT_API_ATTRS Reinitialize() { sum_ = 0; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + *p = static_cast<A>(sum_); + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + sum_ += *array_.Element<A>(at); + return true; + } + +private: + const Descriptor &array_; + INTERMEDIATE sum_{0}; +}; + +template <typename INTERMEDIATE> class RealSumAccumulator { +public: + explicit RT_API_ATTRS RealSumAccumulator(const Descriptor &array) + : array_{array} {} + void RT_API_ATTRS Reinitialize() { sum_ = correction_ = 0; } + template <typename A> RT_API_ATTRS A Result() const { return sum_; } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + *p = Result<A>(); + } + template <typename A> RT_API_ATTRS bool Accumulate(A x) { + // Kahan summation + auto next{x - correction_}; + auto oldSum{sum_}; + sum_ += next; + correction_ = (sum_ - oldSum) - next; // algebraically zero + return true; + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + return Accumulate(*array_.Element<A>(at)); + } + +private: + const Descriptor &array_; + INTERMEDIATE sum_{0.0}, correction_{0.0}; +}; + +template <typename PART> class ComplexSumAccumulator { +public: + explicit RT_API_ATTRS ComplexSumAccumulator(const Descriptor &array) + : array_{array} {} + void RT_API_ATTRS Reinitialize() { + reals_.Reinitialize(); + imaginaries_.Reinitialize(); + } + template <typename A> + RT_API_ATTRS void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { + using ResultPart = typename A::value_type; + *p = {reals_.template Result<ResultPart>(), + imaginaries_.template Result<ResultPart>()}; + } + template <typename A> RT_API_ATTRS bool Accumulate(const A &z) { + reals_.Accumulate(z.real()); + imaginaries_.Accumulate(z.imag()); + return true; + } + template <typename A> + RT_API_ATTRS bool AccumulateAt(const SubscriptValue at[]) { + return Accumulate(*array_.Element<A>(at)); + } + +private: + const Descriptor &array_; + RealSumAccumulator<PART> reals_{array_}, imaginaries_{array_}; +}; + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +CppTypeFor<TypeCategory::Integer, 1> RTDEF(SumInteger1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 1>(x, source, line, dim, mask, + IntegerSumAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "SUM"); +} +CppTypeFor<TypeCategory::Integer, 2> RTDEF(SumInteger2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 2>(x, source, line, dim, mask, + IntegerSumAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "SUM"); +} +CppTypeFor<TypeCategory::Integer, 4> RTDEF(SumInteger4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 4>(x, source, line, dim, mask, + IntegerSumAccumulator<CppTypeFor<TypeCategory::Integer, 4>>{x}, "SUM"); +} +CppTypeFor<TypeCategory::Integer, 8> RTDEF(SumInteger8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 8>(x, source, line, dim, mask, + IntegerSumAccumulator<CppTypeFor<TypeCategory::Integer, 8>>{x}, "SUM"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDEF(SumInteger16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Integer, 16>(x, source, line, dim, + mask, IntegerSumAccumulator<CppTypeFor<TypeCategory::Integer, 16>>{x}, + "SUM"); +} +#endif + +CppTypeFor<TypeCategory::Unsigned, 1> RTDEF(SumUnsigned1)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 1>(x, source, line, dim, + mask, IntegerSumAccumulator<CppTypeFor<TypeCategory::Unsigned, 4>>{x}, + "SUM"); +} +CppTypeFor<TypeCategory::Unsigned, 2> RTDEF(SumUnsigned2)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 2>(x, source, line, dim, + mask, IntegerSumAccumulator<CppTypeFor<TypeCategory::Unsigned, 4>>{x}, + "SUM"); +} +CppTypeFor<TypeCategory::Unsigned, 4> RTDEF(SumUnsigned4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 4>(x, source, line, dim, + mask, IntegerSumAccumulator<CppTypeFor<TypeCategory::Unsigned, 4>>{x}, + "SUM"); +} +CppTypeFor<TypeCategory::Unsigned, 8> RTDEF(SumUnsigned8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 8>(x, source, line, dim, + mask, IntegerSumAccumulator<CppTypeFor<TypeCategory::Unsigned, 8>>{x}, + "SUM"); +} +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Unsigned, 16> RTDEF(SumUnsigned16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Unsigned, 16>(x, source, line, dim, + mask, IntegerSumAccumulator<CppTypeFor<TypeCategory::Unsigned, 16>>{x}, + "SUM"); +} +#endif + +// TODO: real/complex(2 & 3) +CppTypeFor<TypeCategory::Real, 4> RTDEF(SumReal4)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 4>( + x, source, line, dim, mask, RealSumAccumulator<float>{x}, "SUM"); +} +CppTypeFor<TypeCategory::Real, 8> RTDEF(SumReal8)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 8>( + x, source, line, dim, mask, RealSumAccumulator<double>{x}, "SUM"); +} +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDEF(SumReal10)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 10>(x, source, line, dim, mask, + RealSumAccumulator<CppTypeFor<TypeCategory::Real, 10>>{x}, "SUM"); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDEF(SumReal16)(const Descriptor &x, + const char *source, int line, int dim, const Descriptor *mask) { + return GetTotalReduction<TypeCategory::Real, 16>(x, source, line, dim, mask, + RealSumAccumulator<CppTypeFor<TypeCategory::Real, 16>>{x}, "SUM"); +} +#endif + +void RTDEF(CppSumComplex4)(CppTypeFor<TypeCategory::Complex, 4> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = GetTotalReduction<TypeCategory::Complex, 4>( + x, source, line, dim, mask, ComplexSumAccumulator<float>{x}, "SUM"); +} +void RTDEF(CppSumComplex8)(CppTypeFor<TypeCategory::Complex, 8> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = GetTotalReduction<TypeCategory::Complex, 8>( + x, source, line, dim, mask, ComplexSumAccumulator<double>{x}, "SUM"); +} +#if HAS_FLOAT80 +void RTDEF(CppSumComplex10)(CppTypeFor<TypeCategory::Complex, 10> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = + GetTotalReduction<TypeCategory::Complex, 10>(x, source, line, dim, mask, + ComplexSumAccumulator<CppTypeFor<TypeCategory::Real, 10>>{x}, "SUM"); +} +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(CppSumComplex16)(CppTypeFor<TypeCategory::Complex, 16> &result, + const Descriptor &x, const char *source, int line, int dim, + const Descriptor *mask) { + result = + GetTotalReduction<TypeCategory::Complex, 16>(x, source, line, dim, mask, + ComplexSumAccumulator<CppTypeFor<TypeCategory::Real, 16>>{x}, "SUM"); +} +#endif + +void RTDEF(SumDim)(Descriptor &result, const Descriptor &x, int dim, + const char *source, int line, const Descriptor *mask) { + TypedPartialNumericReduction<IntegerSumAccumulator, RealSumAccumulator, + ComplexSumAccumulator, /*MIN_REAL_KIND=*/4>( + result, x, dim, source, line, mask, "SUM"); +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/support.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/support.cpp new file mode 100644 index 00000000000..9beb46e48a1 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/support.cpp @@ -0,0 +1,53 @@ +//===-- lib/runtime/support.cpp ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang/Runtime/support.h" +#include "ISO_Fortran_util.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/type-info.h" + +namespace Fortran::runtime { +extern "C" { +RT_EXT_API_GROUP_BEGIN + +bool RTDEF(IsContiguous)(const Descriptor &descriptor) { + return descriptor.IsContiguous(); +} + +bool RTDEF(IsContiguousUpTo)(const Descriptor &descriptor, int dim) { + return descriptor.IsContiguous(dim); +} + +bool RTDEF(IsAssumedSize)(const Descriptor &descriptor) { + return ISO::IsAssumedSize(&descriptor.raw()); +} + +void RTDEF(CopyAndUpdateDescriptor)(Descriptor &to, const Descriptor &from, + const typeInfo::DerivedType *newDynamicType, + ISO::CFI_attribute_t newAttribute, enum LowerBoundModifier newLowerBounds) { + to = from; + if (newDynamicType) { + DescriptorAddendum *toAddendum{to.Addendum()}; + INTERNAL_CHECK(toAddendum); + toAddendum->set_derivedType(newDynamicType); + to.raw().elem_len = newDynamicType->sizeInBytes(); + } + to.raw().attribute = newAttribute; + if (newLowerBounds != LowerBoundModifier::Preserve) { + const ISO::CFI_index_t newLowerBound{ + newLowerBounds == LowerBoundModifier::SetToOnes ? 1 : 0}; + const int rank{to.rank()}; + for (int i = 0; i < rank; ++i) { + to.GetDimension(i).SetLowerBound(newLowerBound); + } + } +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/temporary-stack.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/temporary-stack.cpp new file mode 100644 index 00000000000..3f6fd8ee15a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/temporary-stack.cpp @@ -0,0 +1,227 @@ +//===-- lib/runtime/temporary-stack.cpp -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements std::vector like storage for a dynamically resizable number of +// temporaries. For use in HLFIR lowering. + +#include "flang/Runtime/temporary-stack.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/terminator.h" +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Runtime/assign.h" + +namespace { + +using namespace Fortran::runtime; + +// the number of elements to allocate when first creating the vector +constexpr size_t INITIAL_ALLOC = 8; + +/// To store C style data. Does not run constructors/destructors. +/// Not using std::vector to avoid linking the runtime library to stdc++ +template <bool COPY_VALUES> class DescriptorStorage final { + using size_type = uint64_t; // see checkedMultiply() + + size_type capacity_{0}; + size_type size_{0}; + Descriptor **data_{nullptr}; + Terminator terminator_; + + // return true on overflow + static bool checkedMultiply(size_type x, size_type y, size_type &res); + + void resize(size_type newCapacity); + + Descriptor *cloneDescriptor(const Descriptor &source); + +public: + DescriptorStorage(const char *sourceFile, int line); + ~DescriptorStorage(); + + // `new` but using the runtime allocation API + static inline DescriptorStorage *allocate(const char *sourceFile, int line) { + Terminator term{sourceFile, line}; + void *ptr = AllocateMemoryOrCrash(term, sizeof(DescriptorStorage)); + return new (ptr) DescriptorStorage{sourceFile, line}; + } + + // `delete` but using the runtime allocation API + static inline void destroy(DescriptorStorage *instance) { + instance->~DescriptorStorage(); + FreeMemory(instance); + } + + // clones a descriptor into this storage + void push(const Descriptor &source); + + // out must be big enough to hold a descriptor of the right rank and addendum + void pop(Descriptor &out); + + // out must be big enough to hold a descriptor of the right rank and addendum + void at(size_type i, Descriptor &out); +}; + +using ValueStack = DescriptorStorage</*COPY_VALUES=*/true>; +using DescriptorStack = DescriptorStorage</*COPY_VALUES=*/false>; +} // namespace + +template <bool COPY_VALUES> +bool DescriptorStorage<COPY_VALUES>::checkedMultiply( + size_type x, size_type y, size_type &res) { + // TODO: c++20 [[unlikely]] + if (x > UINT64_MAX / y) { + return true; + } + res = x * y; + return false; +} + +template <bool COPY_VALUES> +void DescriptorStorage<COPY_VALUES>::resize(size_type newCapacity) { + if (newCapacity <= capacity_) { + return; + } + size_type bytes; + if (checkedMultiply(newCapacity, sizeof(Descriptor *), bytes)) { + terminator_.Crash("temporary-stack: out of memory"); + } + Descriptor **newData = + static_cast<Descriptor **>(AllocateMemoryOrCrash(terminator_, bytes)); + // "memcpy" in glibc has a "nonnull" attribute on the source pointer. + // Avoid passing a null pointer, since it would result in an undefined + // behavior. + if (data_ != nullptr) { + memcpy(newData, data_, capacity_ * sizeof(Descriptor *)); + FreeMemory(data_); + } + data_ = newData; + capacity_ = newCapacity; +} + +template <bool COPY_VALUES> +Descriptor *DescriptorStorage<COPY_VALUES>::cloneDescriptor( + const Descriptor &source) { + const std::size_t bytes = source.SizeInBytes(); + void *memory = AllocateMemoryOrCrash(terminator_, bytes); + Descriptor *desc = new (memory) Descriptor{source}; + return desc; +} + +template <bool COPY_VALUES> +DescriptorStorage<COPY_VALUES>::DescriptorStorage( + const char *sourceFile, int line) + : terminator_{sourceFile, line} { + resize(INITIAL_ALLOC); +} + +template <bool COPY_VALUES> +DescriptorStorage<COPY_VALUES>::~DescriptorStorage() { + for (size_type i = 0; i < size_; ++i) { + Descriptor *element = data_[i]; + if constexpr (COPY_VALUES) { + element->Destroy(false, true); + } + FreeMemory(element); + } + FreeMemory(data_); +} + +template <bool COPY_VALUES> +void DescriptorStorage<COPY_VALUES>::push(const Descriptor &source) { + if (size_ == capacity_) { + size_type newSize; + if (checkedMultiply(capacity_, 2, newSize)) { + terminator_.Crash("temporary-stack: out of address space"); + } + resize(newSize); + } + data_[size_] = cloneDescriptor(source); + Descriptor &box = *data_[size_]; + size_ += 1; + + if constexpr (COPY_VALUES) { + // copy the data pointed to by the box + box.set_base_addr(nullptr); + box.Allocate(kNoAsyncObject); + RTNAME(AssignTemporary) + (box, source, terminator_.sourceFileName(), terminator_.sourceLine()); + } +} + +template <bool COPY_VALUES> +void DescriptorStorage<COPY_VALUES>::pop(Descriptor &out) { + if (size_ == 0) { + terminator_.Crash("temporary-stack: pop empty storage"); + } + size_ -= 1; + Descriptor *ptr = data_[size_]; + out = *ptr; // Descriptor::operator= handles the different sizes + FreeMemory(ptr); +} + +template <bool COPY_VALUES> +void DescriptorStorage<COPY_VALUES>::at(size_type i, Descriptor &out) { + if (i >= size_) { + terminator_.Crash("temporary-stack: out of bounds access"); + } + Descriptor *ptr = data_[i]; + out = *ptr; // Descriptor::operator= handles the different sizes +} + +inline static ValueStack *getValueStorage(void *opaquePtr) { + return static_cast<ValueStack *>(opaquePtr); +} +inline static DescriptorStack *getDescriptorStorage(void *opaquePtr) { + return static_cast<DescriptorStack *>(opaquePtr); +} + +namespace Fortran::runtime { +extern "C" { +void *RTNAME(CreateValueStack)(const char *sourceFile, int line) { + return ValueStack::allocate(sourceFile, line); +} + +void RTNAME(PushValue)(void *opaquePtr, const Descriptor &value) { + getValueStorage(opaquePtr)->push(value); +} + +void RTNAME(PopValue)(void *opaquePtr, Descriptor &value) { + getValueStorage(opaquePtr)->pop(value); +} + +void RTNAME(ValueAt)(void *opaquePtr, uint64_t i, Descriptor &value) { + getValueStorage(opaquePtr)->at(i, value); +} + +void RTNAME(DestroyValueStack)(void *opaquePtr) { + ValueStack::destroy(getValueStorage(opaquePtr)); +} + +void *RTNAME(CreateDescriptorStack)(const char *sourceFile, int line) { + return DescriptorStack::allocate(sourceFile, line); +} + +void RTNAME(PushDescriptor)(void *opaquePtr, const Descriptor &value) { + getDescriptorStorage(opaquePtr)->push(value); +} + +void RTNAME(PopDescriptor)(void *opaquePtr, Descriptor &value) { + getDescriptorStorage(opaquePtr)->pop(value); +} + +void RTNAME(DescriptorAt)(void *opaquePtr, uint64_t i, Descriptor &value) { + getValueStorage(opaquePtr)->at(i, value); +} + +void RTNAME(DestroyDescriptorStack)(void *opaquePtr) { + DescriptorStack::destroy(getDescriptorStorage(opaquePtr)); +} + +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/terminator.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/terminator.cpp new file mode 100644 index 00000000000..97ca824342b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/terminator.cpp @@ -0,0 +1,103 @@ +//===-- lib/runtime/terminator.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/terminator.h" +#include <cstdio> +#include <cstdlib> + +namespace Fortran::runtime { + +#if !defined(RT_DEVICE_COMPILATION) +[[maybe_unused]] static void (*crashHandler)( + const char *, int, const char *, va_list &){nullptr}; + +void Terminator::RegisterCrashHandler( + void (*handler)(const char *, int, const char *, va_list &)) { + crashHandler = handler; +} + +void Terminator::InvokeCrashHandler(const char *message, ...) const { + if (crashHandler) { + va_list ap; + va_start(ap, message); + crashHandler(sourceFileName_, sourceLine_, message, ap); + va_end(ap); + } +} + +[[noreturn]] void Terminator::CrashArgs( + const char *message, va_list &ap) const { + CrashHeader(); + std::vfprintf(stderr, message, ap); + va_end(ap); + CrashFooter(); +} +#endif + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS void Terminator::CrashHeader() const { +#if defined(RT_DEVICE_COMPILATION) + std::printf("\nfatal Fortran runtime error"); + if (sourceFileName_) { + std::printf("(%s", sourceFileName_); + if (sourceLine_) { + std::printf(":%d", sourceLine_); + } + std::printf(")"); + } + std::printf(": "); +#else + std::fputs("\nfatal Fortran runtime error", stderr); + if (sourceFileName_) { + std::fprintf(stderr, "(%s", sourceFileName_); + if (sourceLine_) { + std::fprintf(stderr, ":%d", sourceLine_); + } + fputc(')', stderr); + } + std::fputs(": ", stderr); +#endif +} + +[[noreturn]] RT_API_ATTRS void Terminator::CrashFooter() const { +#if defined(RT_DEVICE_COMPILATION) + std::printf("\n"); +#else + fputc('\n', stderr); + // FIXME: re-enable the flush along with the IO enabling. + io::FlushOutputOnCrash(*this); +#endif + NotifyOtherImagesOfErrorTermination(); +#if defined(RT_DEVICE_COMPILATION) + DeviceTrap(); +#else + std::abort(); +#endif +} + +[[noreturn]] RT_API_ATTRS void Terminator::CheckFailed( + const char *predicate, const char *file, int line) const { + Crash("Internal error: RUNTIME_CHECK(%s) failed at %s(%d)", predicate, file, + line); +} + +[[noreturn]] RT_API_ATTRS void Terminator::CheckFailed( + const char *predicate) const { + Crash("Internal error: RUNTIME_CHECK(%s) failed at %s(%d)", predicate, + sourceFileName_, sourceLine_); +} + +// TODO: These will be defined in the coarray runtime library +RT_API_ATTRS void NotifyOtherImagesOfNormalEnd() {} +RT_API_ATTRS void NotifyOtherImagesOfFailImageStatement() {} +RT_API_ATTRS void NotifyOtherImagesOfErrorTermination() {} + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/time-intrinsic.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/time-intrinsic.cpp new file mode 100644 index 00000000000..8988817a400 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/time-intrinsic.cpp @@ -0,0 +1,580 @@ +//===-- lib/runtime/time-intrinsic.cpp --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements time-related intrinsic subroutines. + +#include "flang/Runtime/time-intrinsic.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang/Runtime/cpp-type.h" +#include <algorithm> +#include <cstdint> +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <ctime> +#ifdef _WIN32 +#include "flang/Common/windows-include.h" +#else +#include <sys/time.h> // gettimeofday +#include <sys/times.h> +#include <unistd.h> +#endif + +// CPU_TIME (Fortran 2018 16.9.57) +// SYSTEM_CLOCK (Fortran 2018 16.9.168) +// +// We can use std::clock() from the <ctime> header as a fallback implementation +// that should be available everywhere. This may not provide the best resolution +// and is particularly troublesome on (some?) POSIX systems where CLOCKS_PER_SEC +// is defined as 10^6 regardless of the actual precision of std::clock(). +// Therefore, we will usually prefer platform-specific alternatives when they +// are available. +// +// We can use SFINAE to choose a platform-specific alternative. To do so, we +// introduce a helper function template, whose overload set will contain only +// implementations relying on interfaces which are actually available. Each +// overload will have a dummy parameter whose type indicates whether or not it +// should be preferred. Any other parameters required for SFINAE should have +// default values provided. +namespace { +// Types for the dummy parameter indicating the priority of a given overload. +// We will invoke our helper with an integer literal argument, so the overload +// with the highest priority should have the type int. +using fallback_implementation = double; +using preferred_implementation = int; + +// This is the fallback implementation, which should work everywhere. +template <typename Unused = void> double GetCpuTime(fallback_implementation) { + std::clock_t timestamp{std::clock()}; + if (timestamp != static_cast<std::clock_t>(-1)) { + return static_cast<double>(timestamp) / CLOCKS_PER_SEC; + } + // Return some negative value to represent failure. + return -1.0; +} + +// struct timespec and timespec_get are not implemented in macOS 10.14. Using +// it here limits which version of MacOS we are compatible with. Unfortunately +// when building on newer MacOS for older MacOS it uses the new headers (with +// a definition of struct timespec) but just errors on API calls so we can't use +// overloading magic to trigger different implementations depending if struct +// timespec is defined. +#if defined __APPLE__ +#define NO_TIMESPEC +#else +#undef NO_TIMESPEC +#endif + +#if defined __MINGW32__ +// clock_gettime is implemented in the pthread library for MinGW. +// Using it here would mean that all programs that link libflang_rt are +// required to also link to pthread. Instead, don't use the function. +#undef CLOCKID_CPU_TIME +#undef CLOCKID_ELAPSED_TIME +#else +// Determine what clock to use for CPU time. +#if defined CLOCK_PROCESS_CPUTIME_ID +#define CLOCKID_CPU_TIME CLOCK_PROCESS_CPUTIME_ID +#elif defined CLOCK_THREAD_CPUTIME_ID +#define CLOCKID_CPU_TIME CLOCK_THREAD_CPUTIME_ID +#else +#undef CLOCKID_CPU_TIME +#endif + +// Determine what clock to use for elapsed time. +#if defined CLOCK_MONOTONIC +#define CLOCKID_ELAPSED_TIME CLOCK_MONOTONIC +#elif defined CLOCK_REALTIME +#define CLOCKID_ELAPSED_TIME CLOCK_REALTIME +#else +#undef CLOCKID_ELAPSED_TIME +#endif +#endif + +#ifdef CLOCKID_CPU_TIME +#ifndef NO_TIMESPEC +// POSIX implementation using clock_gettime. This is only enabled where +// clock_gettime is available. +template <typename T = int, typename U = struct timespec> +double GetCpuTime(preferred_implementation, + // We need some dummy parameters to pass to decltype(clock_gettime). + T ClockId = 0, U *Timespec = nullptr, + decltype(clock_gettime(ClockId, Timespec)) *Enabled = nullptr) { + struct timespec tspec; + if (clock_gettime(CLOCKID_CPU_TIME, &tspec) == 0) { + return tspec.tv_nsec * 1.0e-9 + tspec.tv_sec; + } + // Return some negative value to represent failure. + return -1.0; +} +#endif // !NO_TIMESPEC +#endif // CLOCKID_CPU_TIME + +using count_t = std::int64_t; +using unsigned_count_t = std::uint64_t; + +// POSIX implementation using clock_gettime where available. The clock_gettime +// result is in nanoseconds, which is converted as necessary to +// - deciseconds for kind 1 +// - milliseconds for kinds 2, 4 +// - nanoseconds for kinds 8, 16 +constexpr unsigned_count_t DS_PER_SEC{10u}; +constexpr unsigned_count_t MS_PER_SEC{1'000u}; +[[maybe_unused]] constexpr unsigned_count_t US_PER_SEC{1'000'000u}; +constexpr unsigned_count_t NS_PER_SEC{1'000'000'000u}; + +// Computes HUGE(INT(0,kind)) as an unsigned integer value. +static constexpr inline unsigned_count_t GetHUGE(int kind) { + if (kind > 8) { + kind = 8; + } + return (unsigned_count_t{1} << ((8 * kind) - 1)) - 1; +} + +count_t ConvertSecondsNanosecondsToCount( + int kind, unsigned_count_t sec, unsigned_count_t nsec) { + const unsigned_count_t huge{GetHUGE(kind)}; + if (kind >= 8) { + return (sec * NS_PER_SEC + nsec) % (huge + 1); + } else if (kind >= 2) { + return (sec * MS_PER_SEC + (nsec / (NS_PER_SEC / MS_PER_SEC))) % (huge + 1); + } else { // kind == 1 + return (sec * DS_PER_SEC + (nsec / (NS_PER_SEC / DS_PER_SEC))) % (huge + 1); + } +} + +// Less accurate implementation only accurate to the nearest microsecond +// (instead of nanosecond) for systems where `struct timespec` is not available. +#if defined(NO_TIMESPEC) && !defined(_WIN32) +// Function converts a struct timeval into the desired count to +// be returned by the timing functions in accordance with the requested +// kind at the call site. +count_t ConvertTimevalToCount(int kind, const struct timeval &tval) { + unsigned_count_t sec{static_cast<unsigned_count_t>(tval.tv_sec)}; + unsigned_count_t nsec{static_cast<unsigned_count_t>(tval.tv_usec) * 1000}; + return ConvertSecondsNanosecondsToCount(kind, sec, nsec); +} + +template <typename Unused = void> +count_t GetSystemClockCount(int kind, fallback_implementation) { + struct timeval tval; + + if (gettimeofday(&tval, /*timezone=*/nullptr) != 0) { + // Return -HUGE(COUNT) to represent failure. + return -static_cast<count_t>(GetHUGE(kind)); + } + + // Compute the timestamp as seconds plus nanoseconds in accordance + // with the requested kind at the call site. + return ConvertTimevalToCount(kind, tval); +} + +#else + +// Function converts a std::timespec_t into the desired count to +// be returned by the timing functions in accordance with the requested +// kind at the call site. +count_t ConvertTimeSpecToCount(int kind, const struct timespec &tspec) { + unsigned_count_t sec{static_cast<unsigned_count_t>(tspec.tv_sec)}; + unsigned_count_t nsec{static_cast<unsigned_count_t>(tspec.tv_nsec)}; + return ConvertSecondsNanosecondsToCount(kind, sec, nsec); +} + +#ifndef _AIX +// More accurate version with nanosecond accuracy +template <typename Unused = void> +count_t GetSystemClockCount(int kind, fallback_implementation) { + struct timespec tspec; + + if (timespec_get(&tspec, TIME_UTC) < 0) { + // Return -HUGE(COUNT) to represent failure. + return -static_cast<count_t>(GetHUGE(kind)); + } + + // Compute the timestamp as seconds plus nanoseconds in accordance + // with the requested kind at the call site. + return ConvertTimeSpecToCount(kind, tspec); +} +#endif // !_AIX +#endif // !NO_TIMESPEC + +template <typename Unused = void> +count_t GetSystemClockCountRate(int kind, fallback_implementation) { +#ifdef NO_TIMESPEC + return kind >= 8 ? US_PER_SEC : kind >= 2 ? MS_PER_SEC : DS_PER_SEC; +#else + return kind >= 8 ? NS_PER_SEC : kind >= 2 ? MS_PER_SEC : DS_PER_SEC; +#endif +} + +template <typename Unused = void> +count_t GetSystemClockCountMax(int kind, fallback_implementation) { + unsigned_count_t maxCount{GetHUGE(kind)}; + return maxCount; +} + +#ifndef NO_TIMESPEC +#ifdef CLOCKID_ELAPSED_TIME +template <typename T = int, typename U = struct timespec> +count_t GetSystemClockCount(int kind, preferred_implementation, + // We need some dummy parameters to pass to decltype(clock_gettime). + T ClockId = 0, U *Timespec = nullptr, + decltype(clock_gettime(ClockId, Timespec)) *Enabled = nullptr) { + struct timespec tspec; + const unsigned_count_t huge{GetHUGE(kind)}; + if (clock_gettime(CLOCKID_ELAPSED_TIME, &tspec) != 0) { + return -huge; // failure + } + + // Compute the timestamp as seconds plus nanoseconds in accordance + // with the requested kind at the call site. + return ConvertTimeSpecToCount(kind, tspec); +} +#endif // CLOCKID_ELAPSED_TIME + +template <typename T = int, typename U = struct timespec> +count_t GetSystemClockCountRate(int kind, preferred_implementation, + // We need some dummy parameters to pass to decltype(clock_gettime). + T ClockId = 0, U *Timespec = nullptr, + decltype(clock_gettime(ClockId, Timespec)) *Enabled = nullptr) { + return kind >= 8 ? NS_PER_SEC : kind >= 2 ? MS_PER_SEC : DS_PER_SEC; +} + +template <typename T = int, typename U = struct timespec> +count_t GetSystemClockCountMax(int kind, preferred_implementation, + // We need some dummy parameters to pass to decltype(clock_gettime). + T ClockId = 0, U *Timespec = nullptr, + decltype(clock_gettime(ClockId, Timespec)) *Enabled = nullptr) { + return GetHUGE(kind); +} +#endif // !NO_TIMESPEC + +// DATE_AND_TIME (Fortran 2018 16.9.59) + +// Helper to set an integer value to -HUGE +template <int KIND> struct StoreNegativeHugeAt { + void operator()( + const Fortran::runtime::Descriptor &result, std::size_t at) const { + *result.ZeroBasedIndexedElement<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Integer, KIND>>(at) = + -std::numeric_limits<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Integer, KIND>>::max(); + } +}; + +// Default implementation when date and time information is not available (set +// strings to blanks and values to -HUGE as defined by the standard). +static void DateAndTimeUnavailable(Fortran::runtime::Terminator &terminator, + char *date, std::size_t dateChars, char *time, std::size_t timeChars, + char *zone, std::size_t zoneChars, + const Fortran::runtime::Descriptor *values) { + if (date) { + std::memset(date, static_cast<int>(' '), dateChars); + } + if (time) { + std::memset(time, static_cast<int>(' '), timeChars); + } + if (zone) { + std::memset(zone, static_cast<int>(' '), zoneChars); + } + if (values) { + auto typeCode{values->type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + values->rank() == 1 && values->GetDimension(0).Extent() >= 8 && + typeCode && + typeCode->first == Fortran::common::TypeCategory::Integer); + // DATE_AND_TIME values argument must have decimal range > 4. Do not accept + // KIND 1 here. + int kind{typeCode->second}; + RUNTIME_CHECK(terminator, kind != 1); + for (std::size_t i = 0; i < 8; ++i) { + Fortran::runtime::ApplyIntegerKind<StoreNegativeHugeAt, void>( + kind, terminator, *values, i); + } + } +} + +#ifndef _WIN32 +#ifdef _AIX +// Compute the time difference from GMT/UTC to get around the behavior of +// strfname on AIX that requires setting an environment variable for numeric +// value for ZONE. +// The ZONE and the VALUES(4) arguments of the DATE_AND_TIME intrinsic has +// the resolution to the minute. +static int computeUTCDiff(const tm &localTime, bool *err) { + tm utcTime; + const time_t timer{mktime(const_cast<tm *>(&localTime))}; + if (timer < 0) { + *err = true; + return 0; + } + + // Get the GMT/UTC time + if (gmtime_r(&timer, &utcTime) == nullptr) { + *err = true; + return 0; + } + + // Adjust for day difference + auto dayDiff{localTime.tm_mday - utcTime.tm_mday}; + auto localHr{localTime.tm_hour}; + if (dayDiff > 0) { + if (dayDiff == 1) { + localHr += 24; + } else { + utcTime.tm_hour += 24; + } + } else if (dayDiff < 0) { + if (dayDiff == -1) { + utcTime.tm_hour += 24; + } else { + localHr += 24; + } + } + return (localHr * 60 + localTime.tm_min) - + (utcTime.tm_hour * 60 + utcTime.tm_min); +} +#endif + +static std::size_t getUTCOffsetToBuffer( + char *buffer, const std::size_t &buffSize, tm *localTime) { +#ifdef _AIX + // format: +HHMM or -HHMM + bool err{false}; + auto utcOffset{computeUTCDiff(*localTime, &err)}; + auto hour{utcOffset / 60}; + auto hrMin{hour * 100 + (utcOffset - hour * 60)}; + auto n{sprintf(buffer, "%+05d", hrMin)}; + return err ? 0 : n + 1; +#else + return std::strftime(buffer, buffSize, "%z", localTime); +#endif +} + +// SFINAE helper to return the struct tm.tm_gmtoff which is not a POSIX standard +// field. +template <int KIND, typename TM = struct tm> +Fortran::runtime::CppTypeFor<Fortran::common::TypeCategory::Integer, KIND> +GetGmtOffset(const TM &tm, preferred_implementation, + decltype(tm.tm_gmtoff) *Enabled = nullptr) { + // Returns the GMT offset in minutes. + return tm.tm_gmtoff / 60; +} +template <int KIND, typename TM = struct tm> +Fortran::runtime::CppTypeFor<Fortran::common::TypeCategory::Integer, KIND> +GetGmtOffset(const TM &tm, fallback_implementation) { + // tm.tm_gmtoff is not available, there may be platform dependent alternatives + // (such as using timezone from <time.h> when available), but so far just + // return -HUGE to report that this information is not available. + const auto negHuge{-std::numeric_limits<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Integer, KIND>>::max()}; +#ifdef _AIX + bool err{false}; + auto diff{computeUTCDiff(tm, &err)}; + if (err) { + return negHuge; + } else { + return diff; + } +#else + return negHuge; +#endif +} +template <typename TM = struct tm> struct GmtOffsetHelper { + template <int KIND> struct StoreGmtOffset { + void operator()(const Fortran::runtime::Descriptor &result, std::size_t at, + TM &tm) const { + *result.ZeroBasedIndexedElement<Fortran::runtime::CppTypeFor< + Fortran::common::TypeCategory::Integer, KIND>>(at) = + GetGmtOffset<KIND>(tm, 0); + } + }; +}; + +// Dispatch to posix implementation where gettimeofday and localtime_r are +// available. +static void GetDateAndTime(Fortran::runtime::Terminator &terminator, char *date, + std::size_t dateChars, char *time, std::size_t timeChars, char *zone, + std::size_t zoneChars, const Fortran::runtime::Descriptor *values) { + + timeval t; + if (gettimeofday(&t, nullptr) != 0) { + DateAndTimeUnavailable( + terminator, date, dateChars, time, timeChars, zone, zoneChars, values); + return; + } + time_t timer{t.tv_sec}; + tm localTime; + localtime_r(&timer, &localTime); + std::intmax_t ms{t.tv_usec / 1000}; + + static constexpr std::size_t buffSize{16}; + char buffer[buffSize]; + auto copyBufferAndPad{ + [&](char *dest, std::size_t destChars, std::size_t len) { + auto copyLen{std::min(len, destChars)}; + std::memcpy(dest, buffer, copyLen); + for (auto i{copyLen}; i < destChars; ++i) { + dest[i] = ' '; + } + }}; + if (date) { + auto len = std::strftime(buffer, buffSize, "%Y%m%d", &localTime); + copyBufferAndPad(date, dateChars, len); + } + if (time) { + auto len{std::snprintf(buffer, buffSize, "%02d%02d%02d.%03jd", + localTime.tm_hour, localTime.tm_min, localTime.tm_sec, ms)}; + copyBufferAndPad(time, timeChars, len); + } + if (zone) { + // Note: this may leave the buffer empty on many platforms. Classic flang + // has a much more complex way of doing this (see __io_timezone in classic + // flang). + auto len{getUTCOffsetToBuffer(buffer, buffSize, &localTime)}; + copyBufferAndPad(zone, zoneChars, len); + } + if (values) { + auto typeCode{values->type().GetCategoryAndKind()}; + RUNTIME_CHECK(terminator, + values->rank() == 1 && values->GetDimension(0).Extent() >= 8 && + typeCode && + typeCode->first == Fortran::common::TypeCategory::Integer); + // DATE_AND_TIME values argument must have decimal range > 4. Do not accept + // KIND 1 here. + int kind{typeCode->second}; + RUNTIME_CHECK(terminator, kind != 1); + auto storeIntegerAt = [&](std::size_t atIndex, std::int64_t value) { + Fortran::runtime::ApplyIntegerKind<Fortran::runtime::StoreIntegerAt, + void>(kind, terminator, *values, atIndex, value); + }; + storeIntegerAt(0, localTime.tm_year + 1900); + storeIntegerAt(1, localTime.tm_mon + 1); + storeIntegerAt(2, localTime.tm_mday); + Fortran::runtime::ApplyIntegerKind< + GmtOffsetHelper<struct tm>::StoreGmtOffset, void>( + kind, terminator, *values, 3, localTime); + storeIntegerAt(4, localTime.tm_hour); + storeIntegerAt(5, localTime.tm_min); + storeIntegerAt(6, localTime.tm_sec); + storeIntegerAt(7, ms); + } +} + +#else +// Fallback implementation where gettimeofday or localtime_r are not both +// available (e.g. windows). +static void GetDateAndTime(Fortran::runtime::Terminator &terminator, char *date, + std::size_t dateChars, char *time, std::size_t timeChars, char *zone, + std::size_t zoneChars, const Fortran::runtime::Descriptor *values) { + // TODO: An actual implementation for non Posix system should be added. + // So far, implement as if the date and time is not available on those + // platforms. + DateAndTimeUnavailable( + terminator, date, dateChars, time, timeChars, zone, zoneChars, values); +} +#endif +} // namespace + +namespace Fortran::runtime { +extern "C" { + +double RTNAME(CpuTime)() { return GetCpuTime(0); } + +std::int64_t RTNAME(SystemClockCount)(int kind) { + return GetSystemClockCount(kind, 0); +} + +std::int64_t RTNAME(SystemClockCountRate)(int kind) { + return GetSystemClockCountRate(kind, 0); +} + +std::int64_t RTNAME(SystemClockCountMax)(int kind) { + return GetSystemClockCountMax(kind, 0); +} + +void RTNAME(DateAndTime)(char *date, std::size_t dateChars, char *time, + std::size_t timeChars, char *zone, std::size_t zoneChars, + const char *source, int line, const Descriptor *values) { + Fortran::runtime::Terminator terminator{source, line}; + return GetDateAndTime( + terminator, date, dateChars, time, timeChars, zone, zoneChars, values); +} + +void RTNAME(Etime)(const Descriptor *values, const Descriptor *time, + const char *sourceFile, int line) { + Fortran::runtime::Terminator terminator{sourceFile, line}; + + double usrTime = -1.0, sysTime = -1.0, realTime = -1.0; + +#ifdef _WIN32 + FILETIME creationTime; + FILETIME exitTime; + FILETIME kernelTime; + FILETIME userTime; + + if (GetProcessTimes(GetCurrentProcess(), &creationTime, &exitTime, + &kernelTime, &userTime) == 0) { + ULARGE_INTEGER userSystemTime; + ULARGE_INTEGER kernelSystemTime; + + memcpy(&userSystemTime, &userTime, sizeof(FILETIME)); + memcpy(&kernelSystemTime, &kernelTime, sizeof(FILETIME)); + + usrTime = ((double)(userSystemTime.QuadPart)) / 10000000.0; + sysTime = ((double)(kernelSystemTime.QuadPart)) / 10000000.0; + realTime = usrTime + sysTime; + } +#else + struct tms tms; + if (times(&tms) != (clock_t)-1) { + usrTime = ((double)(tms.tms_utime)) / sysconf(_SC_CLK_TCK); + sysTime = ((double)(tms.tms_stime)) / sysconf(_SC_CLK_TCK); + realTime = usrTime + sysTime; + } +#endif + + if (values) { + auto typeCode{values->type().GetCategoryAndKind()}; + // ETIME values argument must have decimal range == 2. + RUNTIME_CHECK(terminator, + values->rank() == 1 && typeCode && + typeCode->first == Fortran::common::TypeCategory::Real); + // Only accept KIND=4 here. + int kind{typeCode->second}; + RUNTIME_CHECK(terminator, kind == 4); + auto extent{values->GetDimension(0).Extent()}; + if (extent >= 1) { + ApplyFloatingPointKind<StoreFloatingPointAt, void>( + kind, terminator, *values, /* atIndex = */ 0, usrTime); + } + if (extent >= 2) { + ApplyFloatingPointKind<StoreFloatingPointAt, void>( + kind, terminator, *values, /* atIndex = */ 1, sysTime); + } + } + + if (time) { + auto typeCode{time->type().GetCategoryAndKind()}; + // ETIME time argument must have decimal range == 0. + RUNTIME_CHECK(terminator, + time->rank() == 0 && typeCode && + typeCode->first == Fortran::common::TypeCategory::Real); + // Only accept KIND=4 here. + int kind{typeCode->second}; + RUNTIME_CHECK(terminator, kind == 4); + + ApplyFloatingPointKind<StoreFloatingPointAt, void>( + kind, terminator, *time, /* atIndex = */ 0, realTime); + } +} + +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/tools.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/tools.cpp new file mode 100644 index 00000000000..24d05f369fc --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/tools.cpp @@ -0,0 +1,371 @@ +//===-- lib/runtime/tools.cpp -----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/terminator.h" +#include <algorithm> +#include <cstdint> +#include <cstdlib> +#include <cstring> + +namespace Fortran::runtime { + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS std::size_t TrimTrailingSpaces(const char *s, std::size_t n) { + while (n > 0 && s[n - 1] == ' ') { + --n; + } + return n; +} + +RT_API_ATTRS OwningPtr<char> SaveDefaultCharacter( + const char *s, std::size_t length, const Terminator &terminator) { + if (s) { + auto *p{static_cast<char *>(AllocateMemoryOrCrash(terminator, length + 1))}; + std::memcpy(p, s, length); + p[length] = '\0'; + return OwningPtr<char>{p}; + } else { + return OwningPtr<char>{}; + } +} + +static RT_API_ATTRS bool CaseInsensitiveMatch( + const char *value, std::size_t length, const char *possibility) { + for (; length-- > 0; ++possibility) { + char ch{*value++}; + if (ch >= 'a' && ch <= 'z') { + ch += 'A' - 'a'; + } + if (*possibility != ch) { + if (*possibility != '\0' || ch != ' ') { + return false; + } + // Ignore trailing blanks (12.5.6.2 p1) + while (length-- > 0) { + if (*value++ != ' ') { + return false; + } + } + return true; + } + } + return *possibility == '\0'; +} + +RT_API_ATTRS int IdentifyValue( + const char *value, std::size_t length, const char *possibilities[]) { + if (value) { + for (int j{0}; possibilities[j]; ++j) { + if (CaseInsensitiveMatch(value, length, possibilities[j])) { + return j; + } + } + } + return -1; +} + +RT_API_ATTRS void ToFortranDefaultCharacter( + char *to, std::size_t toLength, const char *from) { + std::size_t len{Fortran::runtime::strlen(from)}; + if (len < toLength) { + std::memcpy(to, from, len); + std::memset(to + len, ' ', toLength - len); + } else { + std::memcpy(to, from, toLength); + } +} + +RT_API_ATTRS void CheckConformability(const Descriptor &to, const Descriptor &x, + Terminator &terminator, const char *funcName, const char *toName, + const char *xName) { + if (x.rank() == 0) { + return; // scalar conforms with anything + } + int rank{to.rank()}; + if (x.rank() != rank) { + terminator.Crash( + "Incompatible array arguments to %s: %s has rank %d but %s has rank %d", + funcName, toName, rank, xName, x.rank()); + } else { + for (int j{0}; j < rank; ++j) { + auto toExtent{static_cast<std::int64_t>(to.GetDimension(j).Extent())}; + auto xExtent{static_cast<std::int64_t>(x.GetDimension(j).Extent())}; + if (xExtent != toExtent) { + terminator.Crash("Incompatible array arguments to %s: dimension %d of " + "%s has extent %" PRId64 " but %s has extent %" PRId64, + funcName, j + 1, toName, toExtent, xName, xExtent); + } + } + } +} + +RT_API_ATTRS void CheckIntegerKind( + Terminator &terminator, int kind, const char *intrinsic) { + if (kind < 1 || kind > 16 || (kind & (kind - 1)) != 0) { + terminator.Crash("not yet implemented: INTEGER(KIND=%d) in %s intrinsic", + intrinsic, kind); + } +} + +template <typename P, int RANK> +RT_API_ATTRS void ShallowCopyDiscontiguousToDiscontiguous( + const Descriptor &to, const Descriptor &from) { + DescriptorIterator<RANK> toIt{to}; + DescriptorIterator<RANK> fromIt{from}; + // Knowing the size at compile time can enable memcpy inlining optimisations + constexpr std::size_t typeElementBytes{sizeof(P)}; + // We might still need to check the actual size as a fallback + std::size_t elementBytes{to.ElementBytes()}; + for (std::size_t n{to.Elements()}; n-- > 0; + toIt.Advance(), fromIt.Advance()) { + // typeElementBytes == 1 when P is a char - the non-specialised case + if constexpr (typeElementBytes != 1) { + std::memcpy( + toIt.template Get<P>(), fromIt.template Get<P>(), typeElementBytes); + } else { + std::memcpy( + toIt.template Get<P>(), fromIt.template Get<P>(), elementBytes); + } + } +} + +// Explicitly instantiate the default case to conform to the C++ standard +template RT_API_ATTRS void ShallowCopyDiscontiguousToDiscontiguous<char, -1>( + const Descriptor &to, const Descriptor &from); + +template <typename P, int RANK> +RT_API_ATTRS void ShallowCopyDiscontiguousToContiguous( + const Descriptor &to, const Descriptor &from) { + char *toAt{to.OffsetElement()}; + constexpr std::size_t typeElementBytes{sizeof(P)}; + std::size_t elementBytes{to.ElementBytes()}; + DescriptorIterator<RANK> fromIt{from}; + for (std::size_t n{to.Elements()}; n-- > 0; + toAt += elementBytes, fromIt.Advance()) { + if constexpr (typeElementBytes != 1) { + std::memcpy(toAt, fromIt.template Get<P>(), typeElementBytes); + } else { + std::memcpy(toAt, fromIt.template Get<P>(), elementBytes); + } + } +} + +template RT_API_ATTRS void ShallowCopyDiscontiguousToContiguous<char, -1>( + const Descriptor &to, const Descriptor &from); + +template <typename P, int RANK> +RT_API_ATTRS void ShallowCopyContiguousToDiscontiguous( + const Descriptor &to, const Descriptor &from) { + char *fromAt{from.OffsetElement()}; + DescriptorIterator<RANK> toIt{to}; + constexpr std::size_t typeElementBytes{sizeof(P)}; + std::size_t elementBytes{to.ElementBytes()}; + for (std::size_t n{to.Elements()}; n-- > 0; + toIt.Advance(), fromAt += elementBytes) { + if constexpr (typeElementBytes != 1) { + std::memcpy(toIt.template Get<P>(), fromAt, typeElementBytes); + } else { + std::memcpy(toIt.template Get<P>(), fromAt, elementBytes); + } + } +} + +template RT_API_ATTRS void ShallowCopyContiguousToDiscontiguous<char, -1>( + const Descriptor &to, const Descriptor &from); + +// ShallowCopy helper for calling the correct specialised variant based on +// scenario +template <typename P, int RANK = -1> +RT_API_ATTRS void ShallowCopyInner(const Descriptor &to, const Descriptor &from, + bool toIsContiguous, bool fromIsContiguous) { + if (toIsContiguous) { + if (fromIsContiguous) { + std::memcpy(to.OffsetElement(), from.OffsetElement(), + to.Elements() * to.ElementBytes()); + } else { + ShallowCopyDiscontiguousToContiguous<P, RANK>(to, from); + } + } else { + if (fromIsContiguous) { + ShallowCopyContiguousToDiscontiguous<P, RANK>(to, from); + } else { + ShallowCopyDiscontiguousToDiscontiguous<P, RANK>(to, from); + } + } +} + +// Most arrays are much closer to rank-1 than to maxRank. +// Doing the recursion upwards instead of downwards puts the more common +// cases earlier in the if-chain and has a tangible impact on performance. +template <typename P, int RANK> struct ShallowCopyRankSpecialize { + static RT_API_ATTRS bool execute(const Descriptor &to, const Descriptor &from, + bool toIsContiguous, bool fromIsContiguous) { + if (to.rank() == RANK && from.rank() == RANK) { + ShallowCopyInner<P, RANK>(to, from, toIsContiguous, fromIsContiguous); + return true; + } + return ShallowCopyRankSpecialize<P, RANK + 1>::execute( + to, from, toIsContiguous, fromIsContiguous); + } +}; + +template <typename P> struct ShallowCopyRankSpecialize<P, maxRank + 1> { + static RT_API_ATTRS bool execute(const Descriptor &to, const Descriptor &from, + bool toIsContiguous, bool fromIsContiguous) { + return false; + } +}; + +// ShallowCopy helper for specialising the variants based on array rank +template <typename P> +RT_API_ATTRS void ShallowCopyRank(const Descriptor &to, const Descriptor &from, + bool toIsContiguous, bool fromIsContiguous) { + // Try to call a specialised ShallowCopy variant from rank-1 up to maxRank + bool specialized{ShallowCopyRankSpecialize<P, 1>::execute( + to, from, toIsContiguous, fromIsContiguous)}; + if (!specialized) { + ShallowCopyInner<P>(to, from, toIsContiguous, fromIsContiguous); + } +} + +RT_API_ATTRS void ShallowCopy(const Descriptor &to, const Descriptor &from, + bool toIsContiguous, bool fromIsContiguous) { + std::size_t elementBytes{to.ElementBytes()}; + // Checking the type at runtime and making sure the pointer passed to memcpy + // has a type that matches the element type makes it possible for the compiler + // to optimise out the memcpy calls altogether and can substantially improve + // performance for some applications. + if (to.type().IsInteger()) { + if (elementBytes == sizeof(int64_t)) { + ShallowCopyRank<int64_t>(to, from, toIsContiguous, fromIsContiguous); + } else if (elementBytes == sizeof(int32_t)) { + ShallowCopyRank<int32_t>(to, from, toIsContiguous, fromIsContiguous); + } else if (elementBytes == sizeof(int16_t)) { + ShallowCopyRank<int16_t>(to, from, toIsContiguous, fromIsContiguous); +#if defined USING_NATIVE_INT128_T + } else if (elementBytes == sizeof(__int128_t)) { + ShallowCopyRank<__int128_t>(to, from, toIsContiguous, fromIsContiguous); +#endif + } else { + ShallowCopyRank<char>(to, from, toIsContiguous, fromIsContiguous); + } + } else if (to.type().IsReal()) { + if (elementBytes == sizeof(double)) { + ShallowCopyRank<double>(to, from, toIsContiguous, fromIsContiguous); + } else if (elementBytes == sizeof(float)) { + ShallowCopyRank<float>(to, from, toIsContiguous, fromIsContiguous); + } else { + ShallowCopyRank<char>(to, from, toIsContiguous, fromIsContiguous); + } + } else { + ShallowCopyRank<char>(to, from, toIsContiguous, fromIsContiguous); + } +} + +RT_API_ATTRS void ShallowCopy(const Descriptor &to, const Descriptor &from) { + ShallowCopy(to, from, to.IsContiguous(), from.IsContiguous()); +} + +RT_API_ATTRS char *EnsureNullTerminated( + char *str, std::size_t length, Terminator &terminator) { + if (runtime::memchr(str, '\0', length) == nullptr) { + char *newCmd{(char *)AllocateMemoryOrCrash(terminator, length + 1)}; + std::memcpy(newCmd, str, length); + newCmd[length] = '\0'; + return newCmd; + } else { + return str; + } +} + +RT_API_ATTRS bool IsValidCharDescriptor(const Descriptor *value) { + return value && value->IsAllocated() && + value->type() == TypeCode(TypeCategory::Character, 1) && + value->rank() == 0; +} + +RT_API_ATTRS bool IsValidIntDescriptor(const Descriptor *intVal) { + // Check that our descriptor is allocated and is a scalar integer with + // kind != 1 (i.e. with a large enough decimal exponent range). + return intVal && intVal->IsAllocated() && intVal->rank() == 0 && + intVal->type().IsInteger() && intVal->type().GetCategoryAndKind() && + intVal->type().GetCategoryAndKind()->second != 1; +} + +RT_API_ATTRS std::int32_t CopyCharsToDescriptor(const Descriptor &value, + const char *rawValue, std::size_t rawValueLength, const Descriptor *errmsg, + std::size_t offset) { + + const std::int64_t toCopy{std::min(static_cast<std::int64_t>(rawValueLength), + static_cast<std::int64_t>(value.ElementBytes() - offset))}; + if (toCopy < 0) { + return ToErrmsg(errmsg, StatValueTooShort); + } + + std::memcpy(value.OffsetElement(offset), rawValue, toCopy); + + if (static_cast<std::int64_t>(rawValueLength) > toCopy) { + return ToErrmsg(errmsg, StatValueTooShort); + } + + return StatOk; +} + +RT_API_ATTRS void StoreIntToDescriptor( + const Descriptor *length, std::int64_t value, Terminator &terminator) { + auto typeCode{length->type().GetCategoryAndKind()}; + int kind{typeCode->second}; + ApplyIntegerKind<StoreIntegerAt, void>( + kind, terminator, *length, /* atIndex = */ 0, value); +} + +template <int KIND> struct FitsInIntegerKind { + RT_API_ATTRS bool operator()([[maybe_unused]] std::int64_t value) { + if constexpr (KIND >= 8) { + return true; + } else { + return value <= + std::numeric_limits< + CppTypeFor<Fortran::common::TypeCategory::Integer, KIND>>::max(); + } + } +}; + +// Utility: establishes & allocates the result array for a partial +// reduction (i.e., one with DIM=). +RT_API_ATTRS void CreatePartialReductionResult(Descriptor &result, + const Descriptor &x, std::size_t resultElementSize, int dim, + Terminator &terminator, const char *intrinsic, TypeCode typeCode) { + int xRank{x.rank()}; + if (dim < 1 || dim > xRank) { + terminator.Crash( + "%s: bad DIM=%d for ARRAY with rank %d", intrinsic, dim, xRank); + } + int zeroBasedDim{dim - 1}; + SubscriptValue resultExtent[maxRank]; + for (int j{0}; j < zeroBasedDim; ++j) { + resultExtent[j] = x.GetDimension(j).Extent(); + } + for (int j{zeroBasedDim + 1}; j < xRank; ++j) { + resultExtent[j - 1] = x.GetDimension(j).Extent(); + } + result.Establish(typeCode, resultElementSize, nullptr, xRank - 1, + resultExtent, CFI_attribute_allocatable); + for (int j{0}; j + 1 < xRank; ++j) { + result.GetDimension(j).SetBounds(1, resultExtent[j]); + } + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "%s: could not allocate memory for result; STAT=%d", intrinsic, stat); + } +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/transformational.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/transformational.cpp new file mode 100644 index 00000000000..3df314a4e96 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/transformational.cpp @@ -0,0 +1,999 @@ +//===-- lib/runtime/transformational.cpp ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements the transformational intrinsic functions of Fortran 2018 that +// rearrange or duplicate data without (much) regard to type. These are +// CSHIFT, EOSHIFT, PACK, RESHAPE, SPREAD, TRANSPOSE, and UNPACK. +// +// Many of these are defined in the 2018 standard with text that makes sense +// only if argument arrays have lower bounds of one. Rather than interpret +// these cases as implying a hidden constraint, these implementations +// work with arbitrary lower bounds. This may be technically an extension +// of the standard but it more likely to conform with its intent. + +#include "flang/Runtime/transformational.h" +#include "copy.h" +#include "flang-rt/runtime/descriptor.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Common/float128.h" + +namespace Fortran::runtime { + +// Utility for CSHIFT & EOSHIFT rank > 1 cases that determines the shift count +// for each of the vector sections of the result. +class ShiftControl { +public: + RT_API_ATTRS ShiftControl(const Descriptor &s, Terminator &t, int dim) + : shift_{s}, terminator_{t}, shiftRank_{s.rank()}, dim_{dim} {} + RT_API_ATTRS void Init(const Descriptor &source, const char *which) { + int rank{source.rank()}; + RUNTIME_CHECK(terminator_, shiftRank_ == 0 || shiftRank_ == rank - 1); + auto catAndKind{shift_.type().GetCategoryAndKind()}; + RUNTIME_CHECK( + terminator_, catAndKind && catAndKind->first == TypeCategory::Integer); + shiftElemLen_ = catAndKind->second; + if (shiftRank_ > 0) { + int k{0}; + for (int j{0}; j < rank; ++j) { + if (j + 1 != dim_) { + const Dimension &shiftDim{shift_.GetDimension(k)}; + lb_[k++] = shiftDim.LowerBound(); + if (shiftDim.Extent() != source.GetDimension(j).Extent()) { + terminator_.Crash("%s: on dimension %d, SHIFT= has extent %jd but " + "ARRAY= has extent %jd", + which, k, static_cast<std::intmax_t>(shiftDim.Extent()), + static_cast<std::intmax_t>(source.GetDimension(j).Extent())); + } + } + } + } else if (auto count{GetInt64Safe( + shift_.OffsetElement<char>(), shiftElemLen_, terminator_)}) { + shiftCount_ = *count; + } else { + terminator_.Crash("%s: SHIFT= value exceeds 64 bits", which); + } + } + RT_API_ATTRS SubscriptValue GetShift(const SubscriptValue resultAt[]) const { + if (shiftRank_ > 0) { + SubscriptValue shiftAt[maxRank]; + int k{0}; + for (int j{0}; j < shiftRank_ + 1; ++j) { + if (j + 1 != dim_) { + shiftAt[k] = lb_[k] + resultAt[j] - 1; + ++k; + } + } + auto count{GetInt64Safe( + shift_.Element<char>(shiftAt), shiftElemLen_, terminator_)}; + RUNTIME_CHECK(terminator_, count.has_value()); + return *count; + } else { + return shiftCount_; // invariant count extracted in Init() + } + } + +private: + const Descriptor &shift_; + Terminator &terminator_; + int shiftRank_; + int dim_; + SubscriptValue lb_[maxRank]; + std::size_t shiftElemLen_; + SubscriptValue shiftCount_{}; +}; + +// Fill an EOSHIFT result with default boundary values +static RT_API_ATTRS void DefaultInitialize( + const Descriptor &result, Terminator &terminator) { + auto catAndKind{result.type().GetCategoryAndKind()}; + RUNTIME_CHECK( + terminator, catAndKind && catAndKind->first != TypeCategory::Derived); + std::size_t elementLen{result.ElementBytes()}; + std::size_t bytes{result.Elements() * elementLen}; + if (catAndKind->first == TypeCategory::Character) { + switch (int kind{catAndKind->second}) { + case 1: + Fortran::runtime::fill_n(result.OffsetElement<char>(), bytes, ' '); + break; + case 2: + Fortran::runtime::fill_n(result.OffsetElement<char16_t>(), bytes / 2, + static_cast<char16_t>(' ')); + break; + case 4: + Fortran::runtime::fill_n(result.OffsetElement<char32_t>(), bytes / 4, + static_cast<char32_t>(' ')); + break; + default: + terminator.Crash( + "not yet implemented: CHARACTER(KIND=%d) in EOSHIFT intrinsic", kind); + } + } else { + std::memset(result.raw().base_addr, 0, bytes); + } +} + +static inline RT_API_ATTRS std::size_t AllocateResult(Descriptor &result, + const Descriptor &source, int rank, const SubscriptValue extent[], + Terminator &terminator, const char *function) { + std::size_t elementLen{source.ElementBytes()}; + const DescriptorAddendum *sourceAddendum{source.Addendum()}; + result.Establish(source.type(), elementLen, nullptr, rank, extent, + CFI_attribute_allocatable, sourceAddendum != nullptr); + if (sourceAddendum) { + *result.Addendum() = *sourceAddendum; + } + for (int j{0}; j < rank; ++j) { + result.GetDimension(j).SetBounds(1, extent[j]); + } + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "%s: Could not allocate memory for result (stat=%d)", function, stat); + } + return elementLen; +} + +template <TypeCategory CAT, int KIND> +static inline RT_API_ATTRS std::size_t AllocateBesselResult(Descriptor &result, + int32_t n1, int32_t n2, Terminator &terminator, const char *function) { + int rank{1}; + SubscriptValue extent[maxRank]; + for (int j{0}; j < maxRank; j++) { + extent[j] = 0; + } + if (n1 <= n2) { + extent[0] = n2 - n1 + 1; + } + + std::size_t elementLen{Descriptor::BytesFor(CAT, KIND)}; + result.Establish(TypeCode{CAT, KIND}, elementLen, nullptr, rank, extent, + CFI_attribute_allocatable, false); + for (int j{0}; j < rank; ++j) { + result.GetDimension(j).SetBounds(1, extent[j]); + } + if (int stat{result.Allocate(kNoAsyncObject)}) { + terminator.Crash( + "%s: Could not allocate memory for result (stat=%d)", function, stat); + } + return elementLen; +} + +template <TypeCategory CAT, int KIND> +static inline RT_API_ATTRS void DoBesselJn(Descriptor &result, int32_t n1, + int32_t n2, CppTypeFor<CAT, KIND> x, CppTypeFor<CAT, KIND> bn2, + CppTypeFor<CAT, KIND> bn2_1, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + AllocateBesselResult<CAT, KIND>(result, n1, n2, terminator, "BESSEL_JN"); + + // The standard requires that n1 and n2 be non-negative. However, some other + // compilers generate results even when n1 and/or n2 are negative. For now, + // we also do not enforce the non-negativity constraint. + if (n2 < n1) { + return; + } + + SubscriptValue at[maxRank]; + for (int j{0}; j < maxRank; ++j) { + at[j] = 0; + } + + // if n2 >= n1, there will be at least one element in the result. + at[0] = n2 - n1 + 1; + *result.Element<CppTypeFor<CAT, KIND>>(at) = bn2; + + if (n2 == n1) { + return; + } + + at[0] = n2 - n1; + *result.Element<CppTypeFor<CAT, KIND>>(at) = bn2_1; + + // Bessel functions of the first kind are stable for a backward recursion + // (see https://dlmf.nist.gov/10.74.iv and https://dlmf.nist.gov/10.6.E1). + // + // J(n-1, x) = (2.0 / x) * n * J(n, x) - J(n+1, x) + // + // which is equivalent to + // + // J(n, x) = (2.0 / x) * (n + 1) * J(n+1, x) - J(n+2, x) + // + CppTypeFor<CAT, KIND> bn_2 = bn2; + CppTypeFor<CAT, KIND> bn_1 = bn2_1; + CppTypeFor<CAT, KIND> twoOverX = 2.0 / x; + for (int n{n2 - 2}; n >= n1; --n) { + auto bn = twoOverX * (n + 1) * bn_1 - bn_2; + + at[0] = n - n1 + 1; + *result.Element<CppTypeFor<CAT, KIND>>(at) = bn; + + bn_2 = bn_1; + bn_1 = bn; + } +} + +template <TypeCategory CAT, int KIND> +static inline RT_API_ATTRS void DoBesselJnX0(Descriptor &result, int32_t n1, + int32_t n2, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + AllocateBesselResult<CAT, KIND>(result, n1, n2, terminator, "BESSEL_JN"); + + // The standard requires that n1 and n2 be non-negative. However, some other + // compilers generate results even when n1 and/or n2 are negative. For now, + // we also do not enforce the non-negativity constraint. + if (n2 < n1) { + return; + } + + SubscriptValue at[maxRank]; + for (int j{0}; j < maxRank; ++j) { + at[j] = 0; + } + + // J(0, 0.0) = 1.0, when n == 0. + // J(n, 0.0) = 0.0, when n > 0. + at[0] = 1; + *result.Element<CppTypeFor<CAT, KIND>>(at) = (n1 == 0) ? 1.0 : 0.0; + for (int j{2}; j <= n2 - n1 + 1; ++j) { + at[0] = j; + *result.Element<CppTypeFor<CAT, KIND>>(at) = 0.0; + } +} + +template <TypeCategory CAT, int KIND> +static inline RT_API_ATTRS void DoBesselYn(Descriptor &result, int32_t n1, + int32_t n2, CppTypeFor<CAT, KIND> x, CppTypeFor<CAT, KIND> bn1, + CppTypeFor<CAT, KIND> bn1_1, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + AllocateBesselResult<CAT, KIND>(result, n1, n2, terminator, "BESSEL_YN"); + + // The standard requires that n1 and n2 be non-negative. However, some other + // compilers generate results even when n1 and/or n2 are negative. For now, + // we also do not enforce the non-negativity constraint. + if (n2 < n1) { + return; + } + + SubscriptValue at[maxRank]; + for (int j{0}; j < maxRank; ++j) { + at[j] = 0; + } + + // if n2 >= n1, there will be at least one element in the result. + at[0] = 1; + *result.Element<CppTypeFor<CAT, KIND>>(at) = bn1; + + if (n2 == n1) { + return; + } + + at[0] = 2; + *result.Element<CppTypeFor<CAT, KIND>>(at) = bn1_1; + + // Bessel functions of the second kind are stable for a forward recursion + // (see https://dlmf.nist.gov/10.74.iv and https://dlmf.nist.gov/10.6.E1). + // + // Y(n+1, x) = (2.0 / x) * n * Y(n, x) - Y(n-1, x) + // + // which is equivalent to + // + // Y(n, x) = (2.0 / x) * (n - 1) * Y(n-1, x) - Y(n-2, x) + // + CppTypeFor<CAT, KIND> bn_2 = bn1; + CppTypeFor<CAT, KIND> bn_1 = bn1_1; + CppTypeFor<CAT, KIND> twoOverX = 2.0 / x; + for (int n{n1 + 2}; n <= n2; ++n) { + auto bn = twoOverX * (n - 1) * bn_1 - bn_2; + + at[0] = n - n1 + 1; + *result.Element<CppTypeFor<CAT, KIND>>(at) = bn; + + bn_2 = bn_1; + bn_1 = bn; + } +} + +template <TypeCategory CAT, int KIND> +static inline RT_API_ATTRS void DoBesselYnX0(Descriptor &result, int32_t n1, + int32_t n2, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + AllocateBesselResult<CAT, KIND>(result, n1, n2, terminator, "BESSEL_YN"); + + // The standard requires that n1 and n2 be non-negative. However, some other + // compilers generate results even when n1 and/or n2 are negative. For now, + // we also do not enforce the non-negativity constraint. + if (n2 < n1) { + return; + } + + SubscriptValue at[maxRank]; + for (int j{0}; j < maxRank; ++j) { + at[j] = 0; + } + + // Y(n, 0.0) = -Inf, when n >= 0 + for (int j{1}; j <= n2 - n1 + 1; ++j) { + at[0] = j; + *result.Element<CppTypeFor<CAT, KIND>>(at) = + -std::numeric_limits<CppTypeFor<CAT, KIND>>::infinity(); + } +} + +static inline RT_API_ATTRS void CheckConformabilityForShallowCopy( + const Descriptor &d1, const Descriptor &d2, Terminator &terminator, + const char *funcName, const char *d1Name, const char *d2Name) { + if (d1.rank() != d2.rank()) { + terminator.Crash( + "Incompatible arguments to %s: %s has rank %d, %s has rank %d", + funcName, d1Name, d1.rank(), d1Name, d2.rank()); + } + + // Check that the shapes conform. + CheckConformability(d1, d2, terminator, funcName, d1Name, d2Name); + + if (d1.ElementBytes() != d2.ElementBytes()) { + terminator.Crash("Incompatible arguments to %s: %s has element byte length " + "%zd, %s has length %zd", + funcName, d1Name, d1.ElementBytes(), d2Name, d2.ElementBytes()); + } + if (d1.type() != d2.type()) { + terminator.Crash("Incompatible arguments to %s: %s has type code %d, %s " + "has type code %d", + funcName, d1Name, d1.type().raw(), d2Name, d2.type().raw()); + } + const DescriptorAddendum *d1Addendum{d1.Addendum()}; + const typeInfo::DerivedType *d1Derived{ + d1Addendum ? d1Addendum->derivedType() : nullptr}; + const DescriptorAddendum *d2Addendum{d2.Addendum()}; + const typeInfo::DerivedType *d2Derived{ + d2Addendum ? d2Addendum->derivedType() : nullptr}; + if (d1Derived != d2Derived) { + terminator.Crash( + "Incompatible arguments to %s: %s and %s have different derived types", + funcName, d1Name, d2Name); + } + if (d2Derived) { + // Compare LEN parameters. + std::size_t lenParms{d2Derived->LenParameters()}; + for (std::size_t j{0}; j < lenParms; ++j) { + if (d1Addendum->LenParameterValue(j) != + d2Addendum->LenParameterValue(j)) { + terminator.Crash("Incompatible arguments to %s: type length parameter " + "%zd for %s is %zd, for %s is %zd", + funcName, j, d1Name, + static_cast<std::size_t>(d1Addendum->LenParameterValue(j)), d2Name, + static_cast<std::size_t>(d2Addendum->LenParameterValue(j))); + } + } + } +} + +template <bool IS_ALLOCATING> +static inline RT_API_ATTRS void DoShallowCopy( + std::conditional_t<IS_ALLOCATING, Descriptor, const Descriptor> &result, + const Descriptor &source, Terminator &terminator, const char *funcName) { + if constexpr (IS_ALLOCATING) { + SubscriptValue extent[maxRank]; + source.GetShape(extent); + AllocateResult(result, source, source.rank(), extent, terminator, funcName); + } else { + CheckConformabilityForShallowCopy( + result, source, terminator, funcName, "RESULT=", "SOURCE="); + } + + ShallowCopy(result, source); +} + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +// BESSEL_JN +// TODO: REAL(2 & 3) +void RTDEF(BesselJn_4)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> bn2, + CppTypeFor<TypeCategory::Real, 4> bn2_1, const char *sourceFile, int line) { + DoBesselJn<TypeCategory::Real, 4>( + result, n1, n2, x, bn2, bn2_1, sourceFile, line); +} + +void RTDEF(BesselJn_8)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> bn2, + CppTypeFor<TypeCategory::Real, 8> bn2_1, const char *sourceFile, int line) { + DoBesselJn<TypeCategory::Real, 8>( + result, n1, n2, x, bn2, bn2_1, sourceFile, line); +} + +#if HAS_FLOAT80 +void RTDEF(BesselJn_10)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 10> x, + CppTypeFor<TypeCategory::Real, 10> bn2, + CppTypeFor<TypeCategory::Real, 10> bn2_1, const char *sourceFile, + int line) { + DoBesselJn<TypeCategory::Real, 10>( + result, n1, n2, x, bn2, bn2_1, sourceFile, line); +} +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(BesselJn_16)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 16> x, + CppTypeFor<TypeCategory::Real, 16> bn2, + CppTypeFor<TypeCategory::Real, 16> bn2_1, const char *sourceFile, + int line) { + DoBesselJn<TypeCategory::Real, 16>( + result, n1, n2, x, bn2, bn2_1, sourceFile, line); +} +#endif + +// TODO: REAL(2 & 3) +void RTDEF(BesselJnX0_4)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselJnX0<TypeCategory::Real, 4>(result, n1, n2, sourceFile, line); +} + +void RTDEF(BesselJnX0_8)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselJnX0<TypeCategory::Real, 8>(result, n1, n2, sourceFile, line); +} + +#if HAS_FLOAT80 +void RTDEF(BesselJnX0_10)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselJnX0<TypeCategory::Real, 10>(result, n1, n2, sourceFile, line); +} +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(BesselJnX0_16)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselJnX0<TypeCategory::Real, 16>(result, n1, n2, sourceFile, line); +} +#endif + +// BESSEL_YN +// TODO: REAL(2 & 3) +void RTDEF(BesselYn_4)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 4> x, CppTypeFor<TypeCategory::Real, 4> bn1, + CppTypeFor<TypeCategory::Real, 4> bn1_1, const char *sourceFile, int line) { + DoBesselYn<TypeCategory::Real, 4>( + result, n1, n2, x, bn1, bn1_1, sourceFile, line); +} + +void RTDEF(BesselYn_8)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 8> x, CppTypeFor<TypeCategory::Real, 8> bn1, + CppTypeFor<TypeCategory::Real, 8> bn1_1, const char *sourceFile, int line) { + DoBesselYn<TypeCategory::Real, 8>( + result, n1, n2, x, bn1, bn1_1, sourceFile, line); +} + +#if HAS_FLOAT80 +void RTDEF(BesselYn_10)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 10> x, + CppTypeFor<TypeCategory::Real, 10> bn1, + CppTypeFor<TypeCategory::Real, 10> bn1_1, const char *sourceFile, + int line) { + DoBesselYn<TypeCategory::Real, 10>( + result, n1, n2, x, bn1, bn1_1, sourceFile, line); +} +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(BesselYn_16)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 16> x, + CppTypeFor<TypeCategory::Real, 16> bn1, + CppTypeFor<TypeCategory::Real, 16> bn1_1, const char *sourceFile, + int line) { + DoBesselYn<TypeCategory::Real, 16>( + result, n1, n2, x, bn1, bn1_1, sourceFile, line); +} +#endif + +// TODO: REAL(2 & 3) +void RTDEF(BesselYnX0_4)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselYnX0<TypeCategory::Real, 4>(result, n1, n2, sourceFile, line); +} + +void RTDEF(BesselYnX0_8)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselYnX0<TypeCategory::Real, 8>(result, n1, n2, sourceFile, line); +} + +#if HAS_FLOAT80 +void RTDEF(BesselYnX0_10)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselYnX0<TypeCategory::Real, 10>(result, n1, n2, sourceFile, line); +} +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDEF(BesselYnX0_16)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile, int line) { + DoBesselYnX0<TypeCategory::Real, 16>(result, n1, n2, sourceFile, line); +} +#endif + +// CSHIFT where rank of ARRAY argument > 1 +void RTDEF(Cshift)(Descriptor &result, const Descriptor &source, + const Descriptor &shift, int dim, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + int rank{source.rank()}; + RUNTIME_CHECK(terminator, rank > 1); + if (dim < 1 || dim > rank) { + terminator.Crash( + "CSHIFT: DIM=%d must be >= 1 and <= ARRAY= rank %d", dim, rank); + } + ShiftControl shiftControl{shift, terminator, dim}; + shiftControl.Init(source, "CSHIFT"); + SubscriptValue extent[maxRank]; + source.GetShape(extent); + AllocateResult(result, source, rank, extent, terminator, "CSHIFT"); + SubscriptValue resultAt[maxRank]; + for (int j{0}; j < rank; ++j) { + resultAt[j] = 1; + } + SubscriptValue sourceLB[maxRank]; + source.GetLowerBounds(sourceLB); + SubscriptValue dimExtent{extent[dim - 1]}; + SubscriptValue dimLB{sourceLB[dim - 1]}; + SubscriptValue &resDim{resultAt[dim - 1]}; + for (std::size_t n{result.Elements()}; n > 0; n -= dimExtent) { + SubscriptValue shiftCount{shiftControl.GetShift(resultAt)}; + SubscriptValue sourceAt[maxRank]; + for (int j{0}; j < rank; ++j) { + sourceAt[j] = sourceLB[j] + resultAt[j] - 1; + } + SubscriptValue &sourceDim{sourceAt[dim - 1]}; + sourceDim = dimLB + shiftCount % dimExtent; + if (sourceDim < dimLB) { + sourceDim += dimExtent; + } + for (resDim = 1; resDim <= dimExtent; ++resDim) { + CopyElement(result, resultAt, source, sourceAt, terminator); + if (++sourceDim == dimLB + dimExtent) { + sourceDim = dimLB; + } + } + result.IncrementSubscripts(resultAt); + } +} + +// CSHIFT where rank of ARRAY argument == 1 +void RTDEF(CshiftVector)(Descriptor &result, const Descriptor &source, + std::int64_t shift, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + RUNTIME_CHECK(terminator, source.rank() == 1); + const Dimension &sourceDim{source.GetDimension(0)}; + SubscriptValue extent{sourceDim.Extent()}; + AllocateResult(result, source, 1, &extent, terminator, "CSHIFT"); + SubscriptValue lb{sourceDim.LowerBound()}; + for (SubscriptValue j{0}; j < extent; ++j) { + SubscriptValue resultAt{1 + j}; + SubscriptValue sourceAt{ + lb + static_cast<SubscriptValue>(j + shift) % extent}; + if (sourceAt < lb) { + sourceAt += extent; + } + CopyElement(result, &resultAt, source, &sourceAt, terminator); + } +} + +// EOSHIFT of rank > 1 +void RTDEF(Eoshift)(Descriptor &result, const Descriptor &source, + const Descriptor &shift, const Descriptor *boundary, int dim, + const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + SubscriptValue extent[maxRank]; + int rank{source.GetShape(extent)}; + RUNTIME_CHECK(terminator, rank > 1); + if (dim < 1 || dim > rank) { + terminator.Crash( + "EOSHIFT: DIM=%d must be >= 1 and <= ARRAY= rank %d", dim, rank); + } + std::size_t elementLen{ + AllocateResult(result, source, rank, extent, terminator, "EOSHIFT")}; + int boundaryRank{-1}; + if (boundary) { + boundaryRank = boundary->rank(); + RUNTIME_CHECK(terminator, boundaryRank == 0 || boundaryRank == rank - 1); + RUNTIME_CHECK(terminator, boundary->type() == source.type()); + if (boundary->ElementBytes() != elementLen) { + terminator.Crash("EOSHIFT: BOUNDARY= has element byte length %zd, but " + "ARRAY= has length %zd", + boundary->ElementBytes(), elementLen); + } + if (boundaryRank > 0) { + int k{0}; + for (int j{0}; j < rank; ++j) { + if (j != dim - 1) { + if (boundary->GetDimension(k).Extent() != extent[j]) { + terminator.Crash("EOSHIFT: BOUNDARY= has extent %jd on dimension " + "%d but must conform with extent %jd of ARRAY=", + static_cast<std::intmax_t>(boundary->GetDimension(k).Extent()), + k + 1, static_cast<std::intmax_t>(extent[j])); + } + ++k; + } + } + } + } + ShiftControl shiftControl{shift, terminator, dim}; + shiftControl.Init(source, "EOSHIFT"); + SubscriptValue resultAt[maxRank]; + for (int j{0}; j < rank; ++j) { + resultAt[j] = 1; + } + if (!boundary) { + DefaultInitialize(result, terminator); + } + SubscriptValue sourceLB[maxRank]; + source.GetLowerBounds(sourceLB); + SubscriptValue boundaryAt[maxRank]; + if (boundaryRank > 0) { + boundary->GetLowerBounds(boundaryAt); + } + SubscriptValue dimExtent{extent[dim - 1]}; + SubscriptValue dimLB{sourceLB[dim - 1]}; + SubscriptValue &resDim{resultAt[dim - 1]}; + for (std::size_t n{result.Elements()}; n > 0; n -= dimExtent) { + SubscriptValue shiftCount{shiftControl.GetShift(resultAt)}; + SubscriptValue sourceAt[maxRank]; + for (int j{0}; j < rank; ++j) { + sourceAt[j] = sourceLB[j] + resultAt[j] - 1; + } + SubscriptValue &sourceDim{sourceAt[dim - 1]}; + sourceDim = dimLB + shiftCount; + for (resDim = 1; resDim <= dimExtent; ++resDim) { + if (sourceDim >= dimLB && sourceDim < dimLB + dimExtent) { + CopyElement(result, resultAt, source, sourceAt, terminator); + } else if (boundary) { + CopyElement(result, resultAt, *boundary, boundaryAt, terminator); + } + ++sourceDim; + } + result.IncrementSubscripts(resultAt); + if (boundaryRank > 0) { + boundary->IncrementSubscripts(boundaryAt); + } + } +} + +// EOSHIFT of vector +void RTDEF(EoshiftVector)(Descriptor &result, const Descriptor &source, + std::int64_t shift, const Descriptor *boundary, const char *sourceFile, + int line) { + Terminator terminator{sourceFile, line}; + RUNTIME_CHECK(terminator, source.rank() == 1); + SubscriptValue extent{source.GetDimension(0).Extent()}; + std::size_t elementLen{ + AllocateResult(result, source, 1, &extent, terminator, "EOSHIFT")}; + if (boundary) { + RUNTIME_CHECK(terminator, boundary->rank() == 0); + RUNTIME_CHECK(terminator, boundary->type() == source.type()); + if (boundary->ElementBytes() != elementLen) { + terminator.Crash("EOSHIFT: BOUNDARY= has element byte length %zd but " + "ARRAY= has length %zd", + boundary->ElementBytes(), elementLen); + } + } + if (!boundary) { + DefaultInitialize(result, terminator); + } + SubscriptValue lb{source.GetDimension(0).LowerBound()}; + for (SubscriptValue j{1}; j <= extent; ++j) { + SubscriptValue sourceAt{lb + j - 1 + static_cast<SubscriptValue>(shift)}; + if (sourceAt >= lb && sourceAt < lb + extent) { + CopyElement(result, &j, source, &sourceAt, terminator); + } else if (boundary) { + CopyElement(result, &j, *boundary, 0, terminator); + } + } +} + +// PACK +void RTDEF(Pack)(Descriptor &result, const Descriptor &source, + const Descriptor &mask, const Descriptor *vector, const char *sourceFile, + int line) { + Terminator terminator{sourceFile, line}; + CheckConformability(source, mask, terminator, "PACK", "ARRAY=", "MASK="); + auto maskType{mask.type().GetCategoryAndKind()}; + RUNTIME_CHECK( + terminator, maskType && maskType->first == TypeCategory::Logical); + SubscriptValue trues{0}; + if (mask.rank() == 0) { + if (IsLogicalElementTrue(mask, nullptr)) { + trues = source.Elements(); + } + } else { + SubscriptValue maskAt[maxRank]; + mask.GetLowerBounds(maskAt); + for (std::size_t n{mask.Elements()}; n > 0; --n) { + if (IsLogicalElementTrue(mask, maskAt)) { + ++trues; + } + mask.IncrementSubscripts(maskAt); + } + } + SubscriptValue extent{trues}; + if (vector) { + RUNTIME_CHECK(terminator, vector->rank() == 1); + RUNTIME_CHECK(terminator, source.type() == vector->type()); + if (source.ElementBytes() != vector->ElementBytes()) { + terminator.Crash("PACK: ARRAY= has element byte length %zd, but VECTOR= " + "has length %zd", + source.ElementBytes(), vector->ElementBytes()); + } + extent = vector->GetDimension(0).Extent(); + if (extent < trues) { + terminator.Crash("PACK: VECTOR= has extent %jd but there are %jd MASK= " + "elements that are .TRUE.", + static_cast<std::intmax_t>(extent), + static_cast<std::intmax_t>(trues)); + } + } + AllocateResult(result, source, 1, &extent, terminator, "PACK"); + SubscriptValue sourceAt[maxRank], resultAt{1}; + source.GetLowerBounds(sourceAt); + if (mask.rank() == 0) { + if (IsLogicalElementTrue(mask, nullptr)) { + for (SubscriptValue n{trues}; n > 0; --n) { + CopyElement(result, &resultAt, source, sourceAt, terminator); + ++resultAt; + source.IncrementSubscripts(sourceAt); + } + } + } else { + SubscriptValue maskAt[maxRank]; + mask.GetLowerBounds(maskAt); + for (std::size_t n{source.Elements()}; n > 0; --n) { + if (IsLogicalElementTrue(mask, maskAt)) { + CopyElement(result, &resultAt, source, sourceAt, terminator); + ++resultAt; + } + source.IncrementSubscripts(sourceAt); + mask.IncrementSubscripts(maskAt); + } + } + if (vector) { + SubscriptValue vectorAt{ + vector->GetDimension(0).LowerBound() + resultAt - 1}; + for (; resultAt <= extent; ++resultAt, ++vectorAt) { + CopyElement(result, &resultAt, *vector, &vectorAt, terminator); + } + } +} + +// RESHAPE +// F2018 16.9.163 +void RTDEF(Reshape)(Descriptor &result, const Descriptor &source, + const Descriptor &shape, const Descriptor *pad, const Descriptor *order, + const char *sourceFile, int line) { + // Compute and check the rank of the result. + Terminator terminator{sourceFile, line}; + RUNTIME_CHECK(terminator, shape.rank() == 1); + RUNTIME_CHECK(terminator, shape.type().IsInteger()); + SubscriptValue resultRank{shape.GetDimension(0).Extent()}; + if (resultRank < 0 || resultRank > static_cast<SubscriptValue>(maxRank)) { + terminator.Crash( + "RESHAPE: SHAPE= vector length %jd implies a bad result rank", + static_cast<std::intmax_t>(resultRank)); + } + + // Extract and check the shape of the result; compute its element count. + SubscriptValue resultExtent[maxRank]; + std::size_t shapeElementBytes{shape.ElementBytes()}; + std::size_t resultElements{1}; + SubscriptValue shapeSubscript{shape.GetDimension(0).LowerBound()}; + for (int j{0}; j < resultRank; ++j, ++shapeSubscript) { + auto extent{GetInt64Safe( + shape.Element<char>(&shapeSubscript), shapeElementBytes, terminator)}; + if (!extent) { + terminator.Crash("RESHAPE: value of SHAPE(%d) exceeds 64 bits", j + 1); + } else if (*extent < 0) { + terminator.Crash("RESHAPE: bad value for SHAPE(%d)=%jd", j + 1, + static_cast<std::intmax_t>(*extent)); + } + resultExtent[j] = *extent; + resultElements *= resultExtent[j]; + } + + // Check that there are sufficient elements in the SOURCE=, or that + // the optional PAD= argument is present and nonempty. + std::size_t elementBytes{source.ElementBytes()}; + std::size_t sourceElements{source.Elements()}; + std::size_t padElements{pad ? pad->Elements() : 0}; + if (resultElements > sourceElements) { + if (padElements <= 0) { + terminator.Crash( + "RESHAPE: not enough elements, need %zd but only have %zd", + resultElements, sourceElements); + } + if (pad->ElementBytes() != elementBytes) { + terminator.Crash("RESHAPE: PAD= has element byte length %zd but SOURCE= " + "has length %zd", + pad->ElementBytes(), elementBytes); + } + } + + // Extract and check the optional ORDER= argument, which must be a + // permutation of [1..resultRank]. + int dimOrder[maxRank]; + if (order) { + RUNTIME_CHECK(terminator, order->rank() == 1); + RUNTIME_CHECK(terminator, order->type().IsInteger()); + if (order->GetDimension(0).Extent() != resultRank) { + terminator.Crash("RESHAPE: the extent of ORDER (%jd) must match the rank" + " of the SHAPE (%d)", + static_cast<std::intmax_t>(order->GetDimension(0).Extent()), + resultRank); + } + std::uint64_t values{0}; + SubscriptValue orderSubscript{order->GetDimension(0).LowerBound()}; + std::size_t orderElementBytes{order->ElementBytes()}; + for (SubscriptValue j{0}; j < resultRank; ++j, ++orderSubscript) { + auto k{GetInt64Safe(order->Element<char>(&orderSubscript), + orderElementBytes, terminator)}; + if (!k) { + terminator.Crash("RESHAPE: ORDER element value exceeds 64 bits"); + } else if (*k < 1 || *k > resultRank || ((values >> *k) & 1)) { + terminator.Crash("RESHAPE: bad value for ORDER element (%jd)", + static_cast<std::intmax_t>(*k)); + } + values |= std::uint64_t{1} << *k; + dimOrder[j] = *k - 1; + } + } else { + for (int j{0}; j < resultRank; ++j) { + dimOrder[j] = j; + } + } + + // Allocate result descriptor + AllocateResult( + result, source, resultRank, resultExtent, terminator, "RESHAPE"); + + // Populate the result's elements. + SubscriptValue resultSubscript[maxRank]; + result.GetLowerBounds(resultSubscript); + SubscriptValue sourceSubscript[maxRank]; + source.GetLowerBounds(sourceSubscript); + std::size_t resultElement{0}; + std::size_t elementsFromSource{std::min(resultElements, sourceElements)}; + for (; resultElement < elementsFromSource; ++resultElement) { + CopyElement(result, resultSubscript, source, sourceSubscript, terminator); + source.IncrementSubscripts(sourceSubscript); + result.IncrementSubscripts(resultSubscript, dimOrder); + } + if (resultElement < resultElements) { + // Remaining elements come from the optional PAD= argument. + SubscriptValue padSubscript[maxRank]; + pad->GetLowerBounds(padSubscript); + for (; resultElement < resultElements; ++resultElement) { + CopyElement(result, resultSubscript, *pad, padSubscript, terminator); + pad->IncrementSubscripts(padSubscript); + result.IncrementSubscripts(resultSubscript, dimOrder); + } + } +} + +// ShallowCopy +void RTDEF(ShallowCopy)(Descriptor &result, const Descriptor &source, + const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + DoShallowCopy<true>(result, source, terminator, "ShallowCopy"); +} + +void RTDEF(ShallowCopyDirect)(const Descriptor &result, + const Descriptor &source, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + DoShallowCopy<false>(result, source, terminator, "ShallowCopyDirect"); +} + +// SPREAD +void RTDEF(Spread)(Descriptor &result, const Descriptor &source, int dim, + std::int64_t ncopies, const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + int rank{source.rank() + 1}; + RUNTIME_CHECK(terminator, rank <= maxRank); + if (dim < 1 || dim > rank) { + terminator.Crash("SPREAD: DIM=%d argument for rank-%d source array " + "must be greater than 1 and less than or equal to %d", + dim, rank - 1, rank); + } + ncopies = std::max<std::int64_t>(ncopies, 0); + SubscriptValue extent[maxRank]; + int k{0}; + for (int j{0}; j < rank; ++j) { + extent[j] = j == dim - 1 ? ncopies : source.GetDimension(k++).Extent(); + } + AllocateResult(result, source, rank, extent, terminator, "SPREAD"); + SubscriptValue resultAt[maxRank]; + for (int j{0}; j < rank; ++j) { + resultAt[j] = 1; + } + SubscriptValue &resultDim{resultAt[dim - 1]}; + SubscriptValue sourceAt[maxRank]; + source.GetLowerBounds(sourceAt); + for (std::size_t n{result.Elements()}; n > 0; n -= ncopies) { + for (resultDim = 1; resultDim <= ncopies; ++resultDim) { + CopyElement(result, resultAt, source, sourceAt, terminator); + } + result.IncrementSubscripts(resultAt); + source.IncrementSubscripts(sourceAt); + } +} + +// TRANSPOSE +void RTDEF(Transpose)(Descriptor &result, const Descriptor &matrix, + const char *sourceFile, int line) { + Terminator terminator{sourceFile, line}; + RUNTIME_CHECK(terminator, matrix.rank() == 2); + SubscriptValue extent[2]{ + matrix.GetDimension(1).Extent(), matrix.GetDimension(0).Extent()}; + AllocateResult(result, matrix, 2, extent, terminator, "TRANSPOSE"); + SubscriptValue resultAt[2]{1, 1}; + SubscriptValue matrixLB[2]; + matrix.GetLowerBounds(matrixLB); + for (std::size_t n{result.Elements()}; n-- > 0; + result.IncrementSubscripts(resultAt)) { + SubscriptValue matrixAt[2]{ + matrixLB[0] + resultAt[1] - 1, matrixLB[1] + resultAt[0] - 1}; + CopyElement(result, resultAt, matrix, matrixAt, terminator); + } +} + +// UNPACK +void RTDEF(Unpack)(Descriptor &result, const Descriptor &vector, + const Descriptor &mask, const Descriptor &field, const char *sourceFile, + int line) { + Terminator terminator{sourceFile, line}; + RUNTIME_CHECK(terminator, vector.rank() == 1); + int rank{mask.rank()}; + RUNTIME_CHECK(terminator, rank > 0); + SubscriptValue extent[maxRank]; + mask.GetShape(extent); + CheckConformability(mask, field, terminator, "UNPACK", "MASK=", "FIELD="); + std::size_t elementLen{ + AllocateResult(result, field, rank, extent, terminator, "UNPACK")}; + RUNTIME_CHECK(terminator, vector.type() == field.type()); + if (vector.ElementBytes() != elementLen) { + terminator.Crash( + "UNPACK: VECTOR= has element byte length %zd but FIELD= has length %zd", + vector.ElementBytes(), elementLen); + } + SubscriptValue resultAt[maxRank], maskAt[maxRank], fieldAt[maxRank], + vectorAt{vector.GetDimension(0).LowerBound()}; + for (int j{0}; j < rank; ++j) { + resultAt[j] = 1; + } + mask.GetLowerBounds(maskAt); + field.GetLowerBounds(fieldAt); + SubscriptValue vectorElements{vector.GetDimension(0).Extent()}; + SubscriptValue vectorLeft{vectorElements}; + for (std::size_t n{result.Elements()}; n-- > 0;) { + if (IsLogicalElementTrue(mask, maskAt)) { + if (vectorLeft-- == 0) { + terminator.Crash( + "UNPACK: VECTOR= argument has fewer elements (%d) than " + "MASK= has .TRUE. entries", + vectorElements); + } + CopyElement(result, resultAt, vector, &vectorAt, terminator); + ++vectorAt; + } else { + CopyElement(result, resultAt, field, fieldAt, terminator); + } + result.IncrementSubscripts(resultAt); + mask.IncrementSubscripts(maskAt); + field.IncrementSubscripts(fieldAt); + } +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/type-code.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/type-code.cpp new file mode 100644 index 00000000000..8cfec9a4ec2 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/type-code.cpp @@ -0,0 +1,242 @@ +//===-- lib/runtime/type-code.cpp -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/type-code.h" + +namespace Fortran::runtime { + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS TypeCode::TypeCode(TypeCategory f, int kind) { + switch (f) { + case TypeCategory::Integer: + switch (kind) { + case 1: + raw_ = CFI_type_int8_t; + break; + case 2: + raw_ = CFI_type_int16_t; + break; + case 4: + raw_ = CFI_type_int32_t; + break; + case 8: + raw_ = CFI_type_int64_t; + break; + case 16: + raw_ = CFI_type_int128_t; + break; + } + break; + case TypeCategory::Unsigned: + switch (kind) { + case 1: + raw_ = CFI_type_uint8_t; + break; + case 2: + raw_ = CFI_type_uint16_t; + break; + case 4: + raw_ = CFI_type_uint32_t; + break; + case 8: + raw_ = CFI_type_uint64_t; + break; + case 16: + raw_ = CFI_type_uint128_t; + break; + } + break; + case TypeCategory::Real: + switch (kind) { + case 2: + raw_ = CFI_type_half_float; + break; + case 3: + raw_ = CFI_type_bfloat; + break; + case 4: + raw_ = CFI_type_float; + break; + case 8: + raw_ = CFI_type_double; + break; + case 10: + raw_ = CFI_type_extended_double; + break; + case 16: + raw_ = CFI_type_float128; + break; + } + break; + case TypeCategory::Complex: + switch (kind) { + case 2: + raw_ = CFI_type_half_float_Complex; + break; + case 3: + raw_ = CFI_type_bfloat_Complex; + break; + case 4: + raw_ = CFI_type_float_Complex; + break; + case 8: + raw_ = CFI_type_double_Complex; + break; + case 10: + raw_ = CFI_type_extended_double_Complex; + break; + case 16: + raw_ = CFI_type_long_double_Complex; + break; + } + break; + case TypeCategory::Character: + switch (kind) { + case 1: + raw_ = CFI_type_char; + break; + case 2: + raw_ = CFI_type_char16_t; + break; + case 4: + raw_ = CFI_type_char32_t; + break; + } + break; + case TypeCategory::Logical: + switch (kind) { + case 1: + raw_ = CFI_type_Bool; + break; + case 2: + raw_ = CFI_type_int_least16_t; + break; + case 4: + raw_ = CFI_type_int_least32_t; + break; + case 8: + raw_ = CFI_type_int_least64_t; + break; + } + break; + case TypeCategory::Derived: + raw_ = CFI_type_struct; + break; + } +} + +RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>> +TypeCode::GetCategoryAndKind() const { + switch (raw_) { + case CFI_type_signed_char: + return std::make_pair(TypeCategory::Character, sizeof(signed char)); + case CFI_type_short: + return std::make_pair(TypeCategory::Integer, sizeof(short)); + case CFI_type_int: + return std::make_pair(TypeCategory::Integer, sizeof(int)); + case CFI_type_long: + return std::make_pair(TypeCategory::Integer, sizeof(long)); + case CFI_type_long_long: + return std::make_pair(TypeCategory::Integer, sizeof(long long)); + case CFI_type_size_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::size_t)); + case CFI_type_int8_t: + return std::make_pair(TypeCategory::Integer, 1); + case CFI_type_int16_t: + return std::make_pair(TypeCategory::Integer, 2); + case CFI_type_int32_t: + return std::make_pair(TypeCategory::Integer, 4); + case CFI_type_int64_t: + return std::make_pair(TypeCategory::Integer, 8); + case CFI_type_int128_t: + return std::make_pair(TypeCategory::Integer, 16); + case CFI_type_int_least8_t: + return std::make_pair(TypeCategory::Logical, 1); + case CFI_type_int_least16_t: + return std::make_pair(TypeCategory::Logical, 2); + case CFI_type_int_least32_t: + return std::make_pair(TypeCategory::Logical, 4); + case CFI_type_int_least64_t: + return std::make_pair(TypeCategory::Logical, 8); + case CFI_type_int_least128_t: + return std::make_pair(TypeCategory::Integer, 16); + case CFI_type_int_fast8_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast8_t)); + case CFI_type_int_fast16_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast16_t)); + case CFI_type_int_fast32_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast32_t)); + case CFI_type_int_fast64_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast64_t)); + case CFI_type_int_fast128_t: + return std::make_pair(TypeCategory::Integer, 16); + case CFI_type_intmax_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::intmax_t)); + case CFI_type_intptr_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::intptr_t)); + case CFI_type_ptrdiff_t: + return std::make_pair(TypeCategory::Integer, sizeof(std::ptrdiff_t)); + case CFI_type_half_float: + return std::make_pair(TypeCategory::Real, 2); + case CFI_type_bfloat: + return std::make_pair(TypeCategory::Real, 3); + case CFI_type_float: + return std::make_pair(TypeCategory::Real, 4); + case CFI_type_double: + return std::make_pair(TypeCategory::Real, 8); + case CFI_type_extended_double: + return std::make_pair(TypeCategory::Real, 10); + case CFI_type_long_double: + return std::make_pair(TypeCategory::Real, 16); + case CFI_type_float128: + return std::make_pair(TypeCategory::Real, 16); + case CFI_type_half_float_Complex: + return std::make_pair(TypeCategory::Complex, 2); + case CFI_type_bfloat_Complex: + return std::make_pair(TypeCategory::Complex, 3); + case CFI_type_float_Complex: + return std::make_pair(TypeCategory::Complex, 4); + case CFI_type_double_Complex: + return std::make_pair(TypeCategory::Complex, 8); + case CFI_type_extended_double_Complex: + return std::make_pair(TypeCategory::Complex, 10); + case CFI_type_long_double_Complex: + return std::make_pair(TypeCategory::Complex, 16); + case CFI_type_float128_Complex: + return std::make_pair(TypeCategory::Complex, 16); + case CFI_type_Bool: + return std::make_pair(TypeCategory::Logical, 1); + case CFI_type_char: + return std::make_pair(TypeCategory::Character, 1); + case CFI_type_cptr: + return std::make_pair(TypeCategory::Integer, sizeof(void *)); + case CFI_type_struct: + return std::make_pair(TypeCategory::Derived, 0); + case CFI_type_char16_t: + return std::make_pair(TypeCategory::Character, 2); + case CFI_type_char32_t: + return std::make_pair(TypeCategory::Character, 4); + case CFI_type_uint8_t: + return std::make_pair(TypeCategory::Unsigned, 1); + case CFI_type_uint16_t: + return std::make_pair(TypeCategory::Unsigned, 2); + case CFI_type_uint32_t: + return std::make_pair(TypeCategory::Unsigned, 4); + case CFI_type_uint64_t: + return std::make_pair(TypeCategory::Unsigned, 8); + case CFI_type_uint128_t: + return std::make_pair(TypeCategory::Unsigned, 16); + default: + return Fortran::common::nullopt; + } +} + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/type-info.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/type-info.cpp new file mode 100644 index 00000000000..3e1d7c9c3c7 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/type-info.cpp @@ -0,0 +1,338 @@ +//===-- lib/runtime/type-info.cpp -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/type-info.h" +#include "flang-rt/runtime/terminator.h" +#include "flang-rt/runtime/tools.h" +#include <cstdio> + +namespace Fortran::runtime::typeInfo { + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS Fortran::common::optional<TypeParameterValue> Value::GetValue( + const Descriptor *descriptor) const { + switch (genre_) { + case Genre::Explicit: + return value_; + case Genre::LenParameter: + if (descriptor) { + if (const auto *addendum{descriptor->Addendum()}) { + return addendum->LenParameterValue(value_); + } + } + return Fortran::common::nullopt; + default: + return Fortran::common::nullopt; + } +} + +RT_API_ATTRS std::size_t Component::GetElementByteSize( + const Descriptor &instance) const { + switch (category()) { + case TypeCategory::Integer: + case TypeCategory::Unsigned: + case TypeCategory::Real: + case TypeCategory::Logical: + return kind_; + case TypeCategory::Complex: + return 2 * kind_; + case TypeCategory::Character: + if (auto value{characterLen_.GetValue(&instance)}) { + return kind_ * *value; + } + break; + case TypeCategory::Derived: + if (const auto *type{derivedType()}) { + return type->sizeInBytes(); + } + break; + } + return 0; +} + +RT_API_ATTRS std::size_t Component::GetElements( + const Descriptor &instance) const { + std::size_t elements{1}; + if (int rank{rank_}) { + if (const Value * boundValues{bounds()}) { + for (int j{0}; j < rank; ++j) { + TypeParameterValue lb{ + boundValues[2 * j].GetValue(&instance).value_or(0)}; + TypeParameterValue ub{ + boundValues[2 * j + 1].GetValue(&instance).value_or(0)}; + if (ub >= lb) { + elements *= ub - lb + 1; + } else { + return 0; + } + } + } else { + return 0; + } + } + return elements; +} + +RT_API_ATTRS std::size_t Component::SizeInBytes( + const Descriptor &instance) const { + if (genre() == Genre::Data) { + return GetElementByteSize(instance) * GetElements(instance); + } else if (category() == TypeCategory::Derived) { + const DerivedType *type{derivedType()}; + return Descriptor::SizeInBytes( + rank_, true, type ? type->LenParameters() : 0); + } else { + return Descriptor::SizeInBytes(rank_); + } +} + +RT_API_ATTRS void Component::EstablishDescriptor(Descriptor &descriptor, + const Descriptor &container, Terminator &terminator) const { + ISO::CFI_attribute_t attribute{static_cast<ISO::CFI_attribute_t>( + genre_ == Genre::Allocatable ? CFI_attribute_allocatable + : genre_ == Genre::Pointer ? CFI_attribute_pointer + : CFI_attribute_other)}; + TypeCategory cat{category()}; + if (cat == TypeCategory::Character) { + std::size_t lengthInChars{0}; + if (auto length{characterLen_.GetValue(&container)}) { + lengthInChars = static_cast<std::size_t>(*length); + } else { + RUNTIME_CHECK( + terminator, characterLen_.genre() == Value::Genre::Deferred); + } + descriptor.Establish( + kind_, lengthInChars, nullptr, rank_, nullptr, attribute); + } else if (cat == TypeCategory::Derived) { + if (const DerivedType * type{derivedType()}) { + descriptor.Establish(*type, nullptr, rank_, nullptr, attribute); + } else { // unlimited polymorphic + descriptor.Establish(TypeCode{TypeCategory::Derived, 0}, 0, nullptr, + rank_, nullptr, attribute, true); + } + } else { + descriptor.Establish(cat, kind_, nullptr, rank_, nullptr, attribute); + } + if (rank_ && genre_ != Genre::Allocatable && genre_ != Genre::Pointer) { + const typeInfo::Value *boundValues{bounds()}; + RUNTIME_CHECK(terminator, boundValues != nullptr); + auto byteStride{static_cast<SubscriptValue>(descriptor.ElementBytes())}; + for (int j{0}; j < rank_; ++j) { + auto lb{boundValues++->GetValue(&container)}; + auto ub{boundValues++->GetValue(&container)}; + RUNTIME_CHECK(terminator, lb.has_value() && ub.has_value()); + Dimension &dim{descriptor.GetDimension(j)}; + dim.SetBounds(*lb, *ub); + dim.SetByteStride(byteStride); + byteStride *= dim.Extent(); + } + } +} + +RT_API_ATTRS void Component::CreatePointerDescriptor(Descriptor &descriptor, + const Descriptor &container, Terminator &terminator, + const SubscriptValue *subscripts) const { + RUNTIME_CHECK(terminator, genre_ == Genre::Data); + EstablishDescriptor(descriptor, container, terminator); + std::size_t offset{static_cast<std::size_t>(offset_)}; + if (subscripts) { + offset += container.SubscriptsToByteOffset(subscripts); + } + descriptor.set_base_addr(container.OffsetElement<char>() + offset); + descriptor.raw().attribute = CFI_attribute_pointer; +} + +RT_API_ATTRS const DerivedType *DerivedType::GetParentType() const { + if (hasParent_) { + const Descriptor &compDesc{component()}; + const Component &component{*compDesc.OffsetElement<const Component>()}; + return component.derivedType(); + } else { + return nullptr; + } +} + +RT_API_ATTRS const Component *DerivedType::FindDataComponent( + const char *compName, std::size_t compNameLen) const { + const Descriptor &compDesc{component()}; + std::size_t n{compDesc.Elements()}; + SubscriptValue at[maxRank]; + compDesc.GetLowerBounds(at); + for (std::size_t j{0}; j < n; ++j, compDesc.IncrementSubscripts(at)) { + const Component *component{compDesc.Element<Component>(at)}; + INTERNAL_CHECK(component != nullptr); + const Descriptor &nameDesc{component->name()}; + if (nameDesc.ElementBytes() == compNameLen && + Fortran::runtime::memcmp( + compName, nameDesc.OffsetElement(), compNameLen) == 0) { + return component; + } + } + const DerivedType *parent{GetParentType()}; + return parent ? parent->FindDataComponent(compName, compNameLen) : nullptr; +} + +RT_OFFLOAD_API_GROUP_END + +static void DumpScalarCharacter( + FILE *f, const Descriptor &desc, const char *what) { + if (desc.raw().version == CFI_VERSION && + desc.type() == TypeCode{TypeCategory::Character, 1} && + desc.ElementBytes() > 0 && desc.rank() == 0 && + desc.OffsetElement() != nullptr) { + std::fwrite(desc.OffsetElement(), desc.ElementBytes(), 1, f); + } else { + std::fprintf(f, "bad %s descriptor: ", what); + desc.Dump(f); + } +} + +FILE *DerivedType::Dump(FILE *f) const { + std::fprintf(f, "DerivedType @ %p:\n", reinterpret_cast<const void *>(this)); + const std::uint64_t *uints{reinterpret_cast<const std::uint64_t *>(this)}; + for (int j{0}; j < 64; ++j) { + int offset{j * static_cast<int>(sizeof *uints)}; + std::fprintf(f, " [+%3d](%p) 0x%016jx", offset, + reinterpret_cast<const void *>(&uints[j]), + static_cast<std::uintmax_t>(uints[j])); + if (offset == offsetof(DerivedType, binding_)) { + std::fputs(" <-- binding_\n", f); + } else if (offset == offsetof(DerivedType, name_)) { + std::fputs(" <-- name_\n", f); + } else if (offset == offsetof(DerivedType, sizeInBytes_)) { + std::fputs(" <-- sizeInBytes_\n", f); + } else if (offset == offsetof(DerivedType, uninstantiated_)) { + std::fputs(" <-- uninstantiated_\n", f); + } else if (offset == offsetof(DerivedType, kindParameter_)) { + std::fputs(" <-- kindParameter_\n", f); + } else if (offset == offsetof(DerivedType, lenParameterKind_)) { + std::fputs(" <-- lenParameterKind_\n", f); + } else if (offset == offsetof(DerivedType, component_)) { + std::fputs(" <-- component_\n", f); + } else if (offset == offsetof(DerivedType, procPtr_)) { + std::fputs(" <-- procPtr_\n", f); + } else if (offset == offsetof(DerivedType, special_)) { + std::fputs(" <-- special_\n", f); + } else if (offset == offsetof(DerivedType, specialBitSet_)) { + std::fputs(" <-- specialBitSet_\n", f); + } else if (offset == offsetof(DerivedType, hasParent_)) { + std::fputs(" <-- (flags)\n", f); + } else { + std::fputc('\n', f); + } + } + std::fputs(" name: ", f); + DumpScalarCharacter(f, name(), "DerivedType::name"); + const Descriptor &bindingDesc{binding()}; + std::fprintf( + f, "\n binding descriptor (byteSize 0x%zx): ", binding_.byteSize); + bindingDesc.Dump(f); + const Descriptor &compDesc{component()}; + std::fputs("\n components:\n", f); + if (compDesc.raw().version == CFI_VERSION && + compDesc.type() == TypeCode{TypeCategory::Derived, 0} && + compDesc.ElementBytes() == sizeof(Component) && compDesc.rank() == 1) { + std::size_t n{compDesc.Elements()}; + for (std::size_t j{0}; j < n; ++j) { + const Component &comp{*compDesc.ZeroBasedIndexedElement<Component>(j)}; + std::fprintf(f, " [%3zd] ", j); + comp.Dump(f); + } + } else { + std::fputs(" bad descriptor: ", f); + compDesc.Dump(f); + } + const Descriptor &specialDesc{special()}; + std::fprintf( + f, "\n special descriptor (byteSize 0x%zx): ", special_.byteSize); + specialDesc.Dump(f); + if (specialDesc.IsAllocated()) { + std::size_t specials{specialDesc.Elements()}; + for (std::size_t j{0}; j < specials; ++j) { + std::fprintf(f, " [%3zd] ", j); + specialDesc.ZeroBasedIndexedElement<SpecialBinding>(j)->Dump(f); + } + } + return f; +} + +FILE *Component::Dump(FILE *f) const { + std::fprintf(f, "Component @ %p:\n", reinterpret_cast<const void *>(this)); + std::fputs(" name: ", f); + DumpScalarCharacter(f, name(), "Component::name"); + if (genre_ == Genre::Data) { + std::fputs(" Data ", f); + } else if (genre_ == Genre::Pointer) { + std::fputs(" Pointer ", f); + } else if (genre_ == Genre::Allocatable) { + std::fputs(" Allocatable", f); + } else if (genre_ == Genre::Automatic) { + std::fputs(" Automatic ", f); + } else { + std::fprintf(f, " (bad genre 0x%x)", static_cast<int>(genre_)); + } + std::fprintf(f, " category %d kind %d rank %d offset 0x%zx\n", category_, + kind_, rank_, static_cast<std::size_t>(offset_)); + const auto &dtDesc{derivedType_.descriptor()}; + if (dtDesc.raw().base_addr) { + std::fprintf(f, " derivedType_ %p\n", dtDesc.raw().base_addr); + } + if (initialization_) { + std::fprintf(f, " initialization @ %p:\n", + reinterpret_cast<const void *>(initialization_)); + for (int j{0}; j < 128; j += sizeof(std::uint64_t)) { + std::fprintf(f, " [%3d] 0x%016jx\n", j, + static_cast<std::uintmax_t>( + *reinterpret_cast<const std::uint64_t *>(initialization_ + j))); + } + } + return f; +} + +FILE *SpecialBinding::Dump(FILE *f) const { + std::fprintf( + f, "SpecialBinding @ %p:\n", reinterpret_cast<const void *>(this)); + switch (which_) { + case Which::ScalarAssignment: + std::fputs(" ScalarAssignment", f); + break; + case Which::ElementalAssignment: + std::fputs(" ElementalAssignment", f); + break; + case Which::ReadFormatted: + std::fputs(" ReadFormatted", f); + break; + case Which::ReadUnformatted: + std::fputs(" ReadUnformatted", f); + break; + case Which::WriteFormatted: + std::fputs(" WriteFormatted", f); + break; + case Which::WriteUnformatted: + std::fputs(" WriteUnformatted", f); + break; + case Which::ElementalFinal: + std::fputs(" ElementalFinal", f); + break; + case Which::AssumedRankFinal: + std::fputs(" AssumedRankFinal", f); + break; + default: + std::fprintf(f, " rank-%d final:", + static_cast<int>(which_) - static_cast<int>(Which::ScalarFinal)); + break; + } + std::fprintf(f, " isArgDescriptorSet: 0x%x\n", isArgDescriptorSet_); + std::fprintf(f, " isTypeBound: %d\n", isTypeBound_); + std::fprintf(f, " isArgContiguousSet: 0x%x\n", isArgContiguousSet_); + std::fprintf(f, " proc: %p\n", reinterpret_cast<void *>(proc_)); + return f; +} + +} // namespace Fortran::runtime::typeInfo diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit-map.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit-map.cpp new file mode 100644 index 00000000000..41a03f3319d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit-map.cpp @@ -0,0 +1,137 @@ +//===-- lib/runtime/unit-map.cpp --------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "unit-map.h" +#include "flang/Common/optional.h" + +namespace Fortran::runtime::io { + +void UnitMap::Initialize() { + if (!isInitialized_) { + freeNewUnits_.InitializeState(); + // Unit number -1 is reserved. + // The unit numbers are pushed in reverse order so that the first + // ones to be popped will be small and suitable for use as kind=1 + // integers. + for (int j{freeNewUnits_.maxValue}; j > 1; --j) { + freeNewUnits_.Add(j); + } + isInitialized_ = true; + } +} + +// See 12.5.6.12 in Fortran 2018. NEWUNIT= unit numbers are negative, +// and not equal to -1 (or ERROR_UNIT, if it were negative, which it isn't.) +ExternalFileUnit &UnitMap::NewUnit(const Terminator &terminator) { + CriticalSection critical{lock_}; + Initialize(); + Fortran::common::optional<int> n{freeNewUnits_.PopValue()}; + if (!n) { + n = emergencyNewUnit_++; + } + return Create(-*n, terminator); +} + +ExternalFileUnit *UnitMap::LookUpForClose(int n) { + CriticalSection critical{lock_}; + Chain *previous{nullptr}; + int hash{Hash(n)}; + for (Chain *p{bucket_[hash].get()}; p; previous = p, p = p->next.get()) { + if (p->unit.unitNumber() == n) { + if (previous) { + previous->next.swap(p->next); + } else { + bucket_[hash].swap(p->next); + } + // p->next.get() == p at this point; the next swap pushes p on closing_ + closing_.swap(p->next); + return &p->unit; + } + } + return nullptr; +} + +void UnitMap::DestroyClosed(ExternalFileUnit &unit) { + Chain *p{nullptr}; + { + CriticalSection critical{lock_}; + Chain *previous{nullptr}; + for (p = closing_.get(); p; previous = p, p = p->next.get()) { + if (&p->unit == &unit) { + int n{unit.unitNumber()}; + if (n <= -2) { + freeNewUnits_.Add(-n); + } + if (previous) { + previous->next.swap(p->next); + } else { + closing_.swap(p->next); + } + break; + } + } + } + if (p) { + p->unit.~ExternalFileUnit(); + FreeMemory(p); + } +} + +void UnitMap::CloseAll(IoErrorHandler &handler) { + // Extract units from the map so they can be closed + // without holding lock_. + OwningPtr<Chain> closeList; + { + CriticalSection critical{lock_}; + for (int j{0}; j < buckets_; ++j) { + while (Chain * p{bucket_[j].get()}) { + bucket_[j].swap(p->next); // pops p from head of bucket list + closeList.swap(p->next); // pushes p to closeList + } + } + } + while (Chain * p{closeList.get()}) { + closeList.swap(p->next); // pops p from head of closeList + p->unit.CloseUnit(CloseStatus::Keep, handler); + p->unit.~ExternalFileUnit(); + FreeMemory(p); + } +} + +void UnitMap::FlushAll(IoErrorHandler &handler) { + CriticalSection critical{lock_}; + for (int j{0}; j < buckets_; ++j) { + for (Chain *p{bucket_[j].get()}; p; p = p->next.get()) { + p->unit.FlushOutput(handler); + } + } +} + +ExternalFileUnit *UnitMap::Find(const char *path, std::size_t pathLen) { + if (path) { + // TODO: Faster data structure + for (int j{0}; j < buckets_; ++j) { + for (Chain *p{bucket_[j].get()}; p; p = p->next.get()) { + if (p->unit.path() && p->unit.pathLength() == pathLen && + std::memcmp(p->unit.path(), path, pathLen) == 0) { + return &p->unit; + } + } + } + } + return nullptr; +} + +ExternalFileUnit &UnitMap::Create(int n, const Terminator &terminator) { + Chain &chain{*New<Chain>{terminator}(n).release()}; + chain.next.reset(&chain); + bucket_[Hash(n)].swap(chain.next); // pushes new node as list head + return chain.unit; +} + +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit-map.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit-map.h new file mode 100644 index 00000000000..fa61288a1e1 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit-map.h @@ -0,0 +1,103 @@ +//===-- lib/runtime/unit-map.h ----------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Maps Fortran unit numbers to their ExternalFileUnit instances. +// A simple hash table with forward-linked chains per bucket. + +#ifndef FLANG_RT_RUNTIME_UNIT_MAP_H_ +#define FLANG_RT_RUNTIME_UNIT_MAP_H_ + +#include "unit.h" +#include "flang-rt/runtime/lock.h" +#include "flang-rt/runtime/memory.h" +#include "flang/Common/fast-int-set.h" +#include <cstdint> +#include <cstdlib> + +namespace Fortran::runtime::io { + +class UnitMap { +public: + ExternalFileUnit *LookUp(int n) { + CriticalSection critical{lock_}; + return Find(n); + } + + ExternalFileUnit *LookUpOrCreate( + int n, const Terminator &terminator, bool &wasExtant) { + CriticalSection critical{lock_}; + if (auto *p{Find(n)}) { + wasExtant = true; + return p; + } else { + wasExtant = false; + return n >= 0 ? &Create(n, terminator) : nullptr; + } + } + + // Unit look-up by name is needed for INQUIRE(FILE="...") + ExternalFileUnit *LookUp(const char *path, std::size_t pathLen) { + CriticalSection critical{lock_}; + return Find(path, pathLen); + } + + ExternalFileUnit &NewUnit(const Terminator &); + + // To prevent races, the unit is removed from the map if it exists, + // and put on the closing_ list until DestroyClosed() is called. + ExternalFileUnit *LookUpForClose(int); + + void DestroyClosed(ExternalFileUnit &); + void CloseAll(IoErrorHandler &); + void FlushAll(IoErrorHandler &); + +private: + struct Chain { + explicit Chain(int n) : unit{n} {} + ExternalFileUnit unit; + OwningPtr<Chain> next{nullptr}; + }; + + static constexpr int buckets_{1031}; // must be prime + + // The pool of recyclable new unit numbers uses the range that + // works even with INTEGER(kind=1). 0 and -1 are never used. + static constexpr int maxNewUnits_{129}; // [ -128 .. 0 ] + + int Hash(int n) { return std::abs(n) % buckets_; } + + void Initialize(); + + ExternalFileUnit *Find(int n) { + Chain *previous{nullptr}; + int hash{Hash(n)}; + for (Chain *p{bucket_[hash].get()}; p; previous = p, p = p->next.get()) { + if (p->unit.unitNumber() == n) { + if (previous) { + // Move found unit to front of chain for quicker lookup next time + previous->next.swap(p->next); // now p->next.get() == p + bucket_[hash].swap(p->next); // now bucket_[hash].get() == p + } + return &p->unit; + } + } + return nullptr; + } + ExternalFileUnit *Find(const char *path, std::size_t pathLen); + + ExternalFileUnit &Create(int, const Terminator &); + + Lock lock_; + bool isInitialized_{false}; + OwningPtr<Chain> bucket_[buckets_]{}; // all owned by *this + OwningPtr<Chain> closing_{nullptr}; // units during CLOSE statement + common::FastIntSet<maxNewUnits_> freeNewUnits_; + int emergencyNewUnit_{maxNewUnits_}; // not recycled +}; +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_UNIT_MAP_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit.cpp new file mode 100644 index 00000000000..5f52fa2781d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit.cpp @@ -0,0 +1,875 @@ +//===-- lib/runtime/unit.cpp ------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Implementation of ExternalFileUnit common for both +// RT_USE_PSEUDO_FILE_UNIT=0 and RT_USE_PSEUDO_FILE_UNIT=1. +// +//===----------------------------------------------------------------------===// +#include "unit.h" +#include "flang-rt/runtime/io-error.h" +#include "flang-rt/runtime/lock.h" +#include "flang-rt/runtime/tools.h" +#include <limits> +#include <utility> + +namespace Fortran::runtime::io { + +#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS +RT_OFFLOAD_VAR_GROUP_BEGIN +RT_VAR_ATTRS ExternalFileUnit *defaultInput{nullptr}; // unit 5 +RT_VAR_ATTRS ExternalFileUnit *defaultOutput{nullptr}; // unit 6 +RT_VAR_ATTRS ExternalFileUnit *errorOutput{nullptr}; // unit 0 extension +RT_OFFLOAD_VAR_GROUP_END +#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS + +RT_OFFLOAD_API_GROUP_BEGIN + +static inline RT_API_ATTRS void SwapEndianness( + char *data, std::size_t bytes, std::size_t elementBytes) { + if (elementBytes > 1) { + auto half{elementBytes >> 1}; + for (std::size_t j{0}; j + elementBytes <= bytes; j += elementBytes) { + for (std::size_t k{0}; k < half; ++k) { + RT_DIAG_PUSH + RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN + std::swap(data[j + k], data[j + elementBytes - 1 - k]); + RT_DIAG_POP + } + } + } +} + +bool ExternalFileUnit::Emit(const char *data, std::size_t bytes, + std::size_t elementBytes, IoErrorHandler &handler) { + auto furthestAfter{std::max(furthestPositionInRecord, + positionInRecord + static_cast<std::int64_t>(bytes))}; + if (openRecl) { + // Check for fixed-length record overrun, but allow for + // sequential record termination. + int extra{0}; + int header{0}; + if (access == Access::Sequential) { + if (isUnformatted.value_or(false)) { + // record header + footer + header = static_cast<int>(sizeof(std::uint32_t)); + extra = 2 * header; + } else { +#ifdef _WIN32 + if (!isWindowsTextFile()) { + ++extra; // carriage return (CR) + } +#endif + ++extra; // newline (LF) + } + } + if (furthestAfter > extra + *openRecl) { + handler.SignalError(IostatRecordWriteOverrun, + "Attempt to write %zd bytes to position %jd in a fixed-size record " + "of %jd bytes", + bytes, static_cast<std::intmax_t>(positionInRecord - header), + static_cast<std::intmax_t>(*openRecl)); + return false; + } + } + if (recordLength) { + // It is possible for recordLength to have a value now for a + // variable-length output record if the previous operation + // was a BACKSPACE or non advancing input statement. + recordLength.reset(); + beganReadingRecord_ = false; + } + if (IsAfterEndfile()) { + handler.SignalError(IostatWriteAfterEndfile); + return false; + } + CheckDirectAccess(handler); + WriteFrame(frameOffsetInFile_, recordOffsetInFrame_ + furthestAfter, handler); + if (positionInRecord > furthestPositionInRecord) { + std::memset(Frame() + recordOffsetInFrame_ + furthestPositionInRecord, ' ', + positionInRecord - furthestPositionInRecord); + } + char *to{Frame() + recordOffsetInFrame_ + positionInRecord}; + std::memcpy(to, data, bytes); + if (swapEndianness_) { + SwapEndianness(to, bytes, elementBytes); + } + positionInRecord += bytes; + furthestPositionInRecord = furthestAfter; + anyWriteSinceLastPositioning_ = true; + return true; +} + +bool ExternalFileUnit::Receive(char *data, std::size_t bytes, + std::size_t elementBytes, IoErrorHandler &handler) { + RUNTIME_CHECK(handler, direction_ == Direction::Input); + auto furthestAfter{std::max(furthestPositionInRecord, + positionInRecord + static_cast<std::int64_t>(bytes))}; + if (furthestAfter > recordLength.value_or(furthestAfter)) { + handler.SignalError(IostatRecordReadOverrun, + "Attempt to read %zd bytes at position %jd in a record of %jd bytes", + bytes, static_cast<std::intmax_t>(positionInRecord), + static_cast<std::intmax_t>(*recordLength)); + return false; + } + auto need{recordOffsetInFrame_ + furthestAfter}; + auto got{ReadFrame(frameOffsetInFile_, need, handler)}; + if (got >= need) { + std::memcpy(data, Frame() + recordOffsetInFrame_ + positionInRecord, bytes); + if (swapEndianness_) { + SwapEndianness(data, bytes, elementBytes); + } + positionInRecord += bytes; + furthestPositionInRecord = furthestAfter; + return true; + } else { + HitEndOnRead(handler); + return false; + } +} + +std::size_t ExternalFileUnit::GetNextInputBytes( + const char *&p, IoErrorHandler &handler) { + RUNTIME_CHECK(handler, direction_ == Direction::Input); + if (access == Access::Sequential && + positionInRecord < recordLength.value_or(positionInRecord)) { + // Fast path for variable-length formatted input: the whole record + // must be in frame as a result of newline detection for record length. + p = Frame() + recordOffsetInFrame_ + positionInRecord; + return *recordLength - positionInRecord; + } + std::size_t length{1}; + if (auto recl{EffectiveRecordLength()}) { + if (positionInRecord < *recl) { + length = *recl - positionInRecord; + } else { + p = nullptr; + return 0; + } + } + p = FrameNextInput(handler, length); + return p ? length : 0; +} + +std::size_t ExternalFileUnit::ViewBytesInRecord( + const char *&p, bool forward) const { + p = nullptr; + auto recl{recordLength.value_or(positionInRecord)}; + if (forward) { + if (positionInRecord < recl) { + p = Frame() + recordOffsetInFrame_ + positionInRecord; + return recl - positionInRecord; + } + } else { + if (positionInRecord <= recl) { + p = Frame() + recordOffsetInFrame_ + positionInRecord; + } + return positionInRecord - leftTabLimit.value_or(0); + } + return 0; +} + +const char *ExternalFileUnit::FrameNextInput( + IoErrorHandler &handler, std::size_t bytes) { + RUNTIME_CHECK(handler, isUnformatted.has_value() && !*isUnformatted); + if (static_cast<std::int64_t>(positionInRecord + bytes) <= + recordLength.value_or(positionInRecord + bytes)) { + auto at{recordOffsetInFrame_ + positionInRecord}; + auto need{static_cast<std::size_t>(at + bytes)}; + auto got{ReadFrame(frameOffsetInFile_, need, handler)}; + SetVariableFormattedRecordLength(); + if (got >= need) { + return Frame() + at; + } + HitEndOnRead(handler); + } + return nullptr; +} + +bool ExternalFileUnit::SetVariableFormattedRecordLength() { + if (recordLength || access == Access::Direct) { + return true; + } else if (FrameLength() > recordOffsetInFrame_) { + const char *record{Frame() + recordOffsetInFrame_}; + std::size_t bytes{FrameLength() - recordOffsetInFrame_}; + if (const char *nl{FindCharacter(record, '\n', bytes)}) { + recordLength = nl - record; + if (*recordLength > 0 && record[*recordLength - 1] == '\r') { + --*recordLength; + } + return true; + } + } + return false; +} + +bool ExternalFileUnit::BeginReadingRecord(IoErrorHandler &handler) { + RUNTIME_CHECK(handler, direction_ == Direction::Input); + if (!beganReadingRecord_) { + beganReadingRecord_ = true; + // Don't use IsAtEOF() to check for an EOF condition here, just detect + // it from a failed or short read from the file. IsAtEOF() could be + // wrong for formatted input if actual newline characters had been + // written in-band by previous WRITEs before a REWIND. In fact, + // now that we know that the unit is being used for input (again), + // it's best to reset endfileRecordNumber and ensure IsAtEOF() will + // now be true on return only if it gets set by HitEndOnRead(). + endfileRecordNumber.reset(); + if (access == Access::Direct) { + CheckDirectAccess(handler); + auto need{static_cast<std::size_t>(recordOffsetInFrame_ + *openRecl)}; + auto got{ReadFrame(frameOffsetInFile_, need, handler)}; + if (got >= need) { + recordLength = openRecl; + } else { + recordLength.reset(); + HitEndOnRead(handler); + } + } else { + if (anyWriteSinceLastPositioning_ && access == Access::Sequential) { + // Most Fortran implementations allow a READ after a WRITE; + // the read then just hits an EOF. + DoEndfile<false, Direction::Input>(handler); + } + recordLength.reset(); + RUNTIME_CHECK(handler, isUnformatted.has_value()); + if (*isUnformatted) { + if (access == Access::Sequential) { + BeginSequentialVariableUnformattedInputRecord(handler); + } + } else { // formatted sequential or stream + BeginVariableFormattedInputRecord(handler); + } + } + } + RUNTIME_CHECK(handler, + recordLength.has_value() || !IsRecordFile() || handler.InError()); + return !handler.InError(); +} + +void ExternalFileUnit::FinishReadingRecord(IoErrorHandler &handler) { + RUNTIME_CHECK(handler, direction_ == Direction::Input && beganReadingRecord_); + beganReadingRecord_ = false; + if (handler.GetIoStat() == IostatEnd || + (IsRecordFile() && !recordLength.has_value())) { + // Avoid bogus crashes in END/ERR circumstances; but + // still increment the current record number so that + // an attempted read of an endfile record, followed by + // a BACKSPACE, will still be at EOF. + ++currentRecordNumber; + } else if (IsRecordFile()) { + recordOffsetInFrame_ += *recordLength; + if (access != Access::Direct) { + RUNTIME_CHECK(handler, isUnformatted.has_value()); + recordLength.reset(); + if (isUnformatted.value_or(false)) { + // Retain footer in frame for more efficient BACKSPACE + frameOffsetInFile_ += recordOffsetInFrame_; + recordOffsetInFrame_ = sizeof(std::uint32_t); + } else { // formatted + if (FrameLength() > recordOffsetInFrame_ && + Frame()[recordOffsetInFrame_] == '\r') { + ++recordOffsetInFrame_; + } + if (FrameLength() > recordOffsetInFrame_ && + Frame()[recordOffsetInFrame_] == '\n') { + ++recordOffsetInFrame_; + } + if (!pinnedFrame || mayPosition()) { + frameOffsetInFile_ += recordOffsetInFrame_; + recordOffsetInFrame_ = 0; + } + } + } + ++currentRecordNumber; + } else { // unformatted stream + furthestPositionInRecord = + std::max(furthestPositionInRecord, positionInRecord); + frameOffsetInFile_ += recordOffsetInFrame_ + furthestPositionInRecord; + recordOffsetInFrame_ = 0; + } + BeginRecord(); + leftTabLimit.reset(); +} + +bool ExternalFileUnit::AdvanceRecord(IoErrorHandler &handler) { + if (direction_ == Direction::Input) { + FinishReadingRecord(handler); + return BeginReadingRecord(handler); + } else { // Direction::Output + bool ok{true}; + RUNTIME_CHECK(handler, isUnformatted.has_value()); + positionInRecord = furthestPositionInRecord; + if (access == Access::Direct) { + if (furthestPositionInRecord < + openRecl.value_or(furthestPositionInRecord)) { + // Pad remainder of fixed length record + WriteFrame( + frameOffsetInFile_, recordOffsetInFrame_ + *openRecl, handler); + std::memset(Frame() + recordOffsetInFrame_ + furthestPositionInRecord, + isUnformatted.value_or(false) ? 0 : ' ', + *openRecl - furthestPositionInRecord); + furthestPositionInRecord = *openRecl; + } + } else if (*isUnformatted) { + if (access == Access::Sequential) { + // Append the length of a sequential unformatted variable-length record + // as its footer, then overwrite the reserved first four bytes of the + // record with its length as its header. These four bytes were skipped + // over in BeginUnformattedIO<Output>(). + // TODO: Break very large records up into subrecords with negative + // headers &/or footers + std::uint32_t length; + length = furthestPositionInRecord - sizeof length; + ok = ok && + Emit(reinterpret_cast<const char *>(&length), sizeof length, + sizeof length, handler); + positionInRecord = 0; + ok = ok && + Emit(reinterpret_cast<const char *>(&length), sizeof length, + sizeof length, handler); + } else { + // Unformatted stream: nothing to do + } + } else if (handler.GetIoStat() != IostatOk && + furthestPositionInRecord == 0) { + // Error in formatted variable length record, and no output yet; do + // nothing, like most other Fortran compilers do. + return true; + } else { + // Terminate formatted variable length record + const char *lineEnding{"\n"}; + std::size_t lineEndingBytes{1}; +#ifdef _WIN32 + if (!isWindowsTextFile()) { + lineEnding = "\r\n"; + lineEndingBytes = 2; + } +#endif + ok = ok && Emit(lineEnding, lineEndingBytes, 1, handler); + } + leftTabLimit.reset(); + if (IsAfterEndfile()) { + return false; + } + CommitWrites(); + ++currentRecordNumber; + if (access != Access::Direct) { + impliedEndfile_ = IsRecordFile(); + if (IsAtEOF()) { + endfileRecordNumber.reset(); + } + } + return ok; + } +} + +void ExternalFileUnit::BackspaceRecord(IoErrorHandler &handler) { + if (access == Access::Direct || !IsRecordFile()) { + handler.SignalError(IostatBackspaceNonSequential, + "BACKSPACE(UNIT=%d) on direct-access file or unformatted stream", + unitNumber()); + } else { + if (IsAfterEndfile()) { + // BACKSPACE after explicit ENDFILE + currentRecordNumber = *endfileRecordNumber; + } else if (leftTabLimit && direction_ == Direction::Input) { + // BACKSPACE after non-advancing input + leftTabLimit.reset(); + } else { + DoImpliedEndfile(handler); + if (frameOffsetInFile_ + recordOffsetInFrame_ > 0) { + --currentRecordNumber; + if (openRecl && access == Access::Direct) { + BackspaceFixedRecord(handler); + } else { + RUNTIME_CHECK(handler, isUnformatted.has_value()); + if (isUnformatted.value_or(false)) { + BackspaceVariableUnformattedRecord(handler); + } else { + BackspaceVariableFormattedRecord(handler); + } + } + } + } + BeginRecord(); + anyWriteSinceLastPositioning_ = false; + } +} + +void ExternalFileUnit::FlushOutput(IoErrorHandler &handler) { + if (!mayPosition()) { + auto frameAt{FrameAt()}; + if (frameOffsetInFile_ >= frameAt && + frameOffsetInFile_ < + static_cast<std::int64_t>(frameAt + FrameLength())) { + // A Flush() that's about to happen to a non-positionable file + // needs to advance frameOffsetInFile_ to prevent attempts at + // impossible seeks + CommitWrites(); + leftTabLimit.reset(); + } + } + Flush(handler); +} + +void ExternalFileUnit::FlushIfTerminal(IoErrorHandler &handler) { + if (isTerminal()) { + FlushOutput(handler); + } +} + +void ExternalFileUnit::Endfile(IoErrorHandler &handler) { + if (access == Access::Direct) { + handler.SignalError(IostatEndfileDirect, + "ENDFILE(UNIT=%d) on direct-access file", unitNumber()); + } else if (!mayWrite()) { + handler.SignalError(IostatEndfileUnwritable, + "ENDFILE(UNIT=%d) on read-only file", unitNumber()); + } else if (IsAfterEndfile()) { + // ENDFILE after ENDFILE + } else { + DoEndfile(handler); + if (IsRecordFile() && access != Access::Direct) { + // Explicit ENDFILE leaves position *after* the endfile record + RUNTIME_CHECK(handler, endfileRecordNumber.has_value()); + currentRecordNumber = *endfileRecordNumber + 1; + } + } +} + +void ExternalFileUnit::Rewind(IoErrorHandler &handler) { + if (access == Access::Direct) { + handler.SignalError(IostatRewindNonSequential, + "REWIND(UNIT=%d) on non-sequential file", unitNumber()); + } else { + DoImpliedEndfile(handler); + SetPosition(0); + currentRecordNumber = 1; + anyWriteSinceLastPositioning_ = false; + } +} + +void ExternalFileUnit::SetPosition(std::int64_t pos) { + frameOffsetInFile_ = pos; + recordOffsetInFrame_ = 0; + if (access == Access::Direct) { + directAccessRecWasSet_ = true; + } + BeginRecord(); + beganReadingRecord_ = false; // for positioning after nonadvancing input + leftTabLimit.reset(); +} + +void ExternalFileUnit::Sought(std::int64_t zeroBasedPos) { + SetPosition(zeroBasedPos); + if (zeroBasedPos == 0) { + currentRecordNumber = 1; + } else { + // We no longer know which record we're in. Set currentRecordNumber to + // a large value from whence we can both advance and backspace. + currentRecordNumber = std::numeric_limits<std::int64_t>::max() / 2; + endfileRecordNumber.reset(); + } +} + +bool ExternalFileUnit::SetStreamPos( + std::int64_t oneBasedPos, IoErrorHandler &handler) { + if (access != Access::Stream) { + handler.SignalError("POS= may not appear unless ACCESS='STREAM'"); + return false; + } + if (oneBasedPos < 1) { // POS=1 is beginning of file (12.6.2.11) + handler.SignalError( + "POS=%zd is invalid", static_cast<std::intmax_t>(oneBasedPos)); + return false; + } + // A backwards POS= implies truncation after writing, at least in + // Intel and NAG. + if (static_cast<std::size_t>(oneBasedPos - 1) < + frameOffsetInFile_ + recordOffsetInFrame_) { + DoImpliedEndfile(handler); + } + Sought(oneBasedPos - 1); + return true; +} + +// GNU FSEEK extension +RT_API_ATTRS bool ExternalFileUnit::Fseek(std::int64_t zeroBasedPos, + enum FseekWhence whence, IoErrorHandler &handler) { + if (whence == FseekEnd) { + Flush(handler); // updates knownSize_ + if (auto size{knownSize()}) { + zeroBasedPos += *size; + } else { + return false; + } + } else if (whence == FseekCurrent) { + zeroBasedPos += InquirePos() - 1; + } + if (zeroBasedPos >= 0) { + Sought(zeroBasedPos); + return true; + } else { + return false; + } +} + +bool ExternalFileUnit::SetDirectRec( + std::int64_t oneBasedRec, IoErrorHandler &handler) { + if (access != Access::Direct) { + handler.SignalError("REC= may not appear unless ACCESS='DIRECT'"); + return false; + } + if (!openRecl) { + handler.SignalError("RECL= was not specified"); + return false; + } + if (oneBasedRec < 1) { + handler.SignalError( + "REC=%zd is invalid", static_cast<std::intmax_t>(oneBasedRec)); + return false; + } + currentRecordNumber = oneBasedRec; + SetPosition((oneBasedRec - 1) * *openRecl); + return true; +} + +void ExternalFileUnit::EndIoStatement() { + io_.reset(); + u_.emplace<std::monostate>(); + lock_.Drop(); +} + +void ExternalFileUnit::BeginSequentialVariableUnformattedInputRecord( + IoErrorHandler &handler) { + RUNTIME_CHECK(handler, access == Access::Sequential); + std::uint32_t header{0}, footer{0}; + std::size_t need{recordOffsetInFrame_ + sizeof header}; + std::size_t got{ReadFrame(frameOffsetInFile_, need, handler)}; + // Try to emit informative errors to help debug corrupted files. + const char *error{nullptr}; + if (got < need) { + if (got == recordOffsetInFrame_) { + HitEndOnRead(handler); + } else { + error = "Unformatted variable-length sequential file input failed at " + "record #%jd (file offset %jd): truncated record header"; + } + } else { + header = ReadHeaderOrFooter(recordOffsetInFrame_); + recordLength = sizeof header + header; // does not include footer + need = recordOffsetInFrame_ + *recordLength + sizeof footer; + got = ReadFrame(frameOffsetInFile_, need, handler); + if (got >= need) { + footer = ReadHeaderOrFooter(recordOffsetInFrame_ + *recordLength); + } + if (frameOffsetInFile_ == 0 && recordOffsetInFrame_ == 0 && + (got < need || footer != header)) { + // Maybe an omitted or incorrect byte swap flag setting? + // Try it the other way, since this is the first record. + // (N.B. Won't work on files starting with empty records, but there's + // no good way to know later if all preceding records were empty.) + swapEndianness_ = !swapEndianness_; + std::uint32_t header2{ReadHeaderOrFooter(0)}; + std::size_t recordLength2{sizeof header2 + header2}; + std::size_t need2{recordLength2 + sizeof footer}; + std::size_t got2{ReadFrame(0, need2, handler)}; + if (got2 >= need2) { + std::uint32_t footer2{ReadHeaderOrFooter(recordLength2)}; + if (footer2 == header2) { + error = "Unformatted variable-length sequential file input " + "failed on the first record, probably due to a need " + "for byte order data conversion; consider adding " + "CONVERT='SWAP' to the OPEN statement or adding " + "FORT_CONVERT=SWAP to the execution environment"; + } + } + swapEndianness_ = !swapEndianness_; + } + if (error) { + } else if (got < need) { + error = "Unformatted variable-length sequential file input failed at " + "record #%jd (file offset %jd): hit EOF reading record with " + "length %jd bytes"; + } else if (footer != header) { + error = "Unformatted variable-length sequential file input failed at " + "record #%jd (file offset %jd): record header has length %jd " + "that does not match record footer (%jd)"; + } + } + if (error) { + handler.SignalError(error, static_cast<std::intmax_t>(currentRecordNumber), + static_cast<std::intmax_t>(frameOffsetInFile_), + static_cast<std::intmax_t>(header), static_cast<std::intmax_t>(footer)); + // TODO: error recovery + } + positionInRecord = sizeof header; +} + +void ExternalFileUnit::BeginVariableFormattedInputRecord( + IoErrorHandler &handler) { + if (this == defaultInput) { + if (defaultOutput) { + defaultOutput->FlushOutput(handler); + } + if (errorOutput) { + errorOutput->FlushOutput(handler); + } + } + std::size_t length{0}; + do { + std::size_t need{length + 1}; + length = + ReadFrame(frameOffsetInFile_, recordOffsetInFrame_ + need, handler) - + recordOffsetInFrame_; + if (length < need) { + if (length > 0) { + // final record w/o \n + recordLength = length; + unterminatedRecord = true; + } else { + HitEndOnRead(handler); + } + break; + } + } while (!SetVariableFormattedRecordLength()); +} + +void ExternalFileUnit::BackspaceFixedRecord(IoErrorHandler &handler) { + RUNTIME_CHECK(handler, openRecl.has_value()); + if (frameOffsetInFile_ < *openRecl) { + handler.SignalError(IostatBackspaceAtFirstRecord); + } else { + frameOffsetInFile_ -= *openRecl; + } +} + +void ExternalFileUnit::BackspaceVariableUnformattedRecord( + IoErrorHandler &handler) { + std::uint32_t header{0}; + auto headerBytes{static_cast<std::int64_t>(sizeof header)}; + frameOffsetInFile_ += recordOffsetInFrame_; + recordOffsetInFrame_ = 0; + if (frameOffsetInFile_ <= headerBytes) { + handler.SignalError(IostatBackspaceAtFirstRecord); + return; + } + // Error conditions here cause crashes, not file format errors, because the + // validity of the file structure before the current record will have been + // checked informatively in NextSequentialVariableUnformattedInputRecord(). + std::size_t got{ + ReadFrame(frameOffsetInFile_ - headerBytes, headerBytes, handler)}; + if (static_cast<std::int64_t>(got) < headerBytes) { + handler.SignalError(IostatShortRead); + return; + } + recordLength = ReadHeaderOrFooter(0); + if (frameOffsetInFile_ < *recordLength + 2 * headerBytes) { + handler.SignalError(IostatBadUnformattedRecord); + return; + } + frameOffsetInFile_ -= *recordLength + 2 * headerBytes; + auto need{static_cast<std::size_t>( + recordOffsetInFrame_ + sizeof header + *recordLength)}; + got = ReadFrame(frameOffsetInFile_, need, handler); + if (got < need) { + handler.SignalError(IostatShortRead); + return; + } + header = ReadHeaderOrFooter(recordOffsetInFrame_); + if (header != *recordLength) { + handler.SignalError(IostatBadUnformattedRecord); + return; + } +} + +// There's no portable memrchr(), unfortunately, and strrchr() would +// fail on a record with a NUL, so we have to do it the hard way. +static RT_API_ATTRS const char *FindLastNewline( + const char *str, std::size_t length) { + for (const char *p{str + length}; p >= str; p--) { + if (*p == '\n') { + return p; + } + } + return nullptr; +} + +void ExternalFileUnit::BackspaceVariableFormattedRecord( + IoErrorHandler &handler) { + // File offset of previous record's newline + auto prevNL{ + frameOffsetInFile_ + static_cast<std::int64_t>(recordOffsetInFrame_) - 1}; + if (prevNL < 0) { + handler.SignalError(IostatBackspaceAtFirstRecord); + return; + } + while (true) { + if (frameOffsetInFile_ < prevNL) { + if (const char *p{ + FindLastNewline(Frame(), prevNL - 1 - frameOffsetInFile_)}) { + recordOffsetInFrame_ = p - Frame() + 1; + recordLength = prevNL - (frameOffsetInFile_ + recordOffsetInFrame_); + break; + } + } + if (frameOffsetInFile_ == 0) { + recordOffsetInFrame_ = 0; + recordLength = prevNL; + break; + } + frameOffsetInFile_ -= std::min<std::int64_t>(frameOffsetInFile_, 1024); + auto need{static_cast<std::size_t>(prevNL + 1 - frameOffsetInFile_)}; + auto got{ReadFrame(frameOffsetInFile_, need, handler)}; + if (got < need) { + handler.SignalError(IostatShortRead); + return; + } + } + if (Frame()[recordOffsetInFrame_ + *recordLength] != '\n') { + handler.SignalError(IostatMissingTerminator); + return; + } + if (*recordLength > 0 && + Frame()[recordOffsetInFrame_ + *recordLength - 1] == '\r') { + --*recordLength; + } +} + +void ExternalFileUnit::DoImpliedEndfile(IoErrorHandler &handler) { + if (access != Access::Direct) { + if (!impliedEndfile_ && leftTabLimit && direction_ == Direction::Output) { + // Flush a partial record after non-advancing output + impliedEndfile_ = true; + } + if (impliedEndfile_ && mayPosition()) { + DoEndfile(handler); + } + } + impliedEndfile_ = false; +} + +template <bool ANY_DIR, Direction DIR> +void ExternalFileUnit::DoEndfile(IoErrorHandler &handler) { + if (IsRecordFile() && access != Access::Direct) { + furthestPositionInRecord = + std::max(positionInRecord, furthestPositionInRecord); + if (leftTabLimit) { // last I/O was non-advancing + if (access == Access::Sequential && direction_ == Direction::Output) { + if constexpr (ANY_DIR || DIR == Direction::Output) { + // When DoEndfile() is called from BeginReadingRecord(), + // this call to AdvanceRecord() may appear as a recursion + // though it may never happen. Expose the call only + // under the constexpr direction check. + AdvanceRecord(handler); + } else { + // This check always fails if we are here. + RUNTIME_CHECK(handler, direction_ != Direction::Output); + } + } else { // Access::Stream or input + leftTabLimit.reset(); + ++currentRecordNumber; + } + } + endfileRecordNumber = currentRecordNumber; + } + frameOffsetInFile_ += recordOffsetInFrame_ + furthestPositionInRecord; + recordOffsetInFrame_ = 0; + FlushOutput(handler); + Truncate(frameOffsetInFile_, handler); + TruncateFrame(frameOffsetInFile_, handler); + BeginRecord(); + impliedEndfile_ = false; + anyWriteSinceLastPositioning_ = false; +} + +template void ExternalFileUnit::DoEndfile(IoErrorHandler &handler); +template void ExternalFileUnit::DoEndfile<false, Direction::Output>( + IoErrorHandler &handler); +template void ExternalFileUnit::DoEndfile<false, Direction::Input>( + IoErrorHandler &handler); + +void ExternalFileUnit::CommitWrites() { + frameOffsetInFile_ += + recordOffsetInFrame_ + recordLength.value_or(furthestPositionInRecord); + recordOffsetInFrame_ = 0; + BeginRecord(); +} + +bool ExternalFileUnit::CheckDirectAccess(IoErrorHandler &handler) { + if (access == Access::Direct) { + RUNTIME_CHECK(handler, openRecl); + if (!directAccessRecWasSet_) { + handler.SignalError( + "No REC= was specified for a data transfer with ACCESS='DIRECT'"); + return false; + } + } + return true; +} + +void ExternalFileUnit::HitEndOnRead(IoErrorHandler &handler) { + handler.SignalEnd(); + if (IsRecordFile() && access != Access::Direct) { + endfileRecordNumber = currentRecordNumber; + } +} + +ChildIo &ExternalFileUnit::PushChildIo(IoStatementState &parent) { + OwningPtr<ChildIo> current{std::move(child_)}; + Terminator &terminator{parent.GetIoErrorHandler()}; + OwningPtr<ChildIo> next{New<ChildIo>{terminator}(parent, std::move(current))}; + child_.reset(next.release()); + return *child_; +} + +void ExternalFileUnit::PopChildIo(ChildIo &child) { + if (child_.get() != &child) { + child.parent().GetIoErrorHandler().Crash( + "ChildIo being popped is not top of stack"); + } + child_.reset(child.AcquirePrevious().release()); // deletes top child +} + +std::uint32_t ExternalFileUnit::ReadHeaderOrFooter(std::int64_t frameOffset) { + std::uint32_t word; + char *wordPtr{reinterpret_cast<char *>(&word)}; + std::memcpy(wordPtr, Frame() + frameOffset, sizeof word); + if (swapEndianness_) { + SwapEndianness(wordPtr, sizeof word, sizeof word); + } + return word; +} + +void ChildIo::EndIoStatement() { + io_.reset(); + u_.emplace<std::monostate>(); +} + +Iostat ChildIo::CheckFormattingAndDirection( + bool unformatted, Direction direction) { + bool parentIsInput{!parent_.get_if<IoDirectionState<Direction::Output>>()}; + bool parentIsFormatted{parentIsInput + ? parent_.get_if<FormattedIoStatementState<Direction::Input>>() != + nullptr + : parent_.get_if<FormattedIoStatementState<Direction::Output>>() != + nullptr}; + bool parentIsUnformatted{!parentIsFormatted}; + if (unformatted != parentIsUnformatted) { + return unformatted ? IostatUnformattedChildOnFormattedParent + : IostatFormattedChildOnUnformattedParent; + } else if (parentIsInput != (direction == Direction::Input)) { + return parentIsInput ? IostatChildOutputToInputParent + : IostatChildInputFromOutputParent; + } else { + return IostatOk; + } +} + +RT_OFFLOAD_API_GROUP_END +} // namespace Fortran::runtime::io diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit.h b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit.h new file mode 100644 index 00000000000..9aec9b16595 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/unit.h @@ -0,0 +1,306 @@ +//===-- lib/runtime/unit.h --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Fortran external I/O units + +#ifndef FLANG_RT_RUNTIME_UNIT_H_ +#define FLANG_RT_RUNTIME_UNIT_H_ + +#include "flang-rt/runtime/buffer.h" +#include "flang-rt/runtime/connection.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/file.h" +#include "flang-rt/runtime/format.h" +#include "flang-rt/runtime/io-error.h" +#include "flang-rt/runtime/io-stmt.h" +#include "flang-rt/runtime/lock.h" +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/terminator.h" +#include "flang/Common/constexpr-bitset.h" +#include "flang/Common/optional.h" +#include <cstdlib> +#include <cstring> +#include <flang/Common/variant.h> + +namespace Fortran::runtime::io { + +class UnitMap; +class ChildIo; +class ExternalFileUnit; + +enum FseekWhence { + FseekSet = 0, + FseekCurrent = 1, + FseekEnd = 2, +}; + +RT_OFFLOAD_VAR_GROUP_BEGIN +// Predefined file units. +extern RT_VAR_ATTRS ExternalFileUnit *defaultInput; // unit 5 +extern RT_VAR_ATTRS ExternalFileUnit *defaultOutput; // unit 6 +extern RT_VAR_ATTRS ExternalFileUnit *errorOutput; // unit 0 extension +RT_OFFLOAD_VAR_GROUP_END + +RT_OFFLOAD_API_GROUP_BEGIN + +#if defined(RT_USE_PSEUDO_FILE_UNIT) +// A flavor of OpenFile class that pretends to be a terminal, +// and only provides basic buffering of the output +// in an internal buffer, and Write's the output +// using std::printf(). Since it does not rely on file system +// APIs, it can be used to implement external output +// for offload devices. +class PseudoOpenFile { +public: + using FileOffset = std::int64_t; + + RT_API_ATTRS const char *path() const { return nullptr; } + RT_API_ATTRS std::size_t pathLength() const { return 0; } + RT_API_ATTRS void set_path(OwningPtr<char> &&, std::size_t bytes) {} + RT_API_ATTRS bool mayRead() const { return false; } + RT_API_ATTRS bool mayWrite() const { return true; } + RT_API_ATTRS bool mayPosition() const { return false; } + RT_API_ATTRS bool mayAsynchronous() const { return false; } + RT_API_ATTRS void set_mayAsynchronous(bool yes); + // Pretend to be a terminal to force the output + // at the end of IO statement. + RT_API_ATTRS bool isTerminal() const { return true; } + RT_API_ATTRS bool isWindowsTextFile() const { return false; } + RT_API_ATTRS Fortran::common::optional<FileOffset> knownSize() const; + RT_API_ATTRS bool IsConnected() const { return false; } + RT_API_ATTRS void Open(OpenStatus, Fortran::common::optional<Action>, + Position, IoErrorHandler &); + RT_API_ATTRS void Predefine(int fd) {} + RT_API_ATTRS void Close(CloseStatus, IoErrorHandler &); + RT_API_ATTRS std::size_t Read(FileOffset, char *, std::size_t minBytes, + std::size_t maxBytes, IoErrorHandler &); + RT_API_ATTRS std::size_t Write( + FileOffset, const char *, std::size_t, IoErrorHandler &); + RT_API_ATTRS void Truncate(FileOffset, IoErrorHandler &); + RT_API_ATTRS int ReadAsynchronously( + FileOffset, char *, std::size_t, IoErrorHandler &); + RT_API_ATTRS int WriteAsynchronously( + FileOffset, const char *, std::size_t, IoErrorHandler &); + RT_API_ATTRS void Wait(int id, IoErrorHandler &); + RT_API_ATTRS void WaitAll(IoErrorHandler &); + RT_API_ATTRS Position InquirePosition() const; +}; +#endif // defined(RT_USE_PSEUDO_FILE_UNIT) + +#if !defined(RT_USE_PSEUDO_FILE_UNIT) +using OpenFileClass = OpenFile; +using FileFrameClass = FileFrame<ExternalFileUnit>; +#else // defined(RT_USE_PSEUDO_FILE_UNIT) +using OpenFileClass = PseudoOpenFile; +// Use not so big buffer for the pseudo file unit frame. +using FileFrameClass = FileFrame<ExternalFileUnit, 1024>; +#endif // defined(RT_USE_PSEUDO_FILE_UNIT) + +class ExternalFileUnit : public ConnectionState, + public OpenFileClass, + public FileFrameClass { +public: + static constexpr int maxAsyncIds{64 * 16}; + + explicit RT_API_ATTRS ExternalFileUnit(int unitNumber) + : unitNumber_{unitNumber} { + isUTF8 = executionEnvironment.defaultUTF8; + for (int j{0}; 64 * j < maxAsyncIds; ++j) { + asyncIdAvailable_[j].set(); + } + asyncIdAvailable_[0].reset(0); + } + RT_API_ATTRS ~ExternalFileUnit() {} + + RT_API_ATTRS int unitNumber() const { return unitNumber_; } + RT_API_ATTRS bool swapEndianness() const { return swapEndianness_; } + RT_API_ATTRS bool createdForInternalChildIo() const { + return createdForInternalChildIo_; + } + + static RT_API_ATTRS ExternalFileUnit *LookUp(int unit); + static RT_API_ATTRS ExternalFileUnit *LookUpOrCreate( + int unit, const Terminator &, bool &wasExtant); + static RT_API_ATTRS ExternalFileUnit *LookUpOrCreateAnonymous(int unit, + Direction, Fortran::common::optional<bool> isUnformatted, + IoErrorHandler &); + static RT_API_ATTRS ExternalFileUnit *LookUp( + const char *path, std::size_t pathLen); + static RT_API_ATTRS ExternalFileUnit &CreateNew(int unit, const Terminator &); + static RT_API_ATTRS ExternalFileUnit *LookUpForClose(int unit); + static RT_API_ATTRS ExternalFileUnit &NewUnit( + const Terminator &, bool forChildIo); + static RT_API_ATTRS void CloseAll(IoErrorHandler &); + static RT_API_ATTRS void FlushAll(IoErrorHandler &); + + // Returns true if an existing unit was closed + RT_API_ATTRS bool OpenUnit(Fortran::common::optional<OpenStatus>, + Fortran::common::optional<Action>, Position, OwningPtr<char> &&path, + std::size_t pathLength, Convert, IoErrorHandler &); + RT_API_ATTRS bool OpenAnonymousUnit(Fortran::common::optional<OpenStatus>, + Fortran::common::optional<Action>, Position, Convert, IoErrorHandler &); + RT_API_ATTRS void CloseUnit(CloseStatus, IoErrorHandler &); + RT_API_ATTRS void DestroyClosed(); + + RT_API_ATTRS Iostat SetDirection(Direction); + + template <typename A, typename... X> + RT_API_ATTRS IoStatementState &BeginIoStatement( + const Terminator &terminator, X &&...xs) { + // Take lock_ and hold it until EndIoStatement(). +#if USE_PTHREADS + if (!lock_.TakeIfNoDeadlock()) { + terminator.Crash("Recursive I/O attempted on unit %d", unitNumber_); + } +#else + lock_.Take(); +#endif + A &state{u_.emplace<A>(std::forward<X>(xs)...)}; + if constexpr (!std::is_same_v<A, OpenStatementState>) { + state.mutableModes() = ConnectionState::modes; + } + directAccessRecWasSet_ = false; + io_.emplace(state); + return *io_; + } + + RT_API_ATTRS bool Emit( + const char *, std::size_t, std::size_t elementBytes, IoErrorHandler &); + RT_API_ATTRS bool Receive( + char *, std::size_t, std::size_t elementBytes, IoErrorHandler &); + RT_API_ATTRS std::size_t GetNextInputBytes(const char *&, IoErrorHandler &); + RT_API_ATTRS std::size_t ViewBytesInRecord(const char *&, bool forward) const; + RT_API_ATTRS bool BeginReadingRecord(IoErrorHandler &); + RT_API_ATTRS void FinishReadingRecord(IoErrorHandler &); + RT_API_ATTRS bool AdvanceRecord(IoErrorHandler &); + RT_API_ATTRS void BackspaceRecord(IoErrorHandler &); + RT_API_ATTRS void FlushOutput(IoErrorHandler &); + RT_API_ATTRS void FlushIfTerminal(IoErrorHandler &); + RT_API_ATTRS void Endfile(IoErrorHandler &); + RT_API_ATTRS void Rewind(IoErrorHandler &); + RT_API_ATTRS void EndIoStatement(); + RT_API_ATTRS bool SetStreamPos(std::int64_t oneBasedPos, IoErrorHandler &); + RT_API_ATTRS bool Fseek( + std::int64_t zeroBasedPos, enum FseekWhence, IoErrorHandler &); + RT_API_ATTRS bool SetDirectRec( + std::int64_t, IoErrorHandler &); // one-based, for REC= + RT_API_ATTRS std::int64_t InquirePos() const { + // 12.6.2.11 defines POS=1 as the beginning of file + return frameOffsetInFile_ + recordOffsetInFrame_ + positionInRecord + 1; + } + + RT_API_ATTRS ChildIo *GetChildIo() { return child_.get(); } + RT_API_ATTRS ChildIo &PushChildIo(IoStatementState &); + RT_API_ATTRS void PopChildIo(ChildIo &); + + RT_API_ATTRS int GetAsynchronousId(IoErrorHandler &); + RT_API_ATTRS bool Wait(int); + +private: + static RT_API_ATTRS UnitMap &CreateUnitMap(); + static RT_API_ATTRS UnitMap &GetUnitMap(); + RT_API_ATTRS const char *FrameNextInput(IoErrorHandler &, std::size_t); + RT_API_ATTRS void SetPosition(std::int64_t zeroBasedPos); + RT_API_ATTRS void Sought(std::int64_t zeroBasedPos); + RT_API_ATTRS void BeginSequentialVariableUnformattedInputRecord( + IoErrorHandler &); + RT_API_ATTRS void BeginVariableFormattedInputRecord(IoErrorHandler &); + RT_API_ATTRS void BackspaceFixedRecord(IoErrorHandler &); + RT_API_ATTRS void BackspaceVariableUnformattedRecord(IoErrorHandler &); + RT_API_ATTRS void BackspaceVariableFormattedRecord(IoErrorHandler &); + RT_API_ATTRS bool SetVariableFormattedRecordLength(); + RT_API_ATTRS void DoImpliedEndfile(IoErrorHandler &); + template <bool ANY_DIR = true, Direction DIR = Direction::Output> + RT_API_ATTRS void DoEndfile(IoErrorHandler &); + RT_API_ATTRS void CommitWrites(); + RT_API_ATTRS bool CheckDirectAccess(IoErrorHandler &); + RT_API_ATTRS void HitEndOnRead(IoErrorHandler &); + RT_API_ATTRS std::uint32_t ReadHeaderOrFooter(std::int64_t frameOffset); + + Lock lock_; + + int unitNumber_{-1}; + Direction direction_{Direction::Output}; + bool impliedEndfile_{false}; // sequential/stream output has taken place + bool beganReadingRecord_{false}; + bool anyWriteSinceLastPositioning_{false}; + bool directAccessRecWasSet_{false}; // REC= appeared + // Subtle: The beginning of the frame can't be allowed to advance + // during a single list-directed READ due to the possibility of a + // multi-record CHARACTER value with a "r*" repeat count. So we + // manage the frame and the current record therein separately. + std::int64_t frameOffsetInFile_{0}; + std::size_t recordOffsetInFrame_{0}; // of currentRecordNumber + bool swapEndianness_{false}; + bool createdForInternalChildIo_{false}; + common::BitSet<64> asyncIdAvailable_[maxAsyncIds / 64]; + + // When a synchronous I/O statement is in progress on this unit, holds its + // state. + std::variant<std::monostate, OpenStatementState, CloseStatementState, + ExternalFormattedIoStatementState<Direction::Output>, + ExternalFormattedIoStatementState<Direction::Input>, + ExternalListIoStatementState<Direction::Output>, + ExternalListIoStatementState<Direction::Input>, + ExternalUnformattedIoStatementState<Direction::Output>, + ExternalUnformattedIoStatementState<Direction::Input>, InquireUnitState, + ExternalMiscIoStatementState, ErroneousIoStatementState> + u_; + + // Points to the active alternative (if any) in u_ for use as a Cookie + Fortran::common::optional<IoStatementState> io_; + + // A stack of child I/O pseudo-units for defined I/O that have this + // unit number. + OwningPtr<ChildIo> child_; +}; + +// A pseudo-unit for child I/O statements in defined I/O subroutines; +// it forwards operations to the parent I/O statement, which might also +// be a child I/O statement. +class ChildIo { +public: + RT_API_ATTRS ChildIo(IoStatementState &parent, OwningPtr<ChildIo> &&previous) + : parent_{parent}, previous_{std::move(previous)} {} + + RT_API_ATTRS IoStatementState &parent() const { return parent_; } + + RT_API_ATTRS void EndIoStatement(); + + template <typename A, typename... X> + RT_API_ATTRS IoStatementState &BeginIoStatement(X &&...xs) { + A &state{u_.emplace<A>(std::forward<X>(xs)...)}; + io_.emplace(state); + return *io_; + } + + RT_API_ATTRS OwningPtr<ChildIo> AcquirePrevious() { + return std::move(previous_); + } + + RT_API_ATTRS Iostat CheckFormattingAndDirection(bool unformatted, Direction); + +private: + IoStatementState &parent_; + OwningPtr<ChildIo> previous_; + std::variant<std::monostate, + ChildFormattedIoStatementState<Direction::Output>, + ChildFormattedIoStatementState<Direction::Input>, + ChildListIoStatementState<Direction::Output>, + ChildListIoStatementState<Direction::Input>, + ChildUnformattedIoStatementState<Direction::Output>, + ChildUnformattedIoStatementState<Direction::Input>, InquireUnitState, + ErroneousIoStatementState, ExternalMiscIoStatementState> + u_; + Fortran::common::optional<IoStatementState> io_; +}; + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime::io +#endif // FLANG_RT_RUNTIME_UNIT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/utf.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/utf.cpp new file mode 100644 index 00000000000..ef9df49f24f --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/utf.cpp @@ -0,0 +1,128 @@ +//===-- lib/runtime/utf.cpp -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/utf.h" + +namespace Fortran::runtime { + +#ifndef FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS +// clang-format off +RT_OFFLOAD_VAR_GROUP_BEGIN +const RT_CONST_VAR_ATTRS std::uint8_t UTF8FirstByteTable[256]{ + /* 00 - 7F: 7 bit payload in single byte */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + /* 80 - BF: invalid first byte, valid later byte */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* C0 - DF: 11 bit payload */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + /* E0 - EF: 16 bit payload */ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + /* F0 - F7: 21 bit payload */ 4, 4, 4, 4, 4, 4, 4, 4, + /* F8 - FB: 26 bit payload */ 5, 5, 5, 5, + /* FC - FD: 31 bit payload */ 6, 6, + /* FE: 32 bit payload */ 7, + /* FF: invalid */ 0 +}; +RT_OFFLOAD_VAR_GROUP_END +// clang-format on +#endif // FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS + +RT_OFFLOAD_API_GROUP_BEGIN + +std::size_t MeasurePreviousUTF8Bytes(const char *end, std::size_t limit) { + // Scan back over UTF-8 continuation bytes, if any + for (std::size_t n{1}; n <= limit; ++n) { + if ((end[-n] & 0xc0) != 0x80) { + return n; + } + } + return limit; +} + +// Non-minimal encodings are accepted. +Fortran::common::optional<char32_t> DecodeUTF8(const char *p0) { + const std::uint8_t *p{reinterpret_cast<const std::uint8_t *>(p0)}; + std::size_t bytes{MeasureUTF8Bytes(*p0)}; + if (bytes == 1) { + return char32_t{*p}; + } else if (bytes > 1) { + std::uint64_t result{char32_t{*p} & (0x7f >> bytes)}; + for (std::size_t j{1}; j < bytes; ++j) { + std::uint8_t next{p[j]}; + if (next < 0x80 || next > 0xbf) { + return Fortran::common::nullopt; + } + result = (result << 6) | (next & 0x3f); + } + if (result <= 0xffffffff) { + return static_cast<char32_t>(result); + } + } + return Fortran::common::nullopt; +} + +std::size_t EncodeUTF8(char *p0, char32_t ucs) { + std::uint8_t *p{reinterpret_cast<std::uint8_t *>(p0)}; + if (ucs <= 0x7f) { + p[0] = ucs; + return 1; + } else if (ucs <= 0x7ff) { + p[0] = 0xc0 | (ucs >> 6); + p[1] = 0x80 | (ucs & 0x3f); + return 2; + } else if (ucs <= 0xffff) { + p[0] = 0xe0 | (ucs >> 12); + p[1] = 0x80 | ((ucs >> 6) & 0x3f); + p[2] = 0x80 | (ucs & 0x3f); + return 3; + } else if (ucs <= 0x1fffff) { + p[0] = 0xf0 | (ucs >> 18); + p[1] = 0x80 | ((ucs >> 12) & 0x3f); + p[2] = 0x80 | ((ucs >> 6) & 0x3f); + p[3] = 0x80 | (ucs & 0x3f); + return 4; + } else if (ucs <= 0x3ffffff) { + p[0] = 0xf8 | (ucs >> 24); + p[1] = 0x80 | ((ucs >> 18) & 0x3f); + p[2] = 0x80 | ((ucs >> 12) & 0x3f); + p[3] = 0x80 | ((ucs >> 6) & 0x3f); + p[4] = 0x80 | (ucs & 0x3f); + return 5; + } else if (ucs <= 0x7ffffff) { + p[0] = 0xf8 | (ucs >> 30); + p[1] = 0x80 | ((ucs >> 24) & 0x3f); + p[2] = 0x80 | ((ucs >> 18) & 0x3f); + p[3] = 0x80 | ((ucs >> 12) & 0x3f); + p[4] = 0x80 | ((ucs >> 6) & 0x3f); + p[5] = 0x80 | (ucs & 0x3f); + return 6; + } else { + p[0] = 0xfe; + p[1] = 0x80 | ((ucs >> 30) & 0x3f); + p[2] = 0x80 | ((ucs >> 24) & 0x3f); + p[3] = 0x80 | ((ucs >> 18) & 0x3f); + p[4] = 0x80 | ((ucs >> 12) & 0x3f); + p[5] = 0x80 | ((ucs >> 6) & 0x3f); + p[6] = 0x80 | (ucs & 0x3f); + return 7; + } +} +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/work-queue.cpp b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/work-queue.cpp new file mode 100644 index 00000000000..42dbc9064b0 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang-rt/lib/runtime/work-queue.cpp @@ -0,0 +1,149 @@ +//===-- lib/runtime/work-queue.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "flang-rt/runtime/work-queue.h" +#include "flang-rt/runtime/environment.h" +#include "flang-rt/runtime/memory.h" +#include "flang-rt/runtime/type-info.h" +#include "flang/Common/visit.h" + +namespace Fortran::runtime { + +#if !defined(RT_DEVICE_COMPILATION) +// FLANG_RT_DEBUG code is disabled when false. +static constexpr bool enableDebugOutput{false}; +#endif + +RT_OFFLOAD_API_GROUP_BEGIN + +RT_API_ATTRS int Ticket::Continue(WorkQueue &workQueue) { + if (!begun) { + begun = true; + return common::visit( + [&workQueue]( + auto &specificTicket) { return specificTicket.Begin(workQueue); }, + u); + } else { + return common::visit( + [&workQueue](auto &specificTicket) { + return specificTicket.Continue(workQueue); + }, + u); + } +} + +RT_API_ATTRS WorkQueue::~WorkQueue() { + if (anyDynamicAllocation_) { + if (last_) { + if ((last_->next = firstFree_)) { + last_->next->previous = last_; + } + firstFree_ = first_; + first_ = last_ = nullptr; + } + while (firstFree_) { + TicketList *next{firstFree_->next}; + if (!firstFree_->isStatic) { + FreeMemory(firstFree_); + } + firstFree_ = next; + } + } +} + +RT_API_ATTRS Ticket &WorkQueue::StartTicket() { + if (!firstFree_) { + void *p{AllocateMemoryOrCrash(terminator_, sizeof(TicketList))}; + firstFree_ = new (p) TicketList; + firstFree_->isStatic = false; + anyDynamicAllocation_ = true; + } + TicketList *newTicket{firstFree_}; + if ((firstFree_ = newTicket->next)) { + firstFree_->previous = nullptr; + } + TicketList *after{insertAfter_ ? insertAfter_->next : nullptr}; + if ((newTicket->previous = insertAfter_ ? insertAfter_ : last_)) { + newTicket->previous->next = newTicket; + } else { + first_ = newTicket; + } + if ((newTicket->next = after)) { + after->previous = newTicket; + } else { + last_ = newTicket; + } + newTicket->ticket.begun = false; +#if !defined(RT_DEVICE_COMPILATION) + if (enableDebugOutput && + (executionEnvironment.internalDebugging & + ExecutionEnvironment::WorkQueue)) { + std::fprintf(stderr, "WQ: new ticket\n"); + } +#endif + return newTicket->ticket; +} + +RT_API_ATTRS int WorkQueue::Run() { + while (last_) { + TicketList *at{last_}; + insertAfter_ = last_; +#if !defined(RT_DEVICE_COMPILATION) + if (enableDebugOutput && + (executionEnvironment.internalDebugging & + ExecutionEnvironment::WorkQueue)) { + std::fprintf(stderr, "WQ: %zd %s\n", at->ticket.u.index(), + at->ticket.begun ? "Continue" : "Begin"); + } +#endif + int stat{at->ticket.Continue(*this)}; +#if !defined(RT_DEVICE_COMPILATION) + if (enableDebugOutput && + (executionEnvironment.internalDebugging & + ExecutionEnvironment::WorkQueue)) { + std::fprintf(stderr, "WQ: ... stat %d\n", stat); + } +#endif + insertAfter_ = nullptr; + if (stat == StatOk) { + if (at->previous) { + at->previous->next = at->next; + } else { + first_ = at->next; + } + if (at->next) { + at->next->previous = at->previous; + } else { + last_ = at->previous; + } + if ((at->next = firstFree_)) { + at->next->previous = at; + } + at->previous = nullptr; + firstFree_ = at; + } else if (stat != StatContinue) { + Stop(); + return stat; + } + } + return StatOk; +} + +RT_API_ATTRS void WorkQueue::Stop() { + if (last_) { + if ((last_->next = firstFree_)) { + last_->next->previous = last_; + } + firstFree_ = first_; + first_ = last_ = nullptr; + } +} + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::runtime diff --git a/contrib/libs/llvm/flang-rt/flang/LICENSE.TXT b/contrib/libs/llvm/flang-rt/flang/LICENSE.TXT new file mode 100644 index 00000000000..53bb2e7fbc7 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/LICENSE.TXT @@ -0,0 +1,234 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. diff --git a/contrib/libs/llvm/flang-rt/flang/README.md b/contrib/libs/llvm/flang-rt/flang/README.md new file mode 100644 index 00000000000..2d5435196bb --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/README.md @@ -0,0 +1,42 @@ +# Flang + +Flang is a ground-up implementation of a Fortran front end written in modern +C++. It started off as the f18 project (https://github.com/flang-compiler/f18) +with an aim to replace the previous flang project +(https://github.com/flang-compiler/flang) and address its various deficiencies. +F18 was subsequently accepted into the LLVM project and rechristened as Flang. + +Please note that flang is not ready yet for production usage. + +## Getting Started + +Read more about flang in the [docs directory](docs). +Start with the [compiler overview](docs/Overview.md). + +To better understand Fortran as a language +and the specific grammar accepted by flang, +read [Fortran For C Programmers](docs/FortranForCProgrammers.md) +and +flang's specifications of the [Fortran grammar](docs/f2018-grammar.md) +and +the [OpenMP grammar](docs/OpenMP-4.5-grammar.md). + +Treatment of language extensions is covered +in [this document](docs/Extensions.md). + +To understand the compilers handling of intrinsics, +see the [discussion of intrinsics](docs/Intrinsics.md). + +To understand how a flang program communicates with libraries at runtime, +see the discussion of [runtime descriptors](docs/RuntimeDescriptor.md). + +If you're interested in contributing to the compiler, +read the [style guide](docs/C++style.md) +and +also review [how flang uses modern C++ features](docs/C++17.md). + +If you are interested in writing new documentation, follow +[LLVM's Markdown style guide](https://github.com/llvm/llvm-project/blob/main/llvm/docs/MarkdownQuickstartTemplate.md). + +Consult the [Getting Started with Flang](docs/GettingStarted.md) +for information on building and running flang. diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/Fortran-consts.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/Fortran-consts.h new file mode 100644 index 00000000000..74ef1c85d2c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/Fortran-consts.h @@ -0,0 +1,46 @@ +//===-- include/flang/Common/Fortran-consts.h -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_FORTRAN_CONSTS_H_ +#define FORTRAN_COMMON_FORTRAN_CONSTS_H_ + +#include "enum-class.h" +#include <cstdint> + +namespace Fortran::common { + +// Fortran has five kinds of standard intrinsic data types, the Unsigned +// extension, and derived types. +ENUM_CLASS( + TypeCategory, Integer, Unsigned, Real, Complex, Character, Logical, Derived) +ENUM_CLASS(VectorElementCategory, Integer, Unsigned, Real) + +ENUM_CLASS(IoStmtKind, None, Backspace, Close, Endfile, Flush, Inquire, Open, + Print, Read, Rewind, Wait, Write) + +// Defined I/O variants +ENUM_CLASS( + DefinedIo, ReadFormatted, ReadUnformatted, WriteFormatted, WriteUnformatted) + +// Fortran arrays may have up to 15 dimensions (See Fortran 2018 section 5.4.6). +static constexpr int maxRank{15}; + +// Floating-point rounding modes; these are packed into a byte to save +// room in the runtime's format processing context structure. These +// enumerators are defined with the corresponding values returned from +// llvm.get.rounding. +enum class RoundingMode : std::uint8_t { + ToZero, // ROUND=ZERO, RZ - truncation + TiesToEven, // ROUND=NEAREST, RN - default IEEE rounding + Up, // ROUND=UP, RU + Down, // ROUND=DOWN, RD + TiesAwayFromZero, // ROUND=COMPATIBLE, RC - ties round away from zero +}; + +} // namespace Fortran::common +#endif /* FORTRAN_COMMON_FORTRAN_CONSTS_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/ISO_Fortran_binding_wrapper.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/ISO_Fortran_binding_wrapper.h new file mode 100644 index 00000000000..890522953ef --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/ISO_Fortran_binding_wrapper.h @@ -0,0 +1,38 @@ +/*===-- include/flang/Common/ISO_Fortran_binding_wrapper.h --------*- C++ -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ + +#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_ +#define FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_ + +/* A thin wrapper around flang/include/ISO_Fortran_binding.h + * This header file must be included when ISO_Fortran_binding.h + * definitions/declarations are needed in Flang compiler/runtime + * sources. The inclusion of Common/api-attrs.h below sets up + * proper values for the macros used in ISO_Fortran_binding.h + * for the device offload builds. + * flang/include/ISO_Fortran_binding.h is made a standalone + * header file so that it can be used on its own in users' + * C/C++ programs. + */ + +/* clang-format off */ +#include <stddef.h> +#include "api-attrs.h" +#ifdef __cplusplus +namespace Fortran { +namespace ISO { +#define FORTRAN_ISO_NAMESPACE_ ::Fortran::ISO +#endif /* __cplusplus */ +#include "flang/ISO_Fortran_binding.h" +#ifdef __cplusplus +} // namespace ISO +} // namespace Fortran +#endif /* __cplusplus */ +/* clang-format on */ + +#endif /* FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/api-attrs.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/api-attrs.h new file mode 100644 index 00000000000..fd524ee34cc --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/api-attrs.h @@ -0,0 +1,209 @@ +/*===-- include/flang/Common/api-attrs.h ---------------------------*- C -*-=// + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===------------------------------------------------------------------------=== + */ + +/* + * The file defines a set macros that can be used to apply + * different attributes/pragmas to functions/variables + * declared/defined/used in Flang runtime library. + */ + +#ifndef FORTRAN_RUNTIME_API_ATTRS_H_ +#define FORTRAN_RUNTIME_API_ATTRS_H_ + +/* + * RT_EXT_API_GROUP_BEGIN/END pair is placed around definitions + * of functions exported by Flang runtime library. They are the entry + * points that are referenced in the Flang generated code. + * The macros may be expanded into any construct that is valid to appear + * at C++ module scope. + */ +#ifndef RT_EXT_API_GROUP_BEGIN +#if defined(OMP_NOHOST_BUILD) +#define RT_EXT_API_GROUP_BEGIN \ + _Pragma("omp begin declare target device_type(nohost)") +#elif defined(OMP_OFFLOAD_BUILD) +#define RT_EXT_API_GROUP_BEGIN _Pragma("omp declare target") +#else +#define RT_EXT_API_GROUP_BEGIN +#endif +#endif /* !defined(RT_EXT_API_GROUP_BEGIN) */ + +#ifndef RT_EXT_API_GROUP_END +#if defined(OMP_NOHOST_BUILD) || defined(OMP_OFFLOAD_BUILD) +#define RT_EXT_API_GROUP_END _Pragma("omp end declare target") +#else +#define RT_EXT_API_GROUP_END +#endif +#endif /* !defined(RT_EXT_API_GROUP_END) */ + +/* + * RT_OFFLOAD_API_GROUP_BEGIN/END pair is placed around definitions + * of functions that can be referenced in other modules of Flang + * runtime. For OpenMP offload, these functions are made "declare target" + * making sure they are compiled for the target even though direct + * references to them from other "declare target" functions may not + * be seen. Host-only functions should not be put in between these + * two macros. + */ +#define RT_OFFLOAD_API_GROUP_BEGIN RT_EXT_API_GROUP_BEGIN +#define RT_OFFLOAD_API_GROUP_END RT_EXT_API_GROUP_END + +/* + * RT_OFFLOAD_VAR_GROUP_BEGIN/END pair is placed around definitions + * of variables (e.g. globals or static class members) that can be + * referenced in functions marked with RT_OFFLOAD_API_GROUP_BEGIN/END. + * For OpenMP offload, these variables are made "declare target". + */ +#define RT_OFFLOAD_VAR_GROUP_BEGIN RT_EXT_API_GROUP_BEGIN +#define RT_OFFLOAD_VAR_GROUP_END RT_EXT_API_GROUP_END + +/* + * RT_VAR_GROUP_BEGIN/END pair is placed around definitions + * of module scope variables referenced by Flang runtime (directly + * or indirectly). + * The macros may be expanded into any construct that is valid to appear + * at C++ module scope. + */ +#ifndef RT_VAR_GROUP_BEGIN +#define RT_VAR_GROUP_BEGIN RT_EXT_API_GROUP_BEGIN +#endif /* !defined(RT_VAR_GROUP_BEGIN) */ + +#ifndef RT_VAR_GROUP_END +#define RT_VAR_GROUP_END RT_EXT_API_GROUP_END +#endif /* !defined(RT_VAR_GROUP_END) */ + +/* + * Each non-exported function used by Flang runtime (e.g. via + * calling it or taking its address, etc.) is marked with + * RT_API_ATTRS. The macros is placed at both declaration and + * definition of such a function. + * The macros may be expanded into a construct that is valid + * to appear as part of a C++ decl-specifier. + */ +#ifndef RT_API_ATTRS +#if defined(__CUDACC__) || defined(__CUDA__) +#define RT_API_ATTRS __host__ __device__ +#else +#define RT_API_ATTRS +#endif +#endif /* !defined(RT_API_ATTRS) */ + +/* + * Each const/constexpr module scope variable referenced by Flang runtime + * (directly or indirectly) is marked with RT_CONST_VAR_ATTRS. + * The macros is placed at both declaration and definition of such a variable. + * The macros may be expanded into a construct that is valid + * to appear as part of a C++ decl-specifier. + */ +#ifndef RT_CONST_VAR_ATTRS +#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define RT_CONST_VAR_ATTRS __constant__ +#else +#define RT_CONST_VAR_ATTRS +#endif +#endif /* !defined(RT_CONST_VAR_ATTRS) */ + +/* + * RT_VAR_ATTRS is marking non-const/constexpr module scope variables + * referenced by Flang runtime. + */ +#ifndef RT_VAR_ATTRS +#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define RT_VAR_ATTRS __device__ +#else +#define RT_VAR_ATTRS +#endif +#endif /* !defined(RT_VAR_ATTRS) */ + +/* + * RT_DEVICE_COMPILATION is defined for any device compilation. + * Note that it can only be used reliably with compilers that perform + * separate host and device compilations. + */ +#if ((defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)) || \ + (defined(_OPENMP) && (defined(__AMDGCN__) || defined(__NVPTX__))) +#define RT_DEVICE_COMPILATION 1 +#else +#undef RT_DEVICE_COMPILATION +#endif + +/* + * Recurrence in the call graph prevents computing minimal stack size + * required for a kernel execution. This macro can be used to disable + * some F18 runtime functionality that is implemented using recurrent + * function calls or to use alternative implementation. + */ +#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define RT_DEVICE_AVOID_RECURSION 1 +#else +#undef RT_DEVICE_AVOID_RECURSION +#endif + +#if defined(__CUDACC__) +#define RT_DIAG_PUSH _Pragma("nv_diagnostic push") +#define RT_DIAG_POP _Pragma("nv_diagnostic pop") +#define RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN \ + _Pragma("nv_diag_suppress 20011") _Pragma("nv_diag_suppress 20014") +#else /* !defined(__CUDACC__) */ +#define RT_DIAG_PUSH +#define RT_DIAG_POP +#define RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN +#endif /* !defined(__CUDACC__) */ + +/* + * RT_DEVICE_NOINLINE may be used for non-performance critical + * functions that should not be inlined to minimize the amount + * of code that needs to be processed by the device compiler's + * optimizer. + */ +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif +#if __has_attribute(noinline) +#define RT_NOINLINE_ATTR __attribute__((noinline)) +#else +#define RT_NOINLINE_ATTR +#endif +#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define RT_DEVICE_NOINLINE RT_NOINLINE_ATTR +#define RT_DEVICE_NOINLINE_HOST_INLINE +#else +#define RT_DEVICE_NOINLINE +#define RT_DEVICE_NOINLINE_HOST_INLINE inline +#endif + +/* RT_OPTNONE_ATTR allows disabling optimizations per function. */ +#if __has_attribute(optimize) +/* GCC style. */ +#define RT_OPTNONE_ATTR __attribute__((optimize("O0"))) +#elif __has_attribute(optnone) +/* Clang style. */ +#define RT_OPTNONE_ATTR __attribute__((optnone)) +#else +#define RT_OPTNONE_ATTR +#endif + +/* Detect system endianness if it was not explicitly set. */ +#if !defined(FLANG_LITTLE_ENDIAN) && !defined(FLANG_BIG_ENDIAN) + +/* We always assume Windows is little endian, otherwise use the GCC compatible + * flags. */ +#if defined(_MSC_VER) || defined(_WIN32) +#define FLANG_LITTLE_ENDIAN 1 +#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define FLANG_LITTLE_ENDIAN 1 +#elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define FLANG_BIG_ENDIAN 1 +#else +#error "Unknown or unsupported endianness." +#endif + +#endif /* !defined(FLANG_LITTLE_ENDIAN) && !defined(FLANG_BIG_ENDIAN) */ + +#endif /* !FORTRAN_RUNTIME_API_ATTRS_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/bit-population-count.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/bit-population-count.h new file mode 100644 index 00000000000..e1aeb78f9a3 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/bit-population-count.h @@ -0,0 +1,96 @@ +//===-- include/flang/Common/bit-population-count.h -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_BIT_POPULATION_COUNT_H_ +#define FORTRAN_COMMON_BIT_POPULATION_COUNT_H_ + +// Fast and portable functions that implement Fortran's POPCNT and POPPAR +// intrinsic functions. POPCNT returns the number of bits that are set (1) +// in its argument. POPPAR is a parity function that returns true +// when POPCNT is odd. + +#include <climits> +#include <type_traits> + +namespace Fortran::common { + +template <typename INT, + std::enable_if_t<(sizeof(INT) > 4 && sizeof(INT) <= 8), int> = 0> +inline constexpr int BitPopulationCount(INT x) { + // In each of the 32 2-bit fields, count the bits that were present. + // This leaves a value [0..2] in each of these 2-bit fields. + x = (x & 0x5555555555555555) + ((x >> 1) & 0x5555555555555555); + // Combine into 16 4-bit fields, each holding [0..4] + x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); + // Now 8 8-bit fields, each with [0..8] in their lower 4 bits. + x = (x & 0x0f0f0f0f0f0f0f0f) + ((x >> 4) & 0x0f0f0f0f0f0f0f0f); + // Now 4 16-bit fields, each with [0..16] in their lower 5 bits. + x = (x & 0x001f001f001f001f) + ((x >> 8) & 0x001f001f001f001f); + // Now 2 32-bit fields, each with [0..32] in their lower 6 bits. + x = (x & 0x0000003f0000003f) + ((x >> 16) & 0x0000003f0000003f); + // Last step: 1 64-bit field, with [0..64] + return (x & 0x7f) + (x >> 32); +} + +template <typename INT, + std::enable_if_t<(sizeof(INT) > 2 && sizeof(INT) <= 4), int> = 0> +inline constexpr int BitPopulationCount(INT x) { + // In each of the 16 2-bit fields, count the bits that were present. + // This leaves a value [0..2] in each of these 2-bit fields. + x = (x & 0x55555555) + ((x >> 1) & 0x55555555); + // Combine into 8 4-bit fields, each holding [0..4] + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + // Now 4 8-bit fields, each with [0..8] in their lower 4 bits. + x = (x & 0x0f0f0f0f) + ((x >> 4) & 0x0f0f0f0f); + // Now 2 16-bit fields, each with [0..16] in their lower 5 bits. + x = (x & 0x001f001f) + ((x >> 8) & 0x001f001f); + // Last step: 1 32-bit field, with [0..32] + return (x & 0x3f) + (x >> 16); +} + +template <typename INT, std::enable_if_t<sizeof(INT) == 2, int> = 0> +inline constexpr int BitPopulationCount(INT x) { + // In each of the 8 2-bit fields, count the bits that were present. + // This leaves a value [0..2] in each of these 2-bit fields. + x = (x & 0x5555) + ((x >> 1) & 0x5555); + // Combine into 4 4-bit fields, each holding [0..4] + x = (x & 0x3333) + ((x >> 2) & 0x3333); + // Now 2 8-bit fields, each with [0..8] in their lower 4 bits. + x = (x & 0x0f0f) + ((x >> 4) & 0x0f0f); + // Last step: 1 16-bit field, with [0..16] + return (x & 0x1f) + (x >> 8); +} + +template <typename INT, std::enable_if_t<sizeof(INT) == 1, int> = 0> +inline constexpr int BitPopulationCount(INT x) { + // In each of the 4 2-bit fields, count the bits that were present. + // This leaves a value [0..2] in each of these 2-bit fields. + x = (x & 0x55) + ((x >> 1) & 0x55); + // Combine into 2 4-bit fields, each holding [0..4] + x = (x & 0x33) + ((x >> 2) & 0x33); + // Last step: 1 8-bit field, with [0..8] + return (x & 0xf) + (x >> 4); +} + +template <typename INT> inline constexpr bool Parity(INT x) { + return BitPopulationCount(x) & 1; +} + +// "Parity is for farmers." -- Seymour R. Cray + +template <typename INT> inline constexpr int TrailingZeroBitCount(INT x) { + if ((x & 1) != 0) { + return 0; // fast path for odd values + } else if (x == 0) { + return CHAR_BIT * sizeof x; + } else { + return BitPopulationCount(static_cast<INT>(x ^ (x - 1))) - 1; + } +} +} // namespace Fortran::common +#endif // FORTRAN_COMMON_BIT_POPULATION_COUNT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/constexpr-bitset.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/constexpr-bitset.h new file mode 100644 index 00000000000..1aafb6eff84 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/constexpr-bitset.h @@ -0,0 +1,147 @@ +//===-- include/flang/Common/constexpr-bitset.h -----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_CONSTEXPR_BITSET_H_ +#define FORTRAN_COMMON_CONSTEXPR_BITSET_H_ + +// Implements a replacement for std::bitset<> that is suitable for use +// in constexpr expressions. Limited to elements in [0..127]. + +#include "bit-population-count.h" +#include "uint128.h" +#include <cstddef> +#include <cstdint> +#include <initializer_list> +#include <optional> +#include <type_traits> + +namespace Fortran::common { + +template <int BITS> class BitSet { + static_assert(BITS > 0 && BITS <= 128); + using Word = HostUnsignedIntType<(BITS <= 32 ? 32 : BITS)>; + static constexpr Word allBits{ + ~static_cast<Word>(0) >> (8 * sizeof(Word) - BITS)}; + + constexpr BitSet(Word b) : bits_{b} {} + +public: + constexpr BitSet() {} + constexpr BitSet(const std::initializer_list<int> &xs) { + for (auto x : xs) { + set(x); + } + } + constexpr BitSet(const BitSet &) = default; + constexpr BitSet(BitSet &&) = default; + constexpr BitSet &operator=(const BitSet &) = default; + constexpr BitSet &operator=(BitSet &&) = default; + + constexpr BitSet &operator&=(const BitSet &that) { + bits_ &= that.bits_; + return *this; + } + constexpr BitSet &operator&=(BitSet &&that) { + bits_ &= that.bits_; + return *this; + } + constexpr BitSet &operator^=(const BitSet &that) { + bits_ ^= that.bits_; + return *this; + } + constexpr BitSet &operator^=(BitSet &&that) { + bits_ ^= that.bits_; + return *this; + } + constexpr BitSet &operator|=(const BitSet &that) { + bits_ |= that.bits_; + return *this; + } + constexpr BitSet &operator|=(BitSet &&that) { + bits_ |= that.bits_; + return *this; + } + + constexpr BitSet operator~() const { return ~bits_; } + constexpr BitSet operator&(const BitSet &that) const { + return bits_ & that.bits_; + } + constexpr BitSet operator&(BitSet &&that) const { return bits_ & that.bits_; } + constexpr BitSet operator^(const BitSet &that) const { + return bits_ ^ that.bits_; + } + constexpr BitSet operator^(BitSet &&that) const { return bits_ & that.bits_; } + constexpr BitSet operator|(const BitSet &that) const { + return bits_ | that.bits_; + } + constexpr BitSet operator|(BitSet &&that) const { return bits_ | that.bits_; } + + constexpr bool operator==(const BitSet &that) const { + return bits_ == that.bits_; + } + constexpr bool operator==(BitSet &&that) const { return bits_ == that.bits_; } + constexpr bool operator!=(const BitSet &that) const { + return bits_ != that.bits_; + } + constexpr bool operator!=(BitSet &&that) const { return bits_ != that.bits_; } + + static constexpr std::size_t size() { return BITS; } + constexpr bool test(std::size_t x) const { + return x < BITS && ((bits_ >> x) & 1) != 0; + } + + constexpr bool all() const { return bits_ == allBits; } + constexpr bool any() const { return bits_ != 0; } + constexpr bool none() const { return bits_ == 0; } + + constexpr std::size_t count() const { return BitPopulationCount(bits_); } + + constexpr BitSet &set() { + bits_ = allBits; + return *this; + } + constexpr BitSet set(std::size_t x, bool value = true) { + if (!value) { + return reset(x); + } else { + bits_ |= static_cast<Word>(1) << x; + return *this; + } + } + constexpr BitSet &reset() { + bits_ = 0; + return *this; + } + constexpr BitSet &reset(std::size_t x) { + bits_ &= ~(static_cast<Word>(1) << x); + return *this; + } + constexpr BitSet &flip() { + bits_ ^= allBits; + return *this; + } + constexpr BitSet &flip(std::size_t x) { + bits_ ^= static_cast<Word>(1) << x; + return *this; + } + + constexpr std::optional<std::size_t> LeastElement() const { + if (bits_ == 0) { + return std::nullopt; + } else { + return {TrailingZeroBitCount(bits_)}; + } + } + + Word bits() const { return bits_; } + +private: + Word bits_{0}; +}; +} // namespace Fortran::common +#endif // FORTRAN_COMMON_CONSTEXPR_BITSET_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/enum-class.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/enum-class.h new file mode 100644 index 00000000000..9f9134ee3ff --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/enum-class.h @@ -0,0 +1,79 @@ +//===-- include/flang/Common/enum-class.h -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// The macro +// ENUM_CLASS(className, enum1, enum2, ..., enumN) +// defines +// enum class className { enum1, enum2, ... , enumN }; +// as well as the introspective utilities +// static constexpr std::size_t className_enumSize{N}; +// static inline std::string_view EnumToString(className); + +#ifndef FORTRAN_COMMON_ENUM_CLASS_H_ +#define FORTRAN_COMMON_ENUM_CLASS_H_ + +#include <array> +#include <functional> +#include <string_view> +namespace Fortran::common { + +constexpr std::size_t CountEnumNames(const char *p) { + std::size_t n{0}; + std::size_t any{0}; + for (; *p; ++p) { + if (*p == ',') { + n += any; + any = 0; + } else if (*p != ' ') { + any = 1; + } + } + return n + any; +} + +template <std::size_t ITEMS> +constexpr std::array<std::string_view, ITEMS> EnumNames(const char *p) { + std::array<std::string_view, ITEMS> result{""}; + std::size_t at{0}; + const char *start{nullptr}; + for (; *p; ++p) { + if (*p == ',' || *p == ' ') { + if (start) { + result[at++] = + std::string_view{start, static_cast<std::size_t>(p - start)}; + start = nullptr; + } + } else if (!start) { + start = p; + } + } + if (start) { + result[at] = std::string_view{start, static_cast<std::size_t>(p - start)}; + } + return result; +} + +#define ENUM_CLASS(NAME, ...) \ + enum class NAME { __VA_ARGS__ }; \ + [[maybe_unused]] static constexpr std::size_t NAME##_enumSize{ \ + ::Fortran::common::CountEnumNames(#__VA_ARGS__)}; \ + [[maybe_unused]] static inline std::size_t EnumToInt(NAME e) { \ + return static_cast<std::size_t>(e); \ + } \ + [[maybe_unused]] static inline std::string_view EnumToString(NAME e) { \ + static const constexpr auto names{ \ + ::Fortran::common::EnumNames<NAME##_enumSize>(#__VA_ARGS__)}; \ + return names[static_cast<std::size_t>(e)]; \ + } \ + [[maybe_unused]] inline void ForEach##NAME(std::function<void(NAME)> f) { \ + for (std::size_t i{0}; i < NAME##_enumSize; ++i) { \ + f(static_cast<NAME>(i)); \ + } \ + } +} // namespace Fortran::common +#endif // FORTRAN_COMMON_ENUM_CLASS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/enum-set.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/enum-set.h new file mode 100644 index 00000000000..5290b76debe --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/enum-set.h @@ -0,0 +1,231 @@ +//===-- include/flang/Common/enum-set.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_ENUM_SET_H_ +#define FORTRAN_COMMON_ENUM_SET_H_ + +// Implements a set of enums as a std::bitset<>. APIs from bitset<> and set<> +// can be used on these sets, whichever might be more clear to the user. +// This class template facilitates the use of the more type-safe C++ "enum +// class" feature without loss of convenience. + +#include "constexpr-bitset.h" +#include "idioms.h" +#include <bitset> +#include <cstddef> +#include <initializer_list> +#include <optional> +#include <string> +#include <type_traits> + +namespace Fortran::common { + +template <typename ENUM, std::size_t BITS> class EnumSet { + static_assert(BITS > 0); + +public: + // When the bitset fits in a word, use a custom local bitset class that is + // more amenable to constexpr evaluation than the current std::bitset<>. + using bitsetType = + std::conditional_t<(BITS <= 64), common::BitSet<BITS>, std::bitset<BITS>>; + using enumerationType = ENUM; + + constexpr EnumSet() {} + constexpr EnumSet(const std::initializer_list<enumerationType> &enums) { + for (auto it{enums.begin()}; it != enums.end(); ++it) { + set(*it); + } + } + constexpr EnumSet(const EnumSet &) = default; + constexpr EnumSet(EnumSet &&) = default; + + constexpr EnumSet &operator=(const EnumSet &) = default; + constexpr EnumSet &operator=(EnumSet &&) = default; + + const bitsetType &bitset() const { return bitset_; } + + constexpr EnumSet &operator&=(const EnumSet &that) { + bitset_ &= that.bitset_; + return *this; + } + constexpr EnumSet &operator&=(EnumSet &&that) { + bitset_ &= that.bitset_; + return *this; + } + constexpr EnumSet &operator|=(const EnumSet &that) { + bitset_ |= that.bitset_; + return *this; + } + constexpr EnumSet &operator|=(EnumSet &&that) { + bitset_ |= that.bitset_; + return *this; + } + constexpr EnumSet &operator^=(const EnumSet &that) { + bitset_ ^= that.bitset_; + return *this; + } + constexpr EnumSet &operator^=(EnumSet &&that) { + bitset_ ^= that.bitset_; + return *this; + } + + constexpr EnumSet operator~() const { + EnumSet result; + result.bitset_ = ~bitset_; + return result; + } + constexpr EnumSet operator&(const EnumSet &that) const { + EnumSet result{*this}; + result.bitset_ &= that.bitset_; + return result; + } + constexpr EnumSet operator&(EnumSet &&that) const { + EnumSet result{*this}; + result.bitset_ &= that.bitset_; + return result; + } + constexpr EnumSet operator|(const EnumSet &that) const { + EnumSet result{*this}; + result.bitset_ |= that.bitset_; + return result; + } + constexpr EnumSet operator|(EnumSet &&that) const { + EnumSet result{*this}; + result.bitset_ |= that.bitset_; + return result; + } + constexpr EnumSet operator^(const EnumSet &that) const { + EnumSet result{*this}; + result.bitset_ ^= that.bitset_; + return result; + } + constexpr EnumSet operator^(EnumSet &&that) const { + EnumSet result{*this}; + result.bitset_ ^= that.bitset_; + return result; + } + + constexpr EnumSet operator+(enumerationType v) const { + return {*this | EnumSet{v}}; + } + constexpr EnumSet operator-(enumerationType v) const { + return {*this & ~EnumSet{v}}; + } + + constexpr bool operator==(const EnumSet &that) const { + return bitset_ == that.bitset_; + } + constexpr bool operator==(EnumSet &&that) const { + return bitset_ == that.bitset_; + } + constexpr bool operator!=(const EnumSet &that) const { + return bitset_ != that.bitset_; + } + constexpr bool operator!=(EnumSet &&that) const { + return bitset_ != that.bitset_; + } + + // N.B. std::bitset<> has size() for max_size(), but that's not the same + // thing as std::set<>::size(), which is an element count. + static constexpr std::size_t max_size() { return BITS; } + constexpr bool test(enumerationType x) const { + return bitset_.test(static_cast<std::size_t>(x)); + } + constexpr bool all() const { return bitset_.all(); } + constexpr bool any() const { return bitset_.any(); } + constexpr bool none() const { return bitset_.none(); } + + // N.B. std::bitset<> has count() as an element count, while + // std::set<>::count(x) returns 0 or 1 to indicate presence. + constexpr std::size_t count() const { return bitset_.count(); } + constexpr std::size_t count(enumerationType x) const { + return test(x) ? 1 : 0; + } + + constexpr EnumSet &set() { + bitset_.set(); + return *this; + } + constexpr EnumSet &set(enumerationType x, bool value = true) { + bitset_.set(static_cast<std::size_t>(x), value); + return *this; + } + constexpr EnumSet &reset() { + bitset_.reset(); + return *this; + } + constexpr EnumSet &reset(enumerationType x) { + bitset_.reset(static_cast<std::size_t>(x)); + return *this; + } + constexpr EnumSet &flip() { + bitset_.flip(); + return *this; + } + constexpr EnumSet &flip(enumerationType x) { + bitset_.flip(static_cast<std::size_t>(x)); + return *this; + } + + constexpr bool empty() const { return none(); } + void clear() { reset(); } + void insert(enumerationType x) { set(x); } + void insert(enumerationType &&x) { set(x); } + void emplace(enumerationType &&x) { set(x); } + void erase(enumerationType x) { reset(x); } + void erase(enumerationType &&x) { reset(x); } + + constexpr std::optional<enumerationType> LeastElement() const { + if (empty()) { + return std::nullopt; + } else if constexpr (std::is_same_v<bitsetType, common::BitSet<BITS>>) { + return {static_cast<enumerationType>(bitset_.LeastElement().value())}; + } else { + // std::bitset: just iterate + for (std::size_t j{0}; j < BITS; ++j) { + auto enumerator{static_cast<enumerationType>(j)}; + if (bitset_.test(j)) { + return {enumerator}; + } + } + die("EnumSet::LeastElement(): no bit found in non-empty std::bitset"); + } + } + + template <typename FUNC> void IterateOverMembers(const FUNC &f) const { + EnumSet copy{*this}; + while (auto least{copy.LeastElement()}) { + f(*least); + copy.erase(*least); + } + } + + template <typename STREAM> + STREAM &Dump( + STREAM &o, std::string_view EnumToString(enumerationType)) const { + char sep{'{'}; + IterateOverMembers([&](auto e) { + o << sep << EnumToString(e); + sep = ','; + }); + return o << (sep == '{' ? "{}" : "}"); + } + +private: + bitsetType bitset_{}; +}; +} // namespace Fortran::common + +template <typename ENUM, std::size_t values> +struct std::hash<Fortran::common::EnumSet<ENUM, values>> { + std::size_t operator()( + const Fortran::common::EnumSet<ENUM, values> &x) const { + return std::hash(x.bitset()); + } +}; +#endif // FORTRAN_COMMON_ENUM_SET_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/erfc-scaled.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/erfc-scaled.h new file mode 100644 index 00000000000..001af66baf3 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/erfc-scaled.h @@ -0,0 +1,120 @@ +//===-- include/flang/Common/erfc-scaled.h-----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_ERFC_SCALED_H_ +#define FORTRAN_COMMON_ERFC_SCALED_H_ + +#include "flang/Common/api-attrs.h" +#include <cmath> +#include <limits> + +namespace Fortran::common { +template <typename T> inline RT_API_ATTRS T ErfcScaled(T arg) { + // Coefficients for approximation to erfc in the first interval. + static const T a[5] = {3.16112374387056560e00, 1.13864154151050156e02, + 3.77485237685302021e02, 3.20937758913846947e03, 1.85777706184603153e-1}; + static const T b[4] = {2.36012909523441209e01, 2.44024637934444173e02, + 1.28261652607737228e03, 2.84423683343917062e03}; + + // Coefficients for approximation to erfc in the second interval. + static const T c[9] = {5.64188496988670089e-1, 8.88314979438837594e00, + 6.61191906371416295e01, 2.98635138197400131e02, 8.81952221241769090e02, + 1.71204761263407058e03, 2.05107837782607147e03, 1.23033935479799725e03, + 2.15311535474403846e-8}; + static const T d[8] = {1.57449261107098347e01, 1.17693950891312499e02, + 5.37181101862009858e02, 1.62138957456669019e03, 3.29079923573345963e03, + 4.36261909014324716e03, 3.43936767414372164e03, 1.23033935480374942e03}; + + // Coefficients for approximation to erfc in the third interval. + static const T p[6] = {3.05326634961232344e-1, 3.60344899949804439e-1, + 1.25781726111229246e-1, 1.60837851487422766e-2, 6.58749161529837803e-4, + 1.63153871373020978e-2}; + static const T q[5] = {2.56852019228982242e00, 1.87295284992346047e00, + 5.27905102951428412e-1, 6.05183413124413191e-2, 2.33520497626869185e-3}; + + constexpr T sqrtpi{1.7724538509078120380404576221783883301349L}; + constexpr T rsqrtpi{0.5641895835477562869480794515607725858440L}; + constexpr T epsilonby2{std::numeric_limits<T>::epsilon() * 0.5}; + constexpr T xneg{-26.628e0}; + constexpr T xhuge{6.71e7}; + constexpr T thresh{0.46875e0}; + constexpr T zero{0.0}; + constexpr T one{1.0}; + constexpr T four{4.0}; + constexpr T sixteen{16.0}; + constexpr T xmax{1.0 / (sqrtpi * std::numeric_limits<T>::min())}; + static_assert(xmax > xhuge, "xmax must be greater than xhuge"); + + T ysq; + T xnum; + T xden; + T del; + T result; + + auto x{arg}; + auto y{std::fabs(x)}; + + if (y <= thresh) { + // evaluate erf for |x| <= 0.46875 + ysq = zero; + if (y > epsilonby2) { + ysq = y * y; + } + xnum = a[4] * ysq; + xden = ysq; + for (int i{0}; i < 3; i++) { + xnum = (xnum + a[i]) * ysq; + xden = (xden + b[i]) * ysq; + } + result = x * (xnum + a[3]) / (xden + b[3]); + result = one - result; + result = std::exp(ysq) * result; + return result; + } else if (y <= four) { + // evaluate erfc for 0.46875 < |x| <= 4.0 + xnum = c[8] * y; + xden = y; + for (int i{0}; i < 7; ++i) { + xnum = (xnum + c[i]) * y; + xden = (xden + d[i]) * y; + } + result = (xnum + c[7]) / (xden + d[7]); + } else { + // evaluate erfc for |x| > 4.0 + result = zero; + if (y >= xhuge) { + if (y < xmax) { + result = rsqrtpi / y; + } + } else { + ysq = one / (y * y); + xnum = p[5] * ysq; + xden = ysq; + for (int i{0}; i < 4; ++i) { + xnum = (xnum + p[i]) * ysq; + xden = (xden + q[i]) * ysq; + } + result = ysq * (xnum + p[4]) / (xden + q[4]); + result = (rsqrtpi - result) / y; + } + } + // fix up for negative argument, erf, etc. + if (x < zero) { + if (x < xneg) { + result = std::numeric_limits<T>::max(); + } else { + ysq = trunc(x * sixteen) / sixteen; + del = (x - ysq) * (x + ysq); + y = std::exp((ysq * ysq)) * std::exp((del)); + result = (y + y) - result; + } + } + return result; +} +} // namespace Fortran::common +#endif // FORTRAN_COMMON_ERFC_SCALED_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/fast-int-set.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/fast-int-set.h new file mode 100644 index 00000000000..1214bac75a4 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/fast-int-set.h @@ -0,0 +1,106 @@ +//===-- include/flang/Common/fast-int-set.h --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Implements a Briggs-Torczon fast set of integers in a fixed small range +// [0..(n-1)] This is a data structure with no dynamic memory allocation and all +// O(1) elemental operations. It does not need to initialize its internal state +// arrays, but you can call its InitializeState() member function to avoid +// complaints from valgrind. + +// The set is implemented with two arrays and an element count. +// 1) The distinct values in the set occupy the leading elements of +// value_[0 .. size_-1] in arbitrary order. Their positions may change +// when other values are removed from the set with Remove(). +// 2) For 0 <= j < size_, index_[value_[j]] == j. +// 3) If only Add() and PopValue() are used, the popped values will be the +// most recently Add()ed distinct unpopped values; i.e., the value_ array +// will function as a stack whose top is at (size_-1). + +#ifndef FORTRAN_COMMON_FAST_INT_SET_H_ +#define FORTRAN_COMMON_FAST_INT_SET_H_ + +#include "optional.h" + +namespace Fortran::common { + +template <int N> class FastIntSet { +public: + static_assert(N > 0); + static constexpr int maxValue{N - 1}; + + int size() const { return size_; } + const int *value() const { return &value_[0]; } + + bool IsValidValue(int n) const { return n >= 0 && n <= maxValue; } + + void Clear() { size_ = 0; } + + bool IsEmpty() const { return size_ == 0; } + + void InitializeState() { + if (!isFullyInitialized_) { + for (int j{size_}; j < N; ++j) { + value_[j] = index_[j] = 0; + } + isFullyInitialized_ = true; + } + } + + bool Contains(int n) const { + if (IsValidValue(n)) { + int j{index_[n]}; + return j >= 0 && j < size_ && value_[j] == n; + } else { + return false; + } + } + + bool Add(int n) { + if (IsValidValue(n)) { + if (!UncheckedContains(n)) { + value_[index_[n] = size_++] = n; + } + return true; + } else { + return false; + } + } + + bool Remove(int n) { + if (IsValidValue(n)) { + if (UncheckedContains(n)) { + int last{value_[--size_]}; + value_[index_[last] = index_[n]] = last; + } + return true; + } else { + return false; + } + } + + optional<int> PopValue() { + if (IsEmpty()) { + return nullopt; + } else { + return value_[--size_]; + } + } + +private: + bool UncheckedContains(int n) const { + int j{index_[n]}; + return j >= 0 && j < size_ && value_[j] == n; + } + + int value_[N]; + int index_[N]; + int size_{0}; + bool isFullyInitialized_{false}; // memory was cleared +}; +} // namespace Fortran::common +#endif // FORTRAN_COMMON_FAST_INT_SET_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/float128.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/float128.h new file mode 100644 index 00000000000..eddd3cf2538 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/float128.h @@ -0,0 +1,88 @@ +/*===-- flang/Common/float128.h ----------------------------------*- C -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ + +/* This header is usable in both C and C++ code. + * Isolates build compiler checks to determine the presence of an IEEE-754 + * quad-precision type named __float128 type that isn't __ibm128 + * (double/double). We don't care whether the type has underlying hardware + * support or is emulated. + * + * 128-bit arithmetic may be available via "long double"; this can + * be determined by LDBL_MANT_DIG == 113. A machine may have both 128-bit + * long double and __float128; prefer long double by testing for it first. + */ + +#ifndef FORTRAN_COMMON_FLOAT128_H_ +#define FORTRAN_COMMON_FLOAT128_H_ + +#include "api-attrs.h" +#include <float.h> + +#ifdef __cplusplus +/* + * libc++ does not fully support __float128 right now, e.g. + * std::complex<__float128> multiplication ends up calling + * copysign() that is not defined for __float128. + * In order to check for libc++'s _LIBCPP_VERSION macro + * we need to include at least one libc++ header file. + */ +#include <cstddef> +#endif + +#undef HAS_FLOAT128 +#if (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) && \ + !defined(_LIBCPP_VERSION) && !defined(__CUDA_ARCH__) +/* + * It may still be worth checking for compiler versions, + * since earlier versions may define the macros above, but + * still do not support __float128 fully. + */ +#if __x86_64__ +#if __GNUC__ >= 7 || __clang_major__ >= 7 +#define HAS_FLOAT128 1 +#endif +#elif defined __PPC__ && __GNUC__ >= 8 +#define HAS_FLOAT128 1 +#endif +#endif /* (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) && \ + !defined(_LIBCPP_VERSION) && !defined(__CUDA_ARCH__) */ + +#if LDBL_MANT_DIG == 113 +#define HAS_LDBL128 1 +#endif + +#if defined(RT_DEVICE_COMPILATION) && defined(__CUDACC__) +/* + * Most offload targets do not support 128-bit 'long double'. + * Disable HAS_LDBL128 for __CUDACC__ for the time being. + */ +#undef HAS_LDBL128 +#endif + +/* Define pure C CFloat128Type and CFloat128ComplexType. */ +#if HAS_LDBL128 +typedef long double CFloat128Type; +#ifndef __cplusplus +typedef long double _Complex CFloat128ComplexType; +#endif +#elif HAS_FLOAT128 +typedef __float128 CFloat128Type; + +#ifndef __cplusplus +/* + * Use mode() attribute supported by GCC and Clang. + * Adjust it for other compilers as needed. + */ +#if !defined(_ARCH_PPC) || defined(__LONG_DOUBLE_IEEE128__) +typedef _Complex float __attribute__((mode(TC))) CFloat128ComplexType; +#else +typedef _Complex float __attribute__((mode(KC))) CFloat128ComplexType; +#endif +#endif // __cplusplus +#endif +#endif /* FORTRAN_COMMON_FLOAT128_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/float80.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/float80.h new file mode 100644 index 00000000000..1838f7b13c8 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/float80.h @@ -0,0 +1,43 @@ +/*===-- flang/Common/float80.h --------------------------------------*- C -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ + +/* This header is usable in both C and C++ code. + * Isolates build compiler checks to determine if the 80-bit + * floating point format is supported via a particular C type. + * It defines CFloat80Type and CppFloat80Type aliases for this + * C type. + */ + +#ifndef FORTRAN_COMMON_FLOAT80_H_ +#define FORTRAN_COMMON_FLOAT80_H_ + +#include "api-attrs.h" +#include <float.h> + +#if LDBL_MANT_DIG == 64 +#undef HAS_FLOAT80 +#define HAS_FLOAT80 1 +#endif + +#if defined(RT_DEVICE_COMPILATION) && defined(__CUDACC__) +/* + * 'long double' is treated as 'double' in the CUDA device code, + * and there is no support for 80-bit floating point format. + * This is probably true for most offload devices, so RT_DEVICE_COMPILATION + * check should be enough. For the time being, guard it with __CUDACC__ + * as well. + */ +#undef HAS_FLOAT80 +#endif + +#if HAS_FLOAT80 +typedef long double CFloat80Type; +typedef long double CppFloat80Type; +#endif + +#endif /* FORTRAN_COMMON_FLOAT80_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/format.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/format.h new file mode 100644 index 00000000000..1e64acb8236 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/format.h @@ -0,0 +1,986 @@ +//===-- include/flang/Common/format.h ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_FORMAT_H_ +#define FORTRAN_COMMON_FORMAT_H_ + +#include "Fortran-consts.h" +#include "enum-set.h" +#include <cstring> +#include <limits> + +// Define a FormatValidator class template to validate a format expression +// of a given CHAR type. To enable use in runtime library code as well as +// compiler code, the implementation does its own parsing without recourse +// to compiler parser machinery, and avoids features that require C++ runtime +// library support. A format expression is a pointer to a fixed size +// character string, with an explicit length. Class function Check analyzes +// the expression for syntax and semantic errors and warnings. When an error +// or warning is found, a caller-supplied reporter function is called, which +// may request early termination of validation analysis when some threshold +// number of errors have been reported. If the context is a READ, WRITE, +// or PRINT statement, rather than a FORMAT statement, statement-specific +// checks are also done. + +namespace Fortran::common { + +// AddOverflow and MulOverflow are copied from +// llvm/include/llvm/Support/MathExtras.h and specialised to int64_t. + +// __has_builtin is not defined in some compilers. Make sure it is defined. +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +/// Add two signed integers, computing the two's complement truncated result, +/// returning true if overflow occurred. +static inline bool AddOverflow( + std::int64_t x, std::int64_t y, std::int64_t &result) { +#if __has_builtin(__builtin_add_overflow) + return __builtin_add_overflow(x, y, &result); +#else + // Perform the unsigned addition. + const std::uint64_t ux{static_cast<std::uint64_t>(x)}; + const std::uint64_t uy{static_cast<std::uint64_t>(y)}; + const std::uint64_t uresult{ux + uy}; + + // Convert to signed. + result = static_cast<std::int64_t>(uresult); + + // Adding two positive numbers should result in a positive number. + if (x > 0 && y > 0) { + return result <= 0; + } + // Adding two negatives should result in a negative number. + if (x < 0 && y < 0) { + return result >= 0; + } + return false; +#endif +} + +/// Multiply two signed integers, computing the two's complement truncated +/// result, returning true if an overflow occurred. +static inline bool MulOverflow( + std::int64_t x, std::int64_t y, std::int64_t &result) { +#if __has_builtin(__builtin_mul_overflow) + return __builtin_mul_overflow(x, y, &result); +#else + // Perform the unsigned multiplication on absolute values. + const std::uint64_t ux{x < 0 ? (0 - static_cast<std::uint64_t>(x)) + : static_cast<std::uint64_t>(x)}; + const std::uint64_t uy{y < 0 ? (0 - static_cast<std::uint64_t>(y)) + : static_cast<std::uint64_t>(y)}; + const std::uint64_t uresult{ux * uy}; + + // Convert to signed. + const bool isNegative = (x < 0) ^ (y < 0); + result = isNegative ? (0 - uresult) : uresult; + + // If any of the args was 0, result is 0 and no overflow occurs. + if (ux == 0 || uy == 0) { + return false; + } + + // ux and uy are in [1, 2^n], where n is the number of digits. + // Check how the max allowed absolute value (2^n for negative, 2^(n-1) for + // positive) divided by an argument compares to the other. + if (isNegative) { + return ux > + (static_cast<std::uint64_t>(std::numeric_limits<std::int64_t>::max()) + + std::uint64_t{1}) / + uy; + } else { + return ux > + (static_cast<std::uint64_t>(std::numeric_limits<std::int64_t>::max())) / + uy; + } +#endif +} + +struct FormatMessage { + const char *text; // message text; may have one %s argument + const char *arg; // optional %s argument value + int offset; // offset to message marker + int length; // length of message marker + bool isError; // vs. warning +}; + +// This declaration is logically private to class FormatValidator. +// It is placed here to work around a clang compilation problem. +ENUM_CLASS(TokenKind, None, A, B, BN, BZ, D, DC, DP, DT, E, EN, ES, EX, F, G, I, + L, O, P, RC, RD, RN, RP, RU, RZ, S, SP, SS, T, TL, TR, X, Z, Colon, Slash, + Backslash, // nonstandard: inhibit newline on output + Dollar, // nonstandard: inhibit newline on output on terminals + Star, LParen, RParen, Comma, Point, Sign, + UnsignedInteger, // value in integerValue_ + String) // char-literal-constant or Hollerith constant + +template <typename CHAR = char> class FormatValidator { +public: + using Reporter = std::function<bool(const FormatMessage &)>; + FormatValidator(const CHAR *format, size_t length, Reporter reporter, + IoStmtKind stmt = IoStmtKind::None) + : format_{format}, end_{format + length}, reporter_{reporter}, + stmt_{stmt}, cursor_{format - 1} { + CHECK(format); + } + + bool Check(); + int maxNesting() const { return maxNesting_; } + +private: + common::EnumSet<TokenKind, TokenKind_enumSize> itemsWithLeadingInts_{ + TokenKind::A, TokenKind::B, TokenKind::D, TokenKind::DT, TokenKind::E, + TokenKind::EN, TokenKind::ES, TokenKind::EX, TokenKind::F, TokenKind::G, + TokenKind::I, TokenKind::L, TokenKind::O, TokenKind::P, TokenKind::X, + TokenKind::Z, TokenKind::Slash, TokenKind::LParen}; + + struct Token { + Token &set_kind(TokenKind kind) { + kind_ = kind; + return *this; + } + Token &set_offset(int offset) { + offset_ = offset; + return *this; + } + Token &set_length(int length) { + length_ = length; + return *this; + } + + TokenKind kind() const { return kind_; } + int offset() const { return offset_; } + int length() const { return length_; } + + bool IsSet() { return kind_ != TokenKind::None; } + + private: + TokenKind kind_{TokenKind::None}; + int offset_{0}; + int length_{1}; + }; + + void ReportWarning(const char *text) { ReportWarning(text, token_); } + void ReportWarning( + const char *text, Token &token, const char *arg = nullptr) { + FormatMessage msg{ + text, arg ? arg : argString_, token.offset(), token.length(), false}; + reporterExit_ |= reporter_(msg); + } + + void ReportError(const char *text) { ReportError(text, token_); } + void ReportError(const char *text, Token &token, const char *arg = nullptr) { + if (suppressMessageCascade_) { + return; + } + formatHasErrors_ = true; + suppressMessageCascade_ = true; + FormatMessage msg{ + text, arg ? arg : argString_, token.offset(), token.length(), true}; + reporterExit_ |= reporter_(msg); + } + + void SetLength() { SetLength(token_); } + void SetLength(Token &token) { + token.set_length(cursor_ - format_ - token.offset() + (cursor_ < end_)); + } + + CHAR NextChar(); + CHAR LookAheadChar(); + void Advance(TokenKind); + void NextToken(); + + void check_r(bool allowed = true); + bool check_w(); + void check_m(); + bool check_d(bool checkScaleFactor = false); + void check_k(); + void check_e(); + + const CHAR *const format_; // format text + const CHAR *const end_; // one-past-last of format_ text + Reporter reporter_; + IoStmtKind stmt_; + + const CHAR *cursor_{}; // current location in format_ + const CHAR *laCursor_{}; // lookahead cursor + Token previousToken_{}; + Token token_{}; // current token + Token knrToken_{}; // k, n, or r UnsignedInteger token + Token scaleFactorToken_{}; // most recent scale factor token P + std::int64_t integerValue_{-1}; // value of UnsignedInteger token + std::int64_t knrValue_{-1}; // -1 ==> not present + std::int64_t scaleFactorValue_{}; // signed k in kP + std::int64_t wValue_{-1}; + char argString_[3]{}; // 1-2 character msg arg; usually edit descriptor name + bool formatHasErrors_{false}; + bool unterminatedFormatError_{false}; + bool suppressMessageCascade_{false}; + bool reporterExit_{false}; + int maxNesting_{0}; // max level of nested parentheses +}; + +template <typename CHAR> static inline bool IsWhite(CHAR c) { + // White space. ' ' is standard. Other characters are extensions. + // Extension candidates: + // '\t' (horizontal tab) + // '\n' (new line) + // '\v' (vertical tab) + // '\f' (form feed) + // '\r' (carriage ret) + return c == ' ' || c == '\t' || c == '\v'; +} + +template <typename CHAR> CHAR FormatValidator<CHAR>::NextChar() { + for (++cursor_; cursor_ < end_; ++cursor_) { + if (!IsWhite(*cursor_)) { + return toupper(*cursor_); + } + } + cursor_ = end_; // don't allow cursor_ > end_ + return ' '; +} + +template <typename CHAR> CHAR FormatValidator<CHAR>::LookAheadChar() { + for (laCursor_ = cursor_ + 1; laCursor_ < end_; ++laCursor_) { + if (!IsWhite(*laCursor_)) { + return toupper(*laCursor_); + } + } + laCursor_ = end_; // don't allow laCursor_ > end_ + return ' '; +} + +// After a call to LookAheadChar, set token kind and advance cursor to laCursor. +template <typename CHAR> void FormatValidator<CHAR>::Advance(TokenKind tk) { + cursor_ = laCursor_; + token_.set_kind(tk); +} + +template <typename CHAR> void FormatValidator<CHAR>::NextToken() { + // At entry, cursor_ points before the start of the next token. + // At exit, cursor_ points to last CHAR of token_. + + previousToken_ = token_; + CHAR c{NextChar()}; + token_.set_kind(TokenKind::None); + token_.set_offset(cursor_ - format_); + token_.set_length(1); + if (c == '_' && integerValue_ >= 0) { // C1305, C1309, C1310, C1312, C1313 + ReportError("Kind parameter '_' character in format expression"); + } + integerValue_ = -1; + + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + const CHAR *lastCursor{}; + integerValue_ = 0; + bool overflow{false}; + do { + lastCursor = cursor_; + if (!overflow) { + overflow = MulOverflow( + static_cast<std::int64_t>(10), integerValue_, integerValue_); + } + if (!overflow) { + overflow = AddOverflow( + integerValue_, static_cast<std::int64_t>(c - '0'), integerValue_); + } + c = NextChar(); + } while (c >= '0' && c <= '9'); + cursor_ = lastCursor; + token_.set_kind(TokenKind::UnsignedInteger); + if (overflow) { + SetLength(); + ReportError("Integer overflow in format expression"); + break; + } + if (LookAheadChar() != 'H') { + break; + } + // Hollerith constant + if (laCursor_ + integerValue_ < end_) { + token_.set_kind(TokenKind::String); + cursor_ = laCursor_ + integerValue_; + } else { + token_.set_kind(TokenKind::None); + cursor_ = end_; + } + SetLength(); + if (stmt_ == IoStmtKind::Read) { // 13.3.2p6 + ReportError("'H' edit descriptor in READ format expression"); + } else if (token_.kind() == TokenKind::None) { + ReportError("Unterminated 'H' edit descriptor"); + } else { + ReportWarning("Legacy 'H' edit descriptor"); + } + break; + } + case 'A': + token_.set_kind(TokenKind::A); + break; + case 'B': + switch (LookAheadChar()) { + case 'N': + Advance(TokenKind::BN); + break; + case 'Z': + Advance(TokenKind::BZ); + break; + default: + token_.set_kind(TokenKind::B); + break; + } + break; + case 'D': + switch (LookAheadChar()) { + case 'C': + Advance(TokenKind::DC); + break; + case 'P': + Advance(TokenKind::DP); + break; + case 'T': + Advance(TokenKind::DT); + break; + default: + token_.set_kind(TokenKind::D); + break; + } + break; + case 'E': + switch (LookAheadChar()) { + case 'N': + Advance(TokenKind::EN); + break; + case 'S': + Advance(TokenKind::ES); + break; + case 'X': + Advance(TokenKind::EX); + break; + default: + token_.set_kind(TokenKind::E); + break; + } + break; + case 'F': + token_.set_kind(TokenKind::F); + break; + case 'G': + token_.set_kind(TokenKind::G); + break; + case 'I': + token_.set_kind(TokenKind::I); + break; + case 'L': + token_.set_kind(TokenKind::L); + break; + case 'O': + token_.set_kind(TokenKind::O); + break; + case 'P': + token_.set_kind(TokenKind::P); + break; + case 'R': + switch (LookAheadChar()) { + case 'C': + Advance(TokenKind::RC); + break; + case 'D': + Advance(TokenKind::RD); + break; + case 'N': + Advance(TokenKind::RN); + break; + case 'P': + Advance(TokenKind::RP); + break; + case 'U': + Advance(TokenKind::RU); + break; + case 'Z': + Advance(TokenKind::RZ); + break; + default: + token_.set_kind(TokenKind::None); + break; + } + break; + case 'S': + switch (LookAheadChar()) { + case 'P': + Advance(TokenKind::SP); + break; + case 'S': + Advance(TokenKind::SS); + break; + default: + token_.set_kind(TokenKind::S); + break; + } + break; + case 'T': + switch (LookAheadChar()) { + case 'L': + Advance(TokenKind::TL); + break; + case 'R': + Advance(TokenKind::TR); + break; + default: + token_.set_kind(TokenKind::T); + break; + } + break; + case 'X': + token_.set_kind(TokenKind::X); + break; + case 'Z': + token_.set_kind(TokenKind::Z); + break; + case '-': + case '+': + token_.set_kind(TokenKind::Sign); + break; + case '/': + token_.set_kind(TokenKind::Slash); + break; + case '(': + token_.set_kind(TokenKind::LParen); + break; + case ')': + token_.set_kind(TokenKind::RParen); + break; + case '.': + token_.set_kind(TokenKind::Point); + break; + case ':': + token_.set_kind(TokenKind::Colon); + break; + case '\\': + token_.set_kind(TokenKind::Backslash); + break; + case '$': + token_.set_kind(TokenKind::Dollar); + break; + case '*': + token_.set_kind(LookAheadChar() == '(' ? TokenKind::Star : TokenKind::None); + break; + case ',': { + token_.set_kind(TokenKind::Comma); + CHAR laChar = LookAheadChar(); + if (laChar == ',') { + Advance(TokenKind::Comma); + token_.set_offset(cursor_ - format_); + ReportError("Unexpected ',' in format expression"); + } else if (laChar == ')') { + ReportError("Unexpected ',' before ')' in format expression"); + } + break; + } + case '\'': + case '"': + for (++cursor_; cursor_ < end_; ++cursor_) { + if (*cursor_ == c) { + if (auto nc{cursor_ + 1}; nc < end_ && *nc != c) { + token_.set_kind(TokenKind::String); + break; + } + ++cursor_; + } + } + SetLength(); + if (token_.kind() != TokenKind::String) { + ReportError("Unterminated string"); + } else if (stmt_ == IoStmtKind::Read && + previousToken_.kind() != TokenKind::DT) { // 13.3.2p6 + ReportWarning("String edit descriptor in READ format expression"); + } + break; + default: + if (cursor_ >= end_ && !unterminatedFormatError_) { + suppressMessageCascade_ = false; + ReportError("Unterminated format expression"); + unterminatedFormatError_ = true; + } + token_.set_kind(TokenKind::None); + break; + } + + SetLength(); +} + +template <typename CHAR> void FormatValidator<CHAR>::check_r(bool allowed) { + if (!allowed && knrValue_ >= 0) { + ReportError("Repeat specifier before '%s' edit descriptor", knrToken_); + } else if (knrValue_ == 0) { + ReportError("'%s' edit descriptor repeat specifier must be positive", + knrToken_); // C1304 + } +} + +// Return the predicate "w value is present" to control further processing. +template <typename CHAR> bool FormatValidator<CHAR>::check_w() { + if (token_.kind() == TokenKind::UnsignedInteger) { + wValue_ = integerValue_; + if (wValue_ == 0) { + if (*argString_ == 'A' || stmt_ == IoStmtKind::Read) { + // C1306, 13.7.2.1p6 + ReportError("'%s' edit descriptor 'w' value must be positive"); + } else if (*argString_ == 'L') { + ReportWarning("'%s' edit descriptor 'w' value should be positive"); + } + } + NextToken(); + return true; + } + if (*argString_ != 'A' && *argString_ != 'L') { + ReportWarning("Expected '%s' edit descriptor 'w' value"); // C1306 + } + return false; +} + +template <typename CHAR> void FormatValidator<CHAR>::check_m() { + if (token_.kind() != TokenKind::Point) { + return; + } + NextToken(); + if (token_.kind() != TokenKind::UnsignedInteger) { + ReportError("Expected '%s' edit descriptor 'm' value after '.'"); + return; + } + if ((stmt_ == IoStmtKind::Print || stmt_ == IoStmtKind::Write) && + wValue_ > 0 && integerValue_ > wValue_) { // 13.7.2.2p5, 13.7.2.4p6 + ReportError("'%s' edit descriptor 'm' value is greater than 'w' value"); + } + NextToken(); +} + +// Return the predicate "d value is present" to control further processing. +template <typename CHAR> +bool FormatValidator<CHAR>::check_d(bool checkScaleFactor) { + if (token_.kind() != TokenKind::Point) { + ReportError("Expected '%s' edit descriptor '.d' value"); + return false; + } + NextToken(); + if (token_.kind() != TokenKind::UnsignedInteger) { + ReportError("Expected '%s' edit descriptor 'd' value after '.'"); + return false; + } + if (checkScaleFactor) { + check_k(); + } + NextToken(); + return true; +} + +// Check the value of scale factor k against a field width d. +template <typename CHAR> void FormatValidator<CHAR>::check_k() { + // Limit the check to D and E edit descriptors in output statements that + // explicitly set the scale factor. + if (stmt_ != IoStmtKind::Print && stmt_ != IoStmtKind::Write) { + return; + } + if (!scaleFactorToken_.IsSet()) { + return; + } + // 13.7.2.3.3p5 - The values of d and k must satisfy: + // −d < k <= 0; or + // 0 < k < d+2 + const int64_t d{integerValue_}; + const int64_t k{scaleFactorValue_}; + // Exception: d = k = 0 is nonstandard, but has a reasonable interpretation. + if (d == 0 && k == 0) { + return; + } + if (k <= 0 && !(-d < k)) { + ReportError("Negative scale factor k (from kP) and width d in a '%s' " + "edit descriptor must satisfy '-d < k'"); + } else if (k > 0 && !(k < d + 2)) { + ReportError("Positive scale factor k (from kP) and width d in a '%s' " + "edit descriptor must satisfy 'k < d+2'"); + } +} + +template <typename CHAR> void FormatValidator<CHAR>::check_e() { + if (token_.kind() != TokenKind::E) { + return; + } + NextToken(); + if (token_.kind() != TokenKind::UnsignedInteger) { + ReportError("Expected '%s' edit descriptor 'e' value after 'E'"); + return; + } + NextToken(); +} + +template <typename CHAR> bool FormatValidator<CHAR>::Check() { + if (!*format_) { + ReportError("Empty format expression"); + return formatHasErrors_; + } + NextToken(); + if (token_.kind() != TokenKind::LParen) { + ReportError("Format expression must have an initial '('"); + return formatHasErrors_; + } + NextToken(); + + int nestLevel{0}; // Outer level ()s are at level 0. + Token starToken{}; // unlimited format token + bool hasDataEditDesc{false}; + + // Subject to error recovery exceptions, a loop iteration processes one + // edit descriptor or does list management. The loop terminates when + // - a level-0 right paren is processed (format may be valid) + // - the end of an incomplete format is reached + // - the error reporter requests termination (error threshold reached) + while (!reporterExit_) { + Token signToken{}; + knrValue_ = -1; // -1 ==> not present + wValue_ = -1; + bool commaRequired{true}; + + if (token_.kind() == TokenKind::Sign) { + signToken = token_; + NextToken(); + } + if (token_.kind() == TokenKind::UnsignedInteger) { + knrToken_ = token_; + knrValue_ = integerValue_; + NextToken(); + } + if (signToken.IsSet() && (knrValue_ < 0 || token_.kind() != TokenKind::P)) { + argString_[0] = format_[signToken.offset()]; + argString_[1] = 0; + ReportError("Unexpected '%s' in format expression", signToken); + } + // Default message argument. + // Alphabetic edit descriptor names are one or two characters in length. + argString_[0] = toupper(format_[token_.offset()]); + argString_[1] = token_.length() > 1 ? toupper(*cursor_) : 0; + // Process one format edit descriptor or do format list management. + switch (token_.kind()) { + case TokenKind::A: + // R1307 data-edit-desc -> A [w] + hasDataEditDesc = true; + check_r(); + NextToken(); + check_w(); + break; + case TokenKind::B: + case TokenKind::I: + case TokenKind::O: + case TokenKind::Z: + // R1307 data-edit-desc -> B w [. m] | I w [. m] | O w [. m] | Z w [. m] + hasDataEditDesc = true; + check_r(); + NextToken(); + if (check_w()) { + check_m(); + } + break; + case TokenKind::D: + case TokenKind::F: { + // R1307 data-edit-desc -> D w . d | F w . d + bool isD{token_.kind() == TokenKind::D}; + hasDataEditDesc = true; + check_r(); + NextToken(); + if (check_w()) { + check_d(/*checkScaleFactor=*/isD); + } + break; + } + case TokenKind::E: + case TokenKind::EN: + case TokenKind::ES: + case TokenKind::EX: { + // R1307 data-edit-desc -> + // E w . d [E e] | EN w . d [E e] | ES w . d [E e] | EX w . d [E e] + bool isE{token_.kind() == TokenKind::E}; + hasDataEditDesc = true; + check_r(); + NextToken(); + if (check_w() && check_d(/*checkScaleFactor=*/isE)) { + check_e(); + } + break; + } + case TokenKind::G: + // R1307 data-edit-desc -> G w [. d [E e]] + hasDataEditDesc = true; + check_r(); + NextToken(); + if (check_w()) { + if (wValue_ > 0) { + if (check_d()) { // C1307 + check_e(); + } + } else if (token_.kind() == TokenKind::Point && check_d() && + token_.kind() == TokenKind::E) { // C1308 + ReportError("A 'G0' edit descriptor must not have an 'e' value"); + NextToken(); + if (token_.kind() == TokenKind::UnsignedInteger) { + NextToken(); + } + } + } + break; + case TokenKind::L: + // R1307 data-edit-desc -> L w + hasDataEditDesc = true; + check_r(); + NextToken(); + check_w(); + break; + case TokenKind::DT: + // R1307 data-edit-desc -> DT [char-literal-constant] [( v-list )] + hasDataEditDesc = true; + check_r(); + NextToken(); + if (token_.kind() == TokenKind::String) { + NextToken(); + } + if (token_.kind() == TokenKind::LParen) { + do { + NextToken(); + if (token_.kind() == TokenKind::Sign) { + NextToken(); + } + if (token_.kind() != TokenKind::UnsignedInteger) { + ReportError( + "Expected integer constant in 'DT' edit descriptor v-list"); + break; + } + NextToken(); + } while (token_.kind() == TokenKind::Comma); + if (token_.kind() != TokenKind::RParen) { + ReportError("Expected ',' or ')' in 'DT' edit descriptor v-list"); + while (cursor_ < end_ && token_.kind() != TokenKind::RParen) { + NextToken(); + } + } + NextToken(); + } + break; + case TokenKind::String: + // R1304 data-edit-desc -> char-string-edit-desc + if (knrValue_ >= 0) { + ReportError("Repeat specifier before character string edit descriptor", + knrToken_); + } + NextToken(); + break; + case TokenKind::BN: + case TokenKind::BZ: + case TokenKind::DC: + case TokenKind::DP: + case TokenKind::RC: + case TokenKind::RD: + case TokenKind::RN: + case TokenKind::RP: + case TokenKind::RU: + case TokenKind::RZ: + case TokenKind::S: + case TokenKind::SP: + case TokenKind::SS: + // R1317 sign-edit-desc -> SS | SP | S + // R1318 blank-interp-edit-desc -> BN | BZ + // R1319 round-edit-desc -> RU | RD | RZ | RN | RC | RP + // R1320 decimal-edit-desc -> DC | DP + check_r(false); + NextToken(); + break; + case TokenKind::P: { + // R1313 control-edit-desc -> k P + if (knrValue_ < 0) { + ReportError("'P' edit descriptor must have a scale factor"); + } else { + scaleFactorToken_ = knrToken_; + if (signToken.IsSet() && format_[signToken.offset()] == '-') { + scaleFactorValue_ = -knrValue_; + } else { + scaleFactorValue_ = knrValue_; + } + } + // Diagnosing C1302 may require multiple token lookahead. + // Save current cursor position to enable backup. + const CHAR *saveCursor{cursor_}; + NextToken(); + if (token_.kind() == TokenKind::UnsignedInteger) { + NextToken(); + } + switch (token_.kind()) { + case TokenKind::D: + case TokenKind::E: + case TokenKind::EN: + case TokenKind::ES: + case TokenKind::EX: + case TokenKind::F: + case TokenKind::G: + commaRequired = false; + break; + default:; + } + cursor_ = saveCursor; + NextToken(); + break; + } + case TokenKind::T: + case TokenKind::TL: + case TokenKind::TR: + // R1315 position-edit-desc -> T n | TL n | TR n + check_r(false); + NextToken(); + if (integerValue_ <= 0) { // C1311 + ReportError("'%s' edit descriptor must have a positive position value"); + } + NextToken(); + break; + case TokenKind::X: + // R1315 position-edit-desc -> n X + if (knrValue_ == 0) { // C1311 + ReportError("'X' edit descriptor must have a positive position value", + knrToken_); + } else if (knrValue_ < 0) { + ReportWarning( + "'X' edit descriptor must have a positive position value"); + } + NextToken(); + break; + case TokenKind::Colon: + // R1313 control-edit-desc -> : + check_r(false); + commaRequired = false; + NextToken(); + break; + case TokenKind::Slash: + // R1313 control-edit-desc -> [r] / + commaRequired = false; + NextToken(); + break; + case TokenKind::Backslash: + check_r(false); + ReportWarning("Non-standard '\\' edit descriptor"); + NextToken(); + break; + case TokenKind::Dollar: + check_r(false); + ReportWarning("Non-standard '$' edit descriptor"); + NextToken(); + break; + case TokenKind::Star: + // NextToken assigns a token kind of Star only if * is followed by (. + // So the next token is guaranteed to be LParen. + if (nestLevel > 0) { + ReportError("Nested unlimited format item list"); + } + starToken = token_; + if (knrValue_ >= 0) { + ReportError( + "Repeat specifier before unlimited format item list", knrToken_); + } + hasDataEditDesc = false; + NextToken(); + [[fallthrough]]; + case TokenKind::LParen: + if (knrValue_ == 0) { + ReportError("List repeat specifier must be positive", knrToken_); + } + if (++nestLevel > maxNesting_) { + maxNesting_ = nestLevel; + } + break; + case TokenKind::RParen: + if (knrValue_ >= 0) { + ReportError("Unexpected integer constant", knrToken_); + } + do { + if (nestLevel == 0) { + // Any characters after level-0 ) are ignored. + return formatHasErrors_; // normal exit (may have messages) + } + if (nestLevel == 1 && starToken.IsSet() && !hasDataEditDesc) { + SetLength(starToken); + ReportError( // C1303 + "Unlimited format item list must contain a data edit descriptor", + starToken); + } + --nestLevel; + NextToken(); + } while (token_.kind() == TokenKind::RParen); + if (nestLevel == 0 && starToken.IsSet()) { + ReportError("Character in format after unlimited format item list"); + } + break; + case TokenKind::Comma: + if (knrValue_ >= 0) { + ReportError("Unexpected integer constant", knrToken_); + } + if (suppressMessageCascade_ || reporterExit_) { + break; + } + [[fallthrough]]; + default: + ReportError("Unexpected '%s' in format expression"); + NextToken(); + } + + // Process comma separator and exit an incomplete format. + switch (token_.kind()) { + case TokenKind::Colon: // Comma not required; token not yet processed. + case TokenKind::Slash: // Comma not required; token not yet processed. + case TokenKind::RParen: // Comma not allowed; token not yet processed. + suppressMessageCascade_ = false; + break; + case TokenKind::LParen: // Comma not allowed; token already processed. + case TokenKind::Comma: // Normal comma case; move past token. + suppressMessageCascade_ = false; + NextToken(); + break; + case TokenKind::Sign: // Error; main switch has a better message. + case TokenKind::None: // Error; token not yet processed. + if (cursor_ >= end_) { + return formatHasErrors_; // incomplete format error exit + } + break; + default: + // Possible first token of the next format item; token not yet processed. + if (commaRequired) { + const char *s{"Expected ',' or ')' in format expression"}; // C1302 + if (previousToken_.kind() == TokenKind::UnsignedInteger && + previousToken_.length() > 1 && + itemsWithLeadingInts_.test(token_.kind())) { + // F10.32F10.3 is ambiguous, F10.3F10.3 is not + ReportError(s); + } else { + ReportWarning(s); + } + } + } + } + + return formatHasErrors_; // error reporter (message threshold) exit +} + +} // namespace Fortran::common +#endif // FORTRAN_COMMON_FORMAT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/idioms.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/idioms.h new file mode 100644 index 00000000000..06631bcf2e4 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/idioms.h @@ -0,0 +1,156 @@ +//===-- include/flang/Common/idioms.h ---------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_IDIOMS_H_ +#define FORTRAN_COMMON_IDIOMS_H_ + +// Defines anything that might ever be useful in more than one source file +// or that is too weird or too specific to the host C++ compiler to be +// exposed elsewhere. + +#ifndef __cplusplus +#error this is a C++ program +#endif +#if __cplusplus < 201703L +#error this is a C++17 program +#endif +#if !__clang__ && defined __GNUC__ && __GNUC__ < 7 +#error g++ >= 7.2 is required +#endif + +#include "enum-class.h" +#include "variant.h" +#include "visit.h" +#include <array> +#include <functional> +#include <list> +#include <memory> +#include <optional> +#include <string> +#include <tuple> +#include <type_traits> + +#if __GNUC__ == 7 +// Avoid a deduction bug in GNU 7.x headers by forcing the answer. +namespace std { +template <typename A> +struct is_trivially_copy_constructible<list<A>> : false_type {}; +template <typename A> +struct is_trivially_copy_constructible<optional<list<A>>> : false_type {}; +} // namespace std +#endif + +// enable "this is a std::string"s with the 's' suffix +using namespace std::literals::string_literals; + +namespace Fortran::common { + +// Helper templates for combining a list of lambdas into an anonymous +// struct for use with common::visit() on a std::variant<> sum type. +// E.g.: common::visit(visitors{ +// [&](const firstType &x) { ... }, +// [&](const secondType &x) { ... }, +// ... +// [&](const auto &catchAll) { ... }}, variantObject); + +template <typename... LAMBDAS> struct visitors : LAMBDAS... { + using LAMBDAS::operator()...; +}; + +template <typename... LAMBDAS> visitors(LAMBDAS... x) -> visitors<LAMBDAS...>; + +// Calls std::fprintf(stderr, ...), then abort(). +[[noreturn]] void die(const char *, ...); + +#define DIE(x) Fortran::common::die(x " at " __FILE__ "(%d)", __LINE__) + +// For switch statement default: labels. +#define CRASH_NO_CASE DIE("no case") + +// clang-format off +// For switch statements whose cases have return statements for +// all possibilities. Clang emits warnings if the default: is +// present, gcc emits warnings if it is absent. +#if __clang__ +#define SWITCH_COVERS_ALL_CASES +#else +#define SWITCH_COVERS_ALL_CASES default: CRASH_NO_CASE; +#endif +// clang-format on + +// For cheap assertions that should be applied in production. +// To disable, compile with '-DCHECK=(void)' +#ifndef CHECK +#define CHECK(x) ((x) || (DIE("CHECK(" #x ") failed"), false)) +#endif + +// Same as above, but with a custom error message. +#ifndef CHECK_MSG +#define CHECK_MSG(x, y) ((x) || (DIE("CHECK(" #x ") failed: " #y), false)) +#endif + +// User-defined type traits that default to false: +// Invoke CLASS_TRAIT(traitName) to define a trait, then put +// using traitName = std::true_type; (or false_type) +// into the appropriate class definitions. You can then use +// typename std::enable_if_t<traitName<...>, ...> +// in template specialization definitions. +#define CLASS_TRAIT(T) \ + namespace class_trait_ns_##T { \ + template <typename A> std::true_type test(typename A::T *); \ + template <typename A> std::false_type test(...); \ + template <typename A> \ + constexpr bool has_trait{decltype(test<A>(nullptr))::value}; \ + template <typename A> constexpr bool trait_value() { \ + if constexpr (has_trait<A>) { \ + using U = typename A::T; \ + return U::value; \ + } else { \ + return false; \ + } \ + } \ + } \ + template <typename A> constexpr bool T{class_trait_ns_##T::trait_value<A>()}; + +// Check that a pointer is non-null and dereference it +#define DEREF(p) Fortran::common::Deref(p, __FILE__, __LINE__) + +template <typename T> constexpr T &Deref(T *p, const char *file, int line) { + if (!p) { + Fortran::common::die("nullptr dereference at %s(%d)", file, line); + } + return *p; +} + +template <typename T> +constexpr T &Deref(const std::unique_ptr<T> &p, const char *file, int line) { + if (!p) { + Fortran::common::die("nullptr dereference at %s(%d)", file, line); + } + return *p; +} + +// Given a const reference to a value, return a copy of the value. +template <typename A> A Clone(const A &x) { return x; } + +// C++ does a weird and dangerous thing when deducing template type parameters +// from function arguments: lvalue references are allowed to match rvalue +// reference arguments. Template function declarations like +// template<typename A> int foo(A &&); +// need to be protected against this C++ language feature when functions +// may modify such arguments. Use these type functions to invoke SFINAE +// on a result type via +// template<typename A> common::IfNoLvalue<int, A> foo(A &&); +// or, for constructors, +// template<typename A, typename = common::NoLvalue<A>> int foo(A &&); +// This works with parameter packs too. +template <typename A, typename... B> +using IfNoLvalue = std::enable_if_t<(... && !std::is_lvalue_reference_v<B>), A>; +template <typename... RVREF> using NoLvalue = IfNoLvalue<void, RVREF...>; +} // namespace Fortran::common +#endif // FORTRAN_COMMON_IDIOMS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/leading-zero-bit-count.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/leading-zero-bit-count.h new file mode 100644 index 00000000000..a296e0b4469 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/leading-zero-bit-count.h @@ -0,0 +1,96 @@ +//===-- include/flang/Common/leading-zero-bit-count.h -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_LEADING_ZERO_BIT_COUNT_H_ +#define FORTRAN_COMMON_LEADING_ZERO_BIT_COUNT_H_ + +// A fast and portable function that implements Fortran's LEADZ intrinsic +// function, which counts the number of leading (most significant) zero bit +// positions in an integer value. (If the most significant bit is set, the +// leading zero count is zero; if no bit is set, the leading zero count is the +// word size in bits; otherwise, it's the largest left shift count that +// doesn't reduce the number of bits in the word that are set.) + +#include <cinttypes> + +namespace Fortran::common { +namespace { +// The following magic constant is a binary deBruijn sequence. +// It has the remarkable property that if one extends it +// (virtually) on the right with 5 more zero bits, then all +// of the 64 contiguous framed blocks of six bits in the +// extended 69-bit sequence are distinct. Consequently, +// if one shifts it left by any shift count [0..63] with +// truncation and extracts the uppermost six bit field +// of the shifted value, each shift count maps to a distinct +// field value. That means that we can map those 64 field +// values back to the shift counts that produce them, +// and (the point) this means that we can shift this value +// by an unknown bit count in [0..63] and then figure out +// what that count must have been. +// 0 7 e d d 5 e 5 9 a 4 e 2 8 c 2 +// 0000011111101101110101011110010110011010010011100010100011000010 +static constexpr std::uint64_t deBruijn{0x07edd5e59a4e28c2}; +static constexpr std::uint8_t mapping[64]{63, 0, 58, 1, 59, 47, 53, 2, 60, 39, + 48, 27, 54, 33, 42, 3, 61, 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, + 14, 22, 4, 62, 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21, + 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5}; +} // namespace + +inline constexpr int LeadingZeroBitCount(std::uint64_t x) { + if (x == 0) { + return 64; + } else { + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x |= x >> 32; + // All of the bits below the uppermost set bit are now also set. + x -= x >> 1; // All of the bits below the uppermost are now clear. + // x now has exactly one bit set, so it is a power of two, so + // multiplication by x is equivalent to a left shift by its + // base-2 logarithm. We calculate that unknown base-2 logarithm + // by shifting the deBruijn sequence and mapping the framed value. + int base2Log{mapping[(x * deBruijn) >> 58]}; + return 63 - base2Log; // convert to leading zero count + } +} + +inline constexpr int LeadingZeroBitCount(std::uint32_t x) { + return LeadingZeroBitCount(static_cast<std::uint64_t>(x)) - 32; +} + +inline constexpr int LeadingZeroBitCount(std::uint16_t x) { + return LeadingZeroBitCount(static_cast<std::uint64_t>(x)) - 48; +} + +namespace { +static constexpr std::uint8_t eightBitLeadingZeroBitCount[256]{8, 7, 6, 6, 5, 5, + 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +} + +inline constexpr int LeadingZeroBitCount(std::uint8_t x) { + return eightBitLeadingZeroBitCount[x]; +} + +template <typename A> inline constexpr int BitsNeededFor(A x) { + return 8 * sizeof x - LeadingZeroBitCount(x); +} +} // namespace Fortran::common +#endif // FORTRAN_COMMON_LEADING_ZERO_BIT_COUNT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/optional.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/optional.h new file mode 100644 index 00000000000..72991111be5 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/optional.h @@ -0,0 +1,242 @@ +//===-- include/flang/Common/optional.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Implementation of std::optional borrowed from LLVM's +// libc/src/__support/CPP/optional.h with modifications (e.g. value_or, emplace +// methods were added). +// +// The implementation defines optional in Fortran::common namespace. +// This standalone implementation may be used if the target +// does not support std::optional implementation (e.g. CUDA device env), +// otherwise, Fortran::common::optional is an alias for std::optional. +// +// TODO: using libcu++ is the best option for CUDA, but there is a couple +// of issues: +// * Older CUDA toolkits' libcu++ implementations do not support optional. +// * The include paths need to be set up such that all STD header files +// are taken from libcu++. +// * cuda:: namespace need to be forced for all std:: references. +// +//===----------------------------------------------------------------------===// +#ifndef FORTRAN_COMMON_OPTIONAL_H +#define FORTRAN_COMMON_OPTIONAL_H + +#include "api-attrs.h" +#include <optional> + +#if !defined(STD_OPTIONAL_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_OPTIONAL_UNSUPPORTED 1 +#endif + +#define FORTRAN_OPTIONAL_INLINE_WITH_ATTRS inline RT_API_ATTRS +#define FORTRAN_OPTIONAL_INLINE inline +#define FORTRAN_OPTIONAL_INLINE_VAR inline + +namespace Fortran::common { + +#if STD_OPTIONAL_UNSUPPORTED +// Trivial nullopt_t struct. +struct nullopt_t { + constexpr explicit nullopt_t() = default; +}; + +// nullopt that can be used and returned. +FORTRAN_OPTIONAL_INLINE_VAR constexpr nullopt_t nullopt{}; + +// This is very simple implementation of the std::optional class. It makes +// several assumptions that the underlying type is trivially constructible, +// copyable, or movable. +template <typename T> class optional { + template <typename U, bool = !std::is_trivially_destructible<U>::value> + struct OptionalStorage { + union { + char empty; + U stored_value; + }; + + bool in_use = false; + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS ~OptionalStorage() { reset(); } + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr OptionalStorage() : empty() {} + + template <typename... Args> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr explicit OptionalStorage( + std::in_place_t, Args &&...args) + : stored_value(std::forward<Args>(args)...) {} + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr void reset() { + if (in_use) + stored_value.~U(); + in_use = false; + } + }; + + // The only difference is that this type U doesn't have a nontrivial + // destructor. + template <typename U> struct OptionalStorage<U, false> { + union { + char empty; + U stored_value; + }; + + bool in_use = false; + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr OptionalStorage() : empty() {} + + template <typename... Args> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr explicit OptionalStorage( + std::in_place_t, Args &&...args) + : stored_value(std::forward<Args>(args)...) {} + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr void reset() { + in_use = false; + } + }; + + OptionalStorage<T> storage; + +public: + // The default methods do not use RT_API_ATTRS, which causes + // warnings in CUDA compilation of form: + // __device__/__host__ annotation is ignored on a function .* that is + // explicitly defaulted on its first declaration + FORTRAN_OPTIONAL_INLINE constexpr optional() = default; + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr optional(nullopt_t) {} + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr optional(const T &t) + : storage(std::in_place, t) { + storage.in_use = true; + } + FORTRAN_OPTIONAL_INLINE constexpr optional(const optional &) = default; + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr optional(T &&t) + : storage(std::in_place, std::move(t)) { + storage.in_use = true; + } + FORTRAN_OPTIONAL_INLINE constexpr optional(optional &&O) = default; + + template <typename... ArgTypes> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr optional( + std::in_place_t, ArgTypes &&...Args) + : storage(std::in_place, std::forward<ArgTypes>(Args)...) { + storage.in_use = true; + } + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr optional &operator=(T &&t) { + storage.stored_value = std::move(t); + storage.in_use = true; + return *this; + } + + FORTRAN_OPTIONAL_INLINE constexpr optional &operator=(optional &&) = default; + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr optional &operator=(const T &t) { + storage.stored_value = t; + storage.in_use = true; + return *this; + } + + FORTRAN_OPTIONAL_INLINE constexpr optional &operator=( + const optional &) = default; + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr void reset() { storage.reset(); } + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr const T &value() const & { + return storage.stored_value; + } + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr T &value() & { + return storage.stored_value; + } + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr explicit operator bool() const { + return storage.in_use; + } + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr bool has_value() const { + return storage.in_use; + } + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr const T *operator->() const { + return &storage.stored_value; + } + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr T *operator->() { + return &storage.stored_value; + } + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr const T &operator*() const & { + return storage.stored_value; + } + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr T &operator*() & { + return storage.stored_value; + } + + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr T &&value() && { + return std::move(storage.stored_value); + } + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr T &&operator*() && { + return std::move(storage.stored_value); + } + + template <typename VT> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr T value_or( + VT &&default_value) const & { + return storage.in_use ? storage.stored_value + : static_cast<T>(std::forward<VT>(default_value)); + } + + template <typename VT> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr T value_or( + VT &&default_value) && { + return storage.in_use ? std::move(storage.stored_value) + : static_cast<T>(std::forward<VT>(default_value)); + } + + template <typename... ArgTypes> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS + std::enable_if_t<std::is_constructible_v<T, ArgTypes &&...>, T &> + emplace(ArgTypes &&...args) { + reset(); + new (reinterpret_cast<void *>(std::addressof(storage.stored_value))) + T(std::forward<ArgTypes>(args)...); + storage.in_use = true; + return value(); + } + + template <typename U = T, + std::enable_if_t<(std::is_constructible_v<T, U &&> && + !std::is_same_v<std::decay_t<U>, std::in_place_t> && + !std::is_same_v<std::decay_t<U>, optional> && + std::is_convertible_v<U &&, T>), + bool> = true> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS constexpr optional(U &&value) { + new (reinterpret_cast<void *>(std::addressof(storage.stored_value))) + T(std::forward<U>(value)); + storage.in_use = true; + } + + template <typename U = T, + std::enable_if_t<(std::is_constructible_v<T, U &&> && + !std::is_same_v<std::decay_t<U>, std::in_place_t> && + !std::is_same_v<std::decay_t<U>, optional> && + !std::is_convertible_v<U &&, T>), + bool> = false> + FORTRAN_OPTIONAL_INLINE_WITH_ATTRS explicit constexpr optional(U &&value) { + new (reinterpret_cast<void *>(std::addressof(storage.stored_value))) + T(std::forward<U>(value)); + storage.in_use = true; + } +}; +#else // !STD_OPTIONAL_UNSUPPORTED +using std::nullopt; +using std::nullopt_t; +using std::optional; +#endif // !STD_OPTIONAL_UNSUPPORTED + +} // namespace Fortran::common + +#endif // FORTRAN_COMMON_OPTIONAL_H diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/real.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/real.h new file mode 100644 index 00000000000..785cde3236b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/real.h @@ -0,0 +1,143 @@ +//===-- include/flang/Common/real.h -----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_REAL_H_ +#define FORTRAN_COMMON_REAL_H_ + +// Characteristics of IEEE-754 & related binary floating-point numbers. +// The various representations are distinguished by their binary precisions +// (number of explicit significand bits and any implicit MSB in the fraction). + +#include <cinttypes> + +namespace Fortran::common { + +// Total representation size in bits for each type +static constexpr int BitsForBinaryPrecision(int binaryPrecision) { + switch (binaryPrecision) { + case 8: // IEEE single (truncated): 1+8+7 with implicit bit + return 16; + case 11: // IEEE half precision: 1+5+10 with implicit bit + return 16; + case 24: // IEEE single precision: 1+8+23 with implicit bit + return 32; + case 53: // IEEE double precision: 1+11+52 with implicit bit + return 64; + case 64: // x87 extended precision: 1+15+64, no implicit bit + return 80; + case 106: // "double-double": 2*(1+11+52 with implicit bit) + return 128; + case 113: // IEEE quad precision: 1+15+112 with implicit bit + return 128; + default: + return -1; + } +} + +// Maximum number of significant decimal digits in the fraction of an +// exact conversion in each type; computed by converting the value +// with the minimum exponent (biased to 1) and all fractional bits set. +static constexpr int MaxDecimalConversionDigits(int binaryPrecision) { + switch (binaryPrecision) { + case 8: // IEEE single (truncated): 1+8+7 with implicit bit + return 96; + case 11: // IEEE half precision: 1+5+10 with implicit bit + return 21; + case 24: // IEEE single precision: 1+8+23 with implicit bit + return 112; + case 53: // IEEE double precision: 1+11+52 with implicit bit + return 767; + case 64: // x87 extended precision: 1+15+64, no implicit bit + return 11514; + case 106: // "double-double": 2*(1+11+52 with implicit bit) + return 2 * 767; + case 113: // IEEE quad precision: 1+15+112 with implicit bit + return 11563; + default: + return -1; + } +} + +static constexpr int MaxHexadecimalConversionDigits(int binaryPrecision) { + return binaryPrecision >= 0 ? (binaryPrecision + 3) / 4 : binaryPrecision; +} + +static constexpr int RealKindForPrecision(int binaryPrecision) { + switch (binaryPrecision) { + case 8: // IEEE single (truncated): 1+8+7 with implicit bit + return 3; + case 11: // IEEE half precision: 1+5+10 with implicit bit + return 2; + case 24: // IEEE single precision: 1+8+23 with implicit bit + return 4; + case 53: // IEEE double precision: 1+11+52 with implicit bit + return 8; + case 64: // x87 extended precision: 1+15+64, no implicit bit + return 10; + // TODO: case 106: return kind for double/double + case 113: // IEEE quad precision: 1+15+112 with implicit bit + return 16; + default: + return -1; + } +} + +static constexpr int PrecisionOfRealKind(int kind) { + switch (kind) { + case 2: // IEEE half precision: 1+5+10 with implicit bit + return 11; + case 3: // IEEE single (truncated): 1+8+7 with implicit bit + return 8; + case 4: // IEEE single precision: 1+8+23 with implicit bit + return 24; + case 8: // IEEE double precision: 1+11+52 with implicit bit + return 53; + case 10: // x87 extended precision: 1+15+64, no implicit bit + return 64; + // TODO: case kind for double/double: return 106; + case 16: // IEEE quad precision: 1+15+112 with implicit bit + return 113; + default: + return -1; + } +} + +// RealCharacteristics is constexpr, but also useful when constructed +// with a non-constant precision argument. +class RealCharacteristics { +public: + explicit constexpr RealCharacteristics(int p) : binaryPrecision{p} {} + + int binaryPrecision; + int bits{BitsForBinaryPrecision(binaryPrecision)}; + bool isImplicitMSB{binaryPrecision != 64 /*x87*/}; + int significandBits{binaryPrecision - isImplicitMSB}; + int exponentBits{bits - significandBits - 1 /*sign*/}; + int maxExponent{(1 << exponentBits) - 1}; + int exponentBias{maxExponent / 2}; + int decimalPrecision{LogBaseTwoToLogBaseTen(binaryPrecision - 1)}; + int decimalRange{LogBaseTwoToLogBaseTen(exponentBias - 1)}; + // Number of significant decimal digits in the fraction of the + // exact conversion of the least nonzero subnormal. + int maxDecimalConversionDigits{MaxDecimalConversionDigits(binaryPrecision)}; + int maxHexadecimalConversionDigits{ + MaxHexadecimalConversionDigits(binaryPrecision)}; + +private: + // Converts bit widths to whole decimal digits + static constexpr int LogBaseTwoToLogBaseTen(int logb2) { + constexpr std::int64_t LogBaseTenOfTwoTimesTenToThe12th{301029995664}; + constexpr std::int64_t TenToThe12th{1000000000000}; + std::int64_t logb10{ + (logb2 * LogBaseTenOfTwoTimesTenToThe12th) / TenToThe12th}; + return static_cast<int>(logb10); + } +}; + +} // namespace Fortran::common +#endif // FORTRAN_COMMON_REAL_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/reference-wrapper.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/reference-wrapper.h new file mode 100644 index 00000000000..85b2c6d5abc --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/reference-wrapper.h @@ -0,0 +1,114 @@ +//===-- include/flang/Common/reference-wrapper.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// clang-format off +// +// Implementation of std::reference_wrapper borrowed from libcu++ +// https://github.com/NVIDIA/libcudacxx/blob/f7e6cd07ed5ba826aeac0b742feafddfedc1e400/include/cuda/std/detail/libcxx/include/__functional/reference_wrapper.h#L1 +// with modifications. +// +// The original source code is distributed under the Apache License v2.0 +// with LLVM Exceptions. +// +// TODO: using libcu++ is the best option for CUDA, but there is a couple +// of issues: +// * The include paths need to be set up such that all STD header files +// are taken from libcu++. +// * cuda:: namespace need to be forced for all std:: references. +// +// clang-format on + +#ifndef FORTRAN_COMMON_REFERENCE_WRAPPER_H +#define FORTRAN_COMMON_REFERENCE_WRAPPER_H + +#include "api-attrs.h" +#include <functional> +#include <type_traits> + +#if !defined(STD_REFERENCE_WRAPPER_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_REFERENCE_WRAPPER_UNSUPPORTED 1 +#endif + +namespace Fortran::common { + +template <class _Tp> +using __remove_cvref_t = std::remove_cv_t<std::remove_reference_t<_Tp>>; +template <class _Tp, class _Up> +struct __is_same_uncvref + : std::is_same<__remove_cvref_t<_Tp>, __remove_cvref_t<_Up>> {}; + +#if STD_REFERENCE_WRAPPER_UNSUPPORTED +template <class _Tp> class reference_wrapper { +public: + // types + typedef _Tp type; + +private: + type *__f_; + + static RT_API_ATTRS void __fun(_Tp &); + static void __fun(_Tp &&) = delete; + +public: + template <class _Up, + class = + std::enable_if_t<!__is_same_uncvref<_Up, reference_wrapper>::value, + decltype(__fun(std::declval<_Up>()))>> + constexpr RT_API_ATTRS reference_wrapper(_Up &&__u) { + type &__f = static_cast<_Up &&>(__u); + __f_ = std::addressof(__f); + } + + // access + constexpr RT_API_ATTRS operator type &() const { return *__f_; } + constexpr RT_API_ATTRS type &get() const { return *__f_; } + + // invoke + template <class... _ArgTypes> + constexpr RT_API_ATTRS typename std::invoke_result_t<type &, _ArgTypes...> + operator()(_ArgTypes &&...__args) const { + return std::invoke(get(), std::forward<_ArgTypes>(__args)...); + } +}; + +template <class _Tp> reference_wrapper(_Tp &) -> reference_wrapper<_Tp>; + +template <class _Tp> +inline constexpr RT_API_ATTRS reference_wrapper<_Tp> ref(_Tp &__t) { + return reference_wrapper<_Tp>(__t); +} + +template <class _Tp> +inline constexpr RT_API_ATTRS reference_wrapper<_Tp> ref( + reference_wrapper<_Tp> __t) { + return __t; +} + +template <class _Tp> +inline constexpr RT_API_ATTRS reference_wrapper<const _Tp> cref( + const _Tp &__t) { + return reference_wrapper<const _Tp>(__t); +} + +template <class _Tp> +inline constexpr RT_API_ATTRS reference_wrapper<const _Tp> cref( + reference_wrapper<_Tp> __t) { + return __t; +} + +template <class _Tp> void ref(const _Tp &&) = delete; +template <class _Tp> void cref(const _Tp &&) = delete; +#else // !STD_REFERENCE_WRAPPER_UNSUPPORTED +using std::cref; +using std::ref; +using std::reference_wrapper; +#endif // !STD_REFERENCE_WRAPPER_UNSUPPORTED + +} // namespace Fortran::common + +#endif // FORTRAN_COMMON_REFERENCE_WRAPPER_H diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/restorer.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/restorer.h new file mode 100644 index 00000000000..c18c13e351c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/restorer.h @@ -0,0 +1,56 @@ +//===-- include/flang/Common/restorer.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Utility: before overwriting a variable, capture its value and +// ensure that it will be restored when the Restorer goes out of scope. +// +// int x{3}; +// { +// auto save{common::ScopedSet(x, 4)}; +// // x is now 4 +// } +// // x is back to 3 + +#ifndef FORTRAN_COMMON_RESTORER_H_ +#define FORTRAN_COMMON_RESTORER_H_ +#include "api-attrs.h" +#include "idioms.h" +namespace Fortran::common { +template <typename A> class Restorer { +public: + explicit RT_API_ATTRS Restorer(A &p, A original) + : p_{p}, original_{std::move(original)} {} + RT_API_ATTRS ~Restorer() { p_ = std::move(original_); } + + // Inhibit any recreation of this restorer that would result in two restorers + // trying to restore the same reference. + Restorer(const Restorer &) = delete; + Restorer(Restorer &&that) = delete; + const Restorer &operator=(const Restorer &) = delete; + const Restorer &operator=(Restorer &&that) = delete; + +private: + A &p_; + A original_; +}; + +template <typename A, typename B> +RT_API_ATTRS common::IfNoLvalue<Restorer<A>, B> ScopedSet(A &to, B &&from) { + A original{std::move(to)}; + to = std::move(from); + return Restorer<A>{to, std::move(original)}; +} +template <typename A, typename B> +RT_API_ATTRS common::IfNoLvalue<Restorer<A>, B> ScopedSet( + A &to, const B &from) { + A original{std::move(to)}; + to = from; + return Restorer<A>{to, std::move(original)}; +} +} // namespace Fortran::common +#endif // FORTRAN_COMMON_RESTORER_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/type-kinds.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/type-kinds.h new file mode 100644 index 00000000000..4e5c4f69fcc --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/type-kinds.h @@ -0,0 +1,63 @@ +//===-- include/flang/Common/type-kinds.h -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_TYPE_KINDS_H_ +#define FORTRAN_COMMON_TYPE_KINDS_H_ + +#include "Fortran-consts.h" +#include "real.h" +#include <cinttypes> + +namespace Fortran::common { + +static constexpr int maxKind{16}; + +// A predicate that is true when a kind value is a kind that could possibly +// be supported for an intrinsic type category on some target instruction +// set architecture. +static constexpr bool IsValidKindOfIntrinsicType( + TypeCategory category, std::int64_t kind) { + switch (category) { + case TypeCategory::Integer: + case TypeCategory::Unsigned: + return kind == 1 || kind == 2 || kind == 4 || kind == 8 || kind == 16; + case TypeCategory::Real: + case TypeCategory::Complex: + return kind == 2 || kind == 3 || kind == 4 || kind == 8 || kind == 10 || + kind == 16; + case TypeCategory::Character: + return kind == 1 || kind == 2 || kind == 4; + case TypeCategory::Logical: + return kind == 1 || kind == 2 || kind == 4 || kind == 8; + default: + return false; + } +} + +static constexpr int TypeSizeInBytes(TypeCategory category, std::int64_t kind) { + if (IsValidKindOfIntrinsicType(category, kind)) { + if (category == TypeCategory::Real || category == TypeCategory::Complex) { + int precision{PrecisionOfRealKind(kind)}; + int bits{BitsForBinaryPrecision(precision)}; + if (bits == 80) { // x87 is stored in 16-byte containers + bits = 128; + } + if (category == TypeCategory::Complex) { + bits *= 2; + } + return bits >> 3; + } else { + return kind; + } + } else { + return -1; + } +} + +} // namespace Fortran::common +#endif // FORTRAN_COMMON_TYPE_KINDS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/uint128.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/uint128.h new file mode 100644 index 00000000000..c4bc4689a1e --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/uint128.h @@ -0,0 +1,308 @@ +//===-- include/flang/Common/uint128.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Portable 128-bit integer arithmetic for use in impoverished C++ +// implementations lacking __uint128_t & __int128_t. + +#ifndef FORTRAN_COMMON_UINT128_H_ +#define FORTRAN_COMMON_UINT128_H_ + +// Define AVOID_NATIVE_UINT128_T to force the use of UnsignedInt128 below +// instead of the C++ compiler's native 128-bit unsigned integer type, if +// it has one. +#ifndef AVOID_NATIVE_UINT128_T +#define AVOID_NATIVE_UINT128_T 0 +#endif + +#include "api-attrs.h" +#include "leading-zero-bit-count.h" +#include <cstdint> +#include <type_traits> + +namespace Fortran::common { + +template <bool IS_SIGNED = false> class Int128 { +public: + constexpr Int128() {} + // This means of definition provides some portability for + // "size_t" operands. + constexpr Int128(unsigned n) : low_{n} {} + constexpr Int128(unsigned long n) : low_{n} {} + constexpr Int128(unsigned long long n) : low_{n} {} + constexpr Int128(int n) { + low_ = static_cast<std::uint64_t>(n); + high_ = -static_cast<std::uint64_t>(n < 0); + } + constexpr Int128(long n) { + low_ = static_cast<std::uint64_t>(n); + high_ = -static_cast<std::uint64_t>(n < 0); + } + constexpr Int128(long long n) { + low_ = static_cast<std::uint64_t>(n); + high_ = -static_cast<std::uint64_t>(n < 0); + } + constexpr Int128(const Int128 &) = default; + constexpr Int128(Int128 &&) = default; + constexpr Int128 &operator=(const Int128 &) = default; + constexpr Int128 &operator=(Int128 &&) = default; + + explicit constexpr Int128(const Int128<!IS_SIGNED> &n) + : low_{n.low()}, high_{n.high()} {} + explicit constexpr Int128(Int128<!IS_SIGNED> &&n) + : low_{n.low()}, high_{n.high()} {} + + constexpr Int128 operator+() const { return *this; } + constexpr Int128 operator~() const { return {~high_, ~low_}; } + constexpr Int128 operator-() const { return ~*this + 1; } + constexpr bool operator!() const { return !low_ && !high_; } + constexpr explicit operator bool() const { return low_ || high_; } + constexpr explicit operator std::uint64_t() const { return low_; } + constexpr explicit operator std::int64_t() const { return low_; } + constexpr explicit operator int() const { return static_cast<int>(low_); } + + constexpr std::uint64_t high() const { return high_; } + constexpr std::uint64_t low() const { return low_; } + + constexpr Int128 operator++(/*prefix*/) { + *this += 1; + return *this; + } + constexpr Int128 operator++(int /*postfix*/) { + Int128 result{*this}; + *this += 1; + return result; + } + constexpr Int128 operator--(/*prefix*/) { + *this -= 1; + return *this; + } + constexpr Int128 operator--(int /*postfix*/) { + Int128 result{*this}; + *this -= 1; + return result; + } + + constexpr Int128 operator&(Int128 that) const { + return {high_ & that.high_, low_ & that.low_}; + } + constexpr Int128 operator|(Int128 that) const { + return {high_ | that.high_, low_ | that.low_}; + } + constexpr Int128 operator^(Int128 that) const { + return {high_ ^ that.high_, low_ ^ that.low_}; + } + + constexpr Int128 operator<<(Int128 that) const { + if (that >= 128) { + return {}; + } else if (that == 0) { + return *this; + } else { + std::uint64_t n{that.low_}; + if (n >= 64) { + return {low_ << (n - 64), 0}; + } else { + return {(high_ << n) | (low_ >> (64 - n)), low_ << n}; + } + } + } + constexpr Int128 operator>>(Int128 that) const { + if (that >= 128) { + return {}; + } else if (that == 0) { + return *this; + } else { + std::uint64_t n{that.low_}; + if (n >= 64) { + return {0, high_ >> (n - 64)}; + } else { + return {high_ >> n, (high_ << (64 - n)) | (low_ >> n)}; + } + } + } + + constexpr Int128 operator+(Int128 that) const { + std::uint64_t lower{(low_ & ~topBit) + (that.low_ & ~topBit)}; + bool carry{((lower >> 63) + (low_ >> 63) + (that.low_ >> 63)) > 1}; + return {high_ + that.high_ + carry, low_ + that.low_}; + } + constexpr Int128 operator-(Int128 that) const { return *this + -that; } + + constexpr Int128 operator*(Int128 that) const { + std::uint64_t mask32{0xffffffff}; + if (high_ == 0 && that.high_ == 0) { + std::uint64_t x0{low_ & mask32}, x1{low_ >> 32}; + std::uint64_t y0{that.low_ & mask32}, y1{that.low_ >> 32}; + Int128 x0y0{x0 * y0}, x0y1{x0 * y1}; + Int128 x1y0{x1 * y0}, x1y1{x1 * y1}; + return x0y0 + ((x0y1 + x1y0) << 32) + (x1y1 << 64); + } else { + std::uint64_t x0{low_ & mask32}, x1{low_ >> 32}, x2{high_ & mask32}, + x3{high_ >> 32}; + std::uint64_t y0{that.low_ & mask32}, y1{that.low_ >> 32}, + y2{that.high_ & mask32}, y3{that.high_ >> 32}; + Int128 x0y0{x0 * y0}, x0y1{x0 * y1}, x0y2{x0 * y2}, x0y3{x0 * y3}; + Int128 x1y0{x1 * y0}, x1y1{x1 * y1}, x1y2{x1 * y2}; + Int128 x2y0{x2 * y0}, x2y1{x2 * y1}; + Int128 x3y0{x3 * y0}; + return x0y0 + ((x0y1 + x1y0) << 32) + ((x0y2 + x1y1 + x2y0) << 64) + + ((x0y3 + x1y2 + x2y1 + x3y0) << 96); + } + } + + constexpr Int128 operator/(Int128 that) const { + int j{LeadingZeroes()}; + Int128 bits{*this}; + bits <<= j; + Int128 numerator{}; + Int128 quotient{}; + for (; j < 128; ++j) { + numerator <<= 1; + if (bits.high_ & topBit) { + numerator.low_ |= 1; + } + bits <<= 1; + quotient <<= 1; + if (numerator >= that) { + ++quotient; + numerator -= that; + } + } + return quotient; + } + + constexpr Int128 operator%(Int128 that) const { + int j{LeadingZeroes()}; + Int128 bits{*this}; + bits <<= j; + Int128 remainder{}; + for (; j < 128; ++j) { + remainder <<= 1; + if (bits.high_ & topBit) { + remainder.low_ |= 1; + } + bits <<= 1; + if (remainder >= that) { + remainder -= that; + } + } + return remainder; + } + + constexpr bool operator<(Int128 that) const { + if (IS_SIGNED && (high_ ^ that.high_) & topBit) { + return (high_ & topBit) != 0; + } + return high_ < that.high_ || (high_ == that.high_ && low_ < that.low_); + } + constexpr bool operator<=(Int128 that) const { return !(*this > that); } + constexpr bool operator==(Int128 that) const { + return low_ == that.low_ && high_ == that.high_; + } + constexpr bool operator!=(Int128 that) const { return !(*this == that); } + constexpr bool operator>=(Int128 that) const { return that <= *this; } + constexpr bool operator>(Int128 that) const { return that < *this; } + + constexpr Int128 &operator&=(const Int128 &that) { + *this = *this & that; + return *this; + } + constexpr Int128 &operator|=(const Int128 &that) { + *this = *this | that; + return *this; + } + constexpr Int128 &operator^=(const Int128 &that) { + *this = *this ^ that; + return *this; + } + constexpr Int128 &operator<<=(const Int128 &that) { + *this = *this << that; + return *this; + } + constexpr Int128 &operator>>=(const Int128 &that) { + *this = *this >> that; + return *this; + } + constexpr Int128 &operator+=(const Int128 &that) { + *this = *this + that; + return *this; + } + constexpr Int128 &operator-=(const Int128 &that) { + *this = *this - that; + return *this; + } + constexpr Int128 &operator*=(const Int128 &that) { + *this = *this * that; + return *this; + } + constexpr Int128 &operator/=(const Int128 &that) { + *this = *this / that; + return *this; + } + constexpr Int128 &operator%=(const Int128 &that) { + *this = *this % that; + return *this; + } + +private: + constexpr Int128(std::uint64_t hi, std::uint64_t lo) { + low_ = lo; + high_ = hi; + } + constexpr int LeadingZeroes() const { + if (high_ == 0) { + return 64 + LeadingZeroBitCount(low_); + } else { + return LeadingZeroBitCount(high_); + } + } + RT_VAR_GROUP_BEGIN + static constexpr std::uint64_t topBit{std::uint64_t{1} << 63}; + RT_VAR_GROUP_END +#if FLANG_LITTLE_ENDIAN + std::uint64_t low_{0}, high_{0}; +#elif FLANG_BIG_ENDIAN + std::uint64_t high_{0}, low_{0}; +#else +#error host endianness is not known +#endif +}; + +using UnsignedInt128 = Int128<false>; +using SignedInt128 = Int128<true>; + +#if !AVOID_NATIVE_UINT128_T && (defined __GNUC__ || defined __clang__) && \ + defined __SIZEOF_INT128__ +#define USING_NATIVE_INT128_T 1 +using uint128_t = __uint128_t; +using int128_t = __int128_t; +#else +#undef USING_NATIVE_INT128_T +using uint128_t = UnsignedInt128; +using int128_t = SignedInt128; +#endif + +template <int BITS> struct HostUnsignedIntTypeHelper { + using type = std::conditional_t<(BITS <= 8), std::uint8_t, + std::conditional_t<(BITS <= 16), std::uint16_t, + std::conditional_t<(BITS <= 32), std::uint32_t, + std::conditional_t<(BITS <= 64), std::uint64_t, uint128_t>>>>; +}; +template <int BITS> struct HostSignedIntTypeHelper { + using type = std::conditional_t<(BITS <= 8), std::int8_t, + std::conditional_t<(BITS <= 16), std::int16_t, + std::conditional_t<(BITS <= 32), std::int32_t, + std::conditional_t<(BITS <= 64), std::int64_t, int128_t>>>>; +}; +template <int BITS> +using HostUnsignedIntType = typename HostUnsignedIntTypeHelper<BITS>::type; +template <int BITS> +using HostSignedIntType = typename HostSignedIntTypeHelper<BITS>::type; + +} // namespace Fortran::common +#endif diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/variant.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/variant.h new file mode 100644 index 00000000000..4fff267c93d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/variant.h @@ -0,0 +1,30 @@ +//===-- include/flang/Common/variant.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// A single way to expose C++ variant class in files that can be used +// in F18 runtime build. With inclusion of this file std::variant +// and the related names become available, though, they may correspond +// to alternative definitions (e.g. from cuda::std namespace). + +#ifndef FORTRAN_COMMON_VARIANT_H +#define FORTRAN_COMMON_VARIANT_H + +#if RT_USE_LIBCUDACXX +#error #include <cuda/std/variant> +namespace std { +using cuda::std::get; +using cuda::std::monostate; +using cuda::std::variant; +using cuda::std::variant_size_v; +using cuda::std::visit; +} // namespace std +#else // !RT_USE_LIBCUDACXX +#include <variant> +#endif // !RT_USE_LIBCUDACXX + +#endif // FORTRAN_COMMON_VARIANT_H diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/visit.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/visit.h new file mode 100644 index 00000000000..1a84102b566 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/visit.h @@ -0,0 +1,103 @@ +//===-- include/flang/Common/visit.h ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// common::visit() is a drop-in replacement for std::visit() that reduces both +// compiler build time and compiler execution time modestly, and reduces +// compiler build memory requirements significantly (overall & maximum). +// It does not require redefinition of std::variant<>. +// +// The C++ standard mandates that std::visit be O(1), but most variants are +// small and O(logN) is faster in practice to compile and execute, avoiding +// the need to build a dispatch table. +// +// Define FLANG_USE_STD_VISIT to avoid this code and make common::visit() an +// alias for ::std::visit(). + +#ifndef FORTRAN_COMMON_VISIT_H_ +#define FORTRAN_COMMON_VISIT_H_ + +#include "api-attrs.h" +#include "variant.h" +#include <type_traits> + +namespace Fortran::common { +namespace log2visit { + +template <std::size_t LOW, std::size_t HIGH, typename RESULT, typename VISITOR, + typename... VARIANT> +RT_DEVICE_NOINLINE_HOST_INLINE RT_API_ATTRS RESULT Log2VisitHelper( + VISITOR &&visitor, std::size_t which, VARIANT &&...u) { + if constexpr (LOW + 7 >= HIGH) { + switch (which - LOW) { +#define VISIT_CASE_N(N) \ + case N: \ + if constexpr (LOW + N <= HIGH) { \ + return visitor(std::get<(LOW + N)>(std::forward<VARIANT>(u))...); \ + } + VISIT_CASE_N(1) + [[fallthrough]]; + VISIT_CASE_N(2) + [[fallthrough]]; + VISIT_CASE_N(3) + [[fallthrough]]; + VISIT_CASE_N(4) + [[fallthrough]]; + VISIT_CASE_N(5) + [[fallthrough]]; + VISIT_CASE_N(6) + [[fallthrough]]; + VISIT_CASE_N(7) +#undef VISIT_CASE_N + } + return visitor(std::get<LOW>(std::forward<VARIANT>(u))...); + } else { + static constexpr std::size_t mid{(HIGH + LOW) / 2}; + if (which <= mid) { + return Log2VisitHelper<LOW, mid, RESULT>( + std::forward<VISITOR>(visitor), which, std::forward<VARIANT>(u)...); + } else { + return Log2VisitHelper<(mid + 1), HIGH, RESULT>( + std::forward<VISITOR>(visitor), which, std::forward<VARIANT>(u)...); + } + } +} + +template <typename VISITOR, typename... VARIANT> +RT_DEVICE_NOINLINE_HOST_INLINE RT_API_ATTRS auto +visit(VISITOR &&visitor, VARIANT &&...u) -> decltype(visitor(std::get<0>( + std::forward<VARIANT>(u))...)) { + using Result = decltype(visitor(std::get<0>(std::forward<VARIANT>(u))...)); + if constexpr (sizeof...(u) == 1) { + static constexpr std::size_t high{ + (std::variant_size_v<std::decay_t<decltype(u)>> * ...) - 1}; + return Log2VisitHelper<0, high, Result>(std::forward<VISITOR>(visitor), + u.index()..., std::forward<VARIANT>(u)...); + } else { + // TODO: figure out how to do multiple variant arguments + return ::std::visit( + std::forward<VISITOR>(visitor), std::forward<VARIANT>(u)...); + } +} + +} // namespace log2visit + +// Some versions of clang have bugs that cause compilation to hang +// on these templates. MSVC and older GCC versions may work but are +// not well tested. So enable only for GCC 9 and better. +#if __GNUC__ < 9 && !defined(__clang__) +#define FLANG_USE_STD_VISIT +#endif + +#ifdef FLANG_USE_STD_VISIT +using ::std::visit; +#else +using Fortran::common::log2visit::visit; +#endif + +} // namespace Fortran::common +#endif // FORTRAN_COMMON_VISIT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Common/windows-include.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/windows-include.h new file mode 100644 index 00000000000..01bc6fc9eb9 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Common/windows-include.h @@ -0,0 +1,29 @@ +//===-- include/flang/Common/windows-include.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Wrapper around windows.h that works around the name conflicts. +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_COMMON_WINDOWS_INCLUDE_H_ +#define FORTRAN_COMMON_WINDOWS_INCLUDE_H_ + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX + +// Target Windows 2000 and above. This is needed for newer Windows API +// functions, e.g. GetComputerNameExA() +#define _WIN32_WINNT 0x0500 + +#include <windows.h> + +#endif // _WIN32 + +#endif // FORTRAN_COMMON_WINDOWS_INCLUDE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Decimal/binary-floating-point.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Decimal/binary-floating-point.h new file mode 100644 index 00000000000..1e0cde97d98 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Decimal/binary-floating-point.h @@ -0,0 +1,211 @@ +//===-- include/flang/Decimal/binary-floating-point.h -----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_DECIMAL_BINARY_FLOATING_POINT_H_ +#define FORTRAN_DECIMAL_BINARY_FLOATING_POINT_H_ + +// Access and manipulate the fields of an IEEE-754 binary +// floating-point value via a generalized template. + +#include "flang/Common/api-attrs.h" +#include "flang/Common/real.h" +#include "flang/Common/uint128.h" +#include <cinttypes> +#include <climits> +#include <cstring> +#include <type_traits> + +namespace Fortran::decimal { + +enum FortranRounding { + RoundNearest, /* RN and RP */ + RoundUp, /* RU */ + RoundDown, /* RD */ + RoundToZero, /* RZ - no rounding */ + RoundCompatible, /* RC: like RN, but ties go away from 0 */ +}; + +template <int BINARY_PRECISION> class BinaryFloatingPointNumber { +public: + static constexpr common::RealCharacteristics realChars{BINARY_PRECISION}; + static constexpr int binaryPrecision{BINARY_PRECISION}; + static constexpr int bits{realChars.bits}; + static constexpr int isImplicitMSB{realChars.isImplicitMSB}; + static constexpr int significandBits{realChars.significandBits}; + static constexpr int exponentBits{realChars.exponentBits}; + static constexpr int exponentBias{realChars.exponentBias}; + static constexpr int maxExponent{realChars.maxExponent}; + static constexpr int decimalPrecision{realChars.decimalPrecision}; + static constexpr int decimalRange{realChars.decimalRange}; + static constexpr int maxDecimalConversionDigits{ + realChars.maxDecimalConversionDigits}; + + using RawType = common::HostUnsignedIntType<bits>; + static_assert(CHAR_BIT * sizeof(RawType) >= bits); + RT_OFFLOAD_VAR_GROUP_BEGIN + static constexpr RawType significandMask{(RawType{1} << significandBits) - 1}; + + constexpr RT_API_ATTRS BinaryFloatingPointNumber() {} // zero + RT_OFFLOAD_VAR_GROUP_END + constexpr BinaryFloatingPointNumber( + const BinaryFloatingPointNumber &that) = default; + constexpr BinaryFloatingPointNumber( + BinaryFloatingPointNumber &&that) = default; + constexpr BinaryFloatingPointNumber &operator=( + const BinaryFloatingPointNumber &that) = default; + constexpr BinaryFloatingPointNumber &operator=( + BinaryFloatingPointNumber &&that) = default; + constexpr explicit RT_API_ATTRS BinaryFloatingPointNumber(RawType raw) + : raw_{raw} {} + + RT_API_ATTRS RawType raw() const { return raw_; } + + template <typename A> + explicit constexpr RT_API_ATTRS BinaryFloatingPointNumber(A x) { + static_assert(sizeof raw_ <= sizeof x); + std::memcpy(reinterpret_cast<void *>(&raw_), + reinterpret_cast<const void *>(&x), sizeof raw_); + } + + constexpr RT_API_ATTRS int BiasedExponent() const { + return static_cast<int>( + (raw_ >> significandBits) & ((1 << exponentBits) - 1)); + } + constexpr RT_API_ATTRS int UnbiasedExponent() const { + int biased{BiasedExponent()}; + return biased - exponentBias + (biased == 0); + } + constexpr RT_API_ATTRS RawType Significand() const { + return raw_ & significandMask; + } + constexpr RT_API_ATTRS RawType Fraction() const { + RawType sig{Significand()}; + if (isImplicitMSB && BiasedExponent() > 0) { + sig |= RawType{1} << significandBits; + } + return sig; + } + + constexpr RT_API_ATTRS bool IsZero() const { + return (raw_ & ((RawType{1} << (bits - 1)) - 1)) == 0; + } + constexpr RT_API_ATTRS bool IsNaN() const { + auto expo{BiasedExponent()}; + auto sig{Significand()}; + if constexpr (bits == 80) { // x87 + if (expo == maxExponent) { + return sig != (significandMask >> 1) + 1; + } else { + return expo != 0 && !(sig & (RawType{1} << (significandBits - 1))); + ; + } + } else { + return expo == maxExponent && sig != 0; + } + } + constexpr RT_API_ATTRS bool IsInfinite() const { + if constexpr (bits == 80) { // x87 + return BiasedExponent() == maxExponent && + Significand() == ((significandMask >> 1) + 1); + } else { + return BiasedExponent() == maxExponent && Significand() == 0; + } + } + constexpr RT_API_ATTRS bool IsMaximalFiniteMagnitude() const { + return BiasedExponent() == maxExponent - 1 && + Significand() == significandMask; + } + constexpr RT_API_ATTRS bool IsNegative() const { + return ((raw_ >> (bits - 1)) & 1) != 0; + } + + constexpr RT_API_ATTRS void Negate() { raw_ ^= RawType{1} << (bits - 1); } + + // For calculating the nearest neighbors of a floating-point value + constexpr RT_API_ATTRS void Previous() { + RemoveExplicitMSB(); + --raw_; + InsertExplicitMSB(); + } + constexpr RT_API_ATTRS void Next() { + RemoveExplicitMSB(); + ++raw_; + InsertExplicitMSB(); + } + + static constexpr RT_API_ATTRS BinaryFloatingPointNumber Infinity( + bool isNegative) { + RawType result{RawType{maxExponent} << significandBits}; + if (isNegative) { + result |= RawType{1} << (bits - 1); + } + return BinaryFloatingPointNumber{result}; + } + + // Returns true when the result is exact + constexpr RT_API_ATTRS bool RoundToBits( + int keepBits, enum FortranRounding mode) { + if (IsNaN() || IsInfinite() || keepBits >= binaryPrecision) { + return true; + } + int lostBits{keepBits < binaryPrecision ? binaryPrecision - keepBits : 0}; + RawType lostMask{static_cast<RawType>((RawType{1} << lostBits) - 1)}; + if (RawType lost{static_cast<RawType>(raw_ & lostMask)}; lost != 0) { + bool increase{false}; + switch (mode) { + case RoundNearest: + if (lost >> (lostBits - 1) != 0) { // >= tie + if ((lost & (lostMask >> 1)) != 0) { + increase = true; // > tie + } else { + increase = ((raw_ >> lostBits) & 1) != 0; // tie to even + } + } + break; + case RoundUp: + increase = !IsNegative(); + break; + case RoundDown: + increase = IsNegative(); + break; + case RoundToZero: + break; + case RoundCompatible: + increase = lost >> (lostBits - 1) != 0; // >= tie + break; + } + if (increase) { + raw_ |= lostMask; + Next(); + } + return false; // inexact + } else { + return true; // exact + } + } + +private: + constexpr RT_API_ATTRS void RemoveExplicitMSB() { + if constexpr (!isImplicitMSB) { + raw_ = (raw_ & (significandMask >> 1)) | ((raw_ & ~significandMask) >> 1); + } + } + constexpr RT_API_ATTRS void InsertExplicitMSB() { + if constexpr (!isImplicitMSB) { + constexpr RawType mask{significandMask >> 1}; + raw_ = (raw_ & mask) | ((raw_ & ~mask) << 1); + if (BiasedExponent() > 0) { + raw_ |= RawType{1} << (significandBits - 1); + } + } + } + + RawType raw_{0}; +}; +} // namespace Fortran::decimal +#endif diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Decimal/decimal.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Decimal/decimal.h new file mode 100644 index 00000000000..5e81e47a182 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Decimal/decimal.h @@ -0,0 +1,146 @@ +/*===-- include/flang/Decimal/decimal.h ---------------------------*- C++ -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + * ===-----------------------------------------------------------------------=== + */ + +/* C and C++ API for binary-to/from-decimal conversion package. */ + +#ifndef FORTRAN_DECIMAL_DECIMAL_H_ +#define FORTRAN_DECIMAL_DECIMAL_H_ + +#include "flang/Common/api-attrs.h" +#include <stddef.h> + +#ifdef __cplusplus +// Binary-to-decimal conversions (formatting) produce a sequence of decimal +// digit characters in a NUL-terminated user-supplied buffer that constitute +// a decimal fraction (or zero), accompanied by a decimal exponent that +// you'll get to adjust and format yourself. There can be a leading sign +// character. +// Negative zero is "-0". The result can also be "NaN", "Inf", "+Inf", +// or "-Inf". +// If the conversion can't fit in the user-supplied buffer, a null pointer +// is returned. + +#include "binary-floating-point.h" +namespace Fortran::decimal { +#endif /* C++ */ + +enum ConversionResultFlags { + Exact = 0, + Overflow = 1, + Inexact = 2, + Invalid = 4, + Underflow = 8, +}; + +struct ConversionToDecimalResult { + const char *str; /* may not be original buffer pointer; null if overflow */ + size_t length; /* does not include NUL terminator */ + int decimalExponent; /* assuming decimal point to the left of first digit */ + enum ConversionResultFlags flags; +}; + +/* The "minimize" flag causes the fewest number of output digits + * to be emitted such that reading them back into the same binary + * floating-point format with RoundNearest will return the same + * value. + */ +enum DecimalConversionFlags { + Minimize = 1, /* Minimize # of digits */ + AlwaysSign = 2, /* emit leading '+' if not negative */ +}; + +/* + * When allocating decimal conversion output buffers, use the maximum + * number of significant decimal digits in the representation of the + * least nonzero value, and add this extra space for a sign, a NUL, and + * some extra due to the library working internally in base 10**16 + * and computing its output size in multiples of 16. + */ +#define EXTRA_DECIMAL_CONVERSION_SPACE (1 + 1 + 2 * 16 - 1) + +#ifdef __cplusplus + +RT_OFFLOAD_API_GROUP_BEGIN + +template <int PREC> +RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal(char *, size_t, + DecimalConversionFlags, int digits, enum FortranRounding rounding, + BinaryFloatingPointNumber<PREC> x); + +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<8>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<8>); +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<11>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<11>); +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<24>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<24>); +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<53>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<53>); +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<64>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<64>); +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<113>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<113>); + +template <int PREC> struct ConversionToBinaryResult { + BinaryFloatingPointNumber<PREC> binary; + enum ConversionResultFlags flags { Exact }; +}; + +template <int PREC> +RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(const char *&, + enum FortranRounding = RoundNearest, const char *end = nullptr); + +extern template RT_API_ATTRS ConversionToBinaryResult<8> ConvertToBinary<8>( + const char *&, enum FortranRounding, const char *end); +extern template RT_API_ATTRS ConversionToBinaryResult<11> ConvertToBinary<11>( + const char *&, enum FortranRounding, const char *end); +extern template RT_API_ATTRS ConversionToBinaryResult<24> ConvertToBinary<24>( + const char *&, enum FortranRounding, const char *end); +extern template RT_API_ATTRS ConversionToBinaryResult<53> ConvertToBinary<53>( + const char *&, enum FortranRounding, const char *end); +extern template RT_API_ATTRS ConversionToBinaryResult<64> ConvertToBinary<64>( + const char *&, enum FortranRounding, const char *end); +extern template RT_API_ATTRS ConversionToBinaryResult<113> ConvertToBinary<113>( + const char *&, enum FortranRounding, const char *end); + +RT_OFFLOAD_API_GROUP_END + +} // namespace Fortran::decimal +extern "C" { +#define NS(x) Fortran::decimal::x +#else /* C++ */ +#define NS(x) x +#endif /* C++ */ + +RT_API_ATTRS struct NS(ConversionToDecimalResult) + ConvertFloatToDecimal(char *, size_t, enum NS(DecimalConversionFlags), + int digits, enum NS(FortranRounding), float); +RT_API_ATTRS struct NS(ConversionToDecimalResult) + ConvertDoubleToDecimal(char *, size_t, enum NS(DecimalConversionFlags), + int digits, enum NS(FortranRounding), double); +RT_API_ATTRS struct NS(ConversionToDecimalResult) + ConvertLongDoubleToDecimal(char *, size_t, enum NS(DecimalConversionFlags), + int digits, enum NS(FortranRounding), long double); + +RT_API_ATTRS enum NS(ConversionResultFlags) + ConvertDecimalToFloat(const char **, float *, enum NS(FortranRounding)); +RT_API_ATTRS enum NS(ConversionResultFlags) + ConvertDecimalToDouble(const char **, double *, enum NS(FortranRounding)); +RT_API_ATTRS enum NS(ConversionResultFlags) ConvertDecimalToLongDouble( + const char **, long double *, enum NS(FortranRounding)); +#undef NS +#ifdef __cplusplus +} // extern "C" +#endif +#endif diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/ISO_Fortran_binding.h b/contrib/libs/llvm/flang-rt/flang/include/flang/ISO_Fortran_binding.h new file mode 100644 index 00000000000..f5b8d0d2ea6 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/ISO_Fortran_binding.h @@ -0,0 +1,215 @@ +/*===-- include/flang/ISO_Fortran_binding.h -----------------------*- C++ -*-=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + * ===-----------------------------------------------------------------------=== + */ + +#ifndef CFI_ISO_FORTRAN_BINDING_H_ +#define CFI_ISO_FORTRAN_BINDING_H_ + +/* When this header is included into the compiler and runtime implementations, + * it does so by means of a wrapper header that establishes namespaces and + * a macro for extra function attributes (RT_API_ATTRS). + */ +#ifndef FORTRAN_COMMON_ISO_FORTRAN_BINDING_WRAPPER_H_ +#include <stddef.h> +#define FORTRAN_ISO_NAMESPACE_ +#endif + +/* Standard interface to Fortran from C and C++. + * These interfaces are named in subclause 18.5 of the Fortran 2018 + * standard, with most of the actual details being left to the + * implementation. + */ + +#ifndef RT_API_ATTRS +#define RT_API_ATTRS +#endif + +/* 18.5.4 */ +#define CFI_VERSION 20240719 + +#if !defined CFI_MAX_RANK || !defined __OVERRIDE_CFI_MAX_RANK +#define CFI_MAX_RANK 15 +#endif +typedef unsigned char CFI_rank_t; + +/* This type is probably larger than a default Fortran INTEGER + * and should be used for all array indexing and loop bound calculations. + */ +typedef ptrdiff_t CFI_index_t; + +typedef unsigned char CFI_attribute_t; +#define CFI_attribute_pointer 1 +#define CFI_attribute_allocatable 2 +#define CFI_attribute_other 0 /* neither pointer nor allocatable */ + +typedef signed char CFI_type_t; +/* These codes are required to be macros (i.e., #ifdef will work). + * They are not required to be distinct, but neither are they required + * to have had their synonyms combined. + */ +#define CFI_type_signed_char 1 +#define CFI_type_short 2 +#define CFI_type_int 3 +#define CFI_type_long 4 +#define CFI_type_long_long 5 +#define CFI_type_size_t 6 +#define CFI_type_int8_t 7 +#define CFI_type_int16_t 8 +#define CFI_type_int32_t 9 +#define CFI_type_int64_t 10 +#define CFI_type_int128_t 11 /* extension kind=16 */ +#define CFI_type_int_least8_t 12 +#define CFI_type_int_least16_t 13 +#define CFI_type_int_least32_t 14 +#define CFI_type_int_least64_t 15 +#define CFI_type_int_least128_t 16 /* extension */ +#define CFI_type_int_fast8_t 17 +#define CFI_type_int_fast16_t 18 +#define CFI_type_int_fast32_t 19 +#define CFI_type_int_fast64_t 20 +#define CFI_type_int_fast128_t 21 /* extension */ +#define CFI_type_intmax_t 22 +#define CFI_type_intptr_t 23 +#define CFI_type_ptrdiff_t 24 +#define CFI_type_half_float 25 /* extension: kind=2 */ +#define CFI_type_bfloat 26 /* extension: kind=3 */ +#define CFI_type_float 27 +#define CFI_type_double 28 +#define CFI_type_extended_double 29 /* extension: kind=10 */ +#define CFI_type_long_double 30 +#define CFI_type_float128 31 /* extension: kind=16 */ +#define CFI_type_half_float_Complex 32 /* extension: kind=2 */ +#define CFI_type_bfloat_Complex 33 /* extension: kind=3 */ +#define CFI_type_float_Complex 34 +#define CFI_type_double_Complex 35 +#define CFI_type_extended_double_Complex 36 /* extension: kind=10 */ +#define CFI_type_long_double_Complex 37 +#define CFI_type_float128_Complex 38 /* extension: kind=16 */ +#define CFI_type_Bool 39 +#define CFI_type_char 40 +#define CFI_type_cptr 41 +#define CFI_type_struct 42 +#define CFI_type_char16_t 43 /* extension kind=2 */ +#define CFI_type_char32_t 44 /* extension kind=4 */ +#define CFI_type_uint8_t 45 /* extension: unsigned */ +#define CFI_type_uint16_t 46 +#define CFI_type_uint32_t 47 +#define CFI_type_uint64_t 48 +#define CFI_type_uint128_t 49 +#define CFI_TYPE_LAST CFI_type_uint128_t +#define CFI_type_other (-1) // must be negative + +/* Error code macros - skip some of the small values to avoid conflicts with + * other status codes mandated by the standard, e.g. those returned by + * GET_ENVIRONMENT_VARIABLE (16.9.84) */ +#define CFI_SUCCESS 0 /* must be zero */ +#define CFI_ERROR_BASE_ADDR_NULL 11 +#define CFI_ERROR_BASE_ADDR_NOT_NULL 12 +#define CFI_INVALID_ELEM_LEN 13 +#define CFI_INVALID_RANK 14 +#define CFI_INVALID_TYPE 15 +#define CFI_INVALID_ATTRIBUTE 16 +#define CFI_INVALID_EXTENT 17 +#define CFI_INVALID_DESCRIPTOR 18 +#define CFI_ERROR_MEM_ALLOCATION 19 +#define CFI_ERROR_OUT_OF_BOUNDS 20 + +/* 18.5.2 per-dimension information */ +typedef struct CFI_dim_t { + CFI_index_t lower_bound; + CFI_index_t extent; /* == -1 for assumed size */ + CFI_index_t sm; /* memory stride in bytes */ +} CFI_dim_t; + +#ifdef __cplusplus +namespace cfi_internal { +// C++ does not support flexible array. +// The below structure emulates a flexible array. This structure does not take +// care of getting the memory storage. Note that it already contains one element +// because a struct cannot be empty. +extern "C++" template <typename T> struct FlexibleArray : T { + RT_API_ATTRS T &operator[](int index) { return *(this + index); } + RT_API_ATTRS const T &operator[](int index) const { return *(this + index); } + RT_API_ATTRS operator T *() { return this; } + RT_API_ATTRS operator const T *() const { return this; } +}; +} // namespace cfi_internal +#endif + +/* 18.5.3 generic data descriptor */ + +/* Descriptor header members */ +#define _CFI_CDESC_T_HEADER_MEMBERS \ + /* These three members must appear first, \ + * in exactly this order. */ \ + void *base_addr; \ + size_t elem_len; /* element size in bytes */ \ + int version; /* == CFI_VERSION */ \ + CFI_rank_t rank; /* [0 .. CFI_MAX_RANK] */ \ + CFI_type_t type; \ + CFI_attribute_t attribute; \ + /* This encodes both the presence of the f18Addendum and the index of the \ + * allocator used to managed memory of the data hold by the descriptor. */ \ + unsigned char extra; + +typedef struct CFI_cdesc_t { + _CFI_CDESC_T_HEADER_MEMBERS +#ifdef __cplusplus + cfi_internal::FlexibleArray<CFI_dim_t> dim; +#else + CFI_dim_t dim[]; /* must appear last */ +#endif +} CFI_cdesc_t; + +/* 18.5.4 */ +#ifdef __cplusplus +// This struct acquires the additional storage, if any is +// needed, for C++'s CFI_cdesc_t's emulated flexible +// dim[] array. +namespace cfi_internal { +extern "C++" template <int r> struct CdescStorage : public CFI_cdesc_t { + static_assert((r > 1 && r <= CFI_MAX_RANK), "CFI_INVALID_RANK"); + CFI_dim_t dim[r - 1]; +}; +extern "C++" template <> struct CdescStorage<1> : public CFI_cdesc_t {}; +extern "C++" template <> struct CdescStorage<0> : public CFI_cdesc_t {}; +} // namespace cfi_internal +#define CFI_CDESC_T(rank) \ + FORTRAN_ISO_NAMESPACE_::cfi_internal::CdescStorage<rank> +#else +#define CFI_CDESC_T(_RANK) \ + struct { \ + _CFI_CDESC_T_HEADER_MEMBERS \ + CFI_dim_t dim[_RANK]; \ + } +#endif + +/* 18.5.5 procedural interfaces*/ +#ifdef __cplusplus +extern "C" { +#endif +RT_API_ATTRS void *CFI_address( + const CFI_cdesc_t *, const CFI_index_t subscripts[]); +RT_API_ATTRS int CFI_allocate(CFI_cdesc_t *, const CFI_index_t lower_bounds[], + const CFI_index_t upper_bounds[], size_t elem_len); +RT_API_ATTRS int CFI_deallocate(CFI_cdesc_t *); +RT_API_ATTRS int CFI_establish(CFI_cdesc_t *, void *base_addr, CFI_attribute_t, + CFI_type_t, size_t elem_len, CFI_rank_t, const CFI_index_t extents[]); +RT_API_ATTRS int CFI_is_contiguous(const CFI_cdesc_t *); +RT_API_ATTRS int CFI_section(CFI_cdesc_t *, const CFI_cdesc_t *source, + const CFI_index_t lower_bounds[], const CFI_index_t upper_bounds[], + const CFI_index_t strides[]); +RT_API_ATTRS int CFI_select_part(CFI_cdesc_t *, const CFI_cdesc_t *source, + size_t displacement, size_t elem_len); +RT_API_ATTRS int CFI_setpointer( + CFI_cdesc_t *, const CFI_cdesc_t *source, const CFI_index_t lower_bounds[]); +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* CFI_ISO_FORTRAN_BINDING_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/allocatable.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/allocatable.h new file mode 100644 index 00000000000..863c07494e7 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/allocatable.h @@ -0,0 +1,133 @@ +//===-- include/flang/Runtime/allocatable.h ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines APIs for Fortran runtime library support of code generated +// to manipulate and query allocatable variables, dummy arguments, & components. +#ifndef FORTRAN_RUNTIME_ALLOCATABLE_H_ +#define FORTRAN_RUNTIME_ALLOCATABLE_H_ + +#include "flang/Runtime/descriptor-consts.h" +#include "flang/Runtime/entry-names.h" + +namespace Fortran::runtime { + +extern "C" { + +// Initializes the descriptor for an allocatable of intrinsic or derived type. +// The incoming descriptor is treated as (and can be) uninitialized garbage. +// Must be called for each allocatable variable as its scope comes into being. +// The storage for the allocatable's descriptor must have already been +// allocated to a size sufficient for the rank, corank, and type. +// A descriptor must be initialized before being used for any purpose, +// but needs reinitialization in a deallocated state only when there is +// a change of type, rank, or corank. +void RTDECL(AllocatableInitIntrinsic)( + Descriptor &, TypeCategory, int kind, int rank = 0, int corank = 0); +void RTDECL(AllocatableInitCharacter)(Descriptor &, SubscriptValue length = 0, + int kind = 1, int rank = 0, int corank = 0); +void RTDECL(AllocatableInitDerived)( + Descriptor &, const typeInfo::DerivedType &, int rank = 0, int corank = 0); + +// Initializes the descriptor for an allocatable of intrinsic or derived type. +// These functions are meant to be used in the allocate statement lowering. If +// the descriptor is allocated, the initialization is skiped so the error +// handling can be done by AllocatableAllocate. +void RTDECL(AllocatableInitIntrinsicForAllocate)( + Descriptor &, TypeCategory, int kind, int rank = 0, int corank = 0); +void RTDECL(AllocatableInitCharacterForAllocate)(Descriptor &, + SubscriptValue length = 0, int kind = 1, int rank = 0, int corank = 0); +void RTDECL(AllocatableInitDerivedForAllocate)( + Descriptor &, const typeInfo::DerivedType &, int rank = 0, int corank = 0); + +// Checks that an allocatable is not already allocated in statements +// with STAT=. Use this on a value descriptor before setting bounds or +// type parameters. Not necessary on a freshly initialized descriptor. +// (If there's no STAT=, the error will be caught later anyway, but +// this API allows the error to be caught before descriptor is modified.) +// Return 0 on success (deallocated state), else the STAT= value. +int RTDECL(AllocatableCheckAllocated)(Descriptor &, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); + +// For MOLD= allocation; sets bounds, cobounds, and length type +// parameters from another descriptor. The destination descriptor must +// be initialized and deallocated. +void RTDECL(AllocatableApplyMold)( + Descriptor &, const Descriptor &mold, int rank = 0); + +// Explicitly sets the bounds and length type parameters of an initialized +// deallocated allocatable. +void RTDECL(AllocatableSetBounds)( + Descriptor &, int zeroBasedDim, SubscriptValue lower, SubscriptValue upper); + +// The upper cobound is ignored for the last codimension. +void RTDECL(AllocatableSetCoBounds)(Descriptor &, int zeroBasedCoDim, + SubscriptValue lower, SubscriptValue upper = 0); + +// Length type parameters are indexed in declaration order; i.e., 0 is the +// first length type parameter in the deepest base type. (Not for use +// with CHARACTER; see above.) +void RTDECL(AllocatableSetDerivedLength)( + Descriptor &, int which, SubscriptValue); + +// When an explicit type-spec appears in an ALLOCATE statement for an +// allocatable with an explicit (non-deferred) length type paramater for +// a derived type or CHARACTER value, the explicit value has to match +// the length type parameter's value. This API checks that requirement. +// Returns 0 for success, or the STAT= value on failure with hasStat==true. +int RTDECL(AllocatableCheckLengthParameter)(Descriptor &, + int which /* 0 for CHARACTER length */, SubscriptValue other, + bool hasStat = false, const Descriptor *errMsg = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Allocates an allocatable. The allocatable descriptor must have been +// initialized and its bounds and length type parameters set and must be +// in a deallocated state. +// On failure, if hasStat is true, returns a nonzero error code for +// STAT= and (if present) fills in errMsg; if hasStat is false, the +// image is terminated. On success, leaves errMsg alone and returns zero. +// Successfully allocated memory is initialized if the allocatable has a +// derived type, and is always initialized by AllocatableAllocateSource(). +// Performs all necessary coarray synchronization and validation actions. +int RTDECL(AllocatableAllocate)(Descriptor &, + std::int64_t *asyncObject = nullptr, bool hasStat = false, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); +int RTDECL(AllocatableAllocateSource)(Descriptor &, const Descriptor &source, + bool hasStat = false, const Descriptor *errMsg = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Implements the intrinsic subroutine MOVE_ALLOC (16.9.137 in F'2018, +// but note the order of first two arguments is reversed for consistency +// with the other APIs for allocatables.) The destination descriptor +// must be initialized. +std::int32_t RTDECL(MoveAlloc)(Descriptor &to, Descriptor &from, + const typeInfo::DerivedType *, bool hasStat = false, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Deallocates an allocatable. Finalizes elements &/or components as needed. +// The allocatable is left in an initialized state suitable for reallocation +// with the same bounds, cobounds, and length type parameters. +int RTDECL(AllocatableDeallocate)(Descriptor &, bool hasStat = false, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Same as AllocatableDeallocate but also set the dynamic type as the declared +// type as mentioned in 7.3.2.3 note 7. +int RTDECL(AllocatableDeallocatePolymorphic)(Descriptor &, + const typeInfo::DerivedType *, bool hasStat = false, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Variant of above that does not finalize; for intermediate results +void RTDECL(AllocatableDeallocateNoFinal)( + Descriptor &, const char *sourceFile = nullptr, int sourceLine = 0); +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_ALLOCATABLE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/allocator-registry-consts.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/allocator-registry-consts.h new file mode 100644 index 00000000000..70735c2fc7a --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/allocator-registry-consts.h @@ -0,0 +1,20 @@ +//===-- include/flang/Runtime/allocator-registry-consts.h -------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_CONSTS_H_ +#define FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_CONSTS_H_ + +static constexpr unsigned kDefaultAllocator = 0; + +// Allocator used for CUF +static constexpr unsigned kPinnedAllocatorPos = 1; +static constexpr unsigned kDeviceAllocatorPos = 2; +static constexpr unsigned kManagedAllocatorPos = 3; +static constexpr unsigned kUnifiedAllocatorPos = 4; + +#endif /* FORTRAN_RUNTIME_ALLOCATOR_REGISTRY_CONSTS_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/array-constructor-consts.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/array-constructor-consts.h new file mode 100644 index 00000000000..ad3583eef29 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/array-constructor-consts.h @@ -0,0 +1,97 @@ +//===-- include/flang/Runtime/array-constructor-consts.h --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_CONSTS_H_ +#define FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_CONSTS_H_ + +#include "flang/Runtime/descriptor-consts.h" +#include "flang/Runtime/entry-names.h" +#include <cstdint> + +namespace Fortran::runtime { +struct ArrayConstructorVector; + +// Max sizeof(ArrayConstructorVector) and sizeof(ArrayConstructorVector) for any +// target. +// TODO: Use target-specific size/alignment instead of overapproximation. +constexpr std::size_t MaxArrayConstructorVectorSizeInBytes = 2 * 40; +constexpr std::size_t MaxArrayConstructorVectorAlignInBytes = 8; + +// This file defines an API to "push" an evaluated array constructor value +// "from" into some storage "to" of an array constructor. It can be seen as a +// form of std::vector::push_back() implementation for Fortran array +// constructors. In the APIs and ArrayConstructorVector struct above: +// +// - "to" is a ranked-1 descriptor whose declared type is already set to the +// array constructor derived type. It may be already allocated, even before the +// first call to this API, or it may be unallocated. "to" extent is increased +// every time a "from" is pushed past its current extent. At this end of the +// API calls, its extent is the extent of the array constructor. If "to" is +// unallocated and its extent is not null, it is assumed this is the final array +// constructor extent value, and the first allocation already "reserves" storage +// space accordingly to avoid reallocations. +// - "from" is a scalar or array descriptor for the evaluated array +// constructor value that must be copied into the storage of "to" at +// "nextValuePosition". +// - "useValueLengthParameters" must be set to true if the array constructor +// has length parameters and no type spec. If it is true and "to" is +// unallocated, "to" will take the length parameters of "from". If it is true +// and "to" is an allocated character array constructor, it will be checked +// that "from" length matches the one from "to". When it is false, the +// character length must already be set in "to" before the first call to this +// API and "from" character lengths are allowed to mismatch from "to". +// - "nextValuePosition" is the zero based sequence position of "from" in the +// array constructor. It is updated after this call by the number of "from" +// elements. It should be set to zero by the caller of this API before the first +// call. +// - "actualAllocationSize" is the current allocation size of "to" storage. It +// may be bigger than "to" extent for reallocation optimization purposes, but +// should never be smaller, unless this is the first call and "to" is +// unallocated. It is updated by the runtime after each successful allocation or +// reallocation. It should be set to "to" extent if "to" is allocated before the +// first call of this API, and can be left undefined otherwise. +// +// Note that this API can be used with "to" being a variable (that can be +// discontiguous). This can be done when the variable is the left hand side of +// an assignment from an array constructor as long as: +// - none of the ac-value overlaps with the variable, +// - this is an intrinsic assignment that is not a whole allocatable +// assignment, *and* for a type that has no components requiring user defined +// assignments, +// - the variable is properly finalized before using this API if its need to, +// - "useValueLengthParameters" should be set to false in this case, even if +// the array constructor has no type-spec, since the variable may have a +// different character length than the array constructor values. + +extern "C" { +// API to initialize an ArrayConstructorVector before any values are pushed to +// it. Inlined code is only expected to allocate the "ArrayConstructorVector" +// class instance storage with sufficient size +// (MaxArrayConstructorVectorSizeInBytes is expected to be large enough for all +// supported targets). This avoids the need for the runtime to maintain a state, +// or to use dynamic allocation for it. +void RTDECL(InitArrayConstructorVector)(ArrayConstructorVector &vector, + Descriptor &to, bool useValueLengthParameters, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Generic API to push any kind of entity into the array constructor (any +// Fortran type and any rank). +void RTDECL(PushArrayConstructorValue)( + ArrayConstructorVector &vector, const Descriptor &from); + +// API to push scalar array constructor value of: +// - a numerical or logical type, +// - or a derived type that has no length parameters, and no allocatable +// component (that would require deep copies). +// It requires no descriptor for the value that is passed via its base address. +void RTDECL(PushArrayConstructorSimpleScalar)( + ArrayConstructorVector &vector, void *from); +} // extern "C" +} // namespace Fortran::runtime + +#endif /* FORTRAN_RUNTIME_ARRAY_CONSTRUCTOR_CONSTS_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/assign.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/assign.h new file mode 100644 index 00000000000..7d198bdcc9e --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/assign.h @@ -0,0 +1,85 @@ +//===-- include/flang/Runtime/assign.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// External APIs for data assignment (both intrinsic assignment and TBP defined +// generic ASSIGNMENT(=)). Should be called by lowering for any assignments +// possibly needing special handling. Intrinsic assignment to non-allocatable +// variables whose types are intrinsic need not come through here (though they +// may do so). Assignments to allocatables, and assignments whose types may be +// polymorphic or are monomorphic and of derived types with finalization, +// allocatable components, or components with type-bound defined assignments, in +// the original type or the types of its non-pointer components (recursively) +// must arrive here. +// +// Non-type-bound generic INTERFACE ASSIGNMENT(=) is resolved in semantics and +// need not be handled here in the runtime apart from derived type components; +// ditto for type conversions on intrinsic assignments. + +#ifndef FORTRAN_RUNTIME_ASSIGN_H_ +#define FORTRAN_RUNTIME_ASSIGN_H_ + +#include "flang/Runtime/entry-names.h" +#include "flang/Runtime/freestanding-tools.h" + +namespace Fortran::runtime { +class Descriptor; +class Terminator; + +enum AssignFlags { + NoAssignFlags = 0, + MaybeReallocate = 1 << 0, + NeedFinalization = 1 << 1, + CanBeDefinedAssignment = 1 << 2, + ComponentCanBeDefinedAssignment = 1 << 3, + ExplicitLengthCharacterLHS = 1 << 4, + PolymorphicLHS = 1 << 5, + DeallocateLHS = 1 << 6, + UpdateLHSBounds = 1 << 7, +}; + +#ifdef RT_DEVICE_COMPILATION +RT_API_ATTRS void Assign(Descriptor &to, const Descriptor &from, + Terminator &terminator, int flags, MemmoveFct memmoveFct = &MemmoveWrapper); +#else +RT_API_ATTRS void Assign(Descriptor &to, const Descriptor &from, + Terminator &terminator, int flags, + MemmoveFct memmoveFct = &Fortran::runtime::memmove); +#endif + +extern "C" { + +// API for lowering assignment +void RTDECL(Assign)(Descriptor &to, const Descriptor &from, + const char *sourceFile = nullptr, int sourceLine = 0); +// This variant has no finalization, defined assignment, or allocatable +// reallocation. +void RTDECL(AssignTemporary)(Descriptor &to, const Descriptor &from, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Establish "temp" descriptor as an allocatable descriptor with the same type, +// rank, and length parameters as "var" and copy "var" to it using +// AssignTemporary. +void RTDECL(CopyInAssign)(Descriptor &temp, const Descriptor &var, + const char *sourceFile = nullptr, int sourceLine = 0); +// When "var" is provided, copy "temp" to it assuming "var" is already +// initialized. Destroy and deallocate "temp" in all cases. +void RTDECL(CopyOutAssign)(Descriptor *var, Descriptor &temp, + const char *sourceFile = nullptr, int sourceLine = 0); +// This variant is for assignments to explicit-length CHARACTER left-hand +// sides that might need to handle truncation or blank-fill, and +// must maintain the character length even if an allocatable array +// is reallocated. +void RTDECL(AssignExplicitLengthCharacter)(Descriptor &to, + const Descriptor &from, const char *sourceFile = nullptr, + int sourceLine = 0); +// This variant is assignments to whole polymorphic allocatables. +void RTDECL(AssignPolymorphic)(Descriptor &to, const Descriptor &from, + const char *sourceFile = nullptr, int sourceLine = 0); +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_ASSIGN_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/c-or-cpp.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/c-or-cpp.h new file mode 100644 index 00000000000..8bac5239077 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/c-or-cpp.h @@ -0,0 +1,31 @@ +//===-- include/flang/Runtime/c-or-cpp.h ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_C_OR_CPP_H_ +#define FORTRAN_RUNTIME_C_OR_CPP_H_ + +#ifdef __cplusplus +#define IF_CPLUSPLUS(x) x +#define IF_NOT_CPLUSPLUS(x) +#define DEFAULT_VALUE(x) = (x) +#define RESTRICT __restrict +#else +#include <stdbool.h> +#define IF_CPLUSPLUS(x) +#define IF_NOT_CPLUSPLUS(x) x +#define DEFAULT_VALUE(x) +#define RESTRICT restrict +#endif + +#define FORTRAN_EXTERN_C_BEGIN IF_CPLUSPLUS(extern "C" {) +#define FORTRAN_EXTERN_C_END IF_CPLUSPLUS( \ + }) +#define NORETURN IF_CPLUSPLUS([[noreturn]]) +#define NO_ARGUMENTS IF_NOT_CPLUSPLUS(void) + +#endif // FORTRAN_RUNTIME_C_OR_CPP_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/character.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/character.h new file mode 100644 index 00000000000..dd47686fe85 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/character.h @@ -0,0 +1,132 @@ +//===-- include/flang/Runtime/character.h -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines API between compiled code and the CHARACTER +// support functions in the runtime library. + +#ifndef FORTRAN_RUNTIME_CHARACTER_H_ +#define FORTRAN_RUNTIME_CHARACTER_H_ +#include "flang/Runtime/entry-names.h" +#include <cstddef> +#include <cstdint> + +namespace Fortran::runtime { + +class Descriptor; + +template <typename CHAR> +RT_API_ATTRS int CharacterScalarCompare( + const CHAR *x, const CHAR *y, std::size_t xChars, std::size_t yChars); +extern template RT_API_ATTRS int CharacterScalarCompare<char>( + const char *x, const char *y, std::size_t xChars, std::size_t yChars); +extern template RT_API_ATTRS int CharacterScalarCompare<char16_t>( + const char16_t *x, const char16_t *y, std::size_t xChars, + std::size_t yChars); +extern template RT_API_ATTRS int CharacterScalarCompare<char32_t>( + const char32_t *x, const char32_t *y, std::size_t xChars, + std::size_t yChars); + +extern "C" { + +// Appends the corresponding (or expanded) characters of 'operand' +// to the (elements of) a (re)allocation of 'accumulator', which must be an +// initialized CHARACTER allocatable scalar or array descriptor -- use +// AllocatableInitCharacter() to set one up. Crashes when not +// conforming. Assumes independence of data. +void RTDECL(CharacterConcatenate)(Descriptor &accumulator, + const Descriptor &from, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Convenience specialization for ASCII scalars concatenation. +void RTDECL(CharacterConcatenateScalar1)( + Descriptor &accumulator, const char *from, std::size_t chars); + +// CHARACTER comparisons. The kinds must match. Like std::memcmp(), +// the result is less than zero, zero, or greater than zero if the first +// argument is less than the second, equal to the second, or greater than +// the second, respectively. The shorter argument is treated as if it were +// padded on the right with blanks. +// N.B.: Calls to the restricted specific intrinsic functions LGE, LGT, LLE, +// & LLT are converted into calls to these during lowering; they don't have +// to be able to be passed as actual procedure arguments. +int RTDECL(CharacterCompareScalar)(const Descriptor &, const Descriptor &); +int RTDECL(CharacterCompareScalar1)( + const char *x, const char *y, std::size_t xChars, std::size_t yChars); +int RTDECL(CharacterCompareScalar2)(const char16_t *x, const char16_t *y, + std::size_t xChars, std::size_t yChars); +int RTDECL(CharacterCompareScalar4)(const char32_t *x, const char32_t *y, + std::size_t xChars, std::size_t yChars); + +// General CHARACTER comparison; the result is a LOGICAL(KIND=1) array that +// is established and populated. +void RTDECL(CharacterCompare)( + Descriptor &result, const Descriptor &, const Descriptor &); + +// Special-case support for optimized ASCII scalar expressions. + +// Copies data from 'rhs' to the remaining space (lhsLength - offset) +// in 'lhs', if any. Returns the new offset. Assumes independence. +std::size_t RTDECL(CharacterAppend1)(char *lhs, std::size_t lhsBytes, + std::size_t offset, const char *rhs, std::size_t rhsBytes); + +// Appends any necessary spaces to a CHARACTER(KIND=1) scalar. +void RTDECL(CharacterPad1)(char *lhs, std::size_t bytes, std::size_t offset); + +// Intrinsic functions +// The result descriptors below are all established by the runtime. +void RTDECL(Adjustl)(Descriptor &result, const Descriptor &, + const char *sourceFile = nullptr, int sourceLine = 0); +void RTDECL(Adjustr)(Descriptor &result, const Descriptor &, + const char *sourceFile = nullptr, int sourceLine = 0); +std::size_t RTDECL(LenTrim1)(const char *, std::size_t); +std::size_t RTDECL(LenTrim2)(const char16_t *, std::size_t); +std::size_t RTDECL(LenTrim4)(const char32_t *, std::size_t); +void RTDECL(LenTrim)(Descriptor &result, const Descriptor &, int kind, + const char *sourceFile = nullptr, int sourceLine = 0); +void RTDECL(Repeat)(Descriptor &result, const Descriptor &string, + std::int64_t ncopies, const char *sourceFile = nullptr, int sourceLine = 0); +void RTDECL(Trim)(Descriptor &result, const Descriptor &string, + const char *sourceFile = nullptr, int sourceLine = 0); + +void RTDECL(CharacterMax)(Descriptor &accumulator, const Descriptor &x, + const char *sourceFile = nullptr, int sourceLine = 0); +void RTDECL(CharacterMin)(Descriptor &accumulator, const Descriptor &x, + const char *sourceFile = nullptr, int sourceLine = 0); + +std::size_t RTDECL(Index1)(const char *, std::size_t, const char *substring, + std::size_t, bool back = false); +std::size_t RTDECL(Index2)(const char16_t *, std::size_t, + const char16_t *substring, std::size_t, bool back = false); +std::size_t RTDECL(Index4)(const char32_t *, std::size_t, + const char32_t *substring, std::size_t, bool back = false); +void RTDECL(Index)(Descriptor &result, const Descriptor &string, + const Descriptor &substring, const Descriptor *back /*can be null*/, + int kind, const char *sourceFile = nullptr, int sourceLine = 0); + +std::size_t RTDECL(Scan1)( + const char *, std::size_t, const char *set, std::size_t, bool back = false); +std::size_t RTDECL(Scan2)(const char16_t *, std::size_t, const char16_t *set, + std::size_t, bool back = false); +std::size_t RTDECL(Scan4)(const char32_t *, std::size_t, const char32_t *set, + std::size_t, bool back = false); +void RTDECL(Scan)(Descriptor &result, const Descriptor &string, + const Descriptor &set, const Descriptor *back /*can be null*/, int kind, + const char *sourceFile = nullptr, int sourceLine = 0); + +std::size_t RTDECL(Verify1)( + const char *, std::size_t, const char *set, std::size_t, bool back = false); +std::size_t RTDECL(Verify2)(const char16_t *, std::size_t, const char16_t *set, + std::size_t, bool back = false); +std::size_t RTDECL(Verify4)(const char32_t *, std::size_t, const char32_t *set, + std::size_t, bool back = false); +void RTDECL(Verify)(Descriptor &result, const Descriptor &string, + const Descriptor &set, const Descriptor *back /*can be null*/, int kind, + const char *sourceFile = nullptr, int sourceLine = 0); +} +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_CHARACTER_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/command.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/command.h new file mode 100644 index 00000000000..19b486094da --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/command.h @@ -0,0 +1,78 @@ +//===-- include/flang/Runtime/command.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_COMMAND_H_ +#define FORTRAN_RUNTIME_COMMAND_H_ + +#include "flang/Runtime/entry-names.h" +#include <cstdint> + +#ifdef _MSC_VER +// On Windows* OS GetCurrentProcessId returns DWORD aka uint32_t +typedef std::uint32_t pid_t; +#else +#include "sys/types.h" //pid_t +#endif + +namespace Fortran::runtime { +class Descriptor; + +extern "C" { +// 16.9.51 COMMAND_ARGUMENT_COUNT +// +// Lowering may need to cast the result to match the precision of the default +// integer kind. +std::int32_t RTNAME(ArgumentCount)(); + +// Calls getpid() +pid_t RTNAME(GetPID)(); + +// 16.9.82 GET_COMMAND +// Try to get the value of the whole command. All of the parameters are +// optional. +// Return a STATUS as described in the standard. +std::int32_t RTNAME(GetCommand)(const Descriptor *command = nullptr, + const Descriptor *length = nullptr, const Descriptor *errmsg = nullptr, + const char *sourceFile = nullptr, int line = 0); + +// 16.9.83 GET_COMMAND_ARGUMENT +// Try to get the value of the n'th argument. +// Returns a STATUS as described in the standard. +std::int32_t RTNAME(GetCommandArgument)(std::int32_t n, + const Descriptor *argument = nullptr, const Descriptor *length = nullptr, + const Descriptor *errmsg = nullptr, const char *sourceFile = nullptr, + int line = 0); + +// 16.9.84 GET_ENVIRONMENT_VARIABLE +// Try to get the value of the environment variable specified by NAME. +// Returns a STATUS as described in the standard. +std::int32_t RTNAME(GetEnvVariable)(const Descriptor &name, + const Descriptor *value = nullptr, const Descriptor *length = nullptr, + bool trim_name = true, const Descriptor *errmsg = nullptr, + const char *sourceFile = nullptr, int line = 0); + +// Calls getcwd() +std::int32_t RTNAME(GetCwd)( + const Descriptor &cwd, const char *sourceFile, int line); + +// Calls hostnm() +std::int32_t RTNAME(Hostnm)( + const Descriptor &res, const char *sourceFile, int line); + +std::int32_t RTNAME(PutEnv)( + const char *str, size_t str_length, const char *sourceFile, int line); + +// Calls unlink() +std::int32_t RTNAME(Unlink)( + const char *path, size_t pathLength, const char *sourceFile, int line); + +} // extern "C" + +} // namespace Fortran::runtime + +#endif // FORTRAN_RUNTIME_COMMAND_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/complex.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/complex.h new file mode 100644 index 00000000000..522e2380826 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/complex.h @@ -0,0 +1,36 @@ +//===-- include/flang/Runtime/complex.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// A single way to expose C++ complex class in files that can be used +// in F18 runtime build. With inclusion of this file std::complex +// and the related names become available, though, they may correspond +// to alternative definitions (e.g. from cuda::std namespace). + +#ifndef FORTRAN_RUNTIME_COMPLEX_H +#define FORTRAN_RUNTIME_COMPLEX_H + +#include "flang/Common/api-attrs.h" + +#if RT_USE_LIBCUDACXX +#error #include <cuda/std/complex> +#endif + +#if RT_USE_LIBCUDACXX && defined(RT_DEVICE_COMPILATION) +namespace Fortran::runtime::rtcmplx { +using cuda::std::complex; +using cuda::std::conj; +} // namespace Fortran::runtime::rtcmplx +#else // !(RT_USE_LIBCUDACXX && defined(RT_DEVICE_COMPILATION)) +#include <complex> +namespace Fortran::runtime::rtcmplx { +using std::complex; +using std::conj; +} // namespace Fortran::runtime::rtcmplx +#endif // !(RT_USE_LIBCUDACXX && defined(RT_DEVICE_COMPILATION)) + +#endif // FORTRAN_RUNTIME_COMPLEX_H diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/cpp-type.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/cpp-type.h new file mode 100644 index 00000000000..ec0c32579ec --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/cpp-type.h @@ -0,0 +1,118 @@ +//===-- include/flang/Runtime/cpp-type.h ------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Maps Fortran intrinsic types to C++ types used in the runtime. + +#ifndef FORTRAN_RUNTIME_CPP_TYPE_H_ +#define FORTRAN_RUNTIME_CPP_TYPE_H_ + +#include "flang/Common/Fortran-consts.h" +#include "flang/Common/float128.h" +#include "flang/Common/float80.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/complex.h" +#include <cstdint> +#if __cplusplus >= 202302 +#error #include <stdfloat> +#endif +#include <type_traits> + +#if !defined HAS_FP16 && __STDCPP_FLOAT16_T__ +#define HAS_FP16 1 +#endif +#if !defined HAS_BF16 && __STDCPP_BFLOAT16_T__ +#define HAS_BF16 1 +#endif + +namespace Fortran::runtime { + +using common::TypeCategory; + +template <TypeCategory CAT, int KIND> struct CppTypeForHelper { + using type = void; +}; +template <TypeCategory CAT, int KIND> +using CppTypeFor = typename CppTypeForHelper<CAT, KIND>::type; + +template <TypeCategory CAT, int KIND> +constexpr bool HasCppTypeFor{ + !std::is_void_v<typename CppTypeForHelper<CAT, KIND>::type>}; + +template <int KIND> struct CppTypeForHelper<TypeCategory::Integer, KIND> { + using type = common::HostSignedIntType<8 * KIND>; +}; + +template <int KIND> struct CppTypeForHelper<TypeCategory::Unsigned, KIND> { + using type = common::HostUnsignedIntType<8 * KIND>; +}; + +#if HAS_FP16 +template <> struct CppTypeForHelper<TypeCategory::Real, 2> { + using type = std::float16_t; +}; +#endif +#if HAS_BF16 +template <> struct CppTypeForHelper<TypeCategory::Real, 3> { + using type = std::bfloat16_t; +}; +#endif +template <> struct CppTypeForHelper<TypeCategory::Real, 4> { +#if __STDCPP_FLOAT32_T__ + using type = std::float32_t; +#else + using type = float; +#endif +}; +template <> struct CppTypeForHelper<TypeCategory::Real, 8> { +#if __STDCPP_FLOAT64_T__ + using type = std::float64_t; +#else + using type = double; +#endif +}; +#if HAS_FLOAT80 +template <> struct CppTypeForHelper<TypeCategory::Real, 10> { + using type = CppFloat80Type; +}; +#endif +#if __STDCPP_FLOAT128_T__ +using CppFloat128Type = std::float128_t; +#elif HAS_LDBL128 +using CppFloat128Type = long double; +#elif HAS_FLOAT128 +using CppFloat128Type = __float128; +#endif +#if __STDCPP_FLOAT128_t || HAS_LDBL128 || HAS_FLOAT128 +template <> struct CppTypeForHelper<TypeCategory::Real, 16> { + using type = CppFloat128Type; +}; +#endif + +template <int KIND> struct CppTypeForHelper<TypeCategory::Complex, KIND> { + using type = rtcmplx::complex<CppTypeFor<TypeCategory::Real, KIND>>; +}; + +template <> struct CppTypeForHelper<TypeCategory::Character, 1> { + using type = char; +}; +template <> struct CppTypeForHelper<TypeCategory::Character, 2> { + using type = char16_t; +}; +template <> struct CppTypeForHelper<TypeCategory::Character, 4> { + using type = char32_t; +}; + +template <int KIND> struct CppTypeForHelper<TypeCategory::Logical, KIND> { + using type = common::HostSignedIntType<8 * KIND>; +}; +template <> struct CppTypeForHelper<TypeCategory::Logical, 1> { + using type = bool; +}; + +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_CPP_TYPE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/derived-api.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/derived-api.h new file mode 100644 index 00000000000..96374c5a3c2 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/derived-api.h @@ -0,0 +1,73 @@ +//===-- include/flang/Runtime/derived-api.h ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// API for lowering to use for operations on derived type objects. +// Initialiaztion and finalization are implied for pointer and allocatable +// ALLOCATE()/DEALLOCATE() respectively, so these APIs should be used only for +// local variables. Whole allocatable assignment should use AllocatableAssign() +// instead of this Assign(). + +#ifndef FORTRAN_RUNTIME_DERIVED_API_H_ +#define FORTRAN_RUNTIME_DERIVED_API_H_ + +#include "flang/Runtime/entry-names.h" + +namespace Fortran::runtime { +class Descriptor; + +namespace typeInfo { +class DerivedType; +} + +extern "C" { + +// Initializes and allocates an object's components, if it has a derived type +// with any default component initialization or automatic components. +// The descriptor must be initialized and non-null. +void RTDECL(Initialize)( + const Descriptor &, const char *sourceFile = nullptr, int sourceLine = 0); + +// Initializes an object clone from the original object. +// Each allocatable member of the clone is allocated with the same bounds as +// in the original object, if it is also allocated in it. +// The descriptor must be initialized and non-null. +void RTDECL(InitializeClone)(const Descriptor &, const Descriptor &, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Finalizes an object and its components. Deallocates any +// allocatable/automatic components. Does not deallocate the descriptor's +// storage. +void RTDECL(Destroy)(const Descriptor &); + +// Finalizes the object and its components. +void RTDECL(Finalize)( + const Descriptor &, const char *sourceFile = nullptr, int sourceLine = 0); + +/// Deallocates any allocatable/automatic components. +/// Does not deallocate the descriptor's storage. +/// Does not perform any finalization. +void RTDECL(DestroyWithoutFinalization)(const Descriptor &); + +// Intrinsic or defined assignment, with scalar expansion but not type +// conversion. +void RTDECL(Assign)(const Descriptor &, const Descriptor &, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Perform the test of the CLASS IS type guard statement of the SELECT TYPE +// construct. +bool RTDECL(ClassIs)(const Descriptor &, const typeInfo::DerivedType &); + +// Perform the test of the SAME_TYPE_AS intrinsic. +bool RTDECL(SameTypeAs)(const Descriptor &, const Descriptor &); + +// Perform the test of the EXTENDS_TYPE_OF intrinsic. +bool RTDECL(ExtendsTypeOf)(const Descriptor &, const Descriptor &); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_DERIVED_API_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/descriptor-consts.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/descriptor-consts.h new file mode 100644 index 00000000000..acd7bc5ddbd --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/descriptor-consts.h @@ -0,0 +1,76 @@ +//===-- include/flang/Runtime/descriptor-consts.h ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_DESCRIPTOR_CONSTS_H_ +#define FORTRAN_RUNTIME_DESCRIPTOR_CONSTS_H_ + +#include "flang/Common/Fortran-consts.h" +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Common/api-attrs.h" +#include <cstddef> +#include <cstdint> + +// Value of the addendum presence flag. +#define _CFI_ADDENDUM_FLAG 1 +// Number of bits needed to be shifted when manipulating the allocator index. +#define _CFI_ALLOCATOR_IDX_SHIFT 1 +// Allocator index mask. +#define _CFI_ALLOCATOR_IDX_MASK 0b00001110 + +namespace Fortran::runtime::typeInfo { +using TypeParameterValue = std::int64_t; +class DerivedType; +} // namespace Fortran::runtime::typeInfo + +namespace Fortran::runtime { +class Descriptor; +using SubscriptValue = ISO::CFI_index_t; +using common::TypeCategory; + +/// Returns size in bytes of the descriptor (not the data) +/// This must be at least as large as the largest descriptor of any target +/// triple. +static constexpr RT_API_ATTRS std::size_t MaxDescriptorSizeInBytes( + int rank, bool addendum = false, int lengthTypeParameters = 0) { + // Layout: + // + // fortran::runtime::Descriptor { + // ISO::CFI_cdesc_t { + // void *base_addr; (pointer -> up to 8 bytes) + // size_t elem_len; (up to 8 bytes) + // int version; (up to 4 bytes) + // CFI_rank_t rank; (unsigned char -> 1 byte) + // CFI_type_t type; (signed char -> 1 byte) + // CFI_attribute_t attribute; (unsigned char -> 1 byte) + // unsigned char extra; (1 byte) + // } + // } + // fortran::runtime::Dimension[rank] { + // ISO::CFI_dim_t { + // CFI_index_t lower_bound; (ptrdiff_t -> up to 8 bytes) + // CFI_index_t extent; (ptrdiff_t -> up to 8 bytes) + // CFI_index_t sm; (ptrdiff_t -> up to 8 bytes) + // } + // } + // fortran::runtime::DescriptorAddendum { + // const typeInfo::DerivedType *derivedType_; (pointer -> up to 8 + // bytes) typeInfo::TypeParameterValue len_[lenParameters]; (int64_t -> 8 + // bytes) + // } + std::size_t bytes{24u + rank * 24u}; + if (addendum || lengthTypeParameters > 0) { + if (lengthTypeParameters < 1) + lengthTypeParameters = 1; + bytes += 8u + static_cast<std::size_t>(lengthTypeParameters) * 8u; + } + return bytes; +} + +} // namespace Fortran::runtime + +#endif /* FORTRAN_RUNTIME_DESCRIPTOR_CONSTS_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/entry-names.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/entry-names.h new file mode 100644 index 00000000000..68582b92b54 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/entry-names.h @@ -0,0 +1,44 @@ +/*===-- include/flang/Runtime/entry-names.h -------------------------*- C -*-=// + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===------------------------------------------------------------------------=== + */ + +/* Defines the macro RTNAME(n) which decorates the external name of a runtime + * library function or object with extra characters so that it + * (a) is not in the user's name space, + * (b) doesn't conflict with other libraries, and + * (c) prevents incompatible versions of the runtime library from linking + * + * The value of REVISION should not be changed until/unless the API to the + * runtime library must change in some way that breaks backward compatibility. + */ +#ifndef FORTRAN_RUNTIME_ENTRY_NAMES_H +#define FORTRAN_RUNTIME_ENTRY_NAMES_H + +#include "flang/Common/api-attrs.h" + +#ifndef RTNAME +#define NAME_WITH_PREFIX_AND_REVISION(prefix, revision, name) \ + prefix##revision##name +#define RTNAME(name) NAME_WITH_PREFIX_AND_REVISION(_Fortran, A, name) +#endif + +#ifndef RTDECL +#define RTDECL(name) RT_API_ATTRS RTNAME(name) +#endif + +#ifndef RTDEF +#define RTDEF(name) RT_API_ATTRS RTNAME(name) +#endif + +#ifndef RTNAME_STRING +#define RTNAME_STRINGIFY_(x) #x +#define RTNAME_STRINGIFY(x) RTNAME_STRINGIFY_(x) +#define RTNAME_STRING(name) RTNAME_STRINGIFY(RTNAME(name)) +#endif + +#endif /* !FORTRAN_RUNTIME_ENTRY_NAMES_H */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/exceptions.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/exceptions.h new file mode 100644 index 00000000000..c76376e36ed --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/exceptions.h @@ -0,0 +1,52 @@ +//===-- include/flang/Runtime/exceptions.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Support for floating point exceptions and related floating point environment +// functionality. + +#ifndef FORTRAN_RUNTIME_EXCEPTIONS_H_ +#define FORTRAN_RUNTIME_EXCEPTIONS_H_ + +#include "flang/Runtime/entry-names.h" +#include <cinttypes> +#include <cstddef> + +namespace Fortran::runtime { + +class Descriptor; + +extern "C" { + +// Map a set of IEEE_FLAG_TYPE exception values to a libm fenv.h excepts value. +// This mapping is done at runtime to support cross compilation. +std::uint32_t RTNAME(MapException)(std::uint32_t excepts); + +// Exception processing functions that call the corresponding libm functions, +// and also include support for denormal exceptions where available. +void RTNAME(feclearexcept)(std::uint32_t excepts); +void RTNAME(feraiseexcept)(std::uint32_t excepts); +std::uint32_t RTNAME(fetestexcept)(std::uint32_t excepts); +void RTNAME(fedisableexcept)(std::uint32_t excepts); +void RTNAME(feenableexcept)(std::uint32_t excepts); +std::uint32_t RTNAME(fegetexcept)(void); + +// Check if the processor has the ability to control whether to halt +// or continue exeuction when a given exception is raised. +bool RTNAME(SupportHalting)(uint32_t except); + +// Get and set the ieee underflow mode if supported; otherwise nops. +bool RTNAME(GetUnderflowMode)(void); +void RTNAME(SetUnderflowMode)(bool flag); + +// Get the byte size of ieee_modes_type and ieee_status_type data. +std::size_t RTNAME(GetModesTypeSize)(void); +std::size_t RTNAME(GetStatusTypeSize)(void); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_EXCEPTIONS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/execute.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/execute.h new file mode 100644 index 00000000000..ca137b9d182 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/execute.h @@ -0,0 +1,29 @@ +//===-- include/flang/Runtime/command.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_EXECUTE_H_ +#define FORTRAN_RUNTIME_EXECUTE_H_ + +#include "flang/Runtime/entry-names.h" + +namespace Fortran::runtime { +class Descriptor; + +extern "C" { + +// 16.9.83 EXECUTE_COMMAND_LINE +// Execute a command line. +// Returns a EXITSTAT, CMDSTAT, and CMDMSG as described in the standard. +void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait = true, + const Descriptor *exitstat = nullptr, const Descriptor *cmdstat = nullptr, + const Descriptor *cmdmsg = nullptr, const char *sourceFile = nullptr, + int line = 0); +} +} // namespace Fortran::runtime + +#endif // FORTRAN_RUNTIME_EXECUTE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/extensions.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/extensions.h new file mode 100644 index 00000000000..06ae7f35d9b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/extensions.h @@ -0,0 +1,93 @@ +//===-- include/flang/Runtime/extensions.h ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// These C-coded entry points with Fortran-mangled names implement legacy +// extensions that will eventually be implemented in Fortran. + +#ifndef FORTRAN_RUNTIME_EXTENSIONS_H_ +#define FORTRAN_RUNTIME_EXTENSIONS_H_ + +#include "flang/Runtime/entry-names.h" + +#define FORTRAN_PROCEDURE_NAME(name) name##_ + +#include "flang/Runtime/entry-names.h" +#include <cstddef> +#include <cstdint> + +#ifdef _WIN32 +// UID and GID don't exist on Windows, these exist to avoid errors. +typedef std::uint32_t uid_t; +typedef std::uint32_t gid_t; +#else +#include "sys/types.h" //pid_t +#endif + +extern "C" { + +// CALL FLUSH(n) antedates the Fortran 2003 FLUSH statement. +void FORTRAN_PROCEDURE_NAME(flush)(const int &unit); + +// GNU extension subroutine FDATE +void FORTRAN_PROCEDURE_NAME(fdate)(char *string, std::int64_t length); + +void RTNAME(Free)(std::intptr_t ptr); + +// Common extensions FSEEK & FTELL, variously named +std::int32_t RTNAME(Fseek)(int unit, std::int64_t zeroBasedPos, int whence, + const char *sourceFileName, int lineNumber); +std::int64_t RTNAME(Ftell)(int unit); + +// GNU Fortran 77 compatibility function IARGC. +std::int32_t FORTRAN_PROCEDURE_NAME(iargc)(); + +// GNU Fortran 77 compatibility subroutine GETARG(N, ARG). +void FORTRAN_PROCEDURE_NAME(getarg)( + std::int32_t &n, char *arg, std::int64_t length); + +// Calls getgid() +gid_t RTNAME(GetGID)(); + +// Calls getuid() +uid_t RTNAME(GetUID)(); + +// GNU extension subroutine GETLOG(C). +void FORTRAN_PROCEDURE_NAME(getlog)(char *name, std::int64_t length); + +// GNU extension subroutine HOSTNM(C) +int FORTRAN_PROCEDURE_NAME(hostnm)(char *hn, int length); + +std::intptr_t RTNAME(Malloc)(std::size_t size); + +// GNU extension function STATUS = SIGNAL(number, handler) +std::int64_t RTNAME(Signal)(std::int64_t number, void (*handler)(int)); + +// GNU extension subroutine SLEEP(SECONDS) +void RTNAME(Sleep)(std::int64_t seconds); + +// GNU extension function TIME() +std::int64_t RTNAME(time)(); + +// GNU extension function ACCESS(NAME, MODE) +// TODO: not supported on Windows +#ifndef _WIN32 +std::int64_t FORTRAN_PROCEDURE_NAME(access)(const char *name, + std::int64_t nameLength, const char *mode, std::int64_t modeLength); +#endif + +// GNU extension subroutine CHDIR(NAME, [STATUS]) +int RTNAME(Chdir)(const char *name); + +// GNU extension function IERRNO() +int FORTRAN_PROCEDURE_NAME(ierrno)(); + +// GNU extension subroutine PERROR(STRING) +void RTNAME(Perror)(const char *str); + +} // extern "C" +#endif // FORTRAN_RUNTIME_EXTENSIONS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/freestanding-tools.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/freestanding-tools.h new file mode 100644 index 00000000000..91277a71f41 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/freestanding-tools.h @@ -0,0 +1,229 @@ +//===-- include/flang/Runtime/freestanding-tools.h --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_ +#define FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_ + +#include "flang/Common/api-attrs.h" +#include "flang/Runtime/c-or-cpp.h" +#include <algorithm> +#include <cctype> +#include <cstdlib> +#include <cstring> + +// The file defines a set of utilities/classes that might be +// used to get reduce the dependency on external libraries (e.g. libstdc++). + +#if !defined(STD_FILL_N_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_FILL_N_UNSUPPORTED 1 +#endif + +#if !defined(STD_MEMMOVE_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_MEMMOVE_UNSUPPORTED 1 +#endif + +#if !defined(STD_STRLEN_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_STRLEN_UNSUPPORTED 1 +#endif + +#if !defined(STD_MEMCMP_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_MEMCMP_UNSUPPORTED 1 +#endif + +#if !defined(STD_REALLOC_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_REALLOC_UNSUPPORTED 1 +#endif + +#if !defined(STD_MEMCHR_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_MEMCHR_UNSUPPORTED 1 +#endif + +#if !defined(STD_STRCPY_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_STRCPY_UNSUPPORTED 1 +#endif + +#if !defined(STD_STRCMP_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_STRCMP_UNSUPPORTED 1 +#endif + +#if !defined(STD_TOUPPER_UNSUPPORTED) && \ + (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) +#define STD_TOUPPER_UNSUPPORTED 1 +#endif + +namespace Fortran::runtime { + +#if STD_FILL_N_UNSUPPORTED +// Provides alternative implementation for std::fill_n(), if +// it is not supported. +template <typename A, typename B> +static inline RT_API_ATTRS std::enable_if_t<std::is_convertible_v<B, A>, void> +fill_n(A *start, std::size_t count, const B &value) { + for (std::size_t j{0}; j < count; ++j) { + start[j] = value; + } +} +#else // !STD_FILL_N_UNSUPPORTED +using std::fill_n; +#endif // !STD_FILL_N_UNSUPPORTED + +#if STD_MEMMOVE_UNSUPPORTED +// Provides alternative implementation for std::memmove(), if +// it is not supported. +static inline RT_API_ATTRS void *memmove( + void *dest, const void *src, std::size_t count) { + char *to{reinterpret_cast<char *>(dest)}; + const char *from{reinterpret_cast<const char *>(src)}; + + if (to == from) { + return dest; + } + if (to + count <= from || from + count <= to) { + std::memcpy(dest, src, count); + } else if (to < from) { + while (count--) { + *to++ = *from++; + } + } else { + to += count; + from += count; + while (count--) { + *--to = *--from; + } + } + return dest; +} +#else // !STD_MEMMOVE_UNSUPPORTED +using std::memmove; +#endif // !STD_MEMMOVE_UNSUPPORTED + +using MemmoveFct = void *(*)(void *, const void *, std::size_t); + +#ifdef RT_DEVICE_COMPILATION +static RT_API_ATTRS void *MemmoveWrapper( + void *dest, const void *src, std::size_t count) { + return Fortran::runtime::memmove(dest, src, count); +} +#endif + +#if STD_STRLEN_UNSUPPORTED +// Provides alternative implementation for std::strlen(), if +// it is not supported. +static inline RT_API_ATTRS std::size_t strlen(const char *str) { + if (!str) { + // Return 0 for nullptr. + return 0; + } + const char *end = str; + for (; *end != '\0'; ++end) + ; + return end - str; +} +#else // !STD_STRLEN_UNSUPPORTED +using std::strlen; +#endif // !STD_STRLEN_UNSUPPORTED + +#if STD_MEMCMP_UNSUPPORTED +// Provides alternative implementation for std::memcmp(), if +// it is not supported. +static inline RT_API_ATTRS int memcmp( + const void *RESTRICT lhs, const void *RESTRICT rhs, std::size_t count) { + auto m1{reinterpret_cast<const unsigned char *>(lhs)}; + auto m2{reinterpret_cast<const unsigned char *>(rhs)}; + for (; count--; ++m1, ++m2) { + int diff = *m1 - *m2; + if (diff != 0) { + return diff; + } + } + return 0; +} +#else // !STD_MEMCMP_UNSUPPORTED +using std::memcmp; +#endif // !STD_MEMCMP_UNSUPPORTED + +#if STD_REALLOC_UNSUPPORTED +static inline RT_API_ATTRS void *realloc(void *ptr, std::size_t newByteSize) { + // Return nullptr and let the callers assert that. + // TODO: we can provide a straightforward implementation + // via malloc/memcpy/free. + return nullptr; +} +#else // !STD_REALLOC_UNSUPPORTED +using std::realloc; +#endif // !STD_REALLOC_UNSUPPORTED + +#if STD_MEMCHR_UNSUPPORTED +// Provides alternative implementation for std::memchr(), if +// it is not supported. +static inline RT_API_ATTRS const void *memchr( + const void *ptr, int ch, std::size_t count) { + auto buf{reinterpret_cast<const unsigned char *>(ptr)}; + auto c{static_cast<unsigned char>(ch)}; + for (; count--; ++buf) { + if (*buf == c) { + return buf; + } + } + return nullptr; +} +#else // !STD_MEMCMP_UNSUPPORTED +using std::memchr; +#endif // !STD_MEMCMP_UNSUPPORTED + +#if STD_STRCPY_UNSUPPORTED +// Provides alternative implementation for std::strcpy(), if +// it is not supported. +static inline RT_API_ATTRS char *strcpy(char *dest, const char *src) { + char *result{dest}; + do { + *dest++ = *src; + } while (*src++ != '\0'); + return result; +} +#else // !STD_STRCPY_UNSUPPORTED +using std::strcpy; +#endif // !STD_STRCPY_UNSUPPORTED + +#if STD_STRCMP_UNSUPPORTED +// Provides alternative implementation for std::strcmp(), if +// it is not supported. +static inline RT_API_ATTRS int strcmp(const char *lhs, const char *rhs) { + while (*lhs != '\0' && *lhs == *rhs) { + ++lhs; + ++rhs; + } + return static_cast<unsigned char>(*lhs) - static_cast<unsigned char>(*rhs); +} +#else // !STD_STRCMP_UNSUPPORTED +using std::strcmp; +#endif // !STD_STRCMP_UNSUPPORTED + +#if STD_TOUPPER_UNSUPPORTED +// Provides alternative implementation for std::toupper(), if +// it is not supported. +static inline RT_API_ATTRS int toupper(int ch) { + if (ch >= 'a' && ch <= 'z') { + return ch - 'a' + 'A'; + } + return ch; +} +#else // !STD_TOUPPER_UNSUPPORTED +using std::toupper; +#endif // !STD_TOUPPER_UNSUPPORTED + +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/inquiry.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/inquiry.h new file mode 100644 index 00000000000..c7a7487f1a1 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/inquiry.h @@ -0,0 +1,43 @@ +//===-- include/flang/Runtime/inquiry.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the API for the inquiry intrinsic functions +// that inquire about shape information in arrays: LBOUND and SIZE. + +#ifndef FORTRAN_RUNTIME_INQUIRY_H_ +#define FORTRAN_RUNTIME_INQUIRY_H_ + +#include "flang/Runtime/entry-names.h" +#include <cinttypes> + +namespace Fortran::runtime { + +class Descriptor; + +extern "C" { + +std::int64_t RTDECL(LboundDim)(const Descriptor &array, int dim, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Lbound)(void *result, const Descriptor &array, int kind, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Shape)(void *result, const Descriptor &array, int kind, + const char *sourceFile = nullptr, int line = 0); +std::int64_t RTDECL(Size)( + const Descriptor &array, const char *sourceFile = nullptr, int line = 0); + +std::int64_t RTDECL(SizeDim)(const Descriptor &array, int dim, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Ubound)(void *result, const Descriptor &array, int kind, + const char *sourceFile = nullptr, int line = 0); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_INQUIRY_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/io-api.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/io-api.h new file mode 100644 index 00000000000..988fe536705 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/io-api.h @@ -0,0 +1,370 @@ +//===-- include/flang/Runtime/io-api.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the API of the I/O runtime support library for lowering. + +#ifndef FORTRAN_RUNTIME_IO_API_H_ +#define FORTRAN_RUNTIME_IO_API_H_ + +#include "flang/Common/uint128.h" +#include "flang/Runtime/entry-names.h" +#include "flang/Runtime/iostat-consts.h" +#include "flang/Runtime/magic-numbers.h" +#include <cinttypes> +#include <cstddef> + +namespace Fortran::runtime { +class Descriptor; +} // namespace Fortran::runtime + +namespace Fortran::runtime::io { + +struct NonTbpDefinedIoTable; +class NamelistGroup; +class IoStatementState; +using Cookie = IoStatementState *; +using ExternalUnit = int; +using AsynchronousId = int; + +static constexpr ExternalUnit DefaultOutputUnit{FORTRAN_DEFAULT_OUTPUT_UNIT}; +static constexpr ExternalUnit DefaultInputUnit{FORTRAN_DEFAULT_INPUT_UNIT}; + +// INQUIRE specifiers are encoded as simple base-26 packings of +// the spellings of their keywords. +using InquiryKeywordHash = std::uint64_t; +constexpr InquiryKeywordHash HashInquiryKeyword(const char *p) { + InquiryKeywordHash hash{1}; + while (char ch{*p++}) { + std::uint64_t letter{0}; + if (ch >= 'a' && ch <= 'z') { + letter = ch - 'a'; + } else { + letter = ch - 'A'; + } + hash = 26 * hash + letter; + } + return hash; +} + +extern "C" { + +#define IONAME(name) RTNAME(io##name) + +#ifndef IODECL +#define IODECL(name) RT_API_ATTRS IONAME(name) +#endif + +#ifndef IODEF +#define IODEF(name) RT_API_ATTRS IONAME(name) +#endif + +// These functions initiate data transfer statements (READ, WRITE, PRINT). +// Example: PRINT *, 666 is implemented as the series of calls: +// Cookie cookie{BeginExternalListOutput(DefaultOutputUnit, +// __FILE__, __LINE__)}; +// OutputInteger32(cookie, 666); +// EndIoStatement(cookie); +// Formatted I/O with explicit formats can supply the format as a +// const char * pointer with a length, or with a descriptor. + +// Internal I/O initiation +// Internal I/O can loan the runtime library an optional block of memory +// in which the library can maintain state across the calls that implement +// the internal transfer; use of these blocks can reduce the need for dynamic +// memory allocation &/or thread-local storage. The block must be sufficiently +// aligned to hold a pointer. +constexpr std::size_t RecommendedInternalIoScratchAreaBytes( + int maxFormatParenthesesNestingDepth) { + return 32 + 8 * maxFormatParenthesesNestingDepth; +} + +// For NAMELIST I/O, use the API for the appropriate form of list-directed +// I/O initiation and configuration, then call OutputNamelist/InputNamelist +// below. + +// Internal I/O to/from character arrays &/or non-default-kind character +// requires a descriptor, which is copied. +Cookie IODECL(BeginInternalArrayListOutput)(const Descriptor &, + void **scratchArea = nullptr, std::size_t scratchBytes = 0, + const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginInternalArrayListInput)(const Descriptor &, + void **scratchArea = nullptr, std::size_t scratchBytes = 0, + const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginInternalArrayFormattedOutput)(const Descriptor &, + const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr, + std::size_t scratchBytes = 0, const char *sourceFile = nullptr, + int sourceLine = 0); +Cookie IODECL(BeginInternalArrayFormattedInput)(const Descriptor &, + const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr, + std::size_t scratchBytes = 0, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Internal I/O to/from a default-kind character scalar can avoid a +// descriptor. +Cookie IODECL(BeginInternalListOutput)(char *internal, + std::size_t internalLength, void **scratchArea = nullptr, + std::size_t scratchBytes = 0, const char *sourceFile = nullptr, + int sourceLine = 0); +Cookie IODECL(BeginInternalListInput)(const char *internal, + std::size_t internalLength, void **scratchArea = nullptr, + std::size_t scratchBytes = 0, const char *sourceFile = nullptr, + int sourceLine = 0); +Cookie IODECL(BeginInternalFormattedOutput)(char *internal, + std::size_t internalLength, const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr, + std::size_t scratchBytes = 0, const char *sourceFile = nullptr, + int sourceLine = 0); +Cookie IODECL(BeginInternalFormattedInput)(const char *internal, + std::size_t internalLength, const char *format, std::size_t formatLength, + const Descriptor *formatDescriptor = nullptr, void **scratchArea = nullptr, + std::size_t scratchBytes = 0, const char *sourceFile = nullptr, + int sourceLine = 0); + +// External unit numbers must fit in default integers. When the integer +// provided as UNIT is of a wider type than the default integer, it could +// overflow when converted to a default integer. +// CheckUnitNumberInRange should be called to verify that a unit number of a +// wide integer type can fit in a default integer. Since it should be called +// before the BeginXXX(unit, ...) call, it has its own error handling interface. +// If handleError is false, and the unit number is out of range, the program +// will be terminated. Otherwise, if unit is out of range, a nonzero Iostat +// code is returned and ioMsg is set if it is not a nullptr. +enum Iostat IODECL(CheckUnitNumberInRange64)(std::int64_t unit, + bool handleError, char *ioMsg = nullptr, std::size_t ioMsgLength = 0, + const char *sourceFile = nullptr, int sourceLine = 0); +enum Iostat IODECL(CheckUnitNumberInRange128)(common::int128_t unit, + bool handleError, char *ioMsg = nullptr, std::size_t ioMsgLength = 0, + const char *sourceFile = nullptr, int sourceLine = 0); + +// External synchronous I/O initiation +Cookie IODECL(BeginExternalListOutput)(ExternalUnit = DefaultOutputUnit, + const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginExternalListInput)(ExternalUnit = DefaultInputUnit, + const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginExternalFormattedOutput)(const char *format, std::size_t, + const Descriptor *formatDescriptor = nullptr, + ExternalUnit = DefaultOutputUnit, const char *sourceFile = nullptr, + int sourceLine = 0); +Cookie IODECL(BeginExternalFormattedInput)(const char *format, std::size_t, + const Descriptor *formatDescriptor = nullptr, + ExternalUnit = DefaultInputUnit, const char *sourceFile = nullptr, + int sourceLine = 0); +Cookie IODECL(BeginUnformattedOutput)(ExternalUnit = DefaultOutputUnit, + const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginUnformattedInput)(ExternalUnit = DefaultInputUnit, + const char *sourceFile = nullptr, int sourceLine = 0); + +// WAIT(ID=) +Cookie IODECL(BeginWait)(ExternalUnit, AsynchronousId, + const char *sourceFile = nullptr, int sourceLine = 0); +// WAIT(no ID=) +Cookie IODECL(BeginWaitAll)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); + +// Other I/O statements +Cookie IODECL(BeginClose)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginFlush)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginBackspace)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginEndfile)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginRewind)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); + +// OPEN(UNIT=) and OPEN(NEWUNIT=) have distinct interfaces. +Cookie IODECL(BeginOpenUnit)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginOpenNewUnit)( + const char *sourceFile = nullptr, int sourceLine = 0); + +// The variant forms of INQUIRE() statements have distinct interfaces. +// BeginInquireIoLength() is basically a no-op output statement. +Cookie IODECL(BeginInquireUnit)( + ExternalUnit, const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginInquireFile)(const char *, std::size_t, + const char *sourceFile = nullptr, int sourceLine = 0); +Cookie IODECL(BeginInquireIoLength)( + const char *sourceFile = nullptr, int sourceLine = 0); + +// If an I/O statement has any IOSTAT=, ERR=, END=, or EOR= specifiers, +// call EnableHandlers() immediately after the Begin...() call. +// An output or OPEN statement may not enable HasEnd or HasEor. +// This call makes the runtime library defer those particular error/end +// conditions to the EndIoStatement() call rather than terminating +// the image. E.g., for READ(*,*,END=666) A, B, (C(J),J=1,N) +// Cookie cookie{BeginExternalListInput(DefaultInputUnit,__FILE__,__LINE__)}; +// EnableHandlers(cookie, false, false, true /*END=*/, false); +// if (InputReal64(cookie, &A)) { +// if (InputReal64(cookie, &B)) { +// for (int J{1}; J<=N; ++J) { +// if (!InputReal64(cookie, &C[J])) break; +// } +// } +// } +// if (EndIoStatement(cookie) == FORTRAN_RUTIME_IOSTAT_END) goto label666; +void IODECL(EnableHandlers)(Cookie, bool hasIoStat = false, bool hasErr = false, + bool hasEnd = false, bool hasEor = false, bool hasIoMsg = false); + +// ASYNCHRONOUS='YES' or 'NO' on READ/WRITE/OPEN +// Use GetAsynchronousId() to handle ID=. +bool IODECL(SetAsynchronous)(Cookie, const char *, std::size_t); + +// Control list options. These return false on a error that the +// Begin...() call has specified will be handled by the caller. +// The interfaces that pass a default-kind CHARACTER argument +// are limited to passing specific case-insensitive keyword values. +// ADVANCE=YES, NO +bool IODECL(SetAdvance)(Cookie, const char *, std::size_t); +// BLANK=NULL, ZERO +bool IODECL(SetBlank)(Cookie, const char *, std::size_t); +// DECIMAL=COMMA, POINT +bool IODECL(SetDecimal)(Cookie, const char *, std::size_t); +// DELIM=APOSTROPHE, QUOTE, NONE +bool IODECL(SetDelim)(Cookie, const char *, std::size_t); +// PAD=YES, NO +bool IODECL(SetPad)(Cookie, const char *, std::size_t); +bool IODECL(SetPos)(Cookie, std::int64_t); +bool IODECL(SetRec)(Cookie, std::int64_t); +// ROUND=UP, DOWN, ZERO, NEAREST, COMPATIBLE, PROCESSOR_DEFINED +bool IODECL(SetRound)(Cookie, const char *, std::size_t); +// SIGN=PLUS, SUPPRESS, PROCESSOR_DEFINED +bool IODECL(SetSign)(Cookie, const char *, std::size_t); + +// Data item transfer for modes other than NAMELIST: +// Any data object that can be passed as an actual argument without the +// use of a temporary can be transferred by means of a descriptor; +// vector-valued subscripts and coindexing will require elementwise +// transfers &/or data copies. Unformatted transfers to/from contiguous +// blocks of local image memory can avoid the descriptor, and there +// are specializations for the most common scalar types. +// +// These functions return false when the I/O statement has encountered an +// error or end-of-file/record condition that the caller has indicated +// should not cause termination of the image by the runtime library. +// Once the statement has encountered an error, all following items will be +// ignored and also return false; but compiled code should check for errors +// and avoid the following items when they might crash. +bool IODECL(OutputDescriptor)(Cookie, const Descriptor &); +bool IODECL(InputDescriptor)(Cookie, const Descriptor &); +// Formatted (including list directed) I/O data items +bool IODECL(OutputInteger8)(Cookie, std::int8_t); +bool IODECL(OutputInteger16)(Cookie, std::int16_t); +bool IODECL(OutputInteger32)(Cookie, std::int32_t); +bool IODECL(OutputInteger64)(Cookie, std::int64_t); +bool IODECL(OutputInteger128)(Cookie, common::int128_t); +bool IODECL(InputInteger)(Cookie, std::int64_t &, int kind = 8); +bool IODECL(OutputReal32)(Cookie, float); +bool IODECL(InputReal32)(Cookie, float &); +bool IODECL(OutputReal64)(Cookie, double); +bool IODECL(InputReal64)(Cookie, double &); +bool IODECL(OutputComplex32)(Cookie, float, float); +bool IODECL(InputComplex32)(Cookie, float[2]); +bool IODECL(OutputComplex64)(Cookie, double, double); +bool IODECL(InputComplex64)(Cookie, double[2]); +bool IODECL(OutputCharacter)(Cookie, const char *, std::size_t, int kind = 1); +bool IODECL(OutputAscii)(Cookie, const char *, std::size_t); +bool IODECL(InputCharacter)(Cookie, char *, std::size_t, int kind = 1); +bool IODECL(InputAscii)(Cookie, char *, std::size_t); +bool IODECL(OutputLogical)(Cookie, bool); +bool IODECL(InputLogical)(Cookie, bool &); + +// NAMELIST I/O must be the only data item in an (otherwise) +// list-directed I/O statement. +bool IODECL(OutputNamelist)(Cookie, const NamelistGroup &); +bool IODECL(InputNamelist)(Cookie, const NamelistGroup &); + +// When an I/O list item has a derived type with a specific defined +// I/O subroutine of the appropriate generic kind for the active +// I/O data transfer statement (read/write, formatted/unformatted) +// that pertains to the type or its components, and those subroutines +// are dynamic or neither type-bound nor defined with interfaces +// in the same scope as the derived type (or an IMPORT statement has +// made such a generic interface inaccessible), these data item transfer +// APIs enable the I/O runtime to make the right calls to defined I/O +// subroutines. +bool IODECL(OutputDerivedType)( + Cookie, const Descriptor &, const NonTbpDefinedIoTable *); +bool IODECL(InputDerivedType)( + Cookie, const Descriptor &, const NonTbpDefinedIoTable *); + +// Additional specifier interfaces for the connection-list of +// on OPEN statement (only). SetBlank(), SetDecimal(), +// SetDelim(), GetIoMsg(), SetPad(), SetRound(), SetSign(), +// & SetAsynchronous() are also acceptable for OPEN. +// ACCESS=SEQUENTIAL, DIRECT, STREAM +bool IODECL(SetAccess)(Cookie, const char *, std::size_t); +// ACTION=READ, WRITE, or READWRITE +bool IODECL(SetAction)(Cookie, const char *, std::size_t); +// CARRIAGECONTROL=LIST, FORTRAN, NONE +bool IODECL(SetCarriagecontrol)(Cookie, const char *, std::size_t); +// CONVERT=NATIVE, LITTLE_ENDIAN, BIG_ENDIAN, or SWAP +bool IODECL(SetConvert)(Cookie, const char *, std::size_t); +// ENCODING=UTF-8, DEFAULT +bool IODECL(SetEncoding)(Cookie, const char *, std::size_t); +// FORM=FORMATTED, UNFORMATTED +bool IODECL(SetForm)(Cookie, const char *, std::size_t); +// POSITION=ASIS, REWIND, APPEND +bool IODECL(SetPosition)(Cookie, const char *, std::size_t); +bool IODECL(SetRecl)(Cookie, std::size_t); // RECL= + +// STATUS can be set during an OPEN or CLOSE statement. +// For OPEN: STATUS=OLD, NEW, SCRATCH, REPLACE, UNKNOWN +// For CLOSE: STATUS=KEEP, DELETE +bool IODECL(SetStatus)(Cookie, const char *, std::size_t); + +bool IODECL(SetFile)(Cookie, const char *, std::size_t chars); + +// Acquires the runtime-created unit number for OPEN(NEWUNIT=) +bool IODECL(GetNewUnit)(Cookie, int &, int kind = 4); + +// READ(SIZE=), after all input items +std::size_t IODECL(GetSize)(Cookie); + +// INQUIRE(IOLENGTH=), after all output items +std::size_t IODECL(GetIoLength)(Cookie); + +// GetIoMsg() does not modify its argument unless an error or +// end-of-record/file condition is present. +void IODECL(GetIoMsg)(Cookie, char *, std::size_t); // IOMSG= + +// Defines ID= on READ/WRITE(ASYNCHRONOUS='YES') +AsynchronousId IODECL(GetAsynchronousId)(Cookie); + +// INQUIRE() specifiers are mostly identified by their NUL-terminated +// case-insensitive names. +// ACCESS, ACTION, ASYNCHRONOUS, BLANK, CONVERT, DECIMAL, DELIM, DIRECT, +// ENCODING, FORM, FORMATTED, NAME, PAD, POSITION, READ, READWRITE, ROUND, +// SEQUENTIAL, SIGN, STREAM, UNFORMATTED, WRITE: +bool IODECL(InquireCharacter)(Cookie, InquiryKeywordHash, char *, std::size_t); +// EXIST, NAMED, OPENED, and PENDING (without ID): +bool IODECL(InquireLogical)(Cookie, InquiryKeywordHash, bool &); +// PENDING with ID +bool IODECL(InquirePendingId)(Cookie, AsynchronousId, bool &); +// NEXTREC, NUMBER, POS, RECL, SIZE +bool IODECL(InquireInteger64)( + Cookie, InquiryKeywordHash, std::int64_t &, int kind = 8); + +// This function must be called to end an I/O statement, and its +// cookie value may not be used afterwards unless it is recycled +// by the runtime library to serve a later I/O statement. +// The return value can be used to implement IOSTAT=, ERR=, END=, & EOR=; +// store it into the IOSTAT= variable if there is one, and test +// it to implement the various branches. The error condition +// returned is guaranteed to only be one of the problems that the +// EnableHandlers() call has indicated should be handled in compiled code +// rather than by terminating the image. +enum Iostat IODECL(EndIoStatement)(Cookie); + +} // extern "C" +} // namespace Fortran::runtime::io + +#endif /* FORTRAN_RUNTIME_IO_API_H_ */ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/iostat-consts.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/iostat-consts.h new file mode 100644 index 00000000000..26bf75f59fa --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/iostat-consts.h @@ -0,0 +1,93 @@ +//===-- include/flang/Runtime/iostat-consts.h -------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_IOSTAT_CONSTS_H_ +#define FORTRAN_RUNTIME_IOSTAT_CONSTS_H_ + +#include "flang/Common/api-attrs.h" +#include "flang/Runtime/magic-numbers.h" + +namespace Fortran::runtime::io { + +// The value of IOSTAT= is zero when no error, end-of-record, +// or end-of-file condition has arisen; errors are positive values. +// (See 12.11.5 in Fortran 2018 for the complete requirements; +// these constants must match the values of their corresponding +// named constants in the predefined module ISO_FORTRAN_ENV, so +// they're actually defined in another magic-numbers.h header file +// so that they can be included both here and there.) +enum Iostat { + IostatOk = 0, // no error, EOF, or EOR condition + + // These error codes are required by Fortran (see 12.10.2.16-17) to be + // negative integer values + IostatEnd = FORTRAN_RUNTIME_IOSTAT_END, // end-of-file on input & no error + // End-of-record on non-advancing input, no EOF or error + IostatEor = FORTRAN_RUNTIME_IOSTAT_EOR, + + // This value is also required to be negative (12.11.5 bullet 6). + // It signifies a FLUSH statement on an unflushable unit. + IostatUnflushable = FORTRAN_RUNTIME_IOSTAT_FLUSH, + + // Other errors are positive. We use "errno" values unchanged. + // This error is exported in ISO_Fortran_env. + IostatInquireInternalUnit = FORTRAN_RUNTIME_IOSTAT_INQUIRE_INTERNAL_UNIT, + + // The remaining error codes are not exported. + IostatGenericError = 1001, // see IOMSG= for details + IostatRecordWriteOverrun, + IostatRecordReadOverrun, + IostatInternalWriteOverrun, + IostatErrorInFormat, + IostatErrorInKeyword, + IostatEndfileDirect, + IostatEndfileUnwritable, + IostatOpenBadRecl, + IostatOpenUnknownSize, + IostatOpenBadAppend, + IostatWriteToReadOnly, + IostatReadFromWriteOnly, + IostatBackspaceNonSequential, + IostatBackspaceAtFirstRecord, + IostatRewindNonSequential, + IostatWriteAfterEndfile, + IostatFormattedIoOnUnformattedUnit, + IostatUnformattedIoOnFormattedUnit, + IostatListIoOnDirectAccessUnit, + IostatUnformattedChildOnFormattedParent, + IostatFormattedChildOnUnformattedParent, + IostatChildInputFromOutputParent, + IostatChildOutputToInputParent, + IostatShortRead, + IostatMissingTerminator, + IostatBadUnformattedRecord, + IostatUTF8Decoding, + IostatUnitOverflow, + IostatBadRealInput, + IostatBadScaleFactor, + IostatBadAsynchronous, + IostatBadWaitUnit, + IostatBOZInputOverflow, + IostatIntegerInputOverflow, + IostatRealInputOverflow, + IostatOpenAlreadyConnected, + IostatCannotReposition, + IostatBadWaitId, + IostatTooManyAsyncOps, + IostatBadBackspaceUnit, + IostatBadUnitNumber, + IostatBadFlushUnit, + IostatBadOpOnChildUnit, + IostatBadNewUnit, + IostatBadListDirectedInputSeparator, + IostatNonExternalDefinedUnformattedIo, +}; + +} // namespace Fortran::runtime::io + +#endif // FORTRAN_RUNTIME_IOSTAT_CONSTS_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/iostat.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/iostat.h new file mode 100644 index 00000000000..d8db68a3a1c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/iostat.h @@ -0,0 +1,23 @@ +//===-- include/flang/Runtime/iostat.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the values returned by the runtime for IOSTAT= specifiers +// on I/O statements. + +#ifndef FORTRAN_RUNTIME_IOSTAT_H_ +#define FORTRAN_RUNTIME_IOSTAT_H_ + +#include "flang/Common/api-attrs.h" +#include "flang/Runtime/iostat-consts.h" + +namespace Fortran::runtime::io { + +RT_API_ATTRS const char *IostatErrorString(int); + +} // namespace Fortran::runtime::io +#endif // FORTRAN_RUNTIME_IOSTAT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/magic-numbers.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/magic-numbers.h new file mode 100644 index 00000000000..6788ba098bc --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/magic-numbers.h @@ -0,0 +1,129 @@ +#if 0 /*===-- include/flang/Runtime/magic-numbers.h -----------------------===*/ +/* + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===----------------------------------------------------------------------===*/ +#endif +#if 0 +This header can be included into both Fortran and C. + +This file defines various code values that need to be exported +to predefined Fortran standard modules as well as to C/C++ +code in the compiler and runtime library. +These include: + - the error/end code values that can be returned + to an IOSTAT= or STAT= specifier on a Fortran I/O statement + or coindexed data reference (see Fortran 2018 12.11.5, + 16.10.2, and 16.10.2.33) +Codes from <errno.h>, e.g. ENOENT, are assumed to be positive +and are used "raw" as IOSTAT values. + +CFI_ERROR_xxx and CFI_INVALID_xxx macros from ISO_Fortran_binding.h +have small positive values. The FORTRAN_RUNTIME_STAT_xxx macros here +start at 100 so as to never conflict with those codes. +#endif +#ifndef FORTRAN_RUNTIME_MAGIC_NUMBERS_H_ +#define FORTRAN_RUNTIME_MAGIC_NUMBERS_H_ + +#define FORTRAN_DEFAULT_OUTPUT_UNIT 6 +#define FORTRAN_DEFAULT_INPUT_UNIT 5 +#define FORTRAN_ERROR_UNIT 0 + +#define FORTRAN_RUNTIME_IOSTAT_END (-1) +#define FORTRAN_RUNTIME_IOSTAT_EOR (-2) +#define FORTRAN_RUNTIME_IOSTAT_FLUSH (-3) +#define FORTRAN_RUNTIME_IOSTAT_INQUIRE_INTERNAL_UNIT 256 + +#define FORTRAN_RUNTIME_STAT_FAILED_IMAGE 101 +#define FORTRAN_RUNTIME_STAT_LOCKED 102 +#define FORTRAN_RUNTIME_STAT_LOCKED_OTHER_IMAGE 103 +#define FORTRAN_RUNTIME_STAT_STOPPED_IMAGE 104 +#define FORTRAN_RUNTIME_STAT_UNLOCKED 105 +#define FORTRAN_RUNTIME_STAT_UNLOCKED_FAILED_IMAGE 106 + +#if 0 +Status codes for GET_COMMAND_ARGUMENT. The status for 'value too short' needs +to be -1, the others must be positive. +#endif +#define FORTRAN_RUNTIME_STAT_INVALID_ARG_NUMBER 107 +#define FORTRAN_RUNTIME_STAT_MISSING_ARG 108 +#define FORTRAN_RUNTIME_STAT_VALUE_TOO_SHORT -1 + +#if 0 +Status codes for GET_ENVIRONMENT_VARIABLE. Values mandated by the standard. +#endif +#define FORTRAN_RUNTIME_STAT_MISSING_ENV_VAR 1 +#define FORTRAN_RUNTIME_STAT_ENV_VARS_UNSUPPORTED 2 + +#if 0 +Processor-defined status code for MOVE_ALLOC where arguments are the +same allocatable. +#endif +#define FORTRAN_RUNTIME_STAT_MOVE_ALLOC_SAME_ALLOCATABLE 109 + +#if 0 +Additional status code for a bad pointer DEALLOCATE. +#endif +#define FORTRAN_RUNTIME_STAT_BAD_POINTER_DEALLOCATION 110 + +#if 0 +Status codes for GETCWD. +#endif +#define FORTRAN_RUNTIME_STAT_MISSING_CWD 111 + +#if 0 +ieee_class_type values +The sequence is that of F18 Clause 17.2p3, but nothing depends on that. +#endif +#define _FORTRAN_RUNTIME_IEEE_SIGNALING_NAN 1 +#define _FORTRAN_RUNTIME_IEEE_QUIET_NAN 2 +#define _FORTRAN_RUNTIME_IEEE_NEGATIVE_INF 3 +#define _FORTRAN_RUNTIME_IEEE_NEGATIVE_NORMAL 4 +#define _FORTRAN_RUNTIME_IEEE_NEGATIVE_SUBNORMAL 5 +#define _FORTRAN_RUNTIME_IEEE_NEGATIVE_ZERO 6 +#define _FORTRAN_RUNTIME_IEEE_POSITIVE_ZERO 7 +#define _FORTRAN_RUNTIME_IEEE_POSITIVE_SUBNORMAL 8 +#define _FORTRAN_RUNTIME_IEEE_POSITIVE_NORMAL 9 +#define _FORTRAN_RUNTIME_IEEE_POSITIVE_INF 10 +#define _FORTRAN_RUNTIME_IEEE_OTHER_VALUE 11 + +#if 0 +ieee_flag_type values +The values are those of a common but not universal fenv.h file. +The denorm value is a nonstandard extension. +#endif +#define _FORTRAN_RUNTIME_IEEE_INVALID 1 +#define _FORTRAN_RUNTIME_IEEE_DENORM 2 +#define _FORTRAN_RUNTIME_IEEE_DIVIDE_BY_ZERO 4 +#define _FORTRAN_RUNTIME_IEEE_OVERFLOW 8 +#define _FORTRAN_RUNTIME_IEEE_UNDERFLOW 16 +#define _FORTRAN_RUNTIME_IEEE_INEXACT 32 +#define _FORTRAN_RUNTIME_IEEE_ALL \ + _FORTRAN_RUNTIME_IEEE_INVALID | _FORTRAN_RUNTIME_IEEE_DENORM | \ + _FORTRAN_RUNTIME_IEEE_DIVIDE_BY_ZERO | _FORTRAN_RUNTIME_IEEE_OVERFLOW | \ + _FORTRAN_RUNTIME_IEEE_UNDERFLOW | _FORTRAN_RUNTIME_IEEE_INEXACT + +#if 0 +ieee_round_type values +The values are those of the llvm.get.rounding intrinsic, which is assumed by +ieee_arithmetic module rounding procedures. +#endif +#define _FORTRAN_RUNTIME_IEEE_TO_ZERO 0 +#define _FORTRAN_RUNTIME_IEEE_NEAREST 1 +#define _FORTRAN_RUNTIME_IEEE_UP 2 +#define _FORTRAN_RUNTIME_IEEE_DOWN 3 +#define _FORTRAN_RUNTIME_IEEE_AWAY 4 +#define _FORTRAN_RUNTIME_IEEE_OTHER 5 + +#if 0 +INTEGER(kind=4) extents for ieee_exceptions module types ieee_modes_type and +ieee_status_type. These extent values are large enough to hold femode_t and +fenv_t data in many environments. An environment that does not meet these +size constraints may allocate memory with runtime size values. +#endif +#define _FORTRAN_RUNTIME_IEEE_FEMODE_T_EXTENT 2 +#define _FORTRAN_RUNTIME_IEEE_FENV_T_EXTENT 8 + +#endif diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/main.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/main.h new file mode 100644 index 00000000000..88232ea64fa --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/main.h @@ -0,0 +1,23 @@ +//===-- include/flang/Runtime/main.h ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_MAIN_H_ +#define FORTRAN_RUNTIME_MAIN_H_ + +#include "flang/Runtime/c-or-cpp.h" +#include "flang/Runtime/entry-names.h" + +struct EnvironmentDefaultList; + +FORTRAN_EXTERN_C_BEGIN +void RTNAME(ProgramStart)( + int, const char *[], const char *[], const struct EnvironmentDefaultList *); +void RTNAME(ByteswapOption)(void); // -byteswapio +FORTRAN_EXTERN_C_END + +#endif // FORTRAN_RUNTIME_MAIN_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul-instances.inc b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul-instances.inc new file mode 100644 index 00000000000..21269d0b3fe --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul-instances.inc @@ -0,0 +1,338 @@ +//===-- include/flang/Runtime/matmul-instances.inc --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// Helper macros to instantiate MATMUL/MATMUL_TRANSPOSE definitions +// for different data types of the input arguments. +//===----------------------------------------------------------------------===// + +#ifndef MATMUL_INSTANCE +#error "Define MATMUL_INSTANCE before including this file" +#endif + +#ifndef MATMUL_DIRECT_INSTANCE +#error "Define MATMUL_DIRECT_INSTANCE before including this file" +#endif + +#ifndef MATMUL_FORCE_ALL_TYPES +#error "Define MATMUL_FORCE_ALL_TYPES to 0 or 1 before including this file" +#endif + +// clang-format off + +#define FOREACH_MATMUL_TYPE_PAIR(macro) \ + macro(Integer, 1, Integer, 1) \ + macro(Integer, 1, Integer, 2) \ + macro(Integer, 1, Integer, 4) \ + macro(Integer, 1, Integer, 8) \ + macro(Integer, 2, Integer, 1) \ + macro(Integer, 2, Integer, 2) \ + macro(Integer, 2, Integer, 4) \ + macro(Integer, 2, Integer, 8) \ + macro(Integer, 4, Integer, 1) \ + macro(Integer, 4, Integer, 2) \ + macro(Integer, 4, Integer, 4) \ + macro(Integer, 4, Integer, 8) \ + macro(Integer, 8, Integer, 1) \ + macro(Integer, 8, Integer, 2) \ + macro(Integer, 8, Integer, 4) \ + macro(Integer, 8, Integer, 8) \ + macro(Integer, 1, Real, 4) \ + macro(Integer, 1, Real, 8) \ + macro(Integer, 2, Real, 4) \ + macro(Integer, 2, Real, 8) \ + macro(Integer, 4, Real, 4) \ + macro(Integer, 4, Real, 8) \ + macro(Integer, 8, Real, 4) \ + macro(Integer, 8, Real, 8) \ + macro(Integer, 1, Complex, 4) \ + macro(Integer, 1, Complex, 8) \ + macro(Integer, 2, Complex, 4) \ + macro(Integer, 2, Complex, 8) \ + macro(Integer, 4, Complex, 4) \ + macro(Integer, 4, Complex, 8) \ + macro(Integer, 8, Complex, 4) \ + macro(Integer, 8, Complex, 8) \ + macro(Unsigned, 1, Real, 4) \ + macro(Unsigned, 1, Real, 8) \ + macro(Unsigned, 2, Real, 4) \ + macro(Unsigned, 2, Real, 8) \ + macro(Unsigned, 4, Real, 4) \ + macro(Unsigned, 4, Real, 8) \ + macro(Unsigned, 8, Real, 4) \ + macro(Unsigned, 8, Real, 8) \ + macro(Unsigned, 1, Complex, 4) \ + macro(Unsigned, 1, Complex, 8) \ + macro(Unsigned, 2, Complex, 4) \ + macro(Unsigned, 2, Complex, 8) \ + macro(Unsigned, 4, Complex, 4) \ + macro(Unsigned, 4, Complex, 8) \ + macro(Unsigned, 8, Complex, 4) \ + macro(Unsigned, 8, Complex, 8) \ + macro(Real, 4, Integer, 1) \ + macro(Real, 4, Integer, 2) \ + macro(Real, 4, Integer, 4) \ + macro(Real, 4, Integer, 8) \ + macro(Real, 8, Integer, 1) \ + macro(Real, 8, Integer, 2) \ + macro(Real, 8, Integer, 4) \ + macro(Real, 8, Integer, 8) \ + macro(Real, 4, Unsigned, 1) \ + macro(Real, 4, Unsigned, 2) \ + macro(Real, 4, Unsigned, 4) \ + macro(Real, 4, Unsigned, 8) \ + macro(Real, 8, Unsigned, 1) \ + macro(Real, 8, Unsigned, 2) \ + macro(Real, 8, Unsigned, 4) \ + macro(Real, 8, Unsigned, 8) \ + macro(Real, 4, Real, 4) \ + macro(Real, 4, Real, 8) \ + macro(Real, 8, Real, 4) \ + macro(Real, 8, Real, 8) \ + macro(Real, 4, Complex, 4) \ + macro(Real, 4, Complex, 8) \ + macro(Real, 8, Complex, 4) \ + macro(Real, 8, Complex, 8) \ + macro(Complex, 4, Integer, 1) \ + macro(Complex, 4, Integer, 2) \ + macro(Complex, 4, Integer, 4) \ + macro(Complex, 4, Integer, 8) \ + macro(Complex, 8, Integer, 1) \ + macro(Complex, 8, Integer, 2) \ + macro(Complex, 8, Integer, 4) \ + macro(Complex, 8, Integer, 8) \ + macro(Complex, 4, Unsigned, 1) \ + macro(Complex, 4, Unsigned, 2) \ + macro(Complex, 4, Unsigned, 4) \ + macro(Complex, 4, Unsigned, 8) \ + macro(Complex, 8, Unsigned, 1) \ + macro(Complex, 8, Unsigned, 2) \ + macro(Complex, 8, Unsigned, 4) \ + macro(Complex, 8, Unsigned, 8) \ + macro(Complex, 4, Real, 4) \ + macro(Complex, 4, Real, 8) \ + macro(Complex, 8, Real, 4) \ + macro(Complex, 8, Real, 8) \ + macro(Complex, 4, Complex, 4) \ + macro(Complex, 4, Complex, 8) \ + macro(Complex, 8, Complex, 4) \ + macro(Complex, 8, Complex, 8) \ + +FOREACH_MATMUL_TYPE_PAIR(MATMUL_INSTANCE) +FOREACH_MATMUL_TYPE_PAIR(MATMUL_DIRECT_INSTANCE) + +#if MATMUL_FORCE_ALL_TYPES || (defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T) +#define FOREACH_MATMUL_TYPE_PAIR_WITH_INT16(macro) \ + macro(Integer, 16, Integer, 1) \ + macro(Integer, 16, Integer, 2) \ + macro(Integer, 16, Integer, 4) \ + macro(Integer, 16, Integer, 8) \ + macro(Integer, 16, Integer, 16) \ + macro(Integer, 16, Real, 4) \ + macro(Integer, 16, Real, 8) \ + macro(Integer, 16, Complex, 4) \ + macro(Integer, 16, Complex, 8) \ + macro(Unsigned, 16, Real, 4) \ + macro(Unsigned, 16, Real, 8) \ + macro(Unsigned, 16, Complex, 4) \ + macro(Unsigned, 16, Complex, 8) \ + macro(Real, 4, Integer, 16) \ + macro(Real, 8, Integer, 16) \ + macro(Complex, 4, Integer, 16) \ + macro(Complex, 8, Integer, 16) \ + macro(Real, 4, Unsigned, 16) \ + macro(Real, 8, Unsigned, 16) \ + macro(Complex, 4, Unsigned, 16) \ + macro(Complex, 8, Unsigned, 16) \ + +FOREACH_MATMUL_TYPE_PAIR_WITH_INT16(MATMUL_INSTANCE) +FOREACH_MATMUL_TYPE_PAIR_WITH_INT16(MATMUL_DIRECT_INSTANCE) + +#if MATMUL_FORCE_ALL_TYPES || HAS_FLOAT80 +MATMUL_INSTANCE(Integer, 16, Real, 10) +MATMUL_INSTANCE(Integer, 16, Complex, 10) +MATMUL_INSTANCE(Real, 10, Integer, 16) +MATMUL_INSTANCE(Complex, 10, Integer, 16) +MATMUL_INSTANCE(Unsigned, 16, Real, 10) +MATMUL_INSTANCE(Unsigned, 16, Complex, 10) +MATMUL_INSTANCE(Real, 10, Unsigned, 16) +MATMUL_INSTANCE(Complex, 10, Unsigned, 16) +MATMUL_DIRECT_INSTANCE(Integer, 16, Real, 10) +MATMUL_DIRECT_INSTANCE(Integer, 16, Complex, 10) +MATMUL_DIRECT_INSTANCE(Real, 10, Integer, 16) +MATMUL_DIRECT_INSTANCE(Complex, 10, Integer, 16) +MATMUL_DIRECT_INSTANCE(Unsigned, 16, Real, 10) +MATMUL_DIRECT_INSTANCE(Unsigned, 16, Complex, 10) +MATMUL_DIRECT_INSTANCE(Real, 10, Unsigned, 16) +MATMUL_DIRECT_INSTANCE(Complex, 10, Unsigned, 16) +#endif +#if MATMUL_FORCE_ALL_TYPES || (HAS_LDBL128 || HAS_FLOAT128) +MATMUL_INSTANCE(Integer, 16, Real, 16) +MATMUL_INSTANCE(Integer, 16, Complex, 16) +MATMUL_INSTANCE(Real, 16, Integer, 16) +MATMUL_INSTANCE(Complex, 16, Integer, 16) +MATMUL_INSTANCE(Unsigned, 16, Real, 16) +MATMUL_INSTANCE(Unsigned, 16, Complex, 16) +MATMUL_INSTANCE(Real, 16, Unsigned, 16) +MATMUL_INSTANCE(Complex, 16, Unsigned, 16) +MATMUL_DIRECT_INSTANCE(Integer, 16, Real, 16) +MATMUL_DIRECT_INSTANCE(Integer, 16, Complex, 16) +MATMUL_DIRECT_INSTANCE(Real, 16, Integer, 16) +MATMUL_DIRECT_INSTANCE(Complex, 16, Integer, 16) +MATMUL_DIRECT_INSTANCE(Unsigned, 16, Real, 16) +MATMUL_DIRECT_INSTANCE(Unsigned, 16, Complex, 16) +MATMUL_DIRECT_INSTANCE(Real, 16, Unsigned, 16) +MATMUL_DIRECT_INSTANCE(Complex, 16, Unsigned, 16) +#endif +#endif // MATMUL_FORCE_ALL_TYPES || (defined __SIZEOF_INT128__ && !AVOID_NATIVE_UINT128_T) + +#if MATMUL_FORCE_ALL_TYPES || HAS_FLOAT80 +#define FOREACH_MATMUL_TYPE_PAIR_WITH_REAL10(macro) \ + macro(Integer, 1, Real, 10) \ + macro(Integer, 1, Complex, 10) \ + macro(Integer, 2, Real, 10) \ + macro(Integer, 2, Complex, 10) \ + macro(Integer, 4, Real, 10) \ + macro(Integer, 4, Complex, 10) \ + macro(Integer, 8, Real, 10) \ + macro(Integer, 8, Complex, 10) \ + macro(Unsigned, 1, Real, 10) \ + macro(Unsigned, 1, Complex, 10) \ + macro(Unsigned, 2, Real, 10) \ + macro(Unsigned, 2, Complex, 10) \ + macro(Unsigned, 4, Real, 10) \ + macro(Unsigned, 4, Complex, 10) \ + macro(Unsigned, 8, Real, 10) \ + macro(Unsigned, 8, Complex, 10) \ + macro(Real, 4, Real, 10) \ + macro(Real, 4, Complex, 10) \ + macro(Real, 8, Real, 10) \ + macro(Real, 8, Complex, 10) \ + macro(Real, 10, Integer, 1) \ + macro(Real, 10, Integer, 2) \ + macro(Real, 10, Integer, 4) \ + macro(Real, 10, Integer, 8) \ + macro(Real, 10, Unsigned, 1) \ + macro(Real, 10, Unsigned, 2) \ + macro(Real, 10, Unsigned, 4) \ + macro(Real, 10, Unsigned, 8) \ + macro(Real, 10, Real, 4) \ + macro(Real, 10, Real, 8) \ + macro(Real, 10, Real, 10) \ + macro(Real, 10, Complex, 4) \ + macro(Real, 10, Complex, 8) \ + macro(Real, 10, Complex, 10) \ + macro(Complex, 4, Real, 10) \ + macro(Complex, 4, Complex, 10) \ + macro(Complex, 8, Real, 10) \ + macro(Complex, 8, Complex, 10) \ + macro(Complex, 10, Integer, 1) \ + macro(Complex, 10, Integer, 2) \ + macro(Complex, 10, Integer, 4) \ + macro(Complex, 10, Integer, 8) \ + macro(Complex, 10, Unsigned, 1) \ + macro(Complex, 10, Unsigned, 2) \ + macro(Complex, 10, Unsigned, 4) \ + macro(Complex, 10, Unsigned, 8) \ + macro(Complex, 10, Real, 4) \ + macro(Complex, 10, Real, 8) \ + macro(Complex, 10, Real, 10) \ + macro(Complex, 10, Complex, 4) \ + macro(Complex, 10, Complex, 8) \ + macro(Complex, 10, Complex, 10) \ + +FOREACH_MATMUL_TYPE_PAIR_WITH_REAL10(MATMUL_INSTANCE) +FOREACH_MATMUL_TYPE_PAIR_WITH_REAL10(MATMUL_DIRECT_INSTANCE) + +#if MATMUL_FORCE_ALL_TYPES || HAS_FLOAT128 +MATMUL_INSTANCE(Real, 10, Real, 16) +MATMUL_INSTANCE(Real, 10, Complex, 16) +MATMUL_INSTANCE(Real, 16, Real, 10) +MATMUL_INSTANCE(Real, 16, Complex, 10) +MATMUL_INSTANCE(Complex, 10, Real, 16) +MATMUL_INSTANCE(Complex, 10, Complex, 16) +MATMUL_INSTANCE(Complex, 16, Real, 10) +MATMUL_INSTANCE(Complex, 16, Complex, 10) +MATMUL_DIRECT_INSTANCE(Real, 10, Real, 16) +MATMUL_DIRECT_INSTANCE(Real, 10, Complex, 16) +MATMUL_DIRECT_INSTANCE(Real, 16, Real, 10) +MATMUL_DIRECT_INSTANCE(Real, 16, Complex, 10) +MATMUL_DIRECT_INSTANCE(Complex, 10, Real, 16) +MATMUL_DIRECT_INSTANCE(Complex, 10, Complex, 16) +MATMUL_DIRECT_INSTANCE(Complex, 16, Real, 10) +MATMUL_DIRECT_INSTANCE(Complex, 16, Complex, 10) +#endif +#endif // MATMUL_FORCE_ALL_TYPES || HAS_FLOAT80 + +#if MATMUL_FORCE_ALL_TYPES || (HAS_LDBL128 || HAS_FLOAT128) +#define FOREACH_MATMUL_TYPE_PAIR_WITH_REAL16(macro) \ + macro(Integer, 1, Real, 16) \ + macro(Integer, 1, Complex, 16) \ + macro(Integer, 2, Real, 16) \ + macro(Integer, 2, Complex, 16) \ + macro(Integer, 4, Real, 16) \ + macro(Integer, 4, Complex, 16) \ + macro(Integer, 8, Real, 16) \ + macro(Integer, 8, Complex, 16) \ + macro(Real, 4, Real, 16) \ + macro(Real, 4, Complex, 16) \ + macro(Real, 8, Real, 16) \ + macro(Real, 8, Complex, 16) \ + macro(Real, 16, Integer, 1) \ + macro(Real, 16, Integer, 2) \ + macro(Real, 16, Integer, 4) \ + macro(Real, 16, Integer, 8) \ + macro(Real, 16, Real, 4) \ + macro(Real, 16, Real, 8) \ + macro(Real, 16, Real, 16) \ + macro(Real, 16, Complex, 4) \ + macro(Real, 16, Complex, 8) \ + macro(Real, 16, Complex, 16) \ + macro(Complex, 4, Real, 16) \ + macro(Complex, 4, Complex, 16) \ + macro(Complex, 8, Real, 16) \ + macro(Complex, 8, Complex, 16) \ + macro(Complex, 16, Integer, 1) \ + macro(Complex, 16, Integer, 2) \ + macro(Complex, 16, Integer, 4) \ + macro(Complex, 16, Integer, 8) \ + macro(Complex, 16, Real, 4) \ + macro(Complex, 16, Real, 8) \ + macro(Complex, 16, Real, 16) \ + macro(Complex, 16, Complex, 4) \ + macro(Complex, 16, Complex, 8) \ + macro(Complex, 16, Complex, 16) \ + +FOREACH_MATMUL_TYPE_PAIR_WITH_REAL16(MATMUL_INSTANCE) +FOREACH_MATMUL_TYPE_PAIR_WITH_REAL16(MATMUL_DIRECT_INSTANCE) +#endif // MATMUL_FORCE_ALL_TYPES || (HAS_LDBL128 || HAS_FLOAT128) + +#define FOREACH_MATMUL_LOGICAL_TYPE_PAIR(macro) \ + macro(Logical, 1, Logical, 1) \ + macro(Logical, 1, Logical, 2) \ + macro(Logical, 1, Logical, 4) \ + macro(Logical, 1, Logical, 8) \ + macro(Logical, 2, Logical, 1) \ + macro(Logical, 2, Logical, 2) \ + macro(Logical, 2, Logical, 4) \ + macro(Logical, 2, Logical, 8) \ + macro(Logical, 4, Logical, 1) \ + macro(Logical, 4, Logical, 2) \ + macro(Logical, 4, Logical, 4) \ + macro(Logical, 4, Logical, 8) \ + macro(Logical, 8, Logical, 1) \ + macro(Logical, 8, Logical, 2) \ + macro(Logical, 8, Logical, 4) \ + macro(Logical, 8, Logical, 8) \ + +FOREACH_MATMUL_LOGICAL_TYPE_PAIR(MATMUL_INSTANCE) +FOREACH_MATMUL_LOGICAL_TYPE_PAIR(MATMUL_DIRECT_INSTANCE) + +#undef MATMUL_INSTANCE +#undef MATMUL_DIRECT_INSTANCE +#undef MATMUL_FORCE_ALL_TYPES + +// clang-format on diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul-transpose.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul-transpose.h new file mode 100644 index 00000000000..2d79ca10e08 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul-transpose.h @@ -0,0 +1,49 @@ +//===-- include/flang/Runtime/matmul-transpose.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// API for optimised MATMUL(TRANSPOSE(a), b) + +#ifndef FORTRAN_RUNTIME_MATMUL_TRANSPOSE_H_ +#define FORTRAN_RUNTIME_MATMUL_TRANSPOSE_H_ +#include "flang/Common/float128.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/entry-names.h" +namespace Fortran::runtime { +class Descriptor; +extern "C" { + +// The most general MATMUL(TRANSPOSE()). All type and shape information is +// taken from the arguments' descriptors, and the result is dynamically +// allocated. +void RTDECL(MatmulTranspose)(Descriptor &, const Descriptor &, + const Descriptor &, const char *sourceFile = nullptr, int line = 0); + +// A non-allocating variant; the result's descriptor must be established +// and have a valid base address. +void RTDECL(MatmulTransposeDirect)(const Descriptor &, const Descriptor &, + const Descriptor &, const char *sourceFile = nullptr, int line = 0); + +// MATMUL(TRANSPOSE()) versions specialized by the categories of the operand +// types. The KIND and shape information is taken from the argument's +// descriptors. +#define MATMUL_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDECL(MatmulTranspose##XCAT##XKIND##YCAT##YKIND)(Descriptor & result, \ + const Descriptor &x, const Descriptor &y, const char *sourceFile, \ + int line); +#define MATMUL_DIRECT_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDECL(MatmulTransposeDirect##XCAT##XKIND##YCAT##YKIND)( \ + Descriptor & result, const Descriptor &x, const Descriptor &y, \ + const char *sourceFile, int line); + +#define MATMUL_FORCE_ALL_TYPES 0 + +#include "matmul-instances.inc" + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_MATMUL_TRANSPOSE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul.h new file mode 100644 index 00000000000..a72d4a06ee4 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/matmul.h @@ -0,0 +1,48 @@ +//===-- include/flang/Runtime/matmul.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// API for the transformational intrinsic function MATMUL. + +#ifndef FORTRAN_RUNTIME_MATMUL_H_ +#define FORTRAN_RUNTIME_MATMUL_H_ +#include "flang/Common/float128.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/entry-names.h" +namespace Fortran::runtime { +class Descriptor; +extern "C" { + +// The most general MATMUL. All type and shape information is taken from the +// arguments' descriptors, and the result is dynamically allocated. +void RTDECL(Matmul)(Descriptor &, const Descriptor &, const Descriptor &, + const char *sourceFile = nullptr, int line = 0); + +// A non-allocating variant; the result's descriptor must be established +// and have a valid base address. +void RTDECL(MatmulDirect)(const Descriptor &, const Descriptor &, + const Descriptor &, const char *sourceFile = nullptr, int line = 0); + +// MATMUL versions specialized by the categories of the operand types. +// The KIND and shape information is taken from the argument's +// descriptors. +#define MATMUL_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDECL(Matmul##XCAT##XKIND##YCAT##YKIND)(Descriptor & result, \ + const Descriptor &x, const Descriptor &y, const char *sourceFile, \ + int line); +#define MATMUL_DIRECT_INSTANCE(XCAT, XKIND, YCAT, YKIND) \ + void RTDECL(MatmulDirect##XCAT##XKIND##YCAT##YKIND)(Descriptor & result, \ + const Descriptor &x, const Descriptor &y, const char *sourceFile, \ + int line); + +#define MATMUL_FORCE_ALL_TYPES 0 + +#include "matmul-instances.inc" + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_MATMUL_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/misc-intrinsic.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/misc-intrinsic.h new file mode 100644 index 00000000000..3fb3aaed49c --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/misc-intrinsic.h @@ -0,0 +1,31 @@ +//===-- include/flang/Runtime/misc-intrinsic.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Miscellaneous intrinsic procedures + +#ifndef FORTRAN_RUNTIME_MISC_INTRINSIC_H_ +#define FORTRAN_RUNTIME_MISC_INTRINSIC_H_ + +#include "flang/Runtime/entry-names.h" +#include <cstdint> + +namespace Fortran::runtime { + +class Descriptor; + +extern "C" { +void RTDECL(Rename)(const Descriptor &path1, const Descriptor &path2, + const Descriptor *status, const char *sourceFile, int line); +void RTDECL(Transfer)(Descriptor &result, const Descriptor &source, + const Descriptor &mold, const char *sourceFile, int line); +void RTDECL(TransferSize)(Descriptor &result, const Descriptor &source, + const Descriptor &mold, const char *sourceFile, int line, + std::int64_t size); +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_MISC_INTRINSIC_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/numeric.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/numeric.h new file mode 100644 index 00000000000..794c8f47688 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/numeric.h @@ -0,0 +1,458 @@ +//===-- include/flang/Runtime/numeric.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines API between compiled code and the implementations of various numeric +// intrinsic functions in the runtime library. + +#ifndef FORTRAN_RUNTIME_NUMERIC_H_ +#define FORTRAN_RUNTIME_NUMERIC_H_ + +#include "flang/Common/float128.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/entry-names.h" + +namespace Fortran::runtime { +extern "C" { + +// CEILING +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling4_1)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling4_2)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling4_4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling4_8)( + CppTypeFor<TypeCategory::Real, 4>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling4_16)( + CppTypeFor<TypeCategory::Real, 4>); +#endif +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling8_1)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling8_2)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling8_4)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling8_8)( + CppTypeFor<TypeCategory::Real, 8>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling8_16)( + CppTypeFor<TypeCategory::Real, 8>); +#endif +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling10_1)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling10_2)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling10_4)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling10_8)( + CppTypeFor<TypeCategory::Real, 10>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling10_16)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Ceiling16_1)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Ceiling16_2)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Ceiling16_4)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Ceiling16_8)( + CppTypeFor<TypeCategory::Real, 16>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Ceiling16_16)( + CppTypeFor<TypeCategory::Real, 16>); +#endif +#endif + +// ERFC_SCALED +CppTypeFor<TypeCategory::Real, 4> RTDECL(ErfcScaled4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Real, 8> RTDECL(ErfcScaled8)( + CppTypeFor<TypeCategory::Real, 8>); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(ErfcScaled10)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(ErfcScaled16)( + CppTypeFor<TypeCategory::Real, 16>); +#endif + +// EXPONENT is defined to return default INTEGER; support INTEGER(4 & 8) +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent4_4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent4_8)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent8_4)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent8_8)( + CppTypeFor<TypeCategory::Real, 8>); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent10_4)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent10_8)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#if HAS_LDBL128 || HAS_FLOAT +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Exponent16_4)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Exponent16_8)( + CppTypeFor<TypeCategory::Real, 16>); +#endif + +// FLOOR +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor4_1)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor4_2)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor4_4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor4_8)( + CppTypeFor<TypeCategory::Real, 4>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor4_16)( + CppTypeFor<TypeCategory::Real, 4>); +#endif +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor8_1)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor8_2)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor8_4)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor8_8)( + CppTypeFor<TypeCategory::Real, 8>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor8_16)( + CppTypeFor<TypeCategory::Real, 8>); +#endif +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor10_1)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor10_2)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor10_4)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor10_8)( + CppTypeFor<TypeCategory::Real, 10>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor10_16)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Floor16_1)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Floor16_2)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Floor16_4)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Floor16_8)( + CppTypeFor<TypeCategory::Real, 16>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Floor16_16)( + CppTypeFor<TypeCategory::Real, 16>); +#endif +#endif + +// FRACTION +CppTypeFor<TypeCategory::Real, 4> RTDECL(Fraction4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Real, 8> RTDECL(Fraction8)( + CppTypeFor<TypeCategory::Real, 8>); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(Fraction10)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(Fraction16)( + CppTypeFor<TypeCategory::Real, 16>); +#endif + +// ISNAN / IEEE_IS_NAN +bool RTDECL(IsNaN4)(CppTypeFor<TypeCategory::Real, 4>); +bool RTDECL(IsNaN8)(CppTypeFor<TypeCategory::Real, 8>); +#if HAS_FLOAT80 +bool RTDECL(IsNaN10)(CppTypeFor<TypeCategory::Real, 10>); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +bool RTDECL(IsNaN16)(CppTypeFor<TypeCategory::Real, 16>); +#endif + +// MOD & MODULO +CppTypeFor<TypeCategory::Integer, 1> RTDECL(ModInteger1)( + CppTypeFor<TypeCategory::Integer, 1>, CppTypeFor<TypeCategory::Integer, 1>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(ModInteger2)( + CppTypeFor<TypeCategory::Integer, 2>, CppTypeFor<TypeCategory::Integer, 2>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(ModInteger4)( + CppTypeFor<TypeCategory::Integer, 4>, CppTypeFor<TypeCategory::Integer, 4>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(ModInteger8)( + CppTypeFor<TypeCategory::Integer, 8>, CppTypeFor<TypeCategory::Integer, 8>, + const char *sourceFile = nullptr, int sourceLine = 0); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(ModInteger16)( + CppTypeFor<TypeCategory::Integer, 16>, + CppTypeFor<TypeCategory::Integer, 16>, const char *sourceFile = nullptr, + int sourceLine = 0); +#endif +CppTypeFor<TypeCategory::Real, 4> RTDECL(ModReal4)( + CppTypeFor<TypeCategory::Real, 4>, CppTypeFor<TypeCategory::Real, 4>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Real, 8> RTDECL(ModReal8)( + CppTypeFor<TypeCategory::Real, 8>, CppTypeFor<TypeCategory::Real, 8>, + const char *sourceFile = nullptr, int sourceLine = 0); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(ModReal10)( + CppTypeFor<TypeCategory::Real, 10>, CppTypeFor<TypeCategory::Real, 10>, + const char *sourceFile = nullptr, int sourceLine = 0); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(ModReal16)( + CppTypeFor<TypeCategory::Real, 16>, CppTypeFor<TypeCategory::Real, 16>, + const char *sourceFile = nullptr, int sourceLine = 0); +#endif + +CppTypeFor<TypeCategory::Integer, 1> RTDECL(ModuloInteger1)( + CppTypeFor<TypeCategory::Integer, 1>, CppTypeFor<TypeCategory::Integer, 1>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(ModuloInteger2)( + CppTypeFor<TypeCategory::Integer, 2>, CppTypeFor<TypeCategory::Integer, 2>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(ModuloInteger4)( + CppTypeFor<TypeCategory::Integer, 4>, CppTypeFor<TypeCategory::Integer, 4>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(ModuloInteger8)( + CppTypeFor<TypeCategory::Integer, 8>, CppTypeFor<TypeCategory::Integer, 8>, + const char *sourceFile = nullptr, int sourceLine = 0); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(ModuloInteger16)( + CppTypeFor<TypeCategory::Integer, 16>, + CppTypeFor<TypeCategory::Integer, 16>, const char *sourceFile = nullptr, + int sourceLine = 0); +#endif +CppTypeFor<TypeCategory::Real, 4> RTDECL(ModuloReal4)( + CppTypeFor<TypeCategory::Real, 4>, CppTypeFor<TypeCategory::Real, 4>, + const char *sourceFile = nullptr, int sourceLine = 0); +CppTypeFor<TypeCategory::Real, 8> RTDECL(ModuloReal8)( + CppTypeFor<TypeCategory::Real, 8>, CppTypeFor<TypeCategory::Real, 8>, + const char *sourceFile = nullptr, int sourceLine = 0); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(ModuloReal10)( + CppTypeFor<TypeCategory::Real, 10>, CppTypeFor<TypeCategory::Real, 10>, + const char *sourceFile = nullptr, int sourceLine = 0); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(ModuloReal16)( + CppTypeFor<TypeCategory::Real, 16>, CppTypeFor<TypeCategory::Real, 16>, + const char *sourceFile = nullptr, int sourceLine = 0); +#endif + +// NINT +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint4_1)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint4_2)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint4_4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint4_8)( + CppTypeFor<TypeCategory::Real, 4>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint4_16)( + CppTypeFor<TypeCategory::Real, 4>); +#endif +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint8_1)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint8_2)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint8_4)( + CppTypeFor<TypeCategory::Real, 8>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint8_8)( + CppTypeFor<TypeCategory::Real, 8>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint8_16)( + CppTypeFor<TypeCategory::Real, 8>); +#endif +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint10_1)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint10_2)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint10_4)( + CppTypeFor<TypeCategory::Real, 10>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint10_8)( + CppTypeFor<TypeCategory::Real, 10>); +#ifdef __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint10_16)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Integer, 1> RTDECL(Nint16_1)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 2> RTDECL(Nint16_2)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(Nint16_4)( + CppTypeFor<TypeCategory::Real, 16>); +CppTypeFor<TypeCategory::Integer, 8> RTDECL(Nint16_8)( + CppTypeFor<TypeCategory::Real, 16>); +#if defined __SIZEOF_INT128__ +CppTypeFor<TypeCategory::Integer, 16> RTDECL(Nint16_16)( + CppTypeFor<TypeCategory::Real, 16>); +#endif +#endif + +// NEAREST +// The second argument to NEAREST is the result of a comparison +// to zero (i.e., S > 0) +CppTypeFor<TypeCategory::Real, 4> RTDECL(Nearest4)( + CppTypeFor<TypeCategory::Real, 4>, bool positive); +CppTypeFor<TypeCategory::Real, 8> RTDECL(Nearest8)( + CppTypeFor<TypeCategory::Real, 8>, bool positive); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(Nearest10)( + CppTypeFor<TypeCategory::Real, 10>, bool positive); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(Nearest16)( + CppTypeFor<TypeCategory::Real, 16>, bool positive); +#endif + +// RRSPACING +CppTypeFor<TypeCategory::Real, 4> RTDECL(RRSpacing4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Real, 8> RTDECL(RRSpacing8)( + CppTypeFor<TypeCategory::Real, 8>); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(RRSpacing10)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(RRSpacing16)( + CppTypeFor<TypeCategory::Real, 16>); +#endif + +// SET_EXPONENT's I= argument can be any INTEGER kind; upcast it to 64-bit +CppTypeFor<TypeCategory::Real, 4> RTDECL(SetExponent4)( + CppTypeFor<TypeCategory::Real, 4>, std::int64_t); +CppTypeFor<TypeCategory::Real, 8> RTDECL(SetExponent8)( + CppTypeFor<TypeCategory::Real, 8>, std::int64_t); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(SetExponent10)( + CppTypeFor<TypeCategory::Real, 10>, std::int64_t); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(SetExponent16)( + CppTypeFor<TypeCategory::Real, 16>, std::int64_t); +#endif + +// SCALE +CppTypeFor<TypeCategory::Real, 4> RTDECL(Scale4)( + CppTypeFor<TypeCategory::Real, 4>, std::int64_t); +CppTypeFor<TypeCategory::Real, 8> RTDECL(Scale8)( + CppTypeFor<TypeCategory::Real, 8>, std::int64_t); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(Scale10)( + CppTypeFor<TypeCategory::Real, 10>, std::int64_t); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(Scale16)( + CppTypeFor<TypeCategory::Real, 16>, std::int64_t); +#endif + +// SELECTED_CHAR_KIND +CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedCharKind)( + const char *, int, const char *, std::size_t); + +// SELECTED_INT_KIND and SELECTED_UNSIGNED_KIND +CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedIntKind)( + const char *, int, void *, int); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedIntKindMasked)( + const char *, int, void *, int, int); + +// SELECTED_LOGICAL_KIND +CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedLogicalKind)( + const char *, int, void *, int); + +// SELECTED_REAL_KIND +CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedRealKind)( + const char *, int, void *, int, void *, int, void *, int); +CppTypeFor<TypeCategory::Integer, 4> RTDECL(SelectedRealKindMasked)( + const char *, int, void *, int, void *, int, void *, int, int); + +// SPACING +// The variants Spacing2By4 and Spacing3By4 compute SPACING for REAL(2/3) +// but accept and return REAL(4) values, for use in environments where +// std::float16_t or std::bfloat16_t are unavailable. +#if HAS_FP16 +CppTypeFor<TypeCategory::Real, 2> RTDECL(Spacing2)( + CppTypeFor<TypeCategory::Real, 2>); +#endif +CppTypeFor<TypeCategory::Real, 4> RTDECL(Spacing2By4)( + CppTypeFor<TypeCategory::Real, 4>); +#if HAS_BF16 +CppTypeFor<TypeCategory::Real, 3> RTDECL(Spacing3)( + CppTypeFor<TypeCategory::Real, 3>); +#endif +CppTypeFor<TypeCategory::Real, 4> RTDECL(Spacing3By4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Real, 4> RTDECL(Spacing4)( + CppTypeFor<TypeCategory::Real, 4>); +CppTypeFor<TypeCategory::Real, 8> RTDECL(Spacing8)( + CppTypeFor<TypeCategory::Real, 8>); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(Spacing10)( + CppTypeFor<TypeCategory::Real, 10>); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(Spacing16)( + CppTypeFor<TypeCategory::Real, 16>); +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDECL(FPow4i)( + CppTypeFor<TypeCategory::Real, 4> b, + CppTypeFor<TypeCategory::Integer, 4> e); +CppTypeFor<TypeCategory::Real, 8> RTDECL(FPow8i)( + CppTypeFor<TypeCategory::Real, 8> b, + CppTypeFor<TypeCategory::Integer, 4> e); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(FPow10i)( + CppTypeFor<TypeCategory::Real, 10> b, + CppTypeFor<TypeCategory::Integer, 4> e); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(FPow16i)( + CppTypeFor<TypeCategory::Real, 16> b, + CppTypeFor<TypeCategory::Integer, 4> e); +#endif + +CppTypeFor<TypeCategory::Real, 4> RTDECL(FPow4k)( + CppTypeFor<TypeCategory::Real, 4> b, + CppTypeFor<TypeCategory::Integer, 8> e); +CppTypeFor<TypeCategory::Real, 8> RTDECL(FPow8k)( + CppTypeFor<TypeCategory::Real, 8> b, + CppTypeFor<TypeCategory::Integer, 8> e); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(FPow10k)( + CppTypeFor<TypeCategory::Real, 10> b, + CppTypeFor<TypeCategory::Integer, 8> e); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppTypeFor<TypeCategory::Real, 16> RTDECL(FPow16k)( + CppTypeFor<TypeCategory::Real, 16> b, + CppTypeFor<TypeCategory::Integer, 8> e); +#endif + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_NUMERIC_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/pointer.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/pointer.h new file mode 100644 index 00000000000..83472ee59d2 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/pointer.h @@ -0,0 +1,126 @@ +//===-- include/flang/Runtime/pointer.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines APIs for Fortran runtime library support of code generated +// to manipulate and query data pointers. + +#ifndef FORTRAN_RUNTIME_POINTER_H_ +#define FORTRAN_RUNTIME_POINTER_H_ + +#include "flang/Runtime/descriptor-consts.h" +#include "flang/Runtime/entry-names.h" + +namespace Fortran::runtime { +extern "C" { + +// Data pointer initialization for NULLIFY(), "p=>NULL()`, & for ALLOCATE(). + +// Initializes a pointer to a disassociated state for NULLIFY() or "p=>NULL()". +void RTDECL(PointerNullifyIntrinsic)( + Descriptor &, TypeCategory, int kind, int rank = 0, int corank = 0); +void RTDECL(PointerNullifyCharacter)(Descriptor &, SubscriptValue length = 0, + int kind = 1, int rank = 0, int corank = 0); +void RTDECL(PointerNullifyDerived)( + Descriptor &, const typeInfo::DerivedType &, int rank = 0, int corank = 0); + +// Explicitly sets the bounds of an initialized disassociated pointer. +// The upper cobound is ignored for the last codimension. +void RTDECL(PointerSetBounds)( + Descriptor &, int zeroBasedDim, SubscriptValue lower, SubscriptValue upper); +void RTDECL(PointerSetCoBounds)(Descriptor &, int zeroBasedCoDim, + SubscriptValue lower, SubscriptValue upper = 0); + +// Length type parameters are indexed in declaration order; i.e., 0 is the +// first length type parameter in the deepest base type. (Not for use +// with CHARACTER; see above.) +void RTDECL(PointerSetDerivedLength)(Descriptor &, int which, SubscriptValue); + +// For MOLD= allocation: acquires information from another descriptor +// to initialize a null data pointer. +void RTDECL(PointerApplyMold)( + Descriptor &, const Descriptor &mold, int rank = 0); + +// Data pointer association for "p=>TARGET" + +// Associates a scalar pointer with a simple scalar target. +void RTDECL(PointerAssociateScalar)(Descriptor &, void *); + +// Associates a pointer with a target of the same rank, possibly with new lower +// bounds, which are passed in a vector whose length must equal the rank. +void RTDECL(PointerAssociate)(Descriptor &, const Descriptor &target); +void RTDECL(PointerAssociateLowerBounds)( + Descriptor &, const Descriptor &target, const Descriptor &lowerBounds); + +// Associates a pointer with a target with bounds remapping. The target must be +// simply contiguous &/or of rank 1. The bounds constitute a [2,newRank] +// integer array whose columns are [lower bound, upper bound] on each dimension. +void RTDECL(PointerAssociateRemapping)(Descriptor &, const Descriptor &target, + const Descriptor &bounds, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Data pointer allocation and deallocation + +// When an explicit type-spec appears in an ALLOCATE statement for an +// pointer with an explicit (non-deferred) length type paramater for +// a derived type or CHARACTER value, the explicit value has to match +// the length type parameter's value. This API checks that requirement. +// Returns 0 for success, or the STAT= value on failure with hasStat==true. +int RTDECL(PointerCheckLengthParameter)(Descriptor &, + int which /* 0 for CHARACTER length */, SubscriptValue other, + bool hasStat = false, const Descriptor *errMsg = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Allocates a data pointer. Its descriptor must have been initialized +// and its bounds and length type parameters set. It need not be disassociated. +// On failure, if hasStat is true, returns a nonzero error code for +// STAT= and (if present) fills in errMsg; if hasStat is false, the +// image is terminated. On success, leaves errMsg alone and returns zero. +// Successfully allocated memory is initialized if the pointer has a +// derived type, and is always initialized by PointerAllocateSource(). +// Performs all necessary coarray synchronization and validation actions. +int RTDECL(PointerAllocate)(Descriptor &, bool hasStat = false, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); +int RTDECL(PointerAllocateSource)(Descriptor &, const Descriptor &source, + bool hasStat = false, const Descriptor *errMsg = nullptr, + const char *sourceFile = nullptr, int sourceLine = 0); + +// Deallocates a data pointer, which must have been allocated by +// PointerAllocate(), possibly copied with PointerAssociate(). +// Finalizes elements &/or components as needed. The pointer is left +// in an initialized disassociated state suitable for reallocation +// with the same bounds, cobounds, and length type parameters. +int RTDECL(PointerDeallocate)(Descriptor &, bool hasStat = false, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Same as PointerDeallocate but also set the dynamic type as the declared type +// as mentioned in 7.3.2.3 note 7. +int RTDECL(PointerDeallocatePolymorphic)(Descriptor &, + const typeInfo::DerivedType *, bool hasStat = false, + const Descriptor *errMsg = nullptr, const char *sourceFile = nullptr, + int sourceLine = 0); + +// Association inquiries for ASSOCIATED() + +// True when the pointer is not disassociated. +bool RTDECL(PointerIsAssociated)(const Descriptor &); + +// True when the pointer is associated with a specific target. +bool RTDECL(PointerIsAssociatedWith)( + const Descriptor &, const Descriptor *target); + +// Fortran POINTERs are allocated with an extra validation word after their +// payloads in order to detect erroneous deallocations later. +RT_API_ATTRS void *AllocateValidatedPointerPayload( + std::size_t, int allocatorIdx = 0); +RT_API_ATTRS bool ValidatePointerPayload(const ISO::CFI_cdesc_t &); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_POINTER_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/ragged.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/ragged.h new file mode 100644 index 00000000000..f52a619c55b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/ragged.h @@ -0,0 +1,60 @@ +//===-- Runtime/ragged.h ----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_RAGGED_H_ +#define FORTRAN_RUNTIME_RAGGED_H_ + +#include "flang/Runtime/entry-names.h" +#include <cstdint> + +namespace Fortran::runtime { + +// A ragged array header block. +// The header block is used to create the "array of arrays" ragged data +// structure. It contains a pair in `flags` to indicate if the header points to +// an array of headers (isIndirection) or data elements and the rank of the +// pointed-to array. The rank is the length of the extents vector accessed +// through `extentPointer`. The `bufferPointer` is overloaded +// and is null, points to an array of headers (isIndirection), or data. +// By default, a header is set to zero, which is its unused state. +// The layout of a ragged buffer header is mirrored in the compiler. +struct RaggedArrayHeader { + std::uint64_t flags; + void *bufferPointer; + std::int64_t *extentPointer; +}; + +extern "C" { + +// For more on ragged arrays see https://en.wikipedia.org/wiki/Jagged_array. The +// Flang compiler allocates ragged arrays as a generalization for +// non-rectangular array temporaries. Ragged arrays can be allocated recursively +// and on demand. Structurally, each leaf is an optional rectangular array of +// elements. The shape of each leaf is independent and may be computed on +// demand. Each branch node is an optional, possibly sparse rectangular array of +// headers. The shape of each branch is independent and may be computed on +// demand. Ragged arrays preserve a correspondence between a multidimensional +// iteration space and array access vectors, which is helpful for dependence +// analysis. + +// Runtime helper for allocation of ragged array buffers. +// A pointer to the header block to be allocated is given as header. The flag +// isHeader indicates if a block of headers or data is to be allocated. A +// non-negative rank indicates the length of the extentVector, which is a list +// of non-negative extents. elementSize is the size of a data element in the +// rectangular space defined by the extentVector. +void *RTDECL(RaggedArrayAllocate)(void *header, bool isHeader, + std::int64_t rank, std::int64_t elementSize, std::int64_t *extentVector); + +// Runtime helper for deallocation of ragged array buffers. The root header of +// the ragged array structure is passed to deallocate the entire ragged array. +void RTDECL(RaggedArrayDeallocate)(void *raggedArrayHeader); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_RAGGED_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/random.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/random.h new file mode 100644 index 00000000000..1f01be1aa9f --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/random.h @@ -0,0 +1,42 @@ +//===-- include/flang/Runtime/random.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Intrinsic subroutines RANDOM_INIT, RANDOM_NUMBER, and RANDOM_SEED. + +#ifndef FORTRAN_RUNTIME_RANDOM_H_ +#define FORTRAN_RUNTIME_RANDOM_H_ + +#include "flang/Runtime/entry-names.h" +#include <cstdint> + +namespace Fortran::runtime { +class Descriptor; +extern "C" { + +void RTNAME(RandomInit)(bool repeatable, bool image_distinct); + +void RTNAME(RandomNumber)( + const Descriptor &harvest, const char *source, int line); + +// RANDOM_SEED may be called with a value for at most one of its three +// optional arguments. Most calls map to an entry point for that value, +// or the entry point for no values. If argument presence cannot be +// determined at compile time, function RandomSeed can be called to make +// the selection at run time. +void RTNAME(RandomSeedSize)( + const Descriptor *size, const char *source, int line); +void RTNAME(RandomSeedPut)(const Descriptor *put, const char *source, int line); +void RTNAME(RandomSeedGet)(const Descriptor *get, const char *source, int line); +void RTNAME(RandomSeedDefaultPut)(); +void RTNAME(RandomSeed)(const Descriptor *size, const Descriptor *put, + const Descriptor *get, const char *source, int line); + +} // extern "C" +} // namespace Fortran::runtime + +#endif // FORTRAN_RUNTIME_RANDOM_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/reduce.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/reduce.h new file mode 100644 index 00000000000..26a61be455b --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/reduce.h @@ -0,0 +1,565 @@ +//===-- include/flang/Runtime/reduce.h --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the API for implementations of the transformational intrinsic +// function REDUCE(); see F'2023 16.9.173. +// +// Similar to the definition of the APIs for SUM(), &c., in reduction.h, +// there are typed functions here like ReduceInteger4() for total reductions +// to scalars and void functions like ReduceInteger4Dim() for partial +// reductions to smaller arrays. + +#ifndef FORTRAN_RUNTIME_REDUCE_H_ +#define FORTRAN_RUNTIME_REDUCE_H_ + +#include "flang/Common/float128.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/entry-names.h" +#include <complex> +#include <cstdint> + +namespace Fortran::runtime { + +class Descriptor; + +template <typename T> +using ReferenceReductionOperation = T (*)(const T *, const T *); +template <typename T> using ValueReductionOperation = T (*)(T, T); +template <typename CHAR> +using ReductionCharOperation = void (*)(CHAR *hiddenResult, + std::size_t resultLen, const CHAR *x, const CHAR *y, std::size_t xLen, + std::size_t yLen); +using ReductionDerivedTypeOperation = void (*)( + void *hiddenResult, const void *x, const void *y); + +extern "C" { + +std::int8_t RTDECL(ReduceInteger1Ref)(const Descriptor &, + ReferenceReductionOperation<std::int8_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +std::int8_t RTDECL(ReduceInteger1Value)(const Descriptor &, + ValueReductionOperation<std::int8_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int8_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int8_t>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr, + bool ordered = true); +std::int16_t RTDECL(ReduceInteger2Ref)(const Descriptor &, + ReferenceReductionOperation<std::int16_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +std::int16_t RTDECL(ReduceInteger2Value)(const Descriptor &, + ValueReductionOperation<std::int16_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int16_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int16_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +std::int32_t RTDECL(ReduceInteger4Ref)(const Descriptor &, + ReferenceReductionOperation<std::int32_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +std::int32_t RTDECL(ReduceInteger4Value)(const Descriptor &, + ValueReductionOperation<std::int32_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int32_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int32_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +std::int64_t RTDECL(ReduceInteger8Ref)(const Descriptor &, + ReferenceReductionOperation<std::int64_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +std::int64_t RTDECL(ReduceInteger8Value)(const Descriptor &, + ValueReductionOperation<std::int64_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int64_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int64_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(ReduceInteger16Ref)(const Descriptor &, + ReferenceReductionOperation<common::int128_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const common::int128_t *identity = nullptr, bool ordered = true); +common::int128_t RTDECL(ReduceInteger16Value)(const Descriptor &, + ValueReductionOperation<common::int128_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const common::int128_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<common::int128_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const common::int128_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceInteger16DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation<common::int128_t>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const common::int128_t *identity = nullptr, bool ordered = true); +#endif + +std::uint8_t RTDECL(ReduceUnsigned1Ref)(const Descriptor &, + ReferenceReductionOperation<std::uint8_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint8_t *identity = nullptr, bool ordered = true); +std::uint8_t RTDECL(ReduceUnsigned1Value)(const Descriptor &, + ValueReductionOperation<std::uint8_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint8_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::uint8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned1DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation<std::uint8_t>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::uint8_t *identity = nullptr, bool ordered = true); +std::uint16_t RTDECL(ReduceUnsigned2Ref)(const Descriptor &, + ReferenceReductionOperation<std::uint16_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint16_t *identity = nullptr, bool ordered = true); +std::uint16_t RTDECL(ReduceUnsigned2Value)(const Descriptor &, + ValueReductionOperation<std::uint16_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint16_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::uint16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned2DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation<std::uint16_t>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::uint16_t *identity = nullptr, bool ordered = true); +std::uint32_t RTDECL(ReduceUnsigned4Ref)(const Descriptor &, + ReferenceReductionOperation<std::uint32_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint32_t *identity = nullptr, bool ordered = true); +std::uint32_t RTDECL(ReduceUnsigned4Value)(const Descriptor &, + ValueReductionOperation<std::uint32_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint32_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::uint32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned4DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation<std::uint32_t>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::uint32_t *identity = nullptr, bool ordered = true); +std::uint64_t RTDECL(ReduceUnsigned8Ref)(const Descriptor &, + ReferenceReductionOperation<std::uint64_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint64_t *identity = nullptr, bool ordered = true); +std::uint64_t RTDECL(ReduceUnsigned8Value)(const Descriptor &, + ValueReductionOperation<std::uint64_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::uint64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::uint64_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::uint64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned8DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation<std::uint64_t>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const std::uint64_t *identity = nullptr, bool ordered = true); +#ifdef __SIZEOF_INT128__ +common::uint128_t RTDECL(ReduceUnsigned16Ref)(const Descriptor &, + ReferenceReductionOperation<common::uint128_t>, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr, + const common::uint128_t *identity = nullptr, bool ordered = true); +common::uint128_t RTDECL(ReduceUnsigned16Value)(const Descriptor &, + ValueReductionOperation<common::uint128_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const common::uint128_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<common::uint128_t>, const char *source, + int line, int dim, const Descriptor *mask = nullptr, + const common::uint128_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceUnsigned16DimValue)(Descriptor &result, + const Descriptor &array, ValueReductionOperation<common::uint128_t>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const common::uint128_t *identity = nullptr, bool ordered = true); +#endif + +// REAL/COMPLEX(2 & 3) return 32-bit float results for the caller to downconvert +float RTDECL(ReduceReal2Ref)(const Descriptor &, + ReferenceReductionOperation<float>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const float *identity = nullptr, bool ordered = true); +float RTDECL(ReduceReal2Value)(const Descriptor &, + ValueReductionOperation<float>, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<float>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<float>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +float RTDECL(ReduceReal3Ref)(const Descriptor &, + ReferenceReductionOperation<float>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const float *identity = nullptr, bool ordered = true); +float RTDECL(ReduceReal3Value)(const Descriptor &, + ValueReductionOperation<float>, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal3DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<float>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal3DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<float>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +float RTDECL(ReduceReal4Ref)(const Descriptor &, + ReferenceReductionOperation<float>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const float *identity = nullptr, bool ordered = true); +float RTDECL(ReduceReal4Value)(const Descriptor &, + ValueReductionOperation<float>, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<float>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<float>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const float *identity = nullptr, + bool ordered = true); +double RTDECL(ReduceReal8Ref)(const Descriptor &, + ReferenceReductionOperation<double>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const double *identity = nullptr, bool ordered = true); +double RTDECL(ReduceReal8Value)(const Descriptor &, + ValueReductionOperation<double>, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const double *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<double>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const double *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<double>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const double *identity = nullptr, + bool ordered = true); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(ReduceReal10Ref)(const Descriptor &, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Real, 10>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr, + bool ordered = true); +CppTypeFor<TypeCategory::Real, 10> RTDECL(ReduceReal10Value)(const Descriptor &, + ValueReductionOperation<CppTypeFor<TypeCategory::Real, 10>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal10DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Real, 10>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceReal10DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Real, 10>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Real, 10> *identity = nullptr, + bool ordered = true); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDECL(ReduceReal16Ref)(const Descriptor &, + ReferenceReductionOperation<CppFloat128Type>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const CppFloat128Type *identity = nullptr, bool ordered = true); +CppFloat128Type RTDECL(ReduceReal16Value)(const Descriptor &, + ValueReductionOperation<CppFloat128Type>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const CppFloat128Type *identity = nullptr, bool ordered = true); +void RTDECL(ReduceReal16DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<CppFloat128Type>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const CppFloat128Type *identity = nullptr, bool ordered = true); +void RTDECL(ReduceReal16DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<CppFloat128Type>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const CppFloat128Type *identity = nullptr, bool ordered = true); +#endif + +void RTDECL(CppReduceComplex2Ref)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex2Value)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex2DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex2DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex3Ref)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex3Value)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex3DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex3DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex4Ref)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex4Value)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex4DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex4DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 4>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 4> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex8Ref)(CppTypeFor<TypeCategory::Complex, 8> &, + const Descriptor &, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex8Value)(CppTypeFor<TypeCategory::Complex, 8> &, + const Descriptor &, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex8DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex8DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 8>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 8> *identity = nullptr, + bool ordered = true); +#if HAS_FLOAT80 +void RTDECL(CppReduceComplex10Ref)(CppTypeFor<TypeCategory::Complex, 10> &, + const Descriptor &, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex10Value)(CppTypeFor<TypeCategory::Complex, 10> &, + const Descriptor &, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex10DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex10DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 10>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 10> *identity = nullptr, + bool ordered = true); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(CppReduceComplex16Ref)(CppTypeFor<TypeCategory::Complex, 16> &, + const Descriptor &, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex16Value)(CppTypeFor<TypeCategory::Complex, 16> &, + const Descriptor &, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>, + const char *source, int line, int dim = 0, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex16DimRef)(Descriptor &result, + const Descriptor &array, + ReferenceReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr, + bool ordered = true); +void RTDECL(CppReduceComplex16DimValue)(Descriptor &result, + const Descriptor &array, + ValueReductionOperation<CppTypeFor<TypeCategory::Complex, 16>>, + const char *source, int line, int dim, const Descriptor *mask = nullptr, + const CppTypeFor<TypeCategory::Complex, 16> *identity = nullptr, + bool ordered = true); +#endif + +bool RTDECL(ReduceLogical1Ref)(const Descriptor &, + ReferenceReductionOperation<std::int8_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical1Value)(const Descriptor &, + ValueReductionOperation<std::int8_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical1DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int8_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int8_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical1DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int8_t>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const std::int8_t *identity = nullptr, + bool ordered = true); +bool RTDECL(ReduceLogical2Ref)(const Descriptor &, + ReferenceReductionOperation<std::int16_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical2Value)(const Descriptor &, + ValueReductionOperation<std::int16_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical2DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int16_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical2DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int16_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int16_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical4Ref)(const Descriptor &, + ReferenceReductionOperation<std::int32_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical4Value)(const Descriptor &, + ValueReductionOperation<std::int32_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical4DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int32_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical4DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int32_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int32_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical8Ref)(const Descriptor &, + ReferenceReductionOperation<std::int64_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +bool RTDECL(ReduceLogical8Value)(const Descriptor &, + ValueReductionOperation<std::int64_t>, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical8DimRef)(Descriptor &result, const Descriptor &array, + ReferenceReductionOperation<std::int64_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); +void RTDECL(ReduceLogical8DimValue)(Descriptor &result, const Descriptor &array, + ValueReductionOperation<std::int64_t>, const char *source, int line, + int dim, const Descriptor *mask = nullptr, + const std::int64_t *identity = nullptr, bool ordered = true); + +void RTDECL(ReduceChar1)(char *result, const Descriptor &array, + ReductionCharOperation<char>, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const char *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceCharacter1Dim)(Descriptor &result, const Descriptor &array, + ReductionCharOperation<char>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const char *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceChar2)(char16_t *result, const Descriptor &array, + ReductionCharOperation<char16_t>, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const char16_t *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceCharacter2Dim)(Descriptor &result, const Descriptor &array, + ReductionCharOperation<char16_t>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const char16_t *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceChar4)(char32_t *result, const Descriptor &array, + ReductionCharOperation<char32_t>, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const char32_t *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceCharacter4Dim)(Descriptor &result, const Descriptor &array, + ReductionCharOperation<char32_t>, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const char32_t *identity = nullptr, + bool ordered = true); + +void RTDECL(ReduceDerivedType)(char *result, const Descriptor &array, + ReductionDerivedTypeOperation, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr, const char *identity = nullptr, + bool ordered = true); +void RTDECL(ReduceDerivedTypeDim)(Descriptor &result, const Descriptor &array, + ReductionDerivedTypeOperation, const char *source, int line, int dim, + const Descriptor *mask = nullptr, const char *identity = nullptr, + bool ordered = true); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_REDUCE_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/reduction.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/reduction.h new file mode 100644 index 00000000000..6945ed4a653 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/reduction.h @@ -0,0 +1,548 @@ +//===-- include/flang/Runtime/reduction.h -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the API for the reduction transformational intrinsic functions. + +#ifndef FORTRAN_RUNTIME_REDUCTION_H_ +#define FORTRAN_RUNTIME_REDUCTION_H_ + +#include "flang/Common/float128.h" +#include "flang/Common/uint128.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/entry-names.h" +#include <cfloat> +#include <cinttypes> +#include <complex> +#include <cstdint> + +namespace Fortran::runtime { + +class Descriptor; + +extern "C" { + +// Reductions that are known to return scalars have per-type entry +// points. These cover the cases that either have no DIM= +// argument or have an argument rank of 1. Pass 0 for no DIM= +// or the value of the DIM= argument so that it may be checked. +// The data type in the descriptor is checked against the expected +// return type. +// +// Reductions that return arrays are the remaining cases in which +// the argument rank is greater than one and there is a DIM= +// argument present. These cases establish and allocate their +// results in a caller-supplied descriptor, which is assumed to +// be large enough. +// +// Complex-valued SUM and PRODUCT reductions and complex-valued +// DOT_PRODUCT have their API entry points defined in complex-reduction.h; +// these here are C wrappers around C++ implementations so as to keep +// usage of C's _Complex types out of C++ code. + +// SUM() + +std::int8_t RTDECL(SumInteger1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int16_t RTDECL(SumInteger2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int32_t RTDECL(SumInteger4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int64_t RTDECL(SumInteger8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(SumInteger16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +std::uint8_t RTDECL(SumUnsigned1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint16_t RTDECL(SumUnsigned2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint32_t RTDECL(SumUnsigned4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint64_t RTDECL(SumUnsigned8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::uint128_t RTDECL(SumUnsigned16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif + +// REAL/COMPLEX(2 & 3) return 32-bit float results for the caller to downconvert +float RTDECL(SumReal2)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(SumReal3)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(SumReal4)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +double RTDECL(SumReal8)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(SumReal10)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDECL(SumReal16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif + +void RTDECL(CppSumComplex2)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +void RTDECL(CppSumComplex3)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +void RTDECL(CppSumComplex4)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +void RTDECL(CppSumComplex8)(CppTypeFor<TypeCategory::Complex, 8> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#if HAS_FLOAT80 +void RTDECL(CppSumComplex10)(CppTypeFor<TypeCategory::Complex, 10> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(CppSumComplex16)(CppTypeFor<TypeCategory::Complex, 16> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif + +void RTDECL(SumDim)(Descriptor &result, const Descriptor &array, int dim, + const char *source, int line, const Descriptor *mask = nullptr); + +// PRODUCT() + +std::int8_t RTDECL(ProductInteger1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int16_t RTDECL(ProductInteger2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int32_t RTDECL(ProductInteger4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int64_t RTDECL(ProductInteger8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(ProductInteger16)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +std::uint8_t RTDECL(ProductUnsigned1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint16_t RTDECL(ProductUnsigned2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint32_t RTDECL(ProductUnsigned4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint64_t RTDECL(ProductUnsigned8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::uint128_t RTDECL(ProductUnsigned16)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif + +// REAL/COMPLEX(2 & 3) return 32-bit float results for the caller to downconvert +float RTDECL(ProductReal2)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(ProductReal3)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(ProductReal4)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +double RTDECL(ProductReal8)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(ProductReal10)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDECL(ProductReal16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif + +void RTDECL(CppProductComplex2)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +void RTDECL(CppProductComplex3)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +void RTDECL(CppProductComplex4)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +void RTDECL(CppProductComplex8)(CppTypeFor<TypeCategory::Complex, 8> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#if HAS_FLOAT80 +void RTDECL(CppProductComplex10)(CppTypeFor<TypeCategory::Complex, 10> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(CppProductComplex16)(CppTypeFor<TypeCategory::Complex, 16> &, + const Descriptor &, const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif + +void RTDECL(ProductDim)(Descriptor &result, const Descriptor &array, int dim, + const char *source, int line, const Descriptor *mask = nullptr); + +// IALL, IANY, IPARITY +std::int8_t RTDECL(IAll1)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int16_t RTDECL(IAll2)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int32_t RTDECL(IAll4)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int64_t RTDECL(IAll8)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(IAll16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +void RTDECL(IAllDim)(Descriptor &result, const Descriptor &array, int dim, + const char *source, int line, const Descriptor *mask = nullptr); + +std::int8_t RTDECL(IAny1)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int16_t RTDECL(IAny2)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int32_t RTDECL(IAny4)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int64_t RTDECL(IAny8)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(IAny16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +void RTDECL(IAnyDim)(Descriptor &result, const Descriptor &array, int dim, + const char *source, int line, const Descriptor *mask = nullptr); + +std::int8_t RTDECL(IParity1)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int16_t RTDECL(IParity2)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int32_t RTDECL(IParity4)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +std::int64_t RTDECL(IParity8)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(IParity16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +void RTDECL(IParityDim)(Descriptor &result, const Descriptor &array, int dim, + const char *source, int line, const Descriptor *mask = nullptr); + +// FINDLOC, MAXLOC, & MINLOC +// These return allocated arrays in the supplied descriptor. +// The default value for KIND= should be the default INTEGER in effect at +// compilation time. +void RTDECL(Findloc)(Descriptor &, const Descriptor &x, + const Descriptor &target, int kind, const char *source, int line, + const Descriptor *mask = nullptr, bool back = false); +void RTDECL(FindlocDim)(Descriptor &, const Descriptor &x, + const Descriptor &target, int kind, int dim, const char *source, int line, + const Descriptor *mask = nullptr, bool back = false); +void RTDECL(MaxlocCharacter)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocInteger1)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocInteger2)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocInteger4)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocInteger8)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocInteger16)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocUnsigned1)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocUnsigned2)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocUnsigned4)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocUnsigned8)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocUnsigned16)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocReal4)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocReal8)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocReal10)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocReal16)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MaxlocDim)(Descriptor &, const Descriptor &x, int kind, int dim, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocCharacter)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocInteger1)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocInteger2)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocInteger4)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocInteger8)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocInteger16)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocUnsigned1)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocUnsigned2)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocUnsigned4)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocUnsigned8)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocUnsigned16)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocReal4)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocReal8)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocReal10)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocReal16)(Descriptor &, const Descriptor &, int kind, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); +void RTDECL(MinlocDim)(Descriptor &, const Descriptor &x, int kind, int dim, + const char *source, int line, const Descriptor *mask = nullptr, + bool back = false); + +// MAXVAL and MINVAL +std::int8_t RTDECL(MaxvalInteger1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int16_t RTDECL(MaxvalInteger2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int32_t RTDECL(MaxvalInteger4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int64_t RTDECL(MaxvalInteger8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(MaxvalInteger16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +std::uint8_t RTDECL(MaxvalUnsigned1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint16_t RTDECL(MaxvalUnsigned2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint32_t RTDECL(MaxvalUnsigned4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint64_t RTDECL(MaxvalUnsigned8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::uint128_t RTDECL(MaxvalUnsigned16)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +float RTDECL(MaxvalReal2)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(MaxvalReal3)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(MaxvalReal4)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +double RTDECL(MaxvalReal8)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(MaxvalReal10)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDECL(MaxvalReal16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +void RTDECL(MaxvalCharacter)(Descriptor &, const Descriptor &, + const char *source, int line, const Descriptor *mask = nullptr); + +std::int8_t RTDECL(MinvalInteger1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int16_t RTDECL(MinvalInteger2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int32_t RTDECL(MinvalInteger4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::int64_t RTDECL(MinvalInteger8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(MinvalInteger16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +std::uint8_t RTDECL(MinvalUnsigned1)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint16_t RTDECL(MinvalUnsigned2)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint32_t RTDECL(MinvalUnsigned4)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +std::uint64_t RTDECL(MinvalUnsigned8)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#ifdef __SIZEOF_INT128__ +common::uint128_t RTDECL(MinvalUnsigned16)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +float RTDECL(MinvalReal2)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(MinvalReal3)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +float RTDECL(MinvalReal4)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +double RTDECL(MinvalReal8)(const Descriptor &, const char *source, int line, + int dim = 0, const Descriptor *mask = nullptr); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(MinvalReal10)(const Descriptor &, + const char *source, int line, int dim = 0, + const Descriptor *mask = nullptr); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDECL(MinvalReal16)(const Descriptor &, const char *source, + int line, int dim = 0, const Descriptor *mask = nullptr); +#endif +void RTDECL(MinvalCharacter)(Descriptor &, const Descriptor &, + const char *source, int line, const Descriptor *mask = nullptr); + +void RTDECL(MaxvalDim)(Descriptor &, const Descriptor &, int dim, + const char *source, int line, const Descriptor *mask = nullptr); +void RTDECL(MinvalDim)(Descriptor &, const Descriptor &, int dim, + const char *source, int line, const Descriptor *mask = nullptr); + +// NORM2 +float RTDECL(Norm2_2)( + const Descriptor &, const char *source, int line, int dim = 0); +float RTDECL(Norm2_3)( + const Descriptor &, const char *source, int line, int dim = 0); +float RTDECL(Norm2_4)( + const Descriptor &, const char *source, int line, int dim = 0); +double RTDECL(Norm2_8)( + const Descriptor &, const char *source, int line, int dim = 0); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(Norm2_10)( + const Descriptor &, const char *source, int line, int dim = 0); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDECL(Norm2_16)( + const Descriptor &, const char *source, int line, int dim = 0); +void RTDECL(Norm2DimReal16)( + Descriptor &, const Descriptor &, int dim, const char *source, int line); +#endif +void RTDECL(Norm2Dim)( + Descriptor &, const Descriptor &, int dim, const char *source, int line); + +// ALL, ANY, COUNT, & PARITY logical reductions +bool RTDECL(All)(const Descriptor &, const char *source, int line, int dim = 0); +void RTDECL(AllDim)(Descriptor &result, const Descriptor &, int dim, + const char *source, int line); +bool RTDECL(Any)(const Descriptor &, const char *source, int line, int dim = 0); +void RTDECL(AnyDim)(Descriptor &result, const Descriptor &, int dim, + const char *source, int line); +std::int64_t RTDECL(Count)( + const Descriptor &, const char *source, int line, int dim = 0); +void RTDECL(CountDim)(Descriptor &result, const Descriptor &, int dim, int kind, + const char *source, int line); +bool RTDECL(Parity)( + const Descriptor &, const char *source, int line, int dim = 0); +void RTDECL(ParityDim)(Descriptor &result, const Descriptor &, int dim, + const char *source, int line); + +// DOT_PRODUCT +std::int8_t RTDECL(DotProductInteger1)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +std::int16_t RTDECL(DotProductInteger2)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +std::int32_t RTDECL(DotProductInteger4)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +std::int64_t RTDECL(DotProductInteger8)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +#ifdef __SIZEOF_INT128__ +common::int128_t RTDECL(DotProductInteger16)(const Descriptor &, + const Descriptor &, const char *source = nullptr, int line = 0); +#endif +std::uint8_t RTDECL(DotProductUnsigned1)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +std::uint16_t RTDECL(DotProductUnsigned2)(const Descriptor &, + const Descriptor &, const char *source = nullptr, int line = 0); +std::uint32_t RTDECL(DotProductUnsigned4)(const Descriptor &, + const Descriptor &, const char *source = nullptr, int line = 0); +std::uint64_t RTDECL(DotProductUnsigned8)(const Descriptor &, + const Descriptor &, const char *source = nullptr, int line = 0); +#ifdef __SIZEOF_INT128__ +common::uint128_t RTDECL(DotProductUnsigned16)(const Descriptor &, + const Descriptor &, const char *source = nullptr, int line = 0); +#endif +float RTDECL(DotProductReal2)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +float RTDECL(DotProductReal3)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +float RTDECL(DotProductReal4)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +double RTDECL(DotProductReal8)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +#if HAS_FLOAT80 +CppTypeFor<TypeCategory::Real, 10> RTDECL(DotProductReal10)(const Descriptor &, + const Descriptor &, const char *source = nullptr, int line = 0); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +CppFloat128Type RTDECL(DotProductReal16)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); +#endif +void RTDECL(CppDotProductComplex2)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const Descriptor &, const char *source = nullptr, + int line = 0); +void RTDECL(CppDotProductComplex3)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const Descriptor &, const char *source = nullptr, + int line = 0); +void RTDECL(CppDotProductComplex4)(CppTypeFor<TypeCategory::Complex, 4> &, + const Descriptor &, const Descriptor &, const char *source = nullptr, + int line = 0); +void RTDECL(CppDotProductComplex8)(CppTypeFor<TypeCategory::Complex, 8> &, + const Descriptor &, const Descriptor &, const char *source = nullptr, + int line = 0); +#if HAS_FLOAT80 +void RTDECL(CppDotProductComplex10)(CppTypeFor<TypeCategory::Complex, 10> &, + const Descriptor &, const Descriptor &, const char *source = nullptr, + int line = 0); +#endif +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(CppDotProductComplex16)(CppTypeFor<TypeCategory::Complex, 16> &, + const Descriptor &, const Descriptor &, const char *source = nullptr, + int line = 0); +#endif +bool RTDECL(DotProductLogical)(const Descriptor &, const Descriptor &, + const char *source = nullptr, int line = 0); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_REDUCTION_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/stop.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/stop.h new file mode 100644 index 00000000000..4ddc5cf49ec --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/stop.h @@ -0,0 +1,43 @@ +//===-- include/flang/Runtime/stop.h ----------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_STOP_H_ +#define FORTRAN_RUNTIME_STOP_H_ + +#include "flang/Runtime/c-or-cpp.h" +#include "flang/Runtime/entry-names.h" +#include "flang/Runtime/extensions.h" +#include <stdlib.h> + +FORTRAN_EXTERN_C_BEGIN + +// Program-initiated image stop +NORETURN RT_API_ATTRS void RTNAME(StopStatement)( + int code DEFAULT_VALUE(EXIT_SUCCESS), bool isErrorStop DEFAULT_VALUE(false), + bool quiet DEFAULT_VALUE(false)); +NORETURN RT_API_ATTRS void RTNAME(StopStatementText)(const char *, size_t, + bool isErrorStop DEFAULT_VALUE(false), bool quiet DEFAULT_VALUE(false)); +void RTNAME(PauseStatement)(NO_ARGUMENTS); +void RTNAME(PauseStatementInt)(int); +void RTNAME(PauseStatementText)(const char *, size_t); +NORETURN void RTNAME(FailImageStatement)(NO_ARGUMENTS); +NORETURN void RTNAME(ProgramEndStatement)(NO_ARGUMENTS); + +// Extensions +NORETURN void RTNAME(Exit)(int status DEFAULT_VALUE(EXIT_SUCCESS)); +NORETURN void RTNAME(Abort)(NO_ARGUMENTS); +void FORTRAN_PROCEDURE_NAME(backtrace)(NO_ARGUMENTS); + +// Crash with an error message when the program dynamically violates a Fortran +// constraint. +NORETURN RT_API_ATTRS void RTNAME(ReportFatalUserError)( + const char *message, const char *source, int line); + +FORTRAN_EXTERN_C_END + +#endif // FORTRAN_RUNTIME_STOP_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/support.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/support.h new file mode 100644 index 00000000000..8a345bee7f8 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/support.h @@ -0,0 +1,54 @@ +//===-- include/flang/Runtime/support.h -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines APIs for runtime support code for lowering. +#ifndef FORTRAN_RUNTIME_SUPPORT_H_ +#define FORTRAN_RUNTIME_SUPPORT_H_ + +#include "flang/Common/ISO_Fortran_binding_wrapper.h" +#include "flang/Runtime/entry-names.h" +#include <cstddef> +#include <cstdint> + +namespace Fortran::runtime { + +class Descriptor; + +namespace typeInfo { +class DerivedType; +} + +enum class LowerBoundModifier : int { + Preserve = 0, + SetToOnes = 1, + SetToZeroes = 2 +}; + +extern "C" { + +// Predicate: is the storage described by a Descriptor contiguous in memory? +bool RTDECL(IsContiguous)(const Descriptor &); + +// Predicate: is the storage described by a Descriptor contiguous in memory +// up to the given dimension? +bool RTDECL(IsContiguousUpTo)(const Descriptor &, int); + +// Predicate: is this descriptor describing an assumed-size array? +bool RTDECL(IsAssumedSize)(const Descriptor &); + +// Copy "from" descriptor into "to" descriptor and update "to" dynamic type, +// CFI_attribute, and lower bounds according to the other arguments. +// "newDynamicType" may be a null pointer in which case "to" dynamic type is the +// one of "from". +void RTDECL(CopyAndUpdateDescriptor)(Descriptor &to, const Descriptor &from, + const typeInfo::DerivedType *newDynamicType, + ISO::CFI_attribute_t newAttribute, enum LowerBoundModifier newLowerBounds); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_SUPPORT_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/temporary-stack.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/temporary-stack.h new file mode 100644 index 00000000000..3c1a4ea11a4 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/temporary-stack.h @@ -0,0 +1,67 @@ +//===-- include/flang/Runtime/temporary-stack.h -----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// Runtime functions for storing a dynamically resizable number of temporaries. +// For use in HLFIR lowering. +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_RUNTIME_TEMPORARY_STACK_H_ +#define FORTRAN_RUNTIME_TEMPORARY_STACK_H_ + +#include "flang/Runtime/entry-names.h" +#include <stdint.h> + +namespace Fortran::runtime { +class Descriptor; +extern "C" { + +// Stores both the descriptor and a copy of the value in a dynamically resizable +// data structure identified by opaquePtr. All value stacks must be destroyed +// at the end of their lifetime and not used afterwards. +// Popped descriptors point to the copy of the value, not the original address +// of the value. This copy is dynamically allocated, it is up to the caller to +// free the value pointed to by the box. The copy operation is a simple memcpy. +// The sourceFile and line number used when creating the stack are shared for +// all operations. +// Opaque pointers returned from these are incompatible with those returned by +// the flavours for storing descriptors. +[[nodiscard]] void *RTNAME(CreateValueStack)( + const char *sourceFile = nullptr, int line = 0); +void RTNAME(PushValue)(void *opaquePtr, const Descriptor &value); +// Note: retValue should be large enough to hold the right number of dimensions, +// and the optional descriptor addendum +void RTNAME(PopValue)(void *opaquePtr, Descriptor &retValue); +// Return the i'th element into retValue (which must be the right size). An +// exact copy of this descriptor remains in this storage so this one should not +// be deallocated +void RTNAME(ValueAt)(void *opaquePtr, uint64_t i, Descriptor &retValue); +void RTNAME(DestroyValueStack)(void *opaquePtr); + +// Stores descriptors value in a dynamically resizable data structure identified +// by opaquePtr. All descriptor stacks must be destroyed at the end of their +// lifetime and not used afterwards. +// Popped descriptors are identical to those which were pushed. +// The sourceFile and line number used when creating the stack are shared for +// all operations. +// Opaque pointers returned from these are incompatible with those returned by +// the flavours for storing both descriptors and values. +[[nodiscard]] void *RTNAME(CreateDescriptorStack)( + const char *sourceFile = nullptr, int line = 0); +void RTNAME(PushDescriptor)(void *opaquePtr, const Descriptor &value); +// Note: retValue should be large enough to hold the right number of dimensions, +// and the optional descriptor addendum +void RTNAME(PopDescriptor)(void *opaquePtr, Descriptor &retValue); +// Return the i'th element into retValue (which must be the right size). An +// exact copy of this descriptor remains in this storage so this one should not +// be deallocated +void RTNAME(DescriptorAt)(void *opaquePtr, uint64_t i, Descriptor &retValue); +void RTNAME(DestroyDescriptorStack)(void *opaquePtr); + +} // extern "C" +} // namespace Fortran::runtime + +#endif // FORTRAN_RUNTIME_TEMPORARY_STACK_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/time-intrinsic.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/time-intrinsic.h new file mode 100644 index 00000000000..80490a17e45 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/time-intrinsic.h @@ -0,0 +1,51 @@ +//===-- include/flang/Runtime/time-intrinsic.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the API between compiled code and the implementations of time-related +// intrinsic subroutines in the runtime library. + +#ifndef FORTRAN_RUNTIME_TIME_INTRINSIC_H_ +#define FORTRAN_RUNTIME_TIME_INTRINSIC_H_ + +#include "flang/Runtime/entry-names.h" +#include <cinttypes> +#include <cstddef> + +namespace Fortran::runtime { + +class Descriptor; + +extern "C" { + +// Lowering may need to cast this result to match the precision of the default +// real kind. +double RTNAME(CpuTime)(); + +// Interface for the SYSTEM_CLOCK intrinsic. We break it up into 3 distinct +// function calls, one for each of SYSTEM_CLOCK's optional output arguments. +// Lowering converts the results to the types of the actual arguments, +// including the case of a real argument for COUNT_RATE=.. +// The kind argument to SystemClockCount and SystemClockCountMax is the +// kind of the integer actual arguments, which are required to be the same +// when both appear. +std::int64_t RTNAME(SystemClockCount)(int kind = 8); +std::int64_t RTNAME(SystemClockCountRate)(int kind = 8); +std::int64_t RTNAME(SystemClockCountMax)(int kind = 8); + +// Interface for DATE_AND_TIME intrinsic. +void RTNAME(DateAndTime)(char *date, std::size_t dateChars, char *time, + std::size_t timeChars, char *zone, std::size_t zoneChars, + const char *source = nullptr, int line = 0, + const Descriptor *values = nullptr); + +void RTNAME(Etime)(const Descriptor *values, const Descriptor *time, + const char *sourceFile, int line); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_TIME_INTRINSIC_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/transformational.h b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/transformational.h new file mode 100644 index 00000000000..3393ed1dc98 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/include/flang/Runtime/transformational.h @@ -0,0 +1,182 @@ +//===-- include/flang/Runtime/transformational.h ----------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Defines the API for the type-independent transformational intrinsic functions +// that rearrange data in arrays: CSHIFT, EOSHIFT, PACK, RESHAPE, SPREAD, +// TRANSPOSE, and UNPACK. +// These are naive allocating implementations; optimized forms that manipulate +// pointer descriptors or that supply functional views of arrays remain to +// be defined and may instead be part of lowering (see docs/ArrayComposition.md) +// for details). + +#ifndef FORTRAN_RUNTIME_TRANSFORMATIONAL_H_ +#define FORTRAN_RUNTIME_TRANSFORMATIONAL_H_ + +#include "flang/Common/float128.h" +#include "flang/Runtime/cpp-type.h" +#include "flang/Runtime/entry-names.h" +#include <cinttypes> + +namespace Fortran::runtime { + +class Descriptor; + +extern "C" { + +void RTDECL(Reshape)(Descriptor &result, const Descriptor &source, + const Descriptor &shape, const Descriptor *pad = nullptr, + const Descriptor *order = nullptr, const char *sourceFile = nullptr, + int line = 0); + +void RTDECL(BesselJn_2)(Descriptor &result, int32_t n1, int32_t n2, float x, + float bn2, float bn2_1, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselJn_3)(Descriptor &result, int32_t n1, int32_t n2, float x, + float bn2, float bn2_1, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselJn_4)(Descriptor &result, int32_t n1, int32_t n2, float x, + float bn2, float bn2_1, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselJn_8)(Descriptor &result, int32_t n1, int32_t n2, double x, + double bn2, double bn2_1, const char *sourceFile = nullptr, int line = 0); + +#if HAS_FLOAT80 +void RTDECL(BesselJn_10)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 10> x, + CppTypeFor<TypeCategory::Real, 10> bn2, + CppTypeFor<TypeCategory::Real, 10> bn2_1, const char *sourceFile = nullptr, + int line = 0); +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(BesselJn_16)(Descriptor &result, int32_t n1, int32_t n2, + CppFloat128Type x, CppFloat128Type bn2, CppFloat128Type bn2_1, + const char *sourceFile = nullptr, int line = 0); +#endif + +void RTDECL(BesselJnX0_2)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselJnX0_3)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselJnX0_4)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselJnX0_8)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +#if HAS_FLOAT80 +void RTDECL(BesselJnX0_10)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(BesselJnX0_16)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); +#endif + +void RTDECL(BesselYn_2)(Descriptor &result, int32_t n1, int32_t n2, float x, + float bn1, float bn1_1, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselYn_3)(Descriptor &result, int32_t n1, int32_t n2, float x, + float bn1, float bn1_1, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselYn_4)(Descriptor &result, int32_t n1, int32_t n2, float x, + float bn1, float bn1_1, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselYn_8)(Descriptor &result, int32_t n1, int32_t n2, double x, + double bn1, double bn1_1, const char *sourceFile = nullptr, int line = 0); + +#if HAS_FLOAT80 +void RTDECL(BesselYn_10)(Descriptor &result, int32_t n1, int32_t n2, + CppTypeFor<TypeCategory::Real, 10> x, + CppTypeFor<TypeCategory::Real, 10> bn1, + CppTypeFor<TypeCategory::Real, 10> bn1_1, const char *sourceFile = nullptr, + int line = 0); +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(BesselYn_16)(Descriptor &result, int32_t n1, int32_t n2, + CppFloat128Type x, CppFloat128Type bn1, CppFloat128Type bn1_1, + const char *sourceFile = nullptr, int line = 0); +#endif + +void RTDECL(BesselYnX0_2)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselYnX0_3)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselYnX0_4)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(BesselYnX0_8)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); + +#if HAS_FLOAT80 +void RTDECL(BesselYnX0_10)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); +#endif + +#if HAS_LDBL128 || HAS_FLOAT128 +void RTDECL(BesselYnX0_16)(Descriptor &result, int32_t n1, int32_t n2, + const char *sourceFile = nullptr, int line = 0); +#endif + +void RTDECL(Cshift)(Descriptor &result, const Descriptor &source, + const Descriptor &shift, int dim = 1, const char *sourceFile = nullptr, + int line = 0); +void RTDECL(CshiftVector)(Descriptor &result, const Descriptor &source, + std::int64_t shift, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Eoshift)(Descriptor &result, const Descriptor &source, + const Descriptor &shift, const Descriptor *boundary = nullptr, int dim = 1, + const char *sourceFile = nullptr, int line = 0); +void RTDECL(EoshiftVector)(Descriptor &result, const Descriptor &source, + std::int64_t shift, const Descriptor *boundary = nullptr, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Pack)(Descriptor &result, const Descriptor &source, + const Descriptor &mask, const Descriptor *vector = nullptr, + const char *sourceFile = nullptr, int line = 0); + +/// Produce a shallow copy of the \p source in \p result. +/// The \p source may have any type and rank. +/// Unless \p source is unallocated, the \p result will +/// be allocated using the same shape and dynamic type, +/// and will contain the same top-level values as the \p source. +/// The \p result will have the default lower bounds, if it is an array. +/// As the name suggests, it is different from the Assign runtime, +/// because it does not perform recursive assign actions +/// for the components of the derived types. +void RTDECL(ShallowCopy)(Descriptor &result, const Descriptor &source, + const char *sourceFile = nullptr, int line = 0); + +/// Same as ShallowCopy, where the caller provides a pre-allocated +/// \p result. The \p source and \p result must be conforming: +/// * Same rank. +/// * Same extents. +/// * Same size and type of elements (including the type parameters). +/// If \p result is an array, its lower bounds are not affected. +void RTDECL(ShallowCopyDirect)(const Descriptor &result, + const Descriptor &source, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Spread)(Descriptor &result, const Descriptor &source, int dim, + std::int64_t ncopies, const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Transpose)(Descriptor &result, const Descriptor &matrix, + const char *sourceFile = nullptr, int line = 0); + +void RTDECL(Unpack)(Descriptor &result, const Descriptor &vector, + const Descriptor &mask, const Descriptor &field, + const char *sourceFile = nullptr, int line = 0); + +} // extern "C" +} // namespace Fortran::runtime +#endif // FORTRAN_RUNTIME_TRANSFORMATIONAL_H_ diff --git a/contrib/libs/llvm/flang-rt/flang/lib/Decimal/big-radix-floating-point.h b/contrib/libs/llvm/flang-rt/flang/lib/Decimal/big-radix-floating-point.h new file mode 100644 index 00000000000..f9afebf5b3d --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/lib/Decimal/big-radix-floating-point.h @@ -0,0 +1,396 @@ +//===-- lib/Decimal/big-radix-floating-point.h ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_ +#define FORTRAN_DECIMAL_BIG_RADIX_FLOATING_POINT_H_ + +// This is a helper class for use in floating-point conversions between +// binary and decimal representations. It holds a multiple-precision +// integer value using digits of a radix that is a large even power of ten +// (10,000,000,000,000,000 by default, 10**16). These digits are accompanied +// by a signed exponent that denotes multiplication by a power of ten. +// The effective radix point is to the right of the digits (i.e., they do +// not represent a fraction). +// +// The operations supported by this class are limited to those required +// for conversions between binary and decimal representations; it is not +// a general-purpose facility. + +#include "flang/Common/bit-population-count.h" +#include "flang/Common/leading-zero-bit-count.h" +#include "flang/Common/uint128.h" +#include "flang/Decimal/binary-floating-point.h" +#include "flang/Decimal/decimal.h" +#include <cinttypes> +#include <limits> +#include <type_traits> + +// Some environments, viz. glibc 2.17, allow the macro HUGE +// to leak out of <math.h>. +#undef HUGE + +namespace Fortran::decimal { + +static constexpr std::uint64_t TenToThe(int power) { + return power <= 0 ? 1 : 10 * TenToThe(power - 1); +} + +// 10**(LOG10RADIX + 3) must be < 2**wordbits, and LOG10RADIX must be +// even, so that pairs of decimal digits do not straddle Digits. +// So LOG10RADIX must be 16 or 6. +template <int PREC, int LOG10RADIX = 16> class BigRadixFloatingPointNumber { +public: + using Real = BinaryFloatingPointNumber<PREC>; + static constexpr int log10Radix{LOG10RADIX}; + +private: + static constexpr std::uint64_t uint64Radix{TenToThe(log10Radix)}; + static constexpr int minDigitBits{ + 64 - common::LeadingZeroBitCount(uint64Radix)}; + using Digit = common::HostUnsignedIntType<minDigitBits>; + static constexpr Digit radix{uint64Radix}; + static_assert(radix < std::numeric_limits<Digit>::max() / 1000, + "radix is somehow too big"); + static_assert(radix > std::numeric_limits<Digit>::max() / 10000, + "radix is somehow too small"); + + // The base-2 logarithm of the least significant bit that can arise + // in a subnormal IEEE floating-point number. + static constexpr int minLog2AnyBit{ + -Real::exponentBias - Real::binaryPrecision}; + + // The number of Digits needed to represent the smallest subnormal. + static constexpr int maxDigits{3 - minLog2AnyBit / log10Radix}; + +public: + explicit RT_API_ATTRS BigRadixFloatingPointNumber( + enum FortranRounding rounding = RoundNearest) + : rounding_{rounding} {} + + // Converts a binary floating point value. + explicit RT_API_ATTRS BigRadixFloatingPointNumber( + Real, enum FortranRounding = RoundNearest); + + RT_API_ATTRS BigRadixFloatingPointNumber &SetToZero() { + isNegative_ = false; + digits_ = 0; + exponent_ = 0; + return *this; + } + + RT_API_ATTRS bool IsInteger() const { return exponent_ >= 0; } + + // Converts decimal floating-point to binary. + RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(); + + // Parses and converts to binary. Handles leading spaces, + // "NaN", & optionally-signed "Inf". Does not skip internal + // spaces. + // The argument is a reference to a pointer that is left + // pointing to the first character that wasn't parsed. + RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary( + const char *&, const char *end = nullptr); + + // Formats a decimal floating-point number to a user buffer. + // May emit "NaN" or "Inf", or an possibly-signed integer. + // No decimal point is written, but if it were, it would be + // after the last digit; the effective decimal exponent is + // returned as part of the result structure so that it can be + // formatted by the client. + RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal( + char *, std::size_t, enum DecimalConversionFlags, int digits) const; + + // Discard decimal digits not needed to distinguish this value + // from the decimal encodings of two others (viz., the nearest binary + // floating-point numbers immediately below and above this one). + // The last decimal digit may not be uniquely determined in all + // cases, and will be the mean value when that is so (e.g., if + // last decimal digit values 6-8 would all work, it'll be a 7). + // This minimization necessarily assumes that the value will be + // emitted and read back into the same (or less precise) format + // with default rounding to the nearest value. + RT_API_ATTRS void Minimize( + BigRadixFloatingPointNumber &&less, BigRadixFloatingPointNumber &&more); + + template <typename STREAM> STREAM &Dump(STREAM &) const; + +private: + RT_API_ATTRS BigRadixFloatingPointNumber( + const BigRadixFloatingPointNumber &that) + : digits_{that.digits_}, exponent_{that.exponent_}, + isNegative_{that.isNegative_}, rounding_{that.rounding_} { + for (int j{0}; j < digits_; ++j) { + digit_[j] = that.digit_[j]; + } + } + + RT_API_ATTRS bool IsZero() const { + // Don't assume normalization. + for (int j{0}; j < digits_; ++j) { + if (digit_[j] != 0) { + return false; + } + } + return true; + } + + // Predicate: true when 10*value would cause a carry. + // (When this happens during decimal-to-binary conversion, + // there are more digits in the input string than can be + // represented precisely.) + RT_API_ATTRS bool IsFull() const { + return digits_ == digitLimit_ && digit_[digits_ - 1] >= radix / 10; + } + + // Sets *this to an unsigned integer value. + // Returns any remainder. + template <typename UINT> RT_API_ATTRS UINT SetTo(UINT n) { + static_assert( + std::is_same_v<UINT, common::uint128_t> || std::is_unsigned_v<UINT>); + SetToZero(); + while (n != 0) { + auto q{n / 10u}; + if (n != q * 10) { + break; + } + ++exponent_; + n = q; + } + if constexpr (sizeof n < sizeof(Digit)) { + if (n != 0) { + digit_[digits_++] = n; + } + return 0; + } else { + while (n != 0 && digits_ < digitLimit_) { + auto q{n / radix}; + digit_[digits_++] = static_cast<Digit>(n - q * radix); + n = q; + } + return n; + } + } + + RT_API_ATTRS int RemoveLeastOrderZeroDigits() { + int remove{0}; + if (digits_ > 0 && digit_[0] == 0) { + while (remove < digits_ && digit_[remove] == 0) { + ++remove; + } + if (remove >= digits_) { + digits_ = 0; + } else if (remove > 0) { +#if defined __GNUC__ && __GNUC__ < 8 + // (&& j + remove < maxDigits) was added to avoid GCC < 8 build failure + // on -Werror=array-bounds. This can be removed if -Werror is disable. + for (int j{0}; j + remove < digits_ && (j + remove < maxDigits); ++j) { +#else + for (int j{0}; j + remove < digits_; ++j) { +#endif + digit_[j] = digit_[j + remove]; + } + digits_ -= remove; + } + } + return remove; + } + + RT_API_ATTRS void RemoveLeadingZeroDigits() { + while (digits_ > 0 && digit_[digits_ - 1] == 0) { + --digits_; + } + } + + RT_API_ATTRS void Normalize() { + RemoveLeadingZeroDigits(); + exponent_ += RemoveLeastOrderZeroDigits() * log10Radix; + } + + // This limited divisibility test only works for even divisors of the radix, + // which is fine since it's only ever used with 2 and 5. + template <int N> RT_API_ATTRS bool IsDivisibleBy() const { + static_assert(N > 1 && radix % N == 0, "bad modulus"); + return digits_ == 0 || (digit_[0] % N) == 0; + } + + template <unsigned DIVISOR> RT_API_ATTRS int DivideBy() { + Digit remainder{0}; + for (int j{digits_ - 1}; j >= 0; --j) { + Digit q{digit_[j] / DIVISOR}; + Digit nrem{digit_[j] - DIVISOR * q}; + digit_[j] = q + (radix / DIVISOR) * remainder; + remainder = nrem; + } + return remainder; + } + + RT_API_ATTRS void DivideByPowerOfTwo(int twoPow) { // twoPow <= log10Radix + Digit remainder{0}; + auto mask{(Digit{1} << twoPow) - 1}; + auto coeff{radix >> twoPow}; + for (int j{digits_ - 1}; j >= 0; --j) { + auto nrem{digit_[j] & mask}; + digit_[j] = (digit_[j] >> twoPow) + coeff * remainder; + remainder = nrem; + } + } + + // Returns true on overflow + RT_API_ATTRS bool DivideByPowerOfTwoInPlace(int twoPow) { + if (digits_ > 0) { + while (twoPow > 0) { + int chunk{twoPow > log10Radix ? log10Radix : twoPow}; + if ((digit_[0] & ((Digit{1} << chunk) - 1)) == 0) { + DivideByPowerOfTwo(chunk); + twoPow -= chunk; + continue; + } + twoPow -= chunk; + if (digit_[digits_ - 1] >> chunk != 0) { + if (digits_ == digitLimit_) { + return true; // overflow + } + digit_[digits_++] = 0; + } + auto remainder{digit_[digits_ - 1]}; + exponent_ -= log10Radix; + auto coeff{radix >> chunk}; // precise; radix is (5*2)**log10Radix + auto mask{(Digit{1} << chunk) - 1}; + for (int j{digits_ - 1}; j >= 1; --j) { + digit_[j] = (digit_[j - 1] >> chunk) + coeff * remainder; + remainder = digit_[j - 1] & mask; + } + digit_[0] = coeff * remainder; + } + } + return false; // no overflow + } + + RT_API_ATTRS int AddCarry(int position = 0, int carry = 1) { + for (; position < digits_; ++position) { + Digit v{digit_[position] + carry}; + if (v < radix) { + digit_[position] = v; + return 0; + } + digit_[position] = v - radix; + carry = 1; + } + if (digits_ < digitLimit_) { + digit_[digits_++] = carry; + return 0; + } + Normalize(); + if (digits_ < digitLimit_) { + digit_[digits_++] = carry; + return 0; + } + return carry; + } + + RT_API_ATTRS void Decrement() { + for (int j{0}; digit_[j]-- == 0; ++j) { + digit_[j] = radix - 1; + } + } + + template <int N> RT_API_ATTRS int MultiplyByHelper(int carry = 0) { + for (int j{0}; j < digits_; ++j) { + auto v{N * digit_[j] + carry}; + carry = v / radix; + digit_[j] = v - carry * radix; // i.e., v % radix + } + return carry; + } + + template <int N> RT_API_ATTRS int MultiplyBy(int carry = 0) { + if (int newCarry{MultiplyByHelper<N>(carry)}) { + return AddCarry(digits_, newCarry); + } else { + return 0; + } + } + + template <int N> RT_API_ATTRS int MultiplyWithoutNormalization() { + if (int carry{MultiplyByHelper<N>(0)}) { + if (digits_ < digitLimit_) { + digit_[digits_++] = carry; + return 0; + } else { + return carry; + } + } else { + return 0; + } + } + + RT_API_ATTRS void LoseLeastSignificantDigit(); // with rounding + + RT_API_ATTRS void PushCarry(int carry) { + if (digits_ == maxDigits && RemoveLeastOrderZeroDigits() == 0) { + LoseLeastSignificantDigit(); + digit_[digits_ - 1] += carry; + } else { + digit_[digits_++] = carry; + } + } + + // Adds another number and then divides by two. + // Assumes same exponent and sign. + // Returns true when the result has effectively been rounded down. + RT_API_ATTRS bool Mean(const BigRadixFloatingPointNumber &); + + // Parses a floating-point number; leaves the pointer reference + // argument pointing at the next character after what was recognized. + // The "end" argument can be left null if the caller is sure that the + // string is properly terminated with an addressable character that + // can't be in a valid floating-point character. + RT_API_ATTRS bool ParseNumber(const char *&, bool &inexact, const char *end); + + using Raw = typename Real::RawType; + constexpr RT_API_ATTRS Raw SignBit() const { + return Raw{isNegative_} << (Real::bits - 1); + } + constexpr RT_API_ATTRS Raw Infinity() const { + Raw result{static_cast<Raw>(Real::maxExponent)}; + result <<= Real::significandBits; + result |= SignBit(); + if constexpr (Real::bits == 80) { // x87 + result |= Raw{1} << 63; + } + return result; + } + constexpr RT_API_ATTRS Raw NaN(bool isQuiet = true) { + Raw result{Real::maxExponent}; + result <<= Real::significandBits; + result |= SignBit(); + if constexpr (Real::bits == 80) { // x87 + result |= Raw{isQuiet ? 3u : 2u} << 62; + } else { + Raw quiet{isQuiet ? Raw{2} : Raw{1}}; + quiet <<= Real::significandBits - 2; + result |= quiet; + } + return result; + } + constexpr RT_API_ATTRS Raw HUGE() const { + Raw result{static_cast<Raw>(Real::maxExponent)}; + result <<= Real::significandBits; + result |= SignBit(); + return result - 1; // decrement exponent, set all significand bits + } + + Digit digit_[maxDigits]; // in little-endian order: digit_[0] is LSD + int digits_{0}; // # of elements in digit_[] array; zero when zero + int digitLimit_{maxDigits}; // precision clamp + int exponent_{0}; // signed power of ten + bool isNegative_{false}; + enum FortranRounding rounding_ { RoundNearest }; +}; +} // namespace Fortran::decimal +#endif diff --git a/contrib/libs/llvm/flang-rt/flang/lib/Decimal/binary-to-decimal.cpp b/contrib/libs/llvm/flang-rt/flang/lib/Decimal/binary-to-decimal.cpp new file mode 100644 index 00000000000..b64865e95df --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/lib/Decimal/binary-to-decimal.cpp @@ -0,0 +1,392 @@ +//===-- lib/Decimal/binary-to-decimal.cpp ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "big-radix-floating-point.h" +#include "flang/Decimal/decimal.h" +#include <cassert> +#include <cfloat> +#include <string> + +namespace Fortran::decimal { + +template <int PREC, int LOG10RADIX> +BigRadixFloatingPointNumber<PREC, LOG10RADIX>::BigRadixFloatingPointNumber( + BinaryFloatingPointNumber<PREC> x, enum FortranRounding rounding) + : rounding_{rounding} { + bool negative{x.IsNegative()}; + if (x.IsZero()) { + isNegative_ = negative; + return; + } + if (negative) { + x.Negate(); + } + int twoPow{x.UnbiasedExponent()}; + twoPow -= x.bits - 1; + if (!x.isImplicitMSB) { + ++twoPow; + } + int lshift{x.exponentBits}; + if (twoPow <= -lshift) { + twoPow += lshift; + lshift = 0; + } else if (twoPow < 0) { + lshift += twoPow; + twoPow = 0; + } + auto word{x.Fraction()}; + word <<= lshift; + SetTo(word); + isNegative_ = negative; + + // The significand is now encoded in *this as an integer (D) and + // decimal exponent (E): x = D * 10.**E * 2.**twoPow + // twoPow can be positive or negative. + // The goal now is to get twoPow up or down to zero, leaving us with + // only decimal digits and decimal exponent. This is done by + // fast multiplications and divisions of D by 2 and 5. + + // (5*D) * 10.**E * 2.**twoPow -> D * 10.**(E+1) * 2.**(twoPow-1) + for (; twoPow > 0 && IsDivisibleBy<5>(); --twoPow) { + DivideBy<5>(); + ++exponent_; + } + + int overflow{0}; + for (; twoPow >= 9; twoPow -= 9) { + // D * 10.**E * 2.**twoPow -> (D*(2**9)) * 10.**E * 2.**(twoPow-9) + overflow |= MultiplyBy<512>(); + } + for (; twoPow >= 3; twoPow -= 3) { + // D * 10.**E * 2.**twoPow -> (D*(2**3)) * 10.**E * 2.**(twoPow-3) + overflow |= MultiplyBy<8>(); + } + for (; twoPow > 0; --twoPow) { + // D * 10.**E * 2.**twoPow -> (2*D) * 10.**E * 2.**(twoPow-1) + overflow |= MultiplyBy<2>(); + } + + overflow |= DivideByPowerOfTwoInPlace(-twoPow); + assert(overflow == 0); + Normalize(); +} + +template <int PREC, int LOG10RADIX> +ConversionToDecimalResult +BigRadixFloatingPointNumber<PREC, LOG10RADIX>::ConvertToDecimal(char *buffer, + std::size_t n, enum DecimalConversionFlags flags, int maxDigits) const { + if (n < static_cast<std::size_t>(3 + digits_ * LOG10RADIX)) { + return {nullptr, 0, 0, Overflow}; + } + char *start{buffer}; + if (isNegative_) { + *start++ = '-'; + } else if (flags & AlwaysSign) { + *start++ = '+'; + } + if (IsZero()) { + *start++ = '0'; + *start = '\0'; + return {buffer, static_cast<std::size_t>(start - buffer), 0, Exact}; + } + char *p{start}; + static_assert((LOG10RADIX % 2) == 0, "radix not a power of 100"); + static const char lut[] = "0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"; + // Treat the MSD specially: don't emit leading zeroes. + Digit dig{digit_[digits_ - 1]}; + char stack[LOG10RADIX], *sp{stack}; + for (int k{0}; k < log10Radix; k += 2) { + Digit newDig{dig / 100}; + auto d{static_cast<std::uint32_t>(dig) - + std::uint32_t{100} * static_cast<std::uint32_t>(newDig)}; + dig = newDig; + const char *q{lut + d + d}; + *sp++ = q[1]; + *sp++ = q[0]; + } + while (sp > stack && sp[-1] == '0') { + --sp; + } + while (sp > stack) { + *p++ = *--sp; + } + for (int j{digits_ - 1}; j-- > 0;) { + Digit dig{digit_[j]}; + char *reverse{p += log10Radix}; + for (int k{0}; k < log10Radix; k += 2) { + Digit newDig{dig / 100}; + auto d{static_cast<std::uint32_t>(dig) - + std::uint32_t{100} * static_cast<std::uint32_t>(newDig)}; + dig = newDig; + const char *q{lut + d + d}; + *--reverse = q[1]; + *--reverse = q[0]; + } + } + // Adjust exponent so the effective decimal point is to + // the left of the first digit. + int expo = exponent_ + p - start; + // Trim trailing zeroes. + while (p[-1] == '0') { + --p; + } + char *end{start + maxDigits}; + if (maxDigits == 0) { + p = end; + } + if (p <= end) { + *p = '\0'; + return {buffer, static_cast<std::size_t>(p - buffer), expo, Exact}; + } else { + // Apply a digit limit, possibly with rounding. + bool incr{false}; + switch (rounding_) { + case RoundNearest: + incr = *end > '5' || + (*end == '5' && (p > end + 1 || ((end[-1] - '0') & 1) != 0)); + break; + case RoundUp: + incr = !isNegative_; + break; + case RoundDown: + incr = isNegative_; + break; + case RoundToZero: + break; + case RoundCompatible: + incr = *end >= '5'; + break; + } + p = end; + if (incr) { + while (p > start && p[-1] == '9') { + --p; + } + if (p == start) { + *p++ = '1'; + ++expo; + } else { + ++p[-1]; + } + } + + *p = '\0'; + return {buffer, static_cast<std::size_t>(p - buffer), expo, Inexact}; + } +} + +template <int PREC, int LOG10RADIX> +bool BigRadixFloatingPointNumber<PREC, LOG10RADIX>::Mean( + const BigRadixFloatingPointNumber &that) { + while (digits_ < that.digits_) { + digit_[digits_++] = 0; + } + int carry{0}; + for (int j{0}; j < that.digits_; ++j) { + Digit v{digit_[j] + that.digit_[j] + carry}; + if (v >= radix) { + digit_[j] = v - radix; + carry = 1; + } else { + digit_[j] = v; + carry = 0; + } + } + if (carry != 0) { + AddCarry(that.digits_, carry); + } + return DivideBy<2>() != 0; +} + +template <int PREC, int LOG10RADIX> +void BigRadixFloatingPointNumber<PREC, LOG10RADIX>::Minimize( + BigRadixFloatingPointNumber &&less, BigRadixFloatingPointNumber &&more) { + int leastExponent{exponent_}; + if (less.exponent_ < leastExponent) { + leastExponent = less.exponent_; + } + if (more.exponent_ < leastExponent) { + leastExponent = more.exponent_; + } + while (exponent_ > leastExponent) { + --exponent_; + MultiplyBy<10>(); + } + while (less.exponent_ > leastExponent) { + --less.exponent_; + less.MultiplyBy<10>(); + } + while (more.exponent_ > leastExponent) { + --more.exponent_; + more.MultiplyBy<10>(); + } + if (less.Mean(*this)) { + less.AddCarry(); // round up + } + if (!more.Mean(*this)) { + more.Decrement(); // round down + } + while (less.digits_ < more.digits_) { + less.digit_[less.digits_++] = 0; + } + while (more.digits_ < less.digits_) { + more.digit_[more.digits_++] = 0; + } + int digits{more.digits_}; + int same{0}; + while (same < digits && + less.digit_[digits - 1 - same] == more.digit_[digits - 1 - same]) { + ++same; + } + if (same == digits) { + return; + } + digits_ = same + 1; + int offset{digits - digits_}; + exponent_ += offset * log10Radix; + for (int j{0}; j < digits_; ++j) { + digit_[j] = more.digit_[j + offset]; + } + Digit least{less.digit_[offset]}; + Digit my{digit_[0]}; + while (true) { + Digit q{my / 10u}; + Digit r{my - 10 * q}; + Digit lq{least / 10u}; + Digit lr{least - 10 * lq}; + if (r != 0 && lq == q) { + Digit sub{(r - lr) >> 1}; + digit_[0] -= sub; + break; + } else { + least = lq; + my = q; + DivideBy<10>(); + ++exponent_; + } + } + Normalize(); +} + +template <int PREC> +ConversionToDecimalResult ConvertToDecimal(char *buffer, std::size_t size, + enum DecimalConversionFlags flags, int digits, + enum FortranRounding rounding, BinaryFloatingPointNumber<PREC> x) { + if (x.IsNaN()) { + return {"NaN", 3, 0, Invalid}; + } else if (x.IsInfinite()) { + if (x.IsNegative()) { + return {"-Inf", 4, 0, Exact}; + } else if (flags & AlwaysSign) { + return {"+Inf", 4, 0, Exact}; + } else { + return {"Inf", 3, 0, Exact}; + } + } else { + using Big = BigRadixFloatingPointNumber<PREC>; + Big number{x, rounding}; + if ((flags & Minimize) && !x.IsZero()) { + // To emit the fewest decimal digits necessary to represent the value + // in such a way that decimal-to-binary conversion to the same format + // with a fixed assumption about rounding will return the same binary + // value, we also perform binary-to-decimal conversion on the two + // binary values immediately adjacent to this one, use them to identify + // the bounds of the range of decimal values that will map back to the + // original binary value, and find a (not necessary unique) shortest + // decimal sequence in that range. + using Binary = typename Big::Real; + Binary less{x}; + less.Previous(); + Binary more{x}; + if (!x.IsMaximalFiniteMagnitude()) { + more.Next(); + } + number.Minimize(Big{less, rounding}, Big{more, rounding}); + } + return number.ConvertToDecimal(buffer, size, flags, digits); + } +} + +template ConversionToDecimalResult ConvertToDecimal<8>(char *, std::size_t, + enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<8>); +template ConversionToDecimalResult ConvertToDecimal<11>(char *, std::size_t, + enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<11>); +template ConversionToDecimalResult ConvertToDecimal<24>(char *, std::size_t, + enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<24>); +template ConversionToDecimalResult ConvertToDecimal<53>(char *, std::size_t, + enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<53>); +template ConversionToDecimalResult ConvertToDecimal<64>(char *, std::size_t, + enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<64>); +template ConversionToDecimalResult ConvertToDecimal<113>(char *, std::size_t, + enum DecimalConversionFlags, int, enum FortranRounding, + BinaryFloatingPointNumber<113>); + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +ConversionToDecimalResult ConvertFloatToDecimal(char *buffer, std::size_t size, + enum DecimalConversionFlags flags, int digits, + enum FortranRounding rounding, float x) { + return Fortran::decimal::ConvertToDecimal(buffer, size, flags, digits, + rounding, Fortran::decimal::BinaryFloatingPointNumber<24>(x)); +} + +ConversionToDecimalResult ConvertDoubleToDecimal(char *buffer, std::size_t size, + enum DecimalConversionFlags flags, int digits, + enum FortranRounding rounding, double x) { + return Fortran::decimal::ConvertToDecimal(buffer, size, flags, digits, + rounding, Fortran::decimal::BinaryFloatingPointNumber<53>(x)); +} + +#if LDBL_MANT_DIG == 64 +ConversionToDecimalResult ConvertLongDoubleToDecimal(char *buffer, + std::size_t size, enum DecimalConversionFlags flags, int digits, + enum FortranRounding rounding, long double x) { + return Fortran::decimal::ConvertToDecimal(buffer, size, flags, digits, + rounding, Fortran::decimal::BinaryFloatingPointNumber<64>(x)); +} +#elif LDBL_MANT_DIG == 113 +ConversionToDecimalResult ConvertLongDoubleToDecimal(char *buffer, + std::size_t size, enum DecimalConversionFlags flags, int digits, + enum FortranRounding rounding, long double x) { + return Fortran::decimal::ConvertToDecimal(buffer, size, flags, digits, + rounding, Fortran::decimal::BinaryFloatingPointNumber<113>(x)); +} +#endif + +RT_EXT_API_GROUP_END +} // extern "C" + +template <int PREC, int LOG10RADIX> +template <typename STREAM> +STREAM &BigRadixFloatingPointNumber<PREC, LOG10RADIX>::Dump(STREAM &o) const { + if (isNegative_) { + o << '-'; + } + o << "10**(" << exponent_ << ") * ... (rounding " + << static_cast<int>(rounding_) << ")\n"; + for (int j{digits_}; --j >= 0;) { + std::string str{std::to_string(digit_[j])}; + o << std::string(20 - str.size(), ' ') << str << " [" << j << ']'; + if (j + 1 == digitLimit_) { + o << " (limit)"; + } + o << '\n'; + } + return o; +} +} // namespace Fortran::decimal diff --git a/contrib/libs/llvm/flang-rt/flang/lib/Decimal/decimal-to-binary.cpp b/contrib/libs/llvm/flang-rt/flang/lib/Decimal/decimal-to-binary.cpp new file mode 100644 index 00000000000..94c51774237 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/flang/lib/Decimal/decimal-to-binary.cpp @@ -0,0 +1,564 @@ +//===-- lib/Decimal/decimal-to-binary.cpp ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "big-radix-floating-point.h" +#include "flang/Common/bit-population-count.h" +#include "flang/Common/leading-zero-bit-count.h" +#include "flang/Decimal/binary-floating-point.h" +#include "flang/Decimal/decimal.h" +#include "flang/Runtime/freestanding-tools.h" +#include <cinttypes> +#include <cstring> +#include <utility> + +// Some environments, viz. glibc 2.17 and *BSD, allow the macro HUGE +// to leak out of <math.h>. +#undef HUGE + +namespace Fortran::decimal { + +template <int PREC, int LOG10RADIX> +bool BigRadixFloatingPointNumber<PREC, LOG10RADIX>::ParseNumber( + const char *&p, bool &inexact, const char *end) { + SetToZero(); + if (end && p >= end) { + return false; + } + // Skip leading spaces + for (; p != end && *p == ' '; ++p) { + } + if (p == end) { + return false; + } + const char *q{p}; + isNegative_ = *q == '-'; + if (*q == '-' || *q == '+') { + ++q; + } + const char *start{q}; + for (; q != end && *q == '0'; ++q) { + } + const char *firstDigit{q}; + for (; q != end && *q >= '0' && *q <= '9'; ++q) { + } + const char *point{nullptr}; + if (q != end && *q == '.') { + point = q; + for (++q; q != end && *q >= '0' && *q <= '9'; ++q) { + } + } + if (q == start || (q == start + 1 && start == point)) { + return false; // require at least one digit + } + // There's a valid number here; set the reference argument to point to + // the first character afterward, which might be an exponent part. + p = q; + // Strip off trailing zeroes + if (point) { + while (q[-1] == '0') { + --q; + } + if (q[-1] == '.') { + point = nullptr; + --q; + } + } + if (!point) { + while (q > firstDigit && q[-1] == '0') { + --q; + ++exponent_; + } + } + // Trim any excess digits + const char *limit{firstDigit + maxDigits * log10Radix + (point != nullptr)}; + if (q > limit) { + inexact = true; + if (point >= limit) { + q = point; + point = nullptr; + } + if (!point) { + exponent_ += q - limit; + } + q = limit; + } + if (point) { + exponent_ -= static_cast<int>(q - point - 1); + } + if (q == firstDigit) { + exponent_ = 0; // all zeros + } + // Rack the decimal digits up into big Digits. + for (auto times{radix}; q-- > firstDigit;) { + if (*q != '.') { + if (times == radix) { + digit_[digits_++] = *q - '0'; + times = 10; + } else { + digit_[digits_ - 1] += times * (*q - '0'); + times *= 10; + } + } + } + // Look for an optional exponent field. + if (p == end) { + return true; + } + q = p; + switch (*q) { + case 'e': + case 'E': + case 'd': + case 'D': + case 'q': + case 'Q': { + if (++q == end) { + break; + } + bool negExpo{*q == '-'}; + if (*q == '-' || *q == '+') { + ++q; + } + if (q != end && *q >= '0' && *q <= '9') { + int expo{0}; + for (; q != end && *q == '0'; ++q) { + } + const char *expDig{q}; + for (; q != end && *q >= '0' && *q <= '9'; ++q) { + expo = 10 * expo + *q - '0'; + } + if (q >= expDig + 8) { + // There's a ridiculous number of nonzero exponent digits. + // The decimal->binary conversion routine will cope with + // returning 0 or Inf, but we must ensure that "expo" didn't + // overflow back around to something legal. + expo = 10 * Real::decimalRange; + exponent_ = 0; + } + p = q; // exponent is valid; advance the termination pointer + if (negExpo) { + exponent_ -= expo; + } else { + exponent_ += expo; + } + } + } break; + default: + break; + } + return true; +} + +template <int PREC, int LOG10RADIX> +void BigRadixFloatingPointNumber<PREC, + LOG10RADIX>::LoseLeastSignificantDigit() { + Digit LSD{digit_[0]}; + for (int j{0}; j < digits_ - 1; ++j) { + digit_[j] = digit_[j + 1]; + } + digit_[digits_ - 1] = 0; + bool incr{false}; + switch (rounding_) { + case RoundNearest: + incr = LSD > radix / 2 || (LSD == radix / 2 && digit_[0] % 2 != 0); + break; + case RoundUp: + incr = LSD > 0 && !isNegative_; + break; + case RoundDown: + incr = LSD > 0 && isNegative_; + break; + case RoundToZero: + break; + case RoundCompatible: + incr = LSD >= radix / 2; + break; + } + for (int j{0}; (digit_[j] += incr) == radix; ++j) { + digit_[j] = 0; + } +} + +// This local utility class represents an unrounded nonnegative +// binary floating-point value with an unbiased (i.e., signed) +// binary exponent, an integer value (not a fraction) with an implied +// binary point to its *right*, and some guard bits for rounding. +template <int PREC> class IntermediateFloat { +public: + static constexpr int precision{PREC}; + using IntType = common::HostUnsignedIntType<precision>; + static constexpr IntType topBit{IntType{1} << (precision - 1)}; + static constexpr IntType mask{topBit + (topBit - 1)}; + + RT_API_ATTRS IntermediateFloat() {} + IntermediateFloat(const IntermediateFloat &) = default; + + // Assumes that exponent_ is valid on entry, and may increment it. + // Returns the number of guard_ bits that have been determined. + template <typename UINT> RT_API_ATTRS bool SetTo(UINT n) { + static constexpr int nBits{CHAR_BIT * sizeof n}; + if constexpr (precision >= nBits) { + value_ = n; + guard_ = 0; + return 0; + } else { + int shift{common::BitsNeededFor(n) - precision}; + if (shift <= 0) { + value_ = n; + guard_ = 0; + return 0; + } else { + value_ = n >> shift; + exponent_ += shift; + n <<= nBits - shift; + guard_ = (n >> (nBits - guardBits)) | ((n << guardBits) != 0); + return shift; + } + } + } + + RT_API_ATTRS void ShiftIn(int bit = 0) { value_ = value_ + value_ + bit; } + RT_API_ATTRS bool IsFull() const { return value_ >= topBit; } + RT_API_ATTRS void AdjustExponent(int by) { exponent_ += by; } + RT_API_ATTRS void SetGuard(int g) { + guard_ |= (static_cast<GuardType>(g & 6) << (guardBits - 3)) | (g & 1); + } + + RT_API_ATTRS ConversionToBinaryResult<PREC> ToBinary( + bool isNegative, FortranRounding) const; + +private: + static constexpr int guardBits{3}; // guard, round, sticky + using GuardType = int; + static constexpr GuardType oneHalf{GuardType{1} << (guardBits - 1)}; + + IntType value_{0}; + GuardType guard_{0}; + int exponent_{0}; +}; + +// The standard says that these overflow cases round to "representable" +// numbers, and some popular compilers interpret that to mean +/-HUGE() +// rather than +/-Inf. +static inline RT_API_ATTRS constexpr bool RoundOverflowToHuge( + enum FortranRounding rounding, bool isNegative) { + return rounding == RoundToZero || (!isNegative && rounding == RoundDown) || + (isNegative && rounding == RoundUp); +} + +template <int PREC> +ConversionToBinaryResult<PREC> IntermediateFloat<PREC>::ToBinary( + bool isNegative, FortranRounding rounding) const { + using Binary = BinaryFloatingPointNumber<PREC>; + // Create a fraction with a binary point to the left of the integer + // value_, and bias the exponent. + IntType fraction{value_}; + GuardType guard{guard_}; + int expo{exponent_ + Binary::exponentBias + (precision - 1)}; + while (expo < 1 && (fraction > 0 || guard > oneHalf)) { + guard = (guard & 1) | (guard >> 1) | + ((static_cast<GuardType>(fraction) & 1) << (guardBits - 1)); + fraction >>= 1; + ++expo; + } + int flags{Exact}; + if (guard != 0) { + flags |= Inexact; + } + if (fraction == 0) { + if (guard <= oneHalf) { + if ((!isNegative && rounding == RoundUp) || + (isNegative && rounding == RoundDown)) { + // round to least nonzero value + expo = 0; + } else { // round to zero + if (guard != 0) { + flags |= Underflow; + } + Binary zero; + if (isNegative) { + zero.Negate(); + } + return { + std::move(zero), static_cast<enum ConversionResultFlags>(flags)}; + } + } + } else { + // The value is nonzero; normalize it. + while (fraction < topBit && expo > 1) { + --expo; + fraction = fraction * 2 + (guard >> (guardBits - 2)); + guard = + (((guard >> (guardBits - 2)) & 1) << (guardBits - 1)) | (guard & 1); + } + } + // Apply rounding + bool incr{false}; + switch (rounding) { + case RoundNearest: + incr = guard > oneHalf || (guard == oneHalf && (fraction & 1)); + break; + case RoundUp: + incr = guard != 0 && !isNegative; + break; + case RoundDown: + incr = guard != 0 && isNegative; + break; + case RoundToZero: + break; + case RoundCompatible: + incr = guard >= oneHalf; + break; + } + if (incr) { + if (fraction == mask) { + // rounding causes a carry + ++expo; + fraction = topBit; + } else { + ++fraction; + } + } + if (expo == 1 && fraction < topBit) { + expo = 0; // subnormal + flags |= Underflow; + } else if (expo == 0) { + flags |= Underflow; + } else if (expo >= Binary::maxExponent) { + if (RoundOverflowToHuge(rounding, isNegative)) { + expo = Binary::maxExponent - 1; + fraction = mask; + } else { // Inf + expo = Binary::maxExponent; + flags |= Overflow; + if constexpr (Binary::bits == 80) { // x87 + fraction = IntType{1} << 63; + } else { + fraction = 0; + } + } + } + using Raw = typename Binary::RawType; + Raw raw = static_cast<Raw>(isNegative) << (Binary::bits - 1); + raw |= static_cast<Raw>(expo) << Binary::significandBits; + if constexpr (Binary::isImplicitMSB) { + fraction &= ~topBit; + } + raw |= fraction; + return {Binary(raw), static_cast<enum ConversionResultFlags>(flags)}; +} + +template <int PREC, int LOG10RADIX> +ConversionToBinaryResult<PREC> +BigRadixFloatingPointNumber<PREC, LOG10RADIX>::ConvertToBinary() { + // On entry, *this holds a multi-precision integer value in a radix of a + // large power of ten. Its radix point is defined to be to the right of its + // digits, and "exponent_" is the power of ten by which it is to be scaled. + Normalize(); + if (digits_ == 0) { // zero value + return {Real{SignBit()}}; + } + // The value is not zero: x = D. * 10.**E + // Shift our perspective on the radix (& decimal) point so that + // it sits to the *left* of the digits: i.e., x = .D * 10.**E + exponent_ += digits_ * log10Radix; + // Sanity checks for ridiculous exponents + static constexpr int crazy{2 * Real::decimalRange + log10Radix}; + if (exponent_ < -crazy) { + enum ConversionResultFlags flags { + static_cast<enum ConversionResultFlags>(Inexact | Underflow) + }; + if ((!isNegative_ && rounding_ == RoundUp) || + (isNegative_ && rounding_ == RoundDown)) { + // return least nonzero value + return {Real{Raw{1} | SignBit()}, flags}; + } else { // underflow to +/-0. + return {Real{SignBit()}, flags}; + } + } else if (exponent_ > crazy) { // overflow to +/-HUGE() or +/-Inf + if (RoundOverflowToHuge(rounding_, isNegative_)) { + return {Real{HUGE()}}; + } else { + return {Real{Infinity()}, Overflow}; + } + } + // Apply any negative decimal exponent by multiplication + // by a power of two, adjusting the binary exponent to compensate. + IntermediateFloat<PREC> f; + while (exponent_ < log10Radix) { + // x = 0.D * 10.**E * 2.**(f.ex) -> 512 * 0.D * 10.**E * 2.**(f.ex-9) + f.AdjustExponent(-9); + digitLimit_ = digits_; + if (int carry{MultiplyWithoutNormalization<512>()}) { + // x = c.D * 10.**E * 2.**(f.ex) -> .cD * 10.**(E+16) * 2.**(f.ex) + PushCarry(carry); + exponent_ += log10Radix; + } + } + // Apply any positive decimal exponent greater than + // is needed to treat the topmost digit as an integer + // part by multiplying by 10 or 10000 repeatedly. + while (exponent_ > log10Radix) { + digitLimit_ = digits_; + int carry; + if (exponent_ >= log10Radix + 4) { + // x = 0.D * 10.**E * 2.**(f.ex) -> 625 * .D * 10.**(E-4) * 2.**(f.ex+4) + exponent_ -= 4; + carry = MultiplyWithoutNormalization<(5 * 5 * 5 * 5)>(); + f.AdjustExponent(4); + } else { + // x = 0.D * 10.**E * 2.**(f.ex) -> 5 * .D * 10.**(E-1) * 2.**(f.ex+1) + --exponent_; + carry = MultiplyWithoutNormalization<5>(); + f.AdjustExponent(1); + } + if (carry != 0) { + // x = c.D * 10.**E * 2.**(f.ex) -> .cD * 10.**(E+16) * 2.**(f.ex) + PushCarry(carry); + exponent_ += log10Radix; + } + } + // So exponent_ is now log10Radix, meaning that the + // MSD can be taken as an integer part and transferred + // to the binary result. + // x = .jD * 10.**16 * 2.**(f.ex) -> .D * j * 2.**(f.ex) + int guardShift{f.SetTo(digit_[--digits_])}; + // Transfer additional bits until the result is normal. + digitLimit_ = digits_; + while (!f.IsFull()) { + // x = ((b.D)/2) * j * 2.**(f.ex) -> .D * (2j + b) * 2.**(f.ex-1) + f.AdjustExponent(-1); + std::uint32_t carry = MultiplyWithoutNormalization<2>(); + f.ShiftIn(carry); + } + // Get the next few bits for rounding. Allow for some guard bits + // that may have already been set in f.SetTo() above. + int guard{0}; + if (guardShift == 0) { + guard = MultiplyWithoutNormalization<4>(); + } else if (guardShift == 1) { + guard = MultiplyWithoutNormalization<2>(); + } + guard = guard + guard + !IsZero(); + f.SetGuard(guard); + return f.ToBinary(isNegative_, rounding_); +} + +template <int PREC, int LOG10RADIX> +ConversionToBinaryResult<PREC> +BigRadixFloatingPointNumber<PREC, LOG10RADIX>::ConvertToBinary( + const char *&p, const char *limit) { + bool inexact{false}; + if (ParseNumber(p, inexact, limit)) { + auto result{ConvertToBinary()}; + if (inexact) { + result.flags = + static_cast<enum ConversionResultFlags>(result.flags | Inexact); + } + return result; + } else { + // Could not parse a decimal floating-point number. p has been + // advanced over any leading spaces. Most Fortran compilers set + // the sign bit for -NaN. + const char *q{p}; + if (!limit || q < limit) { + isNegative_ = *q == '-'; + if (isNegative_ || *q == '+') { + ++q; + } + } + if ((!limit || limit >= q + 3) && runtime::toupper(q[0]) == 'N' && + runtime::toupper(q[1]) == 'A' && runtime::toupper(q[2]) == 'N') { + // NaN + p = q + 3; + bool isQuiet{true}; + if ((!limit || p < limit) && *p == '(') { + int depth{1}; + do { + ++p; + if (limit && p >= limit) { + // Invalid input + return {Real{NaN(false)}, Invalid}; + } else if (*p == '(') { + ++depth; + } else if (*p == ')') { + --depth; + } else if (*p != ' ') { + // Implementation dependent, but other compilers + // all return quiet NaNs. + } + } while (depth > 0); + ++p; + } + return {Real{NaN(isQuiet)}}; + } else { // Inf? + if ((!limit || limit >= q + 3) && runtime::toupper(q[0]) == 'I' && + runtime::toupper(q[1]) == 'N' && runtime::toupper(q[2]) == 'F') { + if ((!limit || limit >= q + 8) && runtime::toupper(q[3]) == 'I' && + runtime::toupper(q[4]) == 'N' && runtime::toupper(q[5]) == 'I' && + runtime::toupper(q[6]) == 'T' && runtime::toupper(q[7]) == 'Y') { + p = q + 8; + } else { + p = q + 3; + } + return {Real{Infinity()}}; + } else { + // Invalid input + return {Real{NaN()}, Invalid}; + } + } + } +} + +template <int PREC> +ConversionToBinaryResult<PREC> ConvertToBinary( + const char *&p, enum FortranRounding rounding, const char *end) { + return BigRadixFloatingPointNumber<PREC>{rounding}.ConvertToBinary(p, end); +} + +template ConversionToBinaryResult<8> ConvertToBinary<8>( + const char *&, enum FortranRounding, const char *end); +template ConversionToBinaryResult<11> ConvertToBinary<11>( + const char *&, enum FortranRounding, const char *end); +template ConversionToBinaryResult<24> ConvertToBinary<24>( + const char *&, enum FortranRounding, const char *end); +template ConversionToBinaryResult<53> ConvertToBinary<53>( + const char *&, enum FortranRounding, const char *end); +template ConversionToBinaryResult<64> ConvertToBinary<64>( + const char *&, enum FortranRounding, const char *end); +template ConversionToBinaryResult<113> ConvertToBinary<113>( + const char *&, enum FortranRounding, const char *end); + +extern "C" { +RT_EXT_API_GROUP_BEGIN + +enum ConversionResultFlags ConvertDecimalToFloat( + const char **p, float *f, enum FortranRounding rounding) { + auto result{Fortran::decimal::ConvertToBinary<24>(*p, rounding)}; + std::memcpy(reinterpret_cast<void *>(f), + reinterpret_cast<const void *>(&result.binary), sizeof *f); + return result.flags; +} +enum ConversionResultFlags ConvertDecimalToDouble( + const char **p, double *d, enum FortranRounding rounding) { + auto result{Fortran::decimal::ConvertToBinary<53>(*p, rounding)}; + std::memcpy(reinterpret_cast<void *>(d), + reinterpret_cast<const void *>(&result.binary), sizeof *d); + return result.flags; +} +enum ConversionResultFlags ConvertDecimalToLongDouble( + const char **p, long double *ld, enum FortranRounding rounding) { + auto result{Fortran::decimal::ConvertToBinary<64>(*p, rounding)}; + std::memcpy(reinterpret_cast<void *>(ld), + reinterpret_cast<const void *>(&result.binary), sizeof *ld); + return result.flags; +} + +RT_EXT_API_GROUP_END +} // extern "C" +} // namespace Fortran::decimal diff --git a/contrib/libs/llvm/flang-rt/patches/pr157840-missing-include-cstdlib.patch b/contrib/libs/llvm/flang-rt/patches/pr157840-missing-include-cstdlib.patch new file mode 100644 index 00000000000..b94984f33f5 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/patches/pr157840-missing-include-cstdlib.patch @@ -0,0 +1,22 @@ +From e34e6364ce0816b29a52b27873bd0153109e4cc2 Mon Sep 17 00:00:00 2001 +From: Yuriy Chernyshov <[email protected]> +Date: Wed, 10 Sep 2025 14:04:59 +0200 +Subject: [PATCH] Add missing #include <cstdlib> + +std::realloc is declared there +--- + flang/include/flang/Runtime/freestanding-tools.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/flang/include/flang/Runtime/freestanding-tools.h b/flang/include/flang/Runtime/freestanding-tools.h +index 6753b7a24ebe1..7ef7cc74f213b 100644 +--- a/flang/include/flang/Runtime/freestanding-tools.h ++++ b/flang/include/flang/Runtime/freestanding-tools.h +@@ -13,6 +13,7 @@ + #include "flang/Runtime/c-or-cpp.h" + #include <algorithm> + #include <cctype> ++#include <cstdlib> + #include <cstring> + + // The file defines a set of utilities/classes that might be diff --git a/contrib/libs/llvm/flang-rt/patches/pr160096-create-process-w.patch b/contrib/libs/llvm/flang-rt/patches/pr160096-create-process-w.patch new file mode 100644 index 00000000000..d3f65766f44 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/patches/pr160096-create-process-w.patch @@ -0,0 +1,31 @@ +From ec9078d051178837e6d6a082ee165cece89b0aa1 Mon Sep 17 00:00:00 2001 +From: Yuriy Chernyshov <[email protected]> +Date: Mon, 22 Sep 2025 16:15:44 +0300 +Subject: [PATCH] Use CreateProcessW explicitly to improve compatibility + +--- + flang-rt/lib/runtime/execute.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/flang-rt/lib/runtime/execute.cpp b/flang-rt/lib/runtime/execute.cpp +index f180da846a32c..779e040bebebc 100644 +--- a/flang-rt/lib/runtime/execute.cpp ++++ b/flang-rt/lib/runtime/execute.cpp +@@ -212,7 +212,7 @@ void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait, + } else { + // Asynchronous mode + #ifdef _WIN32 +- STARTUPINFO si; ++ STARTUPINFOW si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); +@@ -234,7 +234,7 @@ void RTNAME(ExecuteCommandLine)(const Descriptor &command, bool wait, + } + FreeMemory(newCmdWin); + +- if (CreateProcess(nullptr, wcmd, nullptr, nullptr, FALSE, 0, nullptr, ++ if (CreateProcessW(nullptr, wcmd, nullptr, nullptr, FALSE, 0, nullptr, + nullptr, &si, &pi)) { + // Close handles so it will be removed when terminated + CloseHandle(pi.hProcess); diff --git a/contrib/libs/llvm/flang-rt/ya.make b/contrib/libs/llvm/flang-rt/ya.make new file mode 100644 index 00000000000..692ab5cb888 --- /dev/null +++ b/contrib/libs/llvm/flang-rt/ya.make @@ -0,0 +1,100 @@ +# Generated by devtools/yamaker from nixpkgs 24.05. + +LIBRARY() + +LICENSE( + Apache-2.0 WITH LLVM-exception AND + NCSA +) + +LICENSE_TEXTS(.yandex_meta/licenses.list.txt) + +VERSION(21.1.1) + +ORIGINAL_SOURCE(https://github.com/llvm/llvm-project/archive/llvmorg-21.1.1.tar.gz) + +ADDINCL( + GLOBAL contrib/libs/llvm/flang-rt/flang-rt/include + contrib/libs/llvm/flang-rt/flang-rt + contrib/libs/llvm/flang-rt/flang/include +) + +NO_COMPILER_WARNINGS() + +NO_UTIL() + +SRCS( + flang-rt/lib/runtime/ISO_Fortran_binding.cpp + flang-rt/lib/runtime/allocatable.cpp + flang-rt/lib/runtime/allocator-registry.cpp + flang-rt/lib/runtime/array-constructor.cpp + flang-rt/lib/runtime/assign.cpp + flang-rt/lib/runtime/buffer.cpp + flang-rt/lib/runtime/character.cpp + flang-rt/lib/runtime/command.cpp + flang-rt/lib/runtime/complex-powi.cpp + flang-rt/lib/runtime/complex-reduction.c + flang-rt/lib/runtime/connection.cpp + flang-rt/lib/runtime/copy.cpp + flang-rt/lib/runtime/derived-api.cpp + flang-rt/lib/runtime/derived.cpp + flang-rt/lib/runtime/descriptor-io.cpp + flang-rt/lib/runtime/descriptor.cpp + flang-rt/lib/runtime/dot-product.cpp + flang-rt/lib/runtime/edit-input.cpp + flang-rt/lib/runtime/edit-output.cpp + flang-rt/lib/runtime/environment.cpp + flang-rt/lib/runtime/exceptions.cpp + flang-rt/lib/runtime/execute.cpp + flang-rt/lib/runtime/extensions.cpp + flang-rt/lib/runtime/external-unit.cpp + flang-rt/lib/runtime/extrema.cpp + flang-rt/lib/runtime/file.cpp + flang-rt/lib/runtime/findloc.cpp + flang-rt/lib/runtime/format.cpp + flang-rt/lib/runtime/inquiry.cpp + flang-rt/lib/runtime/internal-unit.cpp + flang-rt/lib/runtime/io-api-minimal.cpp + flang-rt/lib/runtime/io-api.cpp + flang-rt/lib/runtime/io-error.cpp + flang-rt/lib/runtime/io-stmt.cpp + flang-rt/lib/runtime/iostat.cpp + flang-rt/lib/runtime/main.cpp + flang-rt/lib/runtime/matmul-transpose.cpp + flang-rt/lib/runtime/matmul.cpp + flang-rt/lib/runtime/memory.cpp + flang-rt/lib/runtime/misc-intrinsic.cpp + flang-rt/lib/runtime/namelist.cpp + flang-rt/lib/runtime/non-tbp-dio.cpp + flang-rt/lib/runtime/numeric.cpp + flang-rt/lib/runtime/pointer.cpp + flang-rt/lib/runtime/product.cpp + flang-rt/lib/runtime/pseudo-unit.cpp + flang-rt/lib/runtime/ragged.cpp + flang-rt/lib/runtime/random.cpp + flang-rt/lib/runtime/reduce.cpp + flang-rt/lib/runtime/reduction.cpp + flang-rt/lib/runtime/stat.cpp + flang-rt/lib/runtime/stop.cpp + flang-rt/lib/runtime/sum.cpp + flang-rt/lib/runtime/support.cpp + flang-rt/lib/runtime/temporary-stack.cpp + flang-rt/lib/runtime/terminator.cpp + flang-rt/lib/runtime/time-intrinsic.cpp + flang-rt/lib/runtime/tools.cpp + flang-rt/lib/runtime/transformational.cpp + flang-rt/lib/runtime/type-code.cpp + flang-rt/lib/runtime/type-info.cpp + flang-rt/lib/runtime/unit-map.cpp + flang-rt/lib/runtime/unit.cpp + flang-rt/lib/runtime/utf.cpp + flang-rt/lib/runtime/work-queue.cpp + flang/lib/Decimal/binary-to-decimal.cpp + flang/lib/Decimal/decimal-to-binary.cpp +) + +IF (OS_WINDOWS) + LDFLAGS(/LIBPATH:${ARCADIA_ROOT}/build/essentials/flang-empty-runtimes) +ENDIF() + +END() diff --git a/contrib/libs/utf8proc/.yandex_meta/devtools.licenses.report b/contrib/libs/utf8proc/.yandex_meta/devtools.licenses.report index f4c23661e1e..a7c0d20482a 100644 --- a/contrib/libs/utf8proc/.yandex_meta/devtools.licenses.report +++ b/contrib/libs/utf8proc/.yandex_meta/devtools.licenses.report @@ -84,7 +84,7 @@ BELONGS ya.make Match type : REFERENCE Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT Files with this license: - NEWS.md [319:319] + NEWS.md [329:329] KEEP MIT b9f647ef7e29973cc8b999af88006590 BELONGS ya.make @@ -113,7 +113,7 @@ BELONGS ya.make KEEP MIT AND Unicode e494dba55af130e3b0d56ff7a74377e3 BELONGS ya.make -FILE_INCLUDE LICENSE.md found in files: README.md at line 30 +FILE_INCLUDE LICENSE.md found in files: README.md at line 28 Note: matched license text is too long. Read it in the source files. Scancode info: Original SPDX id: MIT @@ -121,11 +121,11 @@ FILE_INCLUDE LICENSE.md found in files: README.md at line 30 Match type : NOTICE Links : http://opensource.org/licenses/mit-license.php, https://spdx.org/licenses/MIT Files with this license: - README.md [25:30] + README.md [23:28] Scancode info: Original SPDX id: LicenseRef-scancode-unicode Score : 100.00 Match type : NOTICE Links : http://unicode.org/, http://unicode.org/copyright.html, https://github.com/nexB/scancode-toolkit/tree/develop/src/licensedcode/data/licenses/unicode.LICENSE Files with this license: - README.md [25:30] + README.md [23:28] diff --git a/contrib/libs/utf8proc/.yandex_meta/override.nix b/contrib/libs/utf8proc/.yandex_meta/override.nix index c1ea2ec638e..6ddffc249d2 100644 --- a/contrib/libs/utf8proc/.yandex_meta/override.nix +++ b/contrib/libs/utf8proc/.yandex_meta/override.nix @@ -1,10 +1,10 @@ self: super: with self; rec { - version = "2.10.0"; + version = "2.11.0"; src = fetchFromGitHub { owner = "JuliaStrings"; repo = "utf8proc"; rev = "v${version}"; - hash = "sha256-wmtMo6eBK/xxxkIeJfh5Yb293po9cKK+7WjqNPoxM9g="; + hash = "sha256-iNITnxA1cacOBRU/XV22yzjB0XUOCYsaLLLPYLa+AoA="; }; } diff --git a/contrib/libs/utf8proc/NEWS.md b/contrib/libs/utf8proc/NEWS.md index 90868241979..e52d161120d 100644 --- a/contrib/libs/utf8proc/NEWS.md +++ b/contrib/libs/utf8proc/NEWS.md @@ -1,5 +1,15 @@ # utf8proc release history # +## Version 2.11.0 ## + +2025-09-10 + + - Unicode 17 support ([#292], [#294]). + + - Documentation improvements ([#295], [#291]). + + - Build fix for C90 ([#284]), silence ASAN warning ([#240]), CMake modernization ([#260]). + ## Version 2.10.0 ## 2024-12-31 @@ -449,7 +459,14 @@ Release of version 1.0.1 [#205]: https://github.com/JuliaStrings/utf8proc/issues/205 [#224]: https://github.com/JuliaStrings/utf8proc/issues/224 [#233]: https://github.com/JuliaStrings/utf8proc/issues/233 +[#240]: https://github.com/JuliaStrings/utf8proc/issues/240 [#247]: https://github.com/JuliaStrings/utf8proc/issues/247 [#253]: https://github.com/JuliaStrings/utf8proc/issues/253 +[#260]: https://github.com/JuliaStrings/utf8proc/issues/260 [#270]: https://github.com/JuliaStrings/utf8proc/issues/270 [#277]: https://github.com/JuliaStrings/utf8proc/issues/277 +[#284]: https://github.com/JuliaStrings/utf8proc/issues/284 +[#291]: https://github.com/JuliaStrings/utf8proc/issues/291 +[#292]: https://github.com/JuliaStrings/utf8proc/issues/292 +[#294]: https://github.com/JuliaStrings/utf8proc/issues/294 +[#295]: https://github.com/JuliaStrings/utf8proc/issues/295 diff --git a/contrib/libs/utf8proc/README.md b/contrib/libs/utf8proc/README.md index f65247713c7..72fe0cd42a3 100644 --- a/contrib/libs/utf8proc/README.md +++ b/contrib/libs/utf8proc/README.md @@ -14,13 +14,11 @@ Software Group, the [Julia developers](http://julialang.org/) have taken over development of utf8proc, since the original developers have moved to other projects. -(utf8proc is used for basic Unicode +utf8proc is used for basic Unicode support in the [Julia language](http://julialang.org/), and the Julia -developers became involved because they wanted to add Unicode 7 support and other features.) +developers became involved because they wanted to add Unicode 7 support and other features; it is now regularly updated to keep up with recent Unicode releases. -(The original utf8proc package also includes Ruby and PostgreSQL plug-ins. -We removed those from utf8proc in order to focus exclusively on the C -library.) +There are also utf8proc wrappers for [Ruby](https://www.ruby-toolbox.com/projects/utf8_proc) and [Rust](https://docs.rs/utf8proc/latest/utf8proc/) ([github](https://github.com/Techcable/utf8proc.rs)). (The original utf8proc package also included PostgreSQL bindings.) The utf8proc package is licensed under the free/open-source [MIT "expat" @@ -53,13 +51,23 @@ gmake CC=/opt/aCC/bin/aCC CFLAGS="+O2" PICFLAG="+z" C99FLAG="-Ae" WCFLAGS="+w" L ``` To run `gmake install` you will need GNU coreutils for the `install` command, and you may want to pass `prefix=/opt libdir=/opt/lib/hpux32` or similar to change the installation location. +### Using with CMake + +A CMake Config-file package is provided. To use utf8proc in a CMake project: + +```cmake +add_executable (app app.c) +find_package (utf8proc 2.9.0 REQUIRED) +target_link_libraries (app PRIVATE utf8proc::utf8proc) +``` + ## General Information The C library is found in this directory after successful compilation and is named `libutf8proc.a` (for the static library) and `libutf8proc.so` (for the dynamic library). -The Unicode version supported is 16.0.0. +The Unicode version supported is 17.0.0. For Unicode normalizations, the following options are used: diff --git a/contrib/libs/utf8proc/utf8proc.c b/contrib/libs/utf8proc/utf8proc.c index 29e92ea3f1d..87cec94213d 100644 --- a/contrib/libs/utf8proc/utf8proc.c +++ b/contrib/libs/utf8proc/utf8proc.c @@ -101,7 +101,7 @@ UTF8PROC_DLLEXPORT const char *utf8proc_version(void) { } UTF8PROC_DLLEXPORT const char *utf8proc_unicode_version(void) { - return "16.0.0"; + return "17.0.0"; } UTF8PROC_DLLEXPORT const char *utf8proc_errmsg(utf8proc_ssize_t errcode) { @@ -388,7 +388,7 @@ static utf8proc_ssize_t seqindex_write_char_decomposed(utf8proc_uint16_t seqinde for (; len >= 0; entry++, len--) { utf8proc_int32_t entry_cp = seqindex_decode_entry(&entry); - written += utf8proc_decompose_char(entry_cp, dst+written, + written += utf8proc_decompose_char(entry_cp, dst ? dst+written : dst, (bufsize > written) ? (bufsize - written) : 0, options, last_boundclass); if (written < 0) return UTF8PROC_ERROR_OVERFLOW; @@ -578,7 +578,7 @@ UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_decompose_custom( uc = custom_func(uc, custom_data); /* user-specified custom mapping */ } decomp_result = utf8proc_decompose_char( - uc, buffer + wpos, (bufsize > wpos) ? (bufsize - wpos) : 0, options, + uc, buffer ? buffer+wpos : buffer, (bufsize > wpos) ? (bufsize - wpos) : 0, options, &boundclass ); if (decomp_result < 0) return decomp_result; @@ -688,8 +688,9 @@ UTF8PROC_DLLEXPORT utf8proc_ssize_t utf8proc_normalize_utf32(utf8proc_int32_t *b int len = starter_property->comb_length; utf8proc_int32_t max_second = utf8proc_combinations_second[idx + len - 1]; if (current_char <= max_second) { + int off; // TODO: binary search? arithmetic search? - for (int off = 0; off < len; ++off) { + for (off = 0; off < len; ++off) { utf8proc_int32_t second = utf8proc_combinations_second[idx + off]; if (current_char < second) { /* not found */ diff --git a/contrib/libs/utf8proc/utf8proc.h b/contrib/libs/utf8proc/utf8proc.h index 130122106e5..a0c22d7ed1d 100644 --- a/contrib/libs/utf8proc/utf8proc.h +++ b/contrib/libs/utf8proc/utf8proc.h @@ -71,7 +71,7 @@ /** The MAJOR version number (increased when backwards API compatibility is broken). */ #define UTF8PROC_VERSION_MAJOR 2 /** The MINOR version number (increased when new functionality is added in a backwards-compatible manner). */ -#define UTF8PROC_VERSION_MINOR 10 +#define UTF8PROC_VERSION_MINOR 11 /** The PATCH version (increased for fixes that do not change the API). */ #define UTF8PROC_VERSION_PATCH 0 /** @} */ @@ -136,7 +136,7 @@ typedef enum { UTF8PROC_STABLE = (1<<1), /** Compatibility decomposition (i.e. formatting information is lost). */ UTF8PROC_COMPAT = (1<<2), - /** Return a result with decomposed characters. */ + /** Return a result with composed characters. */ UTF8PROC_COMPOSE = (1<<3), /** Return a result with decomposed characters. */ UTF8PROC_DECOMPOSE = (1<<4), @@ -503,7 +503,7 @@ UTF8PROC_DLLEXPORT const utf8proc_property_t *utf8proc_get_property(utf8proc_int * @param dst the destination buffer. * @param bufsize the size of the destination buffer. * @param options one or more of the following flags: - * - @ref UTF8PROC_REJECTNA - return an error `codepoint` is unassigned + * - @ref UTF8PROC_REJECTNA - return an error if `codepoint` is unassigned * - @ref UTF8PROC_IGNORE - strip "default ignorable" codepoints * - @ref UTF8PROC_CASEFOLD - apply Unicode casefolding * - @ref UTF8PROC_COMPAT - replace certain codepoints with their @@ -518,6 +518,11 @@ UTF8PROC_DLLEXPORT const utf8proc_property_t *utf8proc_get_property(utf8proc_int * option is used. If the string is being processed in order, this can be initialized to 0 for * the beginning of the string, and is thereafter updated automatically. Otherwise, this parameter is ignored. * + * In the current version of utf8proc, the maximum destination buffer with the @ref UTF8PROC_DECOMPOSE + * option is 4 elements (or double that with @ref UTF8PROC_CHARBOUND), so this is a good default size. + * However, this may increase in future Unicode versions, so you should always check the return value + * as described below. + * * @return * In case of success, the number of codepoints written is returned; in case * of an error, a negative error code is returned (utf8proc_errmsg()). diff --git a/contrib/libs/utf8proc/utf8proc_data.c b/contrib/libs/utf8proc/utf8proc_data.c index 39b7b777805..94988b33587 100644 --- a/contrib/libs/utf8proc/utf8proc_data.c +++ b/contrib/libs/utf8proc/utf8proc_data.c @@ -133,14 +133,14 @@ static const utf8proc_uint16_t utf8proc_sequences[] = { 630, 631, 632, 633, 634, 635, 636, 11364, 638, 639, 422, 641, 42949, 425, 644, 645, 646, 42929, 430, 580, 433, 434, 581, 653, - 654, 655, 656, 657, 439, 659, 661, 662, - 663, 664, 665, 666, 667, 668, 42930, 42928, - 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, - 687, 688, 614, 689, 690, 691, 692, 693, - 694, 695, 696, 704, 705, 32, 774, 32, - 775, 32, 778, 32, 808, 32, 771, 32, - 779, 736, 737, 738, 739, 740, 768, 769, + 654, 655, 656, 657, 439, 659, 662, 663, + 664, 665, 666, 667, 668, 42930, 42928, 671, + 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, + 688, 614, 689, 690, 691, 692, 693, 694, + 695, 696, 704, 705, 32, 774, 32, 775, + 32, 778, 32, 808, 32, 771, 32, 779, + 736, 737, 738, 739, 661, 740, 768, 769, 787, 776, 769, 953, 921, 881, 880, 883, 882, 697, 887, 886, 32, 837, 890, 1021, 1022, 1023, 59, 1011, 168, 769, 913, 769, @@ -843,770 +843,783 @@ static const utf8proc_uint16_t utf8proc_sequences[] = { 42932, 42935, 42934, 42937, 42936, 42939, 42938, 42941, 42940, 42943, 42942, 42945, 42944, 42947, 42946, 42900, 7566, 42952, 42951, 42954, 42953, 612, 42957, 42956, - 42961, 42960, 42963, 42965, 42967, 42966, 42969, 42968, - 42971, 42970, 411, 42994, 42995, 42996, 42998, 42997, - 43000, 43001, 43002, 43824, 43825, 43826, 43827, 43828, - 43829, 43830, 43831, 43832, 43833, 43834, 43835, 43836, - 43837, 43838, 43839, 43840, 43841, 43842, 43843, 43844, - 43845, 43846, 43847, 43848, 43849, 43850, 43851, 43852, - 43853, 43854, 43855, 43856, 43857, 43858, 42931, 43860, - 43861, 43862, 43863, 43864, 43865, 43866, 43868, 43869, - 43870, 43871, 43872, 43873, 43874, 43875, 43876, 43877, - 43878, 43879, 43880, 43881, 5024, 5025, 5026, 5027, - 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, - 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, - 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, - 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, - 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, - 5084, 5085, 5086, 5087, 5088, 5089, 5090, 5091, - 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, - 5100, 5101, 5102, 5103, 35912, 26356, 36040, 28369, - 20018, 21477, 22865, 21895, 22856, 25078, 30313, 32645, - 34367, 34746, 35064, 37007, 27138, 27931, 28889, 29662, - 33853, 37226, 39409, 20098, 21365, 27396, 29211, 34349, - 40478, 23888, 28651, 34253, 35172, 25289, 33240, 34847, - 24266, 26391, 28010, 29436, 37070, 20358, 20919, 21214, - 25796, 27347, 29200, 30439, 34310, 34396, 36335, 38706, - 39791, 40442, 30860, 31103, 32160, 33737, 37636, 35542, - 22751, 24324, 31840, 32894, 29282, 30922, 36034, 38647, - 22744, 23650, 27155, 28122, 28431, 32047, 32311, 38475, - 21202, 32907, 20956, 20940, 31260, 32190, 33777, 38517, - 35712, 25295, 35582, 20025, 23527, 24594, 29575, 30064, - 21271, 30971, 20415, 24489, 19981, 27852, 25976, 32034, - 21443, 22622, 30465, 33865, 35498, 27578, 27784, 25342, - 33509, 25504, 30053, 20142, 20841, 20937, 26753, 31975, - 33391, 35538, 37327, 21237, 21570, 24300, 26053, 28670, - 31018, 38317, 39530, 40599, 40654, 26310, 27511, 36706, - 24180, 24976, 25088, 25754, 28451, 29001, 29833, 31178, - 32244, 32879, 36646, 34030, 36899, 37706, 21015, 21155, - 21693, 28872, 35010, 24265, 24565, 25467, 27566, 31806, - 29557, 20196, 22265, 23994, 24604, 29618, 29801, 32666, - 32838, 37428, 38646, 38728, 38936, 20363, 31150, 37300, - 38584, 24801, 20102, 20698, 23534, 23615, 26009, 29134, - 30274, 34044, 36988, 26248, 38446, 21129, 26491, 26611, - 27969, 28316, 29705, 30041, 30827, 32016, 39006, 25134, - 38520, 20523, 23833, 28138, 36650, 24459, 24900, 26647, - 38534, 21033, 21519, 23653, 26131, 26446, 26792, 27877, - 29702, 30178, 32633, 35023, 35041, 38626, 21311, 28346, - 21533, 29136, 29848, 34298, 38563, 40023, 40607, 26519, - 28107, 33256, 31520, 31890, 29376, 28825, 35672, 20160, - 33590, 21050, 20999, 24230, 25299, 31958, 23429, 27934, - 26292, 36667, 38477, 24275, 20800, 21952, 22618, 26228, - 20958, 29482, 30410, 31036, 31070, 31077, 31119, 38742, - 31934, 34322, 35576, 36920, 37117, 39151, 39164, 39208, - 40372, 37086, 38583, 20398, 20711, 20813, 21193, 21220, - 21329, 21917, 22022, 22120, 22592, 22696, 23652, 24724, - 24936, 24974, 25074, 25935, 26082, 26257, 26757, 28023, - 28186, 28450, 29038, 29227, 29730, 30865, 31049, 31048, - 31056, 31062, 31117, 31118, 31296, 31361, 31680, 32265, - 32321, 32626, 32773, 33261, 33401, 33879, 35088, 35222, - 35585, 35641, 36051, 36104, 36790, 38627, 38911, 38971, - 24693, 55376, 57070, 33304, 20006, 20917, 20840, 20352, - 20805, 20864, 21191, 21242, 21845, 21913, 21986, 22707, - 22852, 22868, 23138, 23336, 24274, 24281, 24425, 24493, - 24792, 24910, 24840, 24928, 25140, 25540, 25628, 25682, - 25942, 26395, 26454, 28379, 28363, 28702, 30631, 29237, - 29359, 29809, 29958, 30011, 30237, 30239, 30427, 30452, - 30538, 30528, 30924, 31409, 31867, 32091, 32574, 33618, - 33775, 34681, 35137, 35206, 35519, 35531, 35565, 35722, - 36664, 36978, 37273, 37494, 38524, 38875, 38923, 39698, - 55370, 56394, 55370, 56388, 55372, 57301, 15261, 16408, - 16441, 55380, 56905, 55383, 56528, 55391, 57043, 40771, - 40846, 102, 102, 64256, 102, 105, 64257, 102, - 108, 64258, 102, 102, 105, 64259, 102, 102, - 108, 64260, 383, 116, 115, 116, 64261, 64262, - 1396, 1398, 64275, 1396, 1381, 64276, 1396, 1387, - 64277, 1406, 1398, 64278, 1396, 1389, 64279, 1497, - 1460, 1522, 1463, 1506, 1492, 1499, 1500, 1501, - 1512, 1514, 1513, 1473, 1513, 1474, 64329, 1473, - 64329, 1474, 1488, 1463, 1488, 1464, 1488, 1468, - 1489, 1468, 1490, 1468, 1491, 1468, 1492, 1468, - 1493, 1468, 1494, 1468, 1496, 1468, 1497, 1468, - 1498, 1468, 1499, 1468, 1500, 1468, 1502, 1468, - 1504, 1468, 1505, 1468, 1507, 1468, 1508, 1468, - 1510, 1468, 1511, 1468, 1512, 1468, 1513, 1468, - 1514, 1468, 1493, 1465, 1489, 1471, 1499, 1471, - 1508, 1471, 1488, 1500, 1649, 1659, 1662, 1664, - 1658, 1663, 1657, 1700, 1702, 1668, 1667, 1670, - 1671, 1677, 1676, 1678, 1672, 1688, 1681, 1705, - 1711, 1715, 1713, 1722, 1723, 1728, 1729, 1726, - 1746, 1747, 1709, 1735, 1734, 1736, 1655, 1739, - 1733, 1737, 1744, 1609, 1574, 1575, 1574, 1749, - 1574, 1608, 1574, 1735, 1574, 1734, 1574, 1736, - 1574, 1744, 1574, 1609, 1740, 1574, 1580, 1574, - 1581, 1574, 1605, 1574, 1610, 1576, 1580, 1576, - 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576, - 1610, 1578, 1580, 1578, 1581, 1578, 1582, 1578, - 1605, 1578, 1609, 1578, 1610, 1579, 1580, 1579, - 1605, 1579, 1609, 1579, 1610, 1580, 1581, 1580, - 1605, 1581, 1580, 1581, 1605, 1582, 1580, 1582, - 1581, 1582, 1605, 1587, 1580, 1587, 1581, 1587, - 1582, 1587, 1605, 1589, 1581, 1589, 1605, 1590, - 1580, 1590, 1581, 1590, 1582, 1590, 1605, 1591, - 1581, 1591, 1605, 1592, 1605, 1593, 1580, 1593, - 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601, - 1581, 1601, 1582, 1601, 1605, 1601, 1609, 1601, - 1610, 1602, 1581, 1602, 1605, 1602, 1609, 1602, - 1610, 1603, 1575, 1603, 1580, 1603, 1581, 1603, - 1582, 1603, 1604, 1603, 1605, 1603, 1609, 1603, - 1610, 1604, 1580, 1604, 1581, 1604, 1582, 1604, - 1605, 1604, 1609, 1604, 1610, 1605, 1580, 1605, - 1581, 1605, 1582, 1605, 1605, 1605, 1609, 1605, - 1610, 1606, 1580, 1606, 1581, 1606, 1582, 1606, - 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, - 1605, 1607, 1609, 1607, 1610, 1610, 1580, 1610, - 1581, 1610, 1582, 1610, 1605, 1610, 1609, 1610, - 1610, 1584, 1648, 1585, 1648, 1609, 1648, 32, - 1612, 1617, 32, 1613, 1617, 32, 1614, 1617, - 32, 1615, 1617, 32, 1616, 1617, 32, 1617, - 1648, 1574, 1585, 1574, 1586, 1574, 1606, 1576, - 1585, 1576, 1586, 1576, 1606, 1578, 1585, 1578, - 1586, 1578, 1606, 1579, 1585, 1579, 1586, 1579, - 1606, 1605, 1575, 1606, 1585, 1606, 1586, 1606, - 1606, 1610, 1585, 1610, 1586, 1610, 1606, 1574, - 1582, 1574, 1607, 1576, 1607, 1578, 1607, 1589, - 1582, 1604, 1607, 1606, 1607, 1607, 1648, 1610, - 1607, 1579, 1607, 1587, 1607, 1588, 1605, 1588, - 1607, 1600, 1614, 1617, 1600, 1615, 1617, 1600, - 1616, 1617, 1591, 1609, 1591, 1610, 1593, 1609, - 1593, 1610, 1594, 1609, 1594, 1610, 1587, 1609, - 1587, 1610, 1588, 1609, 1588, 1610, 1581, 1609, - 1581, 1610, 1580, 1609, 1580, 1610, 1582, 1609, - 1582, 1610, 1589, 1609, 1589, 1610, 1590, 1609, - 1590, 1610, 1588, 1580, 1588, 1581, 1588, 1582, - 1588, 1585, 1587, 1585, 1589, 1585, 1590, 1585, - 1575, 1611, 1578, 1580, 1605, 1578, 1581, 1580, - 1578, 1581, 1605, 1578, 1582, 1605, 1578, 1605, - 1580, 1578, 1605, 1581, 1578, 1605, 1582, 1580, - 1605, 1581, 1581, 1605, 1610, 1581, 1605, 1609, - 1587, 1581, 1580, 1587, 1580, 1581, 1587, 1580, - 1609, 1587, 1605, 1581, 1587, 1605, 1580, 1587, - 1605, 1605, 1589, 1581, 1581, 1589, 1605, 1605, - 1588, 1581, 1605, 1588, 1580, 1610, 1588, 1605, - 1582, 1588, 1605, 1605, 1590, 1581, 1609, 1590, - 1582, 1605, 1591, 1605, 1581, 1591, 1605, 1605, - 1591, 1605, 1610, 1593, 1580, 1605, 1593, 1605, - 1605, 1593, 1605, 1609, 1594, 1605, 1605, 1594, - 1605, 1610, 1594, 1605, 1609, 1601, 1582, 1605, - 1602, 1605, 1581, 1602, 1605, 1605, 1604, 1581, - 1605, 1604, 1581, 1610, 1604, 1581, 1609, 1604, - 1580, 1580, 1604, 1582, 1605, 1604, 1605, 1581, - 1605, 1581, 1580, 1605, 1581, 1605, 1605, 1581, - 1610, 1605, 1580, 1581, 1605, 1580, 1605, 1605, - 1582, 1580, 1605, 1582, 1605, 1605, 1580, 1582, - 1607, 1605, 1580, 1607, 1605, 1605, 1606, 1581, - 1605, 1606, 1581, 1609, 1606, 1580, 1605, 1606, - 1580, 1609, 1606, 1605, 1610, 1606, 1605, 1609, - 1610, 1605, 1605, 1576, 1582, 1610, 1578, 1580, - 1610, 1578, 1580, 1609, 1578, 1582, 1610, 1578, - 1582, 1609, 1578, 1605, 1610, 1578, 1605, 1609, - 1580, 1605, 1610, 1580, 1581, 1609, 1580, 1605, - 1609, 1587, 1582, 1609, 1589, 1581, 1610, 1588, - 1581, 1610, 1590, 1581, 1610, 1604, 1580, 1610, - 1604, 1605, 1610, 1610, 1581, 1610, 1610, 1580, - 1610, 1610, 1605, 1610, 1605, 1605, 1610, 1602, - 1605, 1610, 1606, 1581, 1610, 1593, 1605, 1610, - 1603, 1605, 1610, 1606, 1580, 1581, 1605, 1582, - 1610, 1604, 1580, 1605, 1603, 1605, 1605, 1580, - 1581, 1610, 1581, 1580, 1610, 1605, 1580, 1610, - 1601, 1605, 1610, 1576, 1581, 1610, 1587, 1582, - 1610, 1606, 1580, 1610, 1589, 1604, 1746, 1602, - 1604, 1746, 3, 1575, 1604, 1604, 1607, 3, - 1575, 1603, 1576, 1585, 3, 1605, 1581, 1605, - 1583, 3, 1589, 1604, 1593, 1605, 3, 1585, - 1587, 1608, 1604, 3, 1593, 1604, 1610, 1607, - 3, 1608, 1587, 1604, 1605, 1589, 1604, 1609, - 17, 1589, 1604, 1609, 32, 1575, 1604, 1604, - 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, - 1587, 1604, 1605, 7, 1580, 1604, 32, 1580, - 1604, 1575, 1604, 1607, 3, 1585, 1740, 1575, - 1604, 44, 12289, 12290, 58, 33, 63, 12310, - 12311, 8230, 8229, 8212, 8211, 95, 123, 125, - 12308, 12309, 12304, 12305, 12298, 12299, 12300, 12301, - 12302, 12303, 91, 93, 8254, 35, 38, 42, - 45, 60, 62, 92, 36, 37, 64, 32, - 1611, 1600, 1611, 32, 1612, 32, 1613, 32, - 1614, 1600, 1614, 32, 1615, 1600, 1615, 32, - 1616, 1600, 1616, 32, 1617, 1600, 1617, 32, - 1618, 1600, 1618, 1569, 1570, 1571, 1572, 1573, - 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, - 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, - 1590, 1591, 1592, 1593, 1594, 1601, 1602, 1603, - 1604, 1605, 1606, 1607, 1608, 1610, 1604, 1570, - 1604, 1571, 1604, 1573, 1604, 1575, 34, 39, - 47, 65345, 65346, 65347, 65348, 65349, 65350, 65351, - 65352, 65353, 65354, 65355, 65356, 65357, 65358, 65359, - 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, - 65368, 65369, 65370, 94, 65313, 65314, 65315, 65316, - 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, - 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, - 65333, 65334, 65335, 65336, 65337, 65338, 124, 126, - 10629, 10630, 12539, 12449, 12451, 12453, 12455, 12457, - 12515, 12517, 12519, 12483, 12540, 12531, 12441, 12442, - 12644, 12593, 12594, 12595, 12596, 12597, 12598, 12599, - 12600, 12601, 12602, 12603, 12604, 12605, 12606, 12607, - 12608, 12609, 12610, 12611, 12612, 12613, 12614, 12615, - 12616, 12617, 12618, 12619, 12620, 12621, 12622, 12623, - 12624, 12625, 12626, 12627, 12628, 12629, 12630, 12631, - 12632, 12633, 12634, 12635, 12636, 12637, 12638, 12639, - 12640, 12641, 12642, 12643, 162, 163, 172, 175, - 166, 165, 8361, 9474, 8592, 8593, 8594, 8595, - 9632, 9675, 55297, 56360, 55297, 56361, 55297, 56362, - 55297, 56363, 55297, 56364, 55297, 56365, 55297, 56366, - 55297, 56367, 55297, 56368, 55297, 56369, 55297, 56370, - 55297, 56371, 55297, 56372, 55297, 56373, 55297, 56374, - 55297, 56375, 55297, 56376, 55297, 56377, 55297, 56378, - 55297, 56379, 55297, 56380, 55297, 56381, 55297, 56382, - 55297, 56383, 55297, 56384, 55297, 56385, 55297, 56386, - 55297, 56387, 55297, 56388, 55297, 56389, 55297, 56390, - 55297, 56391, 55297, 56392, 55297, 56393, 55297, 56394, - 55297, 56395, 55297, 56396, 55297, 56397, 55297, 56398, - 55297, 56399, 55297, 56320, 55297, 56321, 55297, 56322, - 55297, 56323, 55297, 56324, 55297, 56325, 55297, 56326, - 55297, 56327, 55297, 56328, 55297, 56329, 55297, 56330, - 55297, 56331, 55297, 56332, 55297, 56333, 55297, 56334, - 55297, 56335, 55297, 56336, 55297, 56337, 55297, 56338, - 55297, 56339, 55297, 56340, 55297, 56341, 55297, 56342, - 55297, 56343, 55297, 56344, 55297, 56345, 55297, 56346, - 55297, 56347, 55297, 56348, 55297, 56349, 55297, 56350, - 55297, 56351, 55297, 56352, 55297, 56353, 55297, 56354, - 55297, 56355, 55297, 56356, 55297, 56357, 55297, 56358, - 55297, 56359, 55297, 56536, 55297, 56537, 55297, 56538, - 55297, 56539, 55297, 56540, 55297, 56541, 55297, 56542, - 55297, 56543, 55297, 56544, 55297, 56545, 55297, 56546, - 55297, 56547, 55297, 56548, 55297, 56549, 55297, 56550, - 55297, 56551, 55297, 56552, 55297, 56553, 55297, 56554, - 55297, 56555, 55297, 56556, 55297, 56557, 55297, 56558, - 55297, 56559, 55297, 56560, 55297, 56561, 55297, 56562, - 55297, 56563, 55297, 56564, 55297, 56565, 55297, 56566, - 55297, 56567, 55297, 56568, 55297, 56569, 55297, 56570, - 55297, 56571, 55297, 56496, 55297, 56497, 55297, 56498, - 55297, 56499, 55297, 56500, 55297, 56501, 55297, 56502, - 55297, 56503, 55297, 56504, 55297, 56505, 55297, 56506, - 55297, 56507, 55297, 56508, 55297, 56509, 55297, 56510, - 55297, 56511, 55297, 56512, 55297, 56513, 55297, 56514, - 55297, 56515, 55297, 56516, 55297, 56517, 55297, 56518, - 55297, 56519, 55297, 56520, 55297, 56521, 55297, 56522, - 55297, 56523, 55297, 56524, 55297, 56525, 55297, 56526, - 55297, 56527, 55297, 56528, 55297, 56529, 55297, 56530, - 55297, 56531, 55297, 56727, 55297, 56728, 55297, 56729, - 55297, 56730, 55297, 56731, 55297, 56732, 55297, 56733, - 55297, 56734, 55297, 56735, 55297, 56736, 55297, 56737, - 55297, 56739, 55297, 56740, 55297, 56741, 55297, 56742, - 55297, 56743, 55297, 56744, 55297, 56745, 55297, 56746, - 55297, 56747, 55297, 56748, 55297, 56749, 55297, 56750, - 55297, 56751, 55297, 56752, 55297, 56753, 55297, 56755, - 55297, 56756, 55297, 56757, 55297, 56758, 55297, 56759, - 55297, 56760, 55297, 56761, 55297, 56763, 55297, 56764, - 55297, 56688, 55297, 56689, 55297, 56690, 55297, 56691, - 55297, 56692, 55297, 56693, 55297, 56694, 55297, 56695, - 55297, 56696, 55297, 56697, 55297, 56698, 55297, 56700, - 55297, 56701, 55297, 56702, 55297, 56703, 55297, 56704, - 55297, 56705, 55297, 56706, 55297, 56707, 55297, 56708, - 55297, 56709, 55297, 56710, 55297, 56711, 55297, 56712, - 55297, 56713, 55297, 56714, 55297, 56716, 55297, 56717, - 55297, 56718, 55297, 56719, 55297, 56720, 55297, 56721, - 55297, 56722, 55297, 56724, 55297, 56725, 55297, 56786, - 775, 55297, 56794, 775, 55297, 57216, 720, 721, - 55297, 57219, 55297, 57220, 55297, 57221, 55297, 57223, - 55297, 57224, 55297, 57225, 55297, 57226, 55297, 57227, - 55297, 57228, 55297, 57229, 55297, 57230, 55297, 57231, - 55297, 57232, 55297, 57233, 55297, 57234, 55297, 57235, - 55297, 57236, 55297, 57237, 55297, 57238, 55297, 57239, - 55297, 57240, 55297, 57241, 55297, 57242, 55297, 57243, - 55351, 57092, 55297, 57244, 55297, 57245, 55297, 57246, - 55351, 57093, 55297, 57247, 55297, 57248, 55351, 57094, - 55297, 57249, 55297, 57250, 55297, 57251, 55297, 57252, - 55297, 57253, 55297, 57254, 55351, 57096, 55297, 57255, - 55297, 57256, 55297, 57257, 55297, 57258, 55297, 57259, - 55297, 57260, 55297, 57261, 55297, 57262, 55297, 57263, - 55297, 57264, 55297, 57266, 55297, 57267, 55297, 57268, - 55297, 57269, 448, 55297, 57270, 449, 55297, 57271, - 450, 55297, 57272, 55351, 57098, 55297, 57273, 55351, - 57118, 55297, 57274, 55299, 56512, 55299, 56513, 55299, - 56514, 55299, 56515, 55299, 56516, 55299, 56517, 55299, - 56518, 55299, 56519, 55299, 56520, 55299, 56521, 55299, - 56522, 55299, 56523, 55299, 56524, 55299, 56525, 55299, - 56526, 55299, 56527, 55299, 56528, 55299, 56529, 55299, - 56530, 55299, 56531, 55299, 56532, 55299, 56533, 55299, - 56534, 55299, 56535, 55299, 56536, 55299, 56537, 55299, - 56538, 55299, 56539, 55299, 56540, 55299, 56541, 55299, - 56542, 55299, 56543, 55299, 56544, 55299, 56545, 55299, - 56546, 55299, 56547, 55299, 56548, 55299, 56549, 55299, - 56550, 55299, 56551, 55299, 56552, 55299, 56553, 55299, - 56554, 55299, 56555, 55299, 56556, 55299, 56557, 55299, - 56558, 55299, 56559, 55299, 56560, 55299, 56561, 55299, - 56562, 55299, 56448, 55299, 56449, 55299, 56450, 55299, - 56451, 55299, 56452, 55299, 56453, 55299, 56454, 55299, - 56455, 55299, 56456, 55299, 56457, 55299, 56458, 55299, - 56459, 55299, 56460, 55299, 56461, 55299, 56462, 55299, - 56463, 55299, 56464, 55299, 56465, 55299, 56466, 55299, - 56467, 55299, 56468, 55299, 56469, 55299, 56470, 55299, - 56471, 55299, 56472, 55299, 56473, 55299, 56474, 55299, - 56475, 55299, 56476, 55299, 56477, 55299, 56478, 55299, - 56479, 55299, 56480, 55299, 56481, 55299, 56482, 55299, - 56483, 55299, 56484, 55299, 56485, 55299, 56486, 55299, - 56487, 55299, 56488, 55299, 56489, 55299, 56490, 55299, - 56491, 55299, 56492, 55299, 56493, 55299, 56494, 55299, - 56495, 55299, 56496, 55299, 56497, 55299, 56498, 55299, - 56688, 55299, 56689, 55299, 56690, 55299, 56691, 55299, - 56692, 55299, 56693, 55299, 56694, 55299, 56695, 55299, - 56696, 55299, 56697, 55299, 56698, 55299, 56699, 55299, - 56700, 55299, 56701, 55299, 56702, 55299, 56703, 55299, - 56704, 55299, 56705, 55299, 56706, 55299, 56707, 55299, - 56708, 55299, 56709, 55299, 56656, 55299, 56657, 55299, - 56658, 55299, 56659, 55299, 56660, 55299, 56661, 55299, - 56662, 55299, 56663, 55299, 56664, 55299, 56665, 55299, - 56666, 55299, 56667, 55299, 56668, 55299, 56669, 55299, - 56670, 55299, 56671, 55299, 56672, 55299, 56673, 55299, - 56674, 55299, 56675, 55299, 56676, 55299, 56677, 55300, - 56473, 55300, 56506, 55300, 56475, 55300, 56506, 55300, - 56485, 55300, 56506, 55300, 56625, 55300, 56615, 55300, - 56626, 55300, 56615, 55300, 57159, 55300, 57150, 55300, - 57159, 55300, 57175, 55300, 57218, 55300, 57289, 55300, - 57220, 55300, 57275, 55300, 57227, 55300, 57282, 55300, - 57232, 55300, 57289, 55300, 57282, 55300, 57282, 55300, - 57282, 55300, 57272, 55300, 57282, 55300, 57289, 55301, - 56505, 55301, 56506, 55301, 56505, 55301, 56496, 55301, - 56505, 55301, 56509, 55301, 56760, 55301, 56751, 55301, - 56761, 55301, 56751, 55302, 56512, 55302, 56513, 55302, - 56514, 55302, 56515, 55302, 56516, 55302, 56517, 55302, - 56518, 55302, 56519, 55302, 56520, 55302, 56521, 55302, - 56522, 55302, 56523, 55302, 56524, 55302, 56525, 55302, - 56526, 55302, 56527, 55302, 56528, 55302, 56529, 55302, - 56530, 55302, 56531, 55302, 56532, 55302, 56533, 55302, - 56534, 55302, 56535, 55302, 56536, 55302, 56537, 55302, - 56538, 55302, 56539, 55302, 56540, 55302, 56541, 55302, - 56542, 55302, 56543, 55302, 56480, 55302, 56481, 55302, - 56482, 55302, 56483, 55302, 56484, 55302, 56485, 55302, - 56486, 55302, 56487, 55302, 56488, 55302, 56489, 55302, - 56490, 55302, 56491, 55302, 56492, 55302, 56493, 55302, - 56494, 55302, 56495, 55302, 56496, 55302, 56497, 55302, - 56498, 55302, 56499, 55302, 56500, 55302, 56501, 55302, - 56502, 55302, 56503, 55302, 56504, 55302, 56505, 55302, - 56506, 55302, 56507, 55302, 56508, 55302, 56509, 55302, - 56510, 55302, 56511, 55302, 56629, 55302, 56624, 55320, - 56606, 55320, 56606, 55320, 56606, 55320, 56617, 55320, - 56606, 55320, 56607, 55320, 56617, 55320, 56607, 55320, - 56606, 55320, 56608, 55320, 56609, 55320, 56607, 55320, - 56610, 55320, 56607, 55320, 56609, 55320, 56608, 55323, - 56679, 55323, 56679, 55323, 56675, 55323, 56679, 55323, - 56681, 55323, 56679, 55323, 56928, 55323, 56929, 55323, - 56930, 55323, 56931, 55323, 56932, 55323, 56933, 55323, - 56934, 55323, 56935, 55323, 56936, 55323, 56937, 55323, - 56938, 55323, 56939, 55323, 56940, 55323, 56941, 55323, - 56942, 55323, 56943, 55323, 56944, 55323, 56945, 55323, - 56946, 55323, 56947, 55323, 56948, 55323, 56949, 55323, - 56950, 55323, 56951, 55323, 56952, 55323, 56953, 55323, - 56954, 55323, 56955, 55323, 56956, 55323, 56957, 55323, - 56958, 55323, 56959, 55323, 56896, 55323, 56897, 55323, - 56898, 55323, 56899, 55323, 56900, 55323, 56901, 55323, - 56902, 55323, 56903, 55323, 56904, 55323, 56905, 55323, - 56906, 55323, 56907, 55323, 56908, 55323, 56909, 55323, - 56910, 55323, 56911, 55323, 56912, 55323, 56913, 55323, - 56914, 55323, 56915, 55323, 56916, 55323, 56917, 55323, - 56918, 55323, 56919, 55323, 56920, 55323, 56921, 55323, - 56922, 55323, 56923, 55323, 56924, 55323, 56925, 55323, - 56926, 55323, 56927, 55348, 56663, 55348, 56677, 55348, - 56664, 55348, 56677, 55348, 56671, 55348, 56686, 55348, - 56671, 55348, 56687, 55348, 56671, 55348, 56688, 55348, - 56671, 55348, 56689, 55348, 56671, 55348, 56690, 55348, - 56761, 55348, 56677, 55348, 56762, 55348, 56677, 55348, - 56763, 55348, 56686, 55348, 56764, 55348, 56686, 55348, - 56763, 55348, 56687, 55348, 56764, 55348, 56687, 55349, - 56320, 55349, 56321, 55349, 56322, 55349, 56323, 55349, - 56324, 55349, 56325, 55349, 56326, 55349, 56327, 55349, - 56328, 55349, 56329, 55349, 56330, 55349, 56331, 55349, - 56332, 55349, 56333, 55349, 56334, 55349, 56335, 55349, - 56336, 55349, 56337, 55349, 56338, 55349, 56339, 55349, - 56340, 55349, 56341, 55349, 56342, 55349, 56343, 55349, - 56344, 55349, 56345, 55349, 56346, 55349, 56347, 55349, - 56348, 55349, 56349, 55349, 56350, 55349, 56351, 55349, - 56352, 55349, 56353, 55349, 56354, 55349, 56355, 55349, - 56356, 55349, 56357, 55349, 56358, 55349, 56359, 55349, - 56360, 55349, 56361, 55349, 56362, 55349, 56363, 55349, - 56364, 55349, 56365, 55349, 56366, 55349, 56367, 55349, - 56368, 55349, 56369, 55349, 56370, 55349, 56371, 55349, - 56372, 55349, 56373, 55349, 56374, 55349, 56375, 55349, - 56376, 55349, 56377, 55349, 56378, 55349, 56379, 55349, - 56380, 55349, 56381, 55349, 56382, 55349, 56383, 55349, - 56384, 55349, 56385, 55349, 56386, 55349, 56387, 55349, - 56388, 55349, 56389, 55349, 56390, 55349, 56391, 55349, - 56392, 55349, 56393, 55349, 56394, 55349, 56395, 55349, - 56396, 55349, 56397, 55349, 56398, 55349, 56399, 55349, - 56400, 55349, 56401, 55349, 56402, 55349, 56403, 55349, - 56404, 55349, 56406, 55349, 56407, 55349, 56408, 55349, - 56409, 55349, 56410, 55349, 56411, 55349, 56412, 55349, - 56413, 55349, 56414, 55349, 56415, 55349, 56416, 55349, - 56417, 55349, 56418, 55349, 56419, 55349, 56420, 55349, - 56421, 55349, 56422, 55349, 56423, 55349, 56424, 55349, - 56425, 55349, 56426, 55349, 56427, 55349, 56428, 55349, - 56429, 55349, 56430, 55349, 56431, 55349, 56432, 55349, - 56433, 55349, 56434, 55349, 56435, 55349, 56436, 55349, - 56437, 55349, 56438, 55349, 56439, 55349, 56440, 55349, - 56441, 55349, 56442, 55349, 56443, 55349, 56444, 55349, - 56445, 55349, 56446, 55349, 56447, 55349, 56448, 55349, - 56449, 55349, 56450, 55349, 56451, 55349, 56452, 55349, - 56453, 55349, 56454, 55349, 56455, 55349, 56456, 55349, - 56457, 55349, 56458, 55349, 56459, 55349, 56460, 55349, - 56461, 55349, 56462, 55349, 56463, 55349, 56464, 55349, - 56465, 55349, 56466, 55349, 56467, 55349, 56468, 55349, - 56469, 55349, 56470, 55349, 56471, 55349, 56472, 55349, - 56473, 55349, 56474, 55349, 56475, 55349, 56476, 55349, - 56478, 55349, 56479, 55349, 56482, 55349, 56485, 55349, - 56486, 55349, 56489, 55349, 56490, 55349, 56491, 55349, - 56492, 55349, 56494, 55349, 56495, 55349, 56496, 55349, - 56497, 55349, 56498, 55349, 56499, 55349, 56500, 55349, - 56501, 55349, 56502, 55349, 56503, 55349, 56504, 55349, - 56505, 55349, 56507, 55349, 56509, 55349, 56510, 55349, - 56511, 55349, 56512, 55349, 56513, 55349, 56514, 55349, - 56515, 55349, 56517, 55349, 56518, 55349, 56519, 55349, - 56520, 55349, 56521, 55349, 56522, 55349, 56523, 55349, - 56524, 55349, 56525, 55349, 56526, 55349, 56527, 55349, - 56528, 55349, 56529, 55349, 56530, 55349, 56531, 55349, - 56532, 55349, 56533, 55349, 56534, 55349, 56535, 55349, - 56536, 55349, 56537, 55349, 56538, 55349, 56539, 55349, - 56540, 55349, 56541, 55349, 56542, 55349, 56543, 55349, - 56544, 55349, 56545, 55349, 56546, 55349, 56547, 55349, - 56548, 55349, 56549, 55349, 56550, 55349, 56551, 55349, - 56552, 55349, 56553, 55349, 56554, 55349, 56555, 55349, - 56556, 55349, 56557, 55349, 56558, 55349, 56559, 55349, - 56560, 55349, 56561, 55349, 56562, 55349, 56563, 55349, - 56564, 55349, 56565, 55349, 56566, 55349, 56567, 55349, - 56568, 55349, 56569, 55349, 56570, 55349, 56571, 55349, - 56572, 55349, 56573, 55349, 56574, 55349, 56575, 55349, - 56576, 55349, 56577, 55349, 56578, 55349, 56579, 55349, - 56580, 55349, 56581, 55349, 56583, 55349, 56584, 55349, - 56585, 55349, 56586, 55349, 56589, 55349, 56590, 55349, - 56591, 55349, 56592, 55349, 56593, 55349, 56594, 55349, - 56595, 55349, 56596, 55349, 56598, 55349, 56599, 55349, - 56600, 55349, 56601, 55349, 56602, 55349, 56603, 55349, - 56604, 55349, 56606, 55349, 56607, 55349, 56608, 55349, - 56609, 55349, 56610, 55349, 56611, 55349, 56612, 55349, - 56613, 55349, 56614, 55349, 56615, 55349, 56616, 55349, - 56617, 55349, 56618, 55349, 56619, 55349, 56620, 55349, - 56621, 55349, 56622, 55349, 56623, 55349, 56624, 55349, - 56625, 55349, 56626, 55349, 56627, 55349, 56628, 55349, - 56629, 55349, 56630, 55349, 56631, 55349, 56632, 55349, - 56633, 55349, 56635, 55349, 56636, 55349, 56637, 55349, - 56638, 55349, 56640, 55349, 56641, 55349, 56642, 55349, - 56643, 55349, 56644, 55349, 56646, 55349, 56650, 55349, - 56651, 55349, 56652, 55349, 56653, 55349, 56654, 55349, - 56655, 55349, 56656, 55349, 56658, 55349, 56659, 55349, - 56660, 55349, 56661, 55349, 56662, 55349, 56663, 55349, - 56664, 55349, 56665, 55349, 56666, 55349, 56667, 55349, - 56668, 55349, 56669, 55349, 56670, 55349, 56671, 55349, - 56672, 55349, 56673, 55349, 56674, 55349, 56675, 55349, - 56676, 55349, 56677, 55349, 56678, 55349, 56679, 55349, - 56680, 55349, 56681, 55349, 56682, 55349, 56683, 55349, - 56684, 55349, 56685, 55349, 56686, 55349, 56687, 55349, - 56688, 55349, 56689, 55349, 56690, 55349, 56691, 55349, - 56692, 55349, 56693, 55349, 56694, 55349, 56695, 55349, - 56696, 55349, 56697, 55349, 56698, 55349, 56699, 55349, - 56700, 55349, 56701, 55349, 56702, 55349, 56703, 55349, - 56704, 55349, 56705, 55349, 56706, 55349, 56707, 55349, - 56708, 55349, 56709, 55349, 56710, 55349, 56711, 55349, - 56712, 55349, 56713, 55349, 56714, 55349, 56715, 55349, - 56716, 55349, 56717, 55349, 56718, 55349, 56719, 55349, - 56720, 55349, 56721, 55349, 56722, 55349, 56723, 55349, - 56724, 55349, 56725, 55349, 56726, 55349, 56727, 55349, - 56728, 55349, 56729, 55349, 56730, 55349, 56731, 55349, - 56732, 55349, 56733, 55349, 56734, 55349, 56735, 55349, - 56736, 55349, 56737, 55349, 56738, 55349, 56739, 55349, - 56740, 55349, 56741, 55349, 56742, 55349, 56743, 55349, - 56744, 55349, 56745, 55349, 56746, 55349, 56747, 55349, - 56748, 55349, 56749, 55349, 56750, 55349, 56751, 55349, - 56752, 55349, 56753, 55349, 56754, 55349, 56755, 55349, - 56756, 55349, 56757, 55349, 56758, 55349, 56759, 55349, - 56760, 55349, 56761, 55349, 56762, 55349, 56763, 55349, - 56764, 55349, 56765, 55349, 56766, 55349, 56767, 55349, - 56768, 55349, 56769, 55349, 56770, 55349, 56771, 55349, - 56772, 55349, 56773, 55349, 56774, 55349, 56775, 55349, - 56776, 55349, 56777, 55349, 56778, 55349, 56779, 55349, - 56780, 55349, 56781, 55349, 56782, 55349, 56783, 55349, - 56784, 55349, 56785, 55349, 56786, 55349, 56787, 55349, - 56788, 55349, 56789, 55349, 56790, 55349, 56791, 55349, - 56792, 55349, 56793, 55349, 56794, 55349, 56795, 55349, - 56796, 55349, 56797, 55349, 56798, 55349, 56799, 55349, - 56800, 55349, 56801, 55349, 56802, 55349, 56803, 55349, - 56804, 55349, 56805, 55349, 56806, 55349, 56807, 55349, - 56808, 55349, 56809, 55349, 56810, 55349, 56811, 55349, - 56812, 55349, 56813, 55349, 56814, 55349, 56815, 55349, - 56816, 55349, 56817, 55349, 56818, 55349, 56819, 55349, - 56820, 55349, 56821, 55349, 56822, 55349, 56823, 55349, - 56824, 55349, 56825, 55349, 56826, 55349, 56827, 55349, - 56828, 55349, 56829, 55349, 56830, 55349, 56831, 55349, - 56832, 55349, 56833, 55349, 56834, 55349, 56835, 55349, - 56836, 55349, 56837, 55349, 56838, 55349, 56839, 55349, - 56840, 55349, 56841, 55349, 56842, 55349, 56843, 55349, - 56844, 55349, 56845, 55349, 56846, 55349, 56847, 55349, - 56848, 55349, 56849, 55349, 56850, 55349, 56851, 55349, - 56852, 55349, 56853, 55349, 56854, 55349, 56855, 55349, - 56856, 55349, 56857, 55349, 56858, 55349, 56859, 55349, - 56860, 55349, 56861, 55349, 56862, 55349, 56863, 55349, - 56864, 55349, 56865, 55349, 56866, 55349, 56867, 55349, - 56868, 55349, 56869, 55349, 56870, 55349, 56871, 55349, - 56872, 55349, 56873, 55349, 56874, 55349, 56875, 55349, - 56876, 55349, 56877, 55349, 56878, 55349, 56879, 55349, - 56880, 55349, 56881, 55349, 56882, 55349, 56883, 55349, - 56884, 55349, 56885, 55349, 56886, 55349, 56887, 55349, - 56888, 55349, 56889, 55349, 56890, 55349, 56891, 55349, - 56892, 55349, 56893, 55349, 56894, 55349, 56895, 55349, - 56896, 55349, 56897, 55349, 56898, 55349, 56899, 55349, - 56900, 55349, 56901, 55349, 56902, 55349, 56903, 55349, - 56904, 55349, 56905, 55349, 56906, 55349, 56907, 55349, - 56908, 55349, 56909, 55349, 56910, 55349, 56911, 55349, - 56912, 55349, 56913, 55349, 56914, 55349, 56915, 55349, - 56916, 55349, 56917, 55349, 56918, 55349, 56919, 55349, - 56920, 55349, 56921, 55349, 56922, 55349, 56923, 55349, - 56924, 55349, 56925, 55349, 56926, 55349, 56927, 55349, - 56928, 55349, 56929, 55349, 56930, 55349, 56931, 55349, - 56932, 55349, 56933, 55349, 56934, 55349, 56935, 55349, - 56936, 55349, 56937, 55349, 56938, 55349, 56939, 55349, - 56940, 55349, 56941, 55349, 56942, 55349, 56943, 55349, - 56944, 55349, 56945, 55349, 56946, 55349, 56947, 55349, - 56948, 55349, 56949, 55349, 56950, 55349, 56951, 55349, - 56952, 55349, 56953, 55349, 56954, 55349, 56955, 55349, - 56956, 55349, 56957, 55349, 56958, 55349, 56959, 55349, - 56960, 55349, 56961, 55349, 56962, 55349, 56963, 55349, - 56964, 55349, 56965, 55349, 56966, 55349, 56967, 55349, - 56968, 55349, 56969, 55349, 56970, 55349, 56971, 55349, - 56972, 55349, 56973, 55349, 56974, 55349, 56975, 55349, - 56976, 55349, 56977, 55349, 56978, 55349, 56979, 55349, - 56980, 55349, 56981, 55349, 56982, 55349, 56983, 55349, - 56984, 55349, 56985, 55349, 56986, 55349, 56987, 55349, - 56988, 55349, 56989, 55349, 56990, 55349, 56991, 55349, - 56992, 55349, 56993, 55349, 56994, 55349, 56995, 305, - 55349, 56996, 55349, 56997, 55349, 57000, 55349, 57001, - 55349, 57002, 55349, 57003, 55349, 57004, 55349, 57005, - 55349, 57006, 55349, 57007, 55349, 57008, 55349, 57009, - 55349, 57010, 55349, 57011, 55349, 57012, 55349, 57013, - 55349, 57014, 55349, 57015, 55349, 57016, 1012, 55349, - 57017, 55349, 57018, 55349, 57019, 55349, 57020, 55349, - 57021, 55349, 57022, 55349, 57023, 55349, 57024, 8711, - 55349, 57026, 55349, 57027, 55349, 57028, 55349, 57029, - 55349, 57030, 55349, 57031, 55349, 57032, 55349, 57033, - 55349, 57034, 55349, 57035, 55349, 57036, 55349, 57037, - 55349, 57038, 55349, 57039, 55349, 57040, 55349, 57041, - 55349, 57042, 55349, 57043, 55349, 57044, 55349, 57045, - 55349, 57046, 55349, 57047, 55349, 57048, 55349, 57049, - 55349, 57050, 8706, 1013, 55349, 57052, 977, 55349, - 57053, 1008, 55349, 57054, 981, 55349, 57055, 1009, - 55349, 57056, 982, 55349, 57057, 55349, 57058, 55349, - 57059, 55349, 57060, 55349, 57061, 55349, 57062, 55349, - 57063, 55349, 57064, 55349, 57065, 55349, 57066, 55349, - 57067, 55349, 57068, 55349, 57069, 55349, 57070, 55349, - 57071, 55349, 57072, 55349, 57073, 55349, 57074, 55349, - 57075, 55349, 57076, 55349, 57077, 55349, 57078, 55349, - 57079, 55349, 57080, 55349, 57081, 55349, 57082, 55349, - 57084, 55349, 57085, 55349, 57086, 55349, 57087, 55349, - 57088, 55349, 57089, 55349, 57090, 55349, 57091, 55349, - 57092, 55349, 57093, 55349, 57094, 55349, 57095, 55349, - 57096, 55349, 57097, 55349, 57098, 55349, 57099, 55349, - 57100, 55349, 57101, 55349, 57102, 55349, 57103, 55349, - 57104, 55349, 57105, 55349, 57106, 55349, 57107, 55349, - 57108, 55349, 57110, 55349, 57111, 55349, 57112, 55349, - 57113, 55349, 57114, 55349, 57115, 55349, 57116, 55349, - 57117, 55349, 57118, 55349, 57119, 55349, 57120, 55349, - 57121, 55349, 57122, 55349, 57123, 55349, 57124, 55349, - 57125, 55349, 57126, 55349, 57127, 55349, 57128, 55349, - 57129, 55349, 57130, 55349, 57131, 55349, 57132, 55349, - 57133, 55349, 57134, 55349, 57135, 55349, 57136, 55349, - 57137, 55349, 57138, 55349, 57139, 55349, 57140, 55349, - 57142, 55349, 57143, 55349, 57144, 55349, 57145, 55349, - 57146, 55349, 57147, 55349, 57148, 55349, 57149, 55349, - 57150, 55349, 57151, 55349, 57152, 55349, 57153, 55349, - 57154, 55349, 57155, 55349, 57156, 55349, 57157, 55349, - 57158, 55349, 57159, 55349, 57160, 55349, 57161, 55349, - 57162, 55349, 57163, 55349, 57164, 55349, 57165, 55349, - 57166, 55349, 57168, 55349, 57169, 55349, 57170, 55349, - 57171, 55349, 57172, 55349, 57173, 55349, 57174, 55349, - 57175, 55349, 57176, 55349, 57177, 55349, 57178, 55349, - 57179, 55349, 57180, 55349, 57181, 55349, 57182, 55349, - 57183, 55349, 57184, 55349, 57185, 55349, 57186, 55349, - 57187, 55349, 57188, 55349, 57189, 55349, 57190, 55349, - 57191, 55349, 57192, 55349, 57193, 55349, 57194, 55349, - 57195, 55349, 57196, 55349, 57197, 55349, 57198, 55349, - 57200, 55349, 57201, 55349, 57202, 55349, 57203, 55349, - 57204, 55349, 57205, 55349, 57206, 55349, 57207, 55349, - 57208, 55349, 57209, 55349, 57210, 55349, 57211, 55349, - 57212, 55349, 57213, 55349, 57214, 55349, 57215, 55349, - 57216, 55349, 57217, 55349, 57218, 55349, 57219, 55349, - 57220, 55349, 57221, 55349, 57222, 55349, 57223, 55349, - 57224, 55349, 57226, 55349, 57227, 55349, 57228, 55349, - 57229, 55349, 57230, 55349, 57231, 55349, 57232, 55349, - 57233, 55349, 57234, 55349, 57235, 55349, 57236, 55349, - 57237, 55349, 57238, 55349, 57239, 55349, 57240, 55349, - 57241, 55349, 57242, 55349, 57243, 55349, 57244, 55349, - 57245, 55349, 57246, 55349, 57247, 55349, 57248, 55349, - 57249, 55349, 57250, 55349, 57251, 55349, 57252, 55349, - 57253, 55349, 57254, 55349, 57255, 55349, 57256, 55349, - 57258, 55349, 57259, 55349, 57260, 55349, 57261, 55349, - 57262, 55349, 57263, 55349, 57264, 55349, 57265, 55349, - 57266, 55349, 57267, 55349, 57268, 55349, 57269, 55349, - 57270, 55349, 57271, 55349, 57272, 55349, 57273, 55349, - 57274, 55349, 57275, 55349, 57276, 55349, 57277, 55349, - 57278, 55349, 57279, 55349, 57280, 55349, 57281, 55349, - 57282, 55349, 57284, 55349, 57285, 55349, 57286, 55349, - 57287, 55349, 57288, 55349, 57289, 55349, 57290, 55349, - 57291, 55351, 57088, 55351, 57089, 55351, 57090, 55351, - 57091, 55351, 57095, 55351, 57097, 55351, 57099, 55351, - 57100, 55351, 57101, 55351, 57102, 55351, 57103, 55351, - 57104, 55351, 57105, 55351, 57106, 55351, 57107, 55351, - 57108, 55351, 57109, 55351, 57110, 55351, 57111, 55351, - 57112, 55351, 57113, 55351, 57114, 55351, 57115, 55351, - 57116, 55351, 57117, 55351, 57125, 55351, 57126, 55351, - 57127, 55351, 57128, 55351, 57129, 55351, 57130, 55352, - 56368, 55352, 56369, 55352, 56370, 55352, 56371, 55352, - 56372, 55352, 56373, 55352, 56374, 55352, 56375, 55352, - 56376, 55352, 56377, 55352, 56378, 55352, 56379, 55352, - 56380, 55352, 56381, 55352, 56382, 55352, 56383, 55352, - 56384, 55352, 56385, 55352, 56386, 55352, 56387, 55352, - 56388, 55352, 56389, 55352, 56390, 55352, 56391, 55352, - 56392, 55352, 56393, 55352, 56394, 55352, 56395, 55352, - 56396, 55352, 56397, 55352, 56398, 55352, 56399, 55352, - 56400, 55352, 56401, 55352, 56402, 55352, 56403, 55352, - 56404, 55352, 56405, 55352, 56406, 55352, 56407, 55352, - 56408, 55352, 56409, 55352, 56410, 55352, 56411, 55352, - 56412, 55352, 56413, 55352, 56414, 55352, 56415, 55352, - 56416, 55352, 56417, 55352, 56418, 55352, 56419, 55352, - 56420, 55352, 56421, 55352, 56422, 55352, 56423, 55352, - 56424, 55352, 56425, 55352, 56426, 55352, 56427, 55352, - 56428, 55352, 56429, 55354, 56610, 55354, 56611, 55354, - 56612, 55354, 56613, 55354, 56614, 55354, 56615, 55354, - 56616, 55354, 56617, 55354, 56618, 55354, 56619, 55354, - 56620, 55354, 56621, 55354, 56622, 55354, 56623, 55354, - 56624, 55354, 56625, 55354, 56626, 55354, 56627, 55354, - 56628, 55354, 56629, 55354, 56630, 55354, 56631, 55354, - 56632, 55354, 56633, 55354, 56634, 55354, 56635, 55354, - 56636, 55354, 56637, 55354, 56638, 55354, 56639, 55354, - 56640, 55354, 56641, 55354, 56642, 55354, 56643, 55354, - 56576, 55354, 56577, 55354, 56578, 55354, 56579, 55354, - 56580, 55354, 56581, 55354, 56582, 55354, 56583, 55354, - 56584, 55354, 56585, 55354, 56586, 55354, 56587, 55354, - 56588, 55354, 56589, 55354, 56590, 55354, 56591, 55354, - 56592, 55354, 56593, 55354, 56594, 55354, 56595, 55354, - 56596, 55354, 56597, 55354, 56598, 55354, 56599, 55354, - 56600, 55354, 56601, 55354, 56602, 55354, 56603, 55354, - 56604, 55354, 56605, 55354, 56606, 55354, 56607, 55354, - 56608, 55354, 56609, 1646, 1697, 1647, 48, 46, - 48, 44, 49, 44, 50, 44, 51, 44, - 52, 44, 53, 44, 54, 44, 55, 44, - 56, 44, 57, 44, 40, 65, 41, 40, - 66, 41, 40, 67, 41, 40, 68, 41, - 40, 69, 41, 40, 70, 41, 40, 71, - 41, 40, 72, 41, 40, 73, 41, 40, - 74, 41, 40, 75, 41, 40, 76, 41, - 40, 77, 41, 40, 78, 41, 40, 79, - 41, 40, 80, 41, 40, 81, 41, 40, - 82, 41, 40, 83, 41, 40, 84, 41, - 40, 85, 41, 40, 86, 41, 40, 87, - 41, 40, 88, 41, 40, 89, 41, 40, - 90, 41, 12308, 83, 12309, 67, 68, 87, - 90, 55356, 56624, 55356, 56625, 55356, 56626, 55356, - 56627, 55356, 56628, 55356, 56629, 55356, 56630, 55356, - 56631, 55356, 56632, 55356, 56633, 55356, 56634, 55356, - 56635, 55356, 56636, 55356, 56637, 55356, 56638, 55356, - 56639, 55356, 56640, 55356, 56641, 55356, 56642, 55356, - 56643, 55356, 56644, 55356, 56645, 55356, 56646, 55356, - 56647, 55356, 56648, 55356, 56649, 72, 86, 83, - 68, 83, 83, 80, 80, 86, 87, 67, - 55356, 56656, 55356, 56657, 55356, 56658, 55356, 56659, - 55356, 56660, 55356, 56661, 55356, 56662, 55356, 56663, - 55356, 56664, 55356, 56665, 55356, 56666, 55356, 56667, - 55356, 56668, 55356, 56669, 55356, 56670, 55356, 56671, - 55356, 56672, 55356, 56673, 55356, 56674, 55356, 56675, - 55356, 56676, 55356, 56677, 55356, 56678, 55356, 56679, - 55356, 56680, 55356, 56681, 77, 67, 77, 68, - 77, 82, 55356, 56688, 55356, 56689, 55356, 56690, - 55356, 56691, 55356, 56692, 55356, 56693, 55356, 56694, - 55356, 56695, 55356, 56696, 55356, 56697, 55356, 56698, - 55356, 56699, 55356, 56700, 55356, 56701, 55356, 56702, - 55356, 56703, 55356, 56704, 55356, 56705, 55356, 56706, - 55356, 56707, 55356, 56708, 55356, 56709, 55356, 56710, - 55356, 56711, 55356, 56712, 55356, 56713, 68, 74, - 12411, 12363, 12467, 12467, 23383, 21452, 12487, 22810, - 35299, 20132, 26144, 28961, 21069, 24460, 20877, 26032, - 21021, 32066, 36009, 22768, 21561, 28436, 25237, 25429, - 36938, 25351, 25171, 31105, 31354, 21512, 28288, 30003, - 21106, 21942, 37197, 12308, 26412, 12309, 12308, 19977, - 12309, 12308, 20108, 12309, 12308, 23433, 12309, 12308, - 28857, 12309, 12308, 25171, 12309, 12308, 30423, 12309, - 12308, 21213, 12309, 12308, 25943, 12309, 24471, 21487, - 20029, 20024, 20033, 55360, 56610, 20320, 20411, 20482, - 20602, 20633, 20687, 13470, 55361, 56890, 20820, 20836, - 20855, 55361, 56604, 13497, 20839, 55361, 56651, 20887, - 20900, 20172, 20908, 55396, 56799, 20995, 13535, 21051, - 21062, 21111, 13589, 21253, 21254, 21321, 21338, 21363, - 21373, 21375, 55362, 56876, 28784, 21450, 21471, 55362, - 57187, 21483, 21489, 21510, 21662, 21560, 21576, 21608, - 21666, 21750, 21776, 21843, 21859, 21892, 21931, 21939, - 21954, 22294, 22295, 22097, 22132, 22766, 22478, 22516, - 22541, 22411, 22578, 22577, 22700, 55365, 56548, 22770, - 22775, 22790, 22818, 22882, 55365, 57000, 55365, 57066, - 23020, 23067, 23079, 23000, 23142, 14062, 14076, 23304, - 23358, 55366, 56776, 23491, 23512, 23539, 55366, 57112, - 23551, 23558, 24403, 14209, 23648, 23744, 23693, 55367, - 56804, 23875, 55367, 56806, 23918, 23915, 23932, 24033, - 24034, 14383, 24061, 24104, 24125, 24169, 14434, 55368, - 56707, 14460, 24240, 24243, 24246, 55400, 57234, 55368, - 57137, 33281, 24354, 14535, 55372, 57016, 55384, 56794, - 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705, - 14650, 14620, 55369, 57044, 24775, 24904, 24908, 24954, - 25010, 24996, 25007, 25054, 25104, 25115, 25181, 25265, - 25300, 25424, 55370, 57100, 25405, 25340, 25448, 25475, - 25572, 55370, 57329, 25634, 25541, 25513, 14894, 25705, - 25726, 25757, 25719, 14956, 25964, 55372, 56330, 26083, - 26360, 26185, 15129, 15112, 15076, 20882, 20885, 26368, - 26268, 32941, 17369, 26401, 26462, 26451, 55372, 57283, - 15177, 26618, 26501, 26706, 55373, 56429, 26766, 26655, - 26900, 26946, 27043, 27114, 27304, 55373, 56995, 27355, - 15384, 27425, 55374, 56487, 27476, 15438, 27506, 27551, - 27579, 55374, 56973, 55367, 56587, 55374, 57082, 27726, - 55375, 56508, 27839, 27853, 27751, 27926, 27966, 28009, - 28024, 28037, 55375, 56606, 27956, 28207, 28270, 15667, - 28359, 55375, 57041, 28153, 28526, 55375, 57182, 55375, - 57230, 28614, 28729, 28699, 15766, 28746, 28797, 28791, - 28845, 55361, 56613, 28997, 55376, 56931, 29084, 55376, - 57259, 29224, 29264, 55377, 56840, 29312, 29333, 55377, - 57141, 55378, 56340, 29562, 29579, 16044, 29605, 16056, - 29767, 29788, 29829, 29898, 16155, 29988, 55379, 56374, - 30014, 55379, 56466, 55368, 56735, 30224, 55379, 57249, - 55379, 57272, 55380, 56388, 16380, 16392, 55380, 56563, - 55380, 56562, 55380, 56601, 55380, 56627, 30494, 30495, - 30603, 16454, 16534, 55381, 56349, 30798, 16611, 55381, - 56870, 55381, 56986, 55381, 57029, 31211, 16687, 31306, - 31311, 55382, 56700, 55382, 56999, 31470, 16898, 55382, - 57259, 31686, 31689, 16935, 55383, 56448, 31954, 17056, - 31976, 31971, 32000, 55383, 57222, 32099, 17153, 32199, - 32258, 32325, 17204, 55384, 56872, 55384, 56903, 17241, - 55384, 57049, 32634, 55384, 57150, 32661, 32762, 55385, - 56538, 55385, 56611, 32864, 55385, 56744, 32880, 55372, - 57183, 17365, 32946, 33027, 17419, 33086, 23221, 55385, - 57255, 55385, 57269, 55372, 57235, 55372, 57244, 33284, - 36766, 17515, 33425, 33419, 33437, 21171, 33457, 33459, - 33469, 33510, 55386, 57148, 33565, 33635, 33709, 33571, - 33725, 33767, 33619, 33738, 33740, 33756, 55387, 56374, - 55387, 56683, 55387, 56533, 17707, 34033, 34035, 34070, - 55388, 57290, 34148, 55387, 57132, 17757, 17761, 55387, - 57265, 55388, 56530, 17771, 34384, 34407, 34409, 34473, - 34440, 34574, 34530, 34600, 34667, 34694, 17879, 34785, - 34817, 17913, 34912, 55389, 56935, 35031, 35038, 17973, - 35066, 13499, 55390, 56494, 55390, 56678, 18110, 18119, - 35488, 55391, 56488, 36011, 36033, 36123, 36215, 55391, - 57135, 55362, 56324, 36299, 36284, 36336, 55362, 56542, - 36564, 55393, 56786, 55393, 56813, 37012, 37105, 37137, - 55393, 57134, 37147, 37432, 37591, 37592, 37500, 37881, - 37909, 55394, 57338, 38283, 18837, 38327, 55395, 56695, - 18918, 38595, 23986, 38691, 55396, 56645, 55396, 56858, - 19054, 19062, 38880, 55397, 56330, 19122, 55397, 56470, - 38953, 55397, 56758, 39138, 19251, 39209, 39335, 39362, - 39422, 19406, 55398, 57136, 40000, 40189, 19662, 19693, - 40295, 55400, 56526, 19704, 55400, 56581, 55400, 56846, - 55400, 56977, 19798, 40702, 40709, 40719, 40726, 55401, - 56832, }; + 42959, 42958, 42961, 42960, 42963, 42962, 42965, 42964, + 42967, 42966, 42969, 42968, 42971, 42970, 411, 42993, + 42994, 42995, 42996, 42998, 42997, 43000, 43001, 43002, + 43824, 43825, 43826, 43827, 43828, 43829, 43830, 43831, + 43832, 43833, 43834, 43835, 43836, 43837, 43838, 43839, + 43840, 43841, 43842, 43843, 43844, 43845, 43846, 43847, + 43848, 43849, 43850, 43851, 43852, 43853, 43854, 43855, + 43856, 43857, 43858, 42931, 43860, 43861, 43862, 43863, + 43864, 43865, 43866, 43868, 43869, 43870, 43871, 43872, + 43873, 43874, 43875, 43876, 43877, 43878, 43879, 43880, + 43881, 5024, 5025, 5026, 5027, 5028, 5029, 5030, + 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, + 5039, 5040, 5041, 5042, 5043, 5044, 5045, 5046, + 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, + 5055, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, + 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, + 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, + 5095, 5096, 5097, 5098, 5099, 5100, 5101, 5102, + 5103, 35912, 26356, 36040, 28369, 20018, 21477, 22865, + 21895, 22856, 25078, 30313, 32645, 34367, 34746, 35064, + 37007, 27138, 27931, 28889, 29662, 33853, 37226, 39409, + 20098, 21365, 27396, 29211, 34349, 40478, 23888, 28651, + 34253, 35172, 25289, 33240, 34847, 24266, 26391, 28010, + 29436, 37070, 20358, 20919, 21214, 25796, 27347, 29200, + 30439, 34310, 34396, 36335, 38706, 39791, 40442, 30860, + 31103, 32160, 33737, 37636, 35542, 22751, 24324, 31840, + 32894, 29282, 30922, 36034, 38647, 22744, 23650, 27155, + 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, + 20940, 31260, 32190, 33777, 38517, 35712, 25295, 35582, + 20025, 23527, 24594, 29575, 30064, 21271, 30971, 20415, + 24489, 19981, 27852, 25976, 32034, 21443, 22622, 30465, + 33865, 35498, 27578, 27784, 25342, 33509, 25504, 30053, + 20142, 20841, 20937, 26753, 31975, 33391, 35538, 37327, + 21237, 21570, 24300, 26053, 28670, 31018, 38317, 39530, + 40599, 40654, 26310, 27511, 36706, 24180, 24976, 25088, + 25754, 28451, 29001, 29833, 31178, 32244, 32879, 36646, + 34030, 36899, 37706, 21015, 21155, 21693, 28872, 35010, + 24265, 24565, 25467, 27566, 31806, 29557, 20196, 22265, + 23994, 24604, 29618, 29801, 32666, 32838, 37428, 38646, + 38728, 38936, 20363, 31150, 37300, 38584, 24801, 20102, + 20698, 23534, 23615, 26009, 29134, 30274, 34044, 36988, + 26248, 38446, 21129, 26491, 26611, 27969, 28316, 29705, + 30041, 30827, 32016, 39006, 25134, 38520, 20523, 23833, + 28138, 36650, 24459, 24900, 26647, 38534, 21033, 21519, + 23653, 26131, 26446, 26792, 27877, 29702, 30178, 32633, + 35023, 35041, 38626, 21311, 28346, 21533, 29136, 29848, + 34298, 38563, 40023, 40607, 26519, 28107, 33256, 31520, + 31890, 29376, 28825, 35672, 20160, 33590, 21050, 20999, + 24230, 25299, 31958, 23429, 27934, 26292, 36667, 38477, + 24275, 20800, 21952, 22618, 26228, 20958, 29482, 30410, + 31036, 31070, 31077, 31119, 38742, 31934, 34322, 35576, + 36920, 37117, 39151, 39164, 39208, 40372, 37086, 38583, + 20398, 20711, 20813, 21193, 21220, 21329, 21917, 22022, + 22120, 22592, 22696, 23652, 24724, 24936, 24974, 25074, + 25935, 26082, 26257, 26757, 28023, 28186, 28450, 29038, + 29227, 29730, 30865, 31049, 31048, 31056, 31062, 31117, + 31118, 31296, 31361, 31680, 32265, 32321, 32626, 32773, + 33261, 33401, 33879, 35088, 35222, 35585, 35641, 36051, + 36104, 36790, 38627, 38911, 38971, 24693, 55376, 57070, + 33304, 20006, 20917, 20840, 20352, 20805, 20864, 21191, + 21242, 21845, 21913, 21986, 22707, 22852, 22868, 23138, + 23336, 24274, 24281, 24425, 24493, 24792, 24910, 24840, + 24928, 25140, 25540, 25628, 25682, 25942, 26395, 26454, + 28379, 28363, 28702, 30631, 29237, 29359, 29809, 29958, + 30011, 30237, 30239, 30427, 30452, 30538, 30528, 30924, + 31409, 31867, 32091, 32574, 33618, 33775, 34681, 35137, + 35206, 35519, 35531, 35565, 35722, 36664, 36978, 37273, + 37494, 38524, 38875, 38923, 39698, 55370, 56394, 55370, + 56388, 55372, 57301, 15261, 16408, 16441, 55380, 56905, + 55383, 56528, 55391, 57043, 40771, 40846, 102, 102, + 64256, 102, 105, 64257, 102, 108, 64258, 102, + 102, 105, 64259, 102, 102, 108, 64260, 383, + 116, 115, 116, 64261, 64262, 1396, 1398, 64275, + 1396, 1381, 64276, 1396, 1387, 64277, 1406, 1398, + 64278, 1396, 1389, 64279, 1497, 1460, 1522, 1463, + 1506, 1492, 1499, 1500, 1501, 1512, 1514, 1513, + 1473, 1513, 1474, 64329, 1473, 64329, 1474, 1488, + 1463, 1488, 1464, 1488, 1468, 1489, 1468, 1490, + 1468, 1491, 1468, 1492, 1468, 1493, 1468, 1494, + 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, + 1468, 1500, 1468, 1502, 1468, 1504, 1468, 1505, + 1468, 1507, 1468, 1508, 1468, 1510, 1468, 1511, + 1468, 1512, 1468, 1513, 1468, 1514, 1468, 1493, + 1465, 1489, 1471, 1499, 1471, 1508, 1471, 1488, + 1500, 1649, 1659, 1662, 1664, 1658, 1663, 1657, + 1700, 1702, 1668, 1667, 1670, 1671, 1677, 1676, + 1678, 1672, 1688, 1681, 1705, 1711, 1715, 1713, + 1722, 1723, 1728, 1729, 1726, 1746, 1747, 1709, + 1735, 1734, 1736, 1655, 1739, 1733, 1737, 1744, + 1609, 1574, 1575, 1574, 1749, 1574, 1608, 1574, + 1735, 1574, 1734, 1574, 1736, 1574, 1744, 1574, + 1609, 1740, 1574, 1580, 1574, 1581, 1574, 1605, + 1574, 1610, 1576, 1580, 1576, 1581, 1576, 1582, + 1576, 1605, 1576, 1609, 1576, 1610, 1578, 1580, + 1578, 1581, 1578, 1582, 1578, 1605, 1578, 1609, + 1578, 1610, 1579, 1580, 1579, 1605, 1579, 1609, + 1579, 1610, 1580, 1581, 1580, 1605, 1581, 1580, + 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, + 1587, 1580, 1587, 1581, 1587, 1582, 1587, 1605, + 1589, 1581, 1589, 1605, 1590, 1580, 1590, 1581, + 1590, 1582, 1590, 1605, 1591, 1581, 1591, 1605, + 1592, 1605, 1593, 1580, 1593, 1605, 1594, 1580, + 1594, 1605, 1601, 1580, 1601, 1581, 1601, 1582, + 1601, 1605, 1601, 1609, 1601, 1610, 1602, 1581, + 1602, 1605, 1602, 1609, 1602, 1610, 1603, 1575, + 1603, 1580, 1603, 1581, 1603, 1582, 1603, 1604, + 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, + 1604, 1581, 1604, 1582, 1604, 1605, 1604, 1609, + 1604, 1610, 1605, 1580, 1605, 1581, 1605, 1582, + 1605, 1605, 1605, 1609, 1605, 1610, 1606, 1580, + 1606, 1581, 1606, 1582, 1606, 1605, 1606, 1609, + 1606, 1610, 1607, 1580, 1607, 1605, 1607, 1609, + 1607, 1610, 1610, 1580, 1610, 1581, 1610, 1582, + 1610, 1605, 1610, 1609, 1610, 1610, 1584, 1648, + 1585, 1648, 1609, 1648, 32, 1612, 1617, 32, + 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, + 32, 1616, 1617, 32, 1617, 1648, 1574, 1585, + 1574, 1586, 1574, 1606, 1576, 1585, 1576, 1586, + 1576, 1606, 1578, 1585, 1578, 1586, 1578, 1606, + 1579, 1585, 1579, 1586, 1579, 1606, 1605, 1575, + 1606, 1585, 1606, 1586, 1606, 1606, 1610, 1585, + 1610, 1586, 1610, 1606, 1574, 1582, 1574, 1607, + 1576, 1607, 1578, 1607, 1589, 1582, 1604, 1607, + 1606, 1607, 1607, 1648, 1610, 1607, 1579, 1607, + 1587, 1607, 1588, 1605, 1588, 1607, 1600, 1614, + 1617, 1600, 1615, 1617, 1600, 1616, 1617, 1591, + 1609, 1591, 1610, 1593, 1609, 1593, 1610, 1594, + 1609, 1594, 1610, 1587, 1609, 1587, 1610, 1588, + 1609, 1588, 1610, 1581, 1609, 1581, 1610, 1580, + 1609, 1580, 1610, 1582, 1609, 1582, 1610, 1589, + 1609, 1589, 1610, 1590, 1609, 1590, 1610, 1588, + 1580, 1588, 1581, 1588, 1582, 1588, 1585, 1587, + 1585, 1589, 1585, 1590, 1585, 1575, 1611, 1578, + 1580, 1605, 1578, 1581, 1580, 1578, 1581, 1605, + 1578, 1582, 1605, 1578, 1605, 1580, 1578, 1605, + 1581, 1578, 1605, 1582, 1580, 1605, 1581, 1581, + 1605, 1610, 1581, 1605, 1609, 1587, 1581, 1580, + 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, + 1581, 1587, 1605, 1580, 1587, 1605, 1605, 1589, + 1581, 1581, 1589, 1605, 1605, 1588, 1581, 1605, + 1588, 1580, 1610, 1588, 1605, 1582, 1588, 1605, + 1605, 1590, 1581, 1609, 1590, 1582, 1605, 1591, + 1605, 1581, 1591, 1605, 1605, 1591, 1605, 1610, + 1593, 1580, 1605, 1593, 1605, 1605, 1593, 1605, + 1609, 1594, 1605, 1605, 1594, 1605, 1610, 1594, + 1605, 1609, 1601, 1582, 1605, 1602, 1605, 1581, + 1602, 1605, 1605, 1604, 1581, 1605, 1604, 1581, + 1610, 1604, 1581, 1609, 1604, 1580, 1580, 1604, + 1582, 1605, 1604, 1605, 1581, 1605, 1581, 1580, + 1605, 1581, 1605, 1605, 1581, 1610, 1605, 1580, + 1581, 1605, 1580, 1605, 1605, 1582, 1580, 1605, + 1582, 1605, 1605, 1580, 1582, 1607, 1605, 1580, + 1607, 1605, 1605, 1606, 1581, 1605, 1606, 1581, + 1609, 1606, 1580, 1605, 1606, 1580, 1609, 1606, + 1605, 1610, 1606, 1605, 1609, 1610, 1605, 1605, + 1576, 1582, 1610, 1578, 1580, 1610, 1578, 1580, + 1609, 1578, 1582, 1610, 1578, 1582, 1609, 1578, + 1605, 1610, 1578, 1605, 1609, 1580, 1605, 1610, + 1580, 1581, 1609, 1580, 1605, 1609, 1587, 1582, + 1609, 1589, 1581, 1610, 1588, 1581, 1610, 1590, + 1581, 1610, 1604, 1580, 1610, 1604, 1605, 1610, + 1610, 1581, 1610, 1610, 1580, 1610, 1610, 1605, + 1610, 1605, 1605, 1610, 1602, 1605, 1610, 1606, + 1581, 1610, 1593, 1605, 1610, 1603, 1605, 1610, + 1606, 1580, 1581, 1605, 1582, 1610, 1604, 1580, + 1605, 1603, 1605, 1605, 1580, 1581, 1610, 1581, + 1580, 1610, 1605, 1580, 1610, 1601, 1605, 1610, + 1576, 1581, 1610, 1587, 1582, 1610, 1606, 1580, + 1610, 1589, 1604, 1746, 1602, 1604, 1746, 3, + 1575, 1604, 1604, 1607, 3, 1575, 1603, 1576, + 1585, 3, 1605, 1581, 1605, 1583, 3, 1589, + 1604, 1593, 1605, 3, 1585, 1587, 1608, 1604, + 3, 1593, 1604, 1610, 1607, 3, 1608, 1587, + 1604, 1605, 1589, 1604, 1609, 17, 1589, 1604, + 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, + 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, + 7, 1580, 1604, 32, 1580, 1604, 1575, 1604, + 1607, 3, 1585, 1740, 1575, 1604, 44, 12289, + 12290, 58, 33, 63, 12310, 12311, 8230, 8229, + 8212, 8211, 95, 123, 125, 12308, 12309, 12304, + 12305, 12298, 12299, 12300, 12301, 12302, 12303, 91, + 93, 8254, 35, 38, 42, 45, 60, 62, + 92, 36, 37, 64, 32, 1611, 1600, 1611, + 32, 1612, 32, 1613, 32, 1614, 1600, 1614, + 32, 1615, 1600, 1615, 32, 1616, 1600, 1616, + 32, 1617, 1600, 1617, 32, 1618, 1600, 1618, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, + 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, + 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, + 1593, 1594, 1601, 1602, 1603, 1604, 1605, 1606, + 1607, 1608, 1610, 1604, 1570, 1604, 1571, 1604, + 1573, 1604, 1575, 34, 39, 47, 65345, 65346, + 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, + 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, + 94, 65313, 65314, 65315, 65316, 65317, 65318, 65319, + 65320, 65321, 65322, 65323, 65324, 65325, 65326, 65327, + 65328, 65329, 65330, 65331, 65332, 65333, 65334, 65335, + 65336, 65337, 65338, 124, 126, 10629, 10630, 12539, + 12449, 12451, 12453, 12455, 12457, 12515, 12517, 12519, + 12483, 12540, 12531, 12441, 12442, 12644, 12593, 12594, + 12595, 12596, 12597, 12598, 12599, 12600, 12601, 12602, + 12603, 12604, 12605, 12606, 12607, 12608, 12609, 12610, + 12611, 12612, 12613, 12614, 12615, 12616, 12617, 12618, + 12619, 12620, 12621, 12622, 12623, 12624, 12625, 12626, + 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, + 12635, 12636, 12637, 12638, 12639, 12640, 12641, 12642, + 12643, 162, 163, 172, 175, 166, 165, 8361, + 9474, 8592, 8593, 8594, 8595, 9632, 9675, 55297, + 56360, 55297, 56361, 55297, 56362, 55297, 56363, 55297, + 56364, 55297, 56365, 55297, 56366, 55297, 56367, 55297, + 56368, 55297, 56369, 55297, 56370, 55297, 56371, 55297, + 56372, 55297, 56373, 55297, 56374, 55297, 56375, 55297, + 56376, 55297, 56377, 55297, 56378, 55297, 56379, 55297, + 56380, 55297, 56381, 55297, 56382, 55297, 56383, 55297, + 56384, 55297, 56385, 55297, 56386, 55297, 56387, 55297, + 56388, 55297, 56389, 55297, 56390, 55297, 56391, 55297, + 56392, 55297, 56393, 55297, 56394, 55297, 56395, 55297, + 56396, 55297, 56397, 55297, 56398, 55297, 56399, 55297, + 56320, 55297, 56321, 55297, 56322, 55297, 56323, 55297, + 56324, 55297, 56325, 55297, 56326, 55297, 56327, 55297, + 56328, 55297, 56329, 55297, 56330, 55297, 56331, 55297, + 56332, 55297, 56333, 55297, 56334, 55297, 56335, 55297, + 56336, 55297, 56337, 55297, 56338, 55297, 56339, 55297, + 56340, 55297, 56341, 55297, 56342, 55297, 56343, 55297, + 56344, 55297, 56345, 55297, 56346, 55297, 56347, 55297, + 56348, 55297, 56349, 55297, 56350, 55297, 56351, 55297, + 56352, 55297, 56353, 55297, 56354, 55297, 56355, 55297, + 56356, 55297, 56357, 55297, 56358, 55297, 56359, 55297, + 56536, 55297, 56537, 55297, 56538, 55297, 56539, 55297, + 56540, 55297, 56541, 55297, 56542, 55297, 56543, 55297, + 56544, 55297, 56545, 55297, 56546, 55297, 56547, 55297, + 56548, 55297, 56549, 55297, 56550, 55297, 56551, 55297, + 56552, 55297, 56553, 55297, 56554, 55297, 56555, 55297, + 56556, 55297, 56557, 55297, 56558, 55297, 56559, 55297, + 56560, 55297, 56561, 55297, 56562, 55297, 56563, 55297, + 56564, 55297, 56565, 55297, 56566, 55297, 56567, 55297, + 56568, 55297, 56569, 55297, 56570, 55297, 56571, 55297, + 56496, 55297, 56497, 55297, 56498, 55297, 56499, 55297, + 56500, 55297, 56501, 55297, 56502, 55297, 56503, 55297, + 56504, 55297, 56505, 55297, 56506, 55297, 56507, 55297, + 56508, 55297, 56509, 55297, 56510, 55297, 56511, 55297, + 56512, 55297, 56513, 55297, 56514, 55297, 56515, 55297, + 56516, 55297, 56517, 55297, 56518, 55297, 56519, 55297, + 56520, 55297, 56521, 55297, 56522, 55297, 56523, 55297, + 56524, 55297, 56525, 55297, 56526, 55297, 56527, 55297, + 56528, 55297, 56529, 55297, 56530, 55297, 56531, 55297, + 56727, 55297, 56728, 55297, 56729, 55297, 56730, 55297, + 56731, 55297, 56732, 55297, 56733, 55297, 56734, 55297, + 56735, 55297, 56736, 55297, 56737, 55297, 56739, 55297, + 56740, 55297, 56741, 55297, 56742, 55297, 56743, 55297, + 56744, 55297, 56745, 55297, 56746, 55297, 56747, 55297, + 56748, 55297, 56749, 55297, 56750, 55297, 56751, 55297, + 56752, 55297, 56753, 55297, 56755, 55297, 56756, 55297, + 56757, 55297, 56758, 55297, 56759, 55297, 56760, 55297, + 56761, 55297, 56763, 55297, 56764, 55297, 56688, 55297, + 56689, 55297, 56690, 55297, 56691, 55297, 56692, 55297, + 56693, 55297, 56694, 55297, 56695, 55297, 56696, 55297, + 56697, 55297, 56698, 55297, 56700, 55297, 56701, 55297, + 56702, 55297, 56703, 55297, 56704, 55297, 56705, 55297, + 56706, 55297, 56707, 55297, 56708, 55297, 56709, 55297, + 56710, 55297, 56711, 55297, 56712, 55297, 56713, 55297, + 56714, 55297, 56716, 55297, 56717, 55297, 56718, 55297, + 56719, 55297, 56720, 55297, 56721, 55297, 56722, 55297, + 56724, 55297, 56725, 55297, 56786, 775, 55297, 56794, + 775, 55297, 57216, 720, 721, 55297, 57219, 55297, + 57220, 55297, 57221, 55297, 57223, 55297, 57224, 55297, + 57225, 55297, 57226, 55297, 57227, 55297, 57228, 55297, + 57229, 55297, 57230, 55297, 57231, 55297, 57232, 55297, + 57233, 55297, 57234, 55297, 57235, 55297, 57236, 55297, + 57237, 55297, 57238, 55297, 57239, 55297, 57240, 55297, + 57241, 55297, 57242, 55297, 57243, 55351, 57092, 55297, + 57244, 55297, 57245, 55297, 57246, 55351, 57093, 55297, + 57247, 55297, 57248, 55351, 57094, 55297, 57249, 55297, + 57250, 55297, 57251, 55297, 57252, 55297, 57253, 55297, + 57254, 55351, 57096, 55297, 57255, 55297, 57256, 55297, + 57257, 55297, 57258, 55297, 57259, 55297, 57260, 55297, + 57261, 55297, 57262, 55297, 57263, 55297, 57264, 55297, + 57266, 55297, 57267, 55297, 57268, 55297, 57269, 448, + 55297, 57270, 449, 55297, 57271, 450, 55297, 57272, + 55351, 57098, 55297, 57273, 55351, 57118, 55297, 57274, + 55299, 56512, 55299, 56513, 55299, 56514, 55299, 56515, + 55299, 56516, 55299, 56517, 55299, 56518, 55299, 56519, + 55299, 56520, 55299, 56521, 55299, 56522, 55299, 56523, + 55299, 56524, 55299, 56525, 55299, 56526, 55299, 56527, + 55299, 56528, 55299, 56529, 55299, 56530, 55299, 56531, + 55299, 56532, 55299, 56533, 55299, 56534, 55299, 56535, + 55299, 56536, 55299, 56537, 55299, 56538, 55299, 56539, + 55299, 56540, 55299, 56541, 55299, 56542, 55299, 56543, + 55299, 56544, 55299, 56545, 55299, 56546, 55299, 56547, + 55299, 56548, 55299, 56549, 55299, 56550, 55299, 56551, + 55299, 56552, 55299, 56553, 55299, 56554, 55299, 56555, + 55299, 56556, 55299, 56557, 55299, 56558, 55299, 56559, + 55299, 56560, 55299, 56561, 55299, 56562, 55299, 56448, + 55299, 56449, 55299, 56450, 55299, 56451, 55299, 56452, + 55299, 56453, 55299, 56454, 55299, 56455, 55299, 56456, + 55299, 56457, 55299, 56458, 55299, 56459, 55299, 56460, + 55299, 56461, 55299, 56462, 55299, 56463, 55299, 56464, + 55299, 56465, 55299, 56466, 55299, 56467, 55299, 56468, + 55299, 56469, 55299, 56470, 55299, 56471, 55299, 56472, + 55299, 56473, 55299, 56474, 55299, 56475, 55299, 56476, + 55299, 56477, 55299, 56478, 55299, 56479, 55299, 56480, + 55299, 56481, 55299, 56482, 55299, 56483, 55299, 56484, + 55299, 56485, 55299, 56486, 55299, 56487, 55299, 56488, + 55299, 56489, 55299, 56490, 55299, 56491, 55299, 56492, + 55299, 56493, 55299, 56494, 55299, 56495, 55299, 56496, + 55299, 56497, 55299, 56498, 55299, 56688, 55299, 56689, + 55299, 56690, 55299, 56691, 55299, 56692, 55299, 56693, + 55299, 56694, 55299, 56695, 55299, 56696, 55299, 56697, + 55299, 56698, 55299, 56699, 55299, 56700, 55299, 56701, + 55299, 56702, 55299, 56703, 55299, 56704, 55299, 56705, + 55299, 56706, 55299, 56707, 55299, 56708, 55299, 56709, + 55299, 56656, 55299, 56657, 55299, 56658, 55299, 56659, + 55299, 56660, 55299, 56661, 55299, 56662, 55299, 56663, + 55299, 56664, 55299, 56665, 55299, 56666, 55299, 56667, + 55299, 56668, 55299, 56669, 55299, 56670, 55299, 56671, + 55299, 56672, 55299, 56673, 55299, 56674, 55299, 56675, + 55299, 56676, 55299, 56677, 55300, 56473, 55300, 56506, + 55300, 56475, 55300, 56506, 55300, 56485, 55300, 56506, + 55300, 56625, 55300, 56615, 55300, 56626, 55300, 56615, + 55300, 57159, 55300, 57150, 55300, 57159, 55300, 57175, + 55300, 57218, 55300, 57289, 55300, 57220, 55300, 57275, + 55300, 57227, 55300, 57282, 55300, 57232, 55300, 57289, + 55300, 57282, 55300, 57282, 55300, 57282, 55300, 57272, + 55300, 57282, 55300, 57289, 55301, 56505, 55301, 56506, + 55301, 56505, 55301, 56496, 55301, 56505, 55301, 56509, + 55301, 56760, 55301, 56751, 55301, 56761, 55301, 56751, + 55302, 56512, 55302, 56513, 55302, 56514, 55302, 56515, + 55302, 56516, 55302, 56517, 55302, 56518, 55302, 56519, + 55302, 56520, 55302, 56521, 55302, 56522, 55302, 56523, + 55302, 56524, 55302, 56525, 55302, 56526, 55302, 56527, + 55302, 56528, 55302, 56529, 55302, 56530, 55302, 56531, + 55302, 56532, 55302, 56533, 55302, 56534, 55302, 56535, + 55302, 56536, 55302, 56537, 55302, 56538, 55302, 56539, + 55302, 56540, 55302, 56541, 55302, 56542, 55302, 56543, + 55302, 56480, 55302, 56481, 55302, 56482, 55302, 56483, + 55302, 56484, 55302, 56485, 55302, 56486, 55302, 56487, + 55302, 56488, 55302, 56489, 55302, 56490, 55302, 56491, + 55302, 56492, 55302, 56493, 55302, 56494, 55302, 56495, + 55302, 56496, 55302, 56497, 55302, 56498, 55302, 56499, + 55302, 56500, 55302, 56501, 55302, 56502, 55302, 56503, + 55302, 56504, 55302, 56505, 55302, 56506, 55302, 56507, + 55302, 56508, 55302, 56509, 55302, 56510, 55302, 56511, + 55302, 56629, 55302, 56624, 55320, 56606, 55320, 56606, + 55320, 56606, 55320, 56617, 55320, 56606, 55320, 56607, + 55320, 56617, 55320, 56607, 55320, 56606, 55320, 56608, + 55320, 56609, 55320, 56607, 55320, 56610, 55320, 56607, + 55320, 56609, 55320, 56608, 55323, 56679, 55323, 56679, + 55323, 56675, 55323, 56679, 55323, 56681, 55323, 56679, + 55323, 56928, 55323, 56929, 55323, 56930, 55323, 56931, + 55323, 56932, 55323, 56933, 55323, 56934, 55323, 56935, + 55323, 56936, 55323, 56937, 55323, 56938, 55323, 56939, + 55323, 56940, 55323, 56941, 55323, 56942, 55323, 56943, + 55323, 56944, 55323, 56945, 55323, 56946, 55323, 56947, + 55323, 56948, 55323, 56949, 55323, 56950, 55323, 56951, + 55323, 56952, 55323, 56953, 55323, 56954, 55323, 56955, + 55323, 56956, 55323, 56957, 55323, 56958, 55323, 56959, + 55323, 56896, 55323, 56897, 55323, 56898, 55323, 56899, + 55323, 56900, 55323, 56901, 55323, 56902, 55323, 56903, + 55323, 56904, 55323, 56905, 55323, 56906, 55323, 56907, + 55323, 56908, 55323, 56909, 55323, 56910, 55323, 56911, + 55323, 56912, 55323, 56913, 55323, 56914, 55323, 56915, + 55323, 56916, 55323, 56917, 55323, 56918, 55323, 56919, + 55323, 56920, 55323, 56921, 55323, 56922, 55323, 56923, + 55323, 56924, 55323, 56925, 55323, 56926, 55323, 56927, + 55323, 57019, 55323, 57020, 55323, 57021, 55323, 57022, + 55323, 57023, 55323, 57024, 55323, 57025, 55323, 57026, + 55323, 57027, 55323, 57028, 55323, 57029, 55323, 57030, + 55323, 57031, 55323, 57032, 55323, 57033, 55323, 57034, + 55323, 57035, 55323, 57036, 55323, 57037, 55323, 57038, + 55323, 57039, 55323, 57040, 55323, 57041, 55323, 57042, + 55323, 57043, 55323, 56992, 55323, 56993, 55323, 56994, + 55323, 56995, 55323, 56996, 55323, 56997, 55323, 56998, + 55323, 56999, 55323, 57000, 55323, 57001, 55323, 57002, + 55323, 57003, 55323, 57004, 55323, 57005, 55323, 57006, + 55323, 57007, 55323, 57008, 55323, 57009, 55323, 57010, + 55323, 57011, 55323, 57012, 55323, 57013, 55323, 57014, + 55323, 57015, 55323, 57016, 55348, 56663, 55348, 56677, + 55348, 56664, 55348, 56677, 55348, 56671, 55348, 56686, + 55348, 56671, 55348, 56687, 55348, 56671, 55348, 56688, + 55348, 56671, 55348, 56689, 55348, 56671, 55348, 56690, + 55348, 56761, 55348, 56677, 55348, 56762, 55348, 56677, + 55348, 56763, 55348, 56686, 55348, 56764, 55348, 56686, + 55348, 56763, 55348, 56687, 55348, 56764, 55348, 56687, + 55349, 56320, 55349, 56321, 55349, 56322, 55349, 56323, + 55349, 56324, 55349, 56325, 55349, 56326, 55349, 56327, + 55349, 56328, 55349, 56329, 55349, 56330, 55349, 56331, + 55349, 56332, 55349, 56333, 55349, 56334, 55349, 56335, + 55349, 56336, 55349, 56337, 55349, 56338, 55349, 56339, + 55349, 56340, 55349, 56341, 55349, 56342, 55349, 56343, + 55349, 56344, 55349, 56345, 55349, 56346, 55349, 56347, + 55349, 56348, 55349, 56349, 55349, 56350, 55349, 56351, + 55349, 56352, 55349, 56353, 55349, 56354, 55349, 56355, + 55349, 56356, 55349, 56357, 55349, 56358, 55349, 56359, + 55349, 56360, 55349, 56361, 55349, 56362, 55349, 56363, + 55349, 56364, 55349, 56365, 55349, 56366, 55349, 56367, + 55349, 56368, 55349, 56369, 55349, 56370, 55349, 56371, + 55349, 56372, 55349, 56373, 55349, 56374, 55349, 56375, + 55349, 56376, 55349, 56377, 55349, 56378, 55349, 56379, + 55349, 56380, 55349, 56381, 55349, 56382, 55349, 56383, + 55349, 56384, 55349, 56385, 55349, 56386, 55349, 56387, + 55349, 56388, 55349, 56389, 55349, 56390, 55349, 56391, + 55349, 56392, 55349, 56393, 55349, 56394, 55349, 56395, + 55349, 56396, 55349, 56397, 55349, 56398, 55349, 56399, + 55349, 56400, 55349, 56401, 55349, 56402, 55349, 56403, + 55349, 56404, 55349, 56406, 55349, 56407, 55349, 56408, + 55349, 56409, 55349, 56410, 55349, 56411, 55349, 56412, + 55349, 56413, 55349, 56414, 55349, 56415, 55349, 56416, + 55349, 56417, 55349, 56418, 55349, 56419, 55349, 56420, + 55349, 56421, 55349, 56422, 55349, 56423, 55349, 56424, + 55349, 56425, 55349, 56426, 55349, 56427, 55349, 56428, + 55349, 56429, 55349, 56430, 55349, 56431, 55349, 56432, + 55349, 56433, 55349, 56434, 55349, 56435, 55349, 56436, + 55349, 56437, 55349, 56438, 55349, 56439, 55349, 56440, + 55349, 56441, 55349, 56442, 55349, 56443, 55349, 56444, + 55349, 56445, 55349, 56446, 55349, 56447, 55349, 56448, + 55349, 56449, 55349, 56450, 55349, 56451, 55349, 56452, + 55349, 56453, 55349, 56454, 55349, 56455, 55349, 56456, + 55349, 56457, 55349, 56458, 55349, 56459, 55349, 56460, + 55349, 56461, 55349, 56462, 55349, 56463, 55349, 56464, + 55349, 56465, 55349, 56466, 55349, 56467, 55349, 56468, + 55349, 56469, 55349, 56470, 55349, 56471, 55349, 56472, + 55349, 56473, 55349, 56474, 55349, 56475, 55349, 56476, + 55349, 56478, 55349, 56479, 55349, 56482, 55349, 56485, + 55349, 56486, 55349, 56489, 55349, 56490, 55349, 56491, + 55349, 56492, 55349, 56494, 55349, 56495, 55349, 56496, + 55349, 56497, 55349, 56498, 55349, 56499, 55349, 56500, + 55349, 56501, 55349, 56502, 55349, 56503, 55349, 56504, + 55349, 56505, 55349, 56507, 55349, 56509, 55349, 56510, + 55349, 56511, 55349, 56512, 55349, 56513, 55349, 56514, + 55349, 56515, 55349, 56517, 55349, 56518, 55349, 56519, + 55349, 56520, 55349, 56521, 55349, 56522, 55349, 56523, + 55349, 56524, 55349, 56525, 55349, 56526, 55349, 56527, + 55349, 56528, 55349, 56529, 55349, 56530, 55349, 56531, + 55349, 56532, 55349, 56533, 55349, 56534, 55349, 56535, + 55349, 56536, 55349, 56537, 55349, 56538, 55349, 56539, + 55349, 56540, 55349, 56541, 55349, 56542, 55349, 56543, + 55349, 56544, 55349, 56545, 55349, 56546, 55349, 56547, + 55349, 56548, 55349, 56549, 55349, 56550, 55349, 56551, + 55349, 56552, 55349, 56553, 55349, 56554, 55349, 56555, + 55349, 56556, 55349, 56557, 55349, 56558, 55349, 56559, + 55349, 56560, 55349, 56561, 55349, 56562, 55349, 56563, + 55349, 56564, 55349, 56565, 55349, 56566, 55349, 56567, + 55349, 56568, 55349, 56569, 55349, 56570, 55349, 56571, + 55349, 56572, 55349, 56573, 55349, 56574, 55349, 56575, + 55349, 56576, 55349, 56577, 55349, 56578, 55349, 56579, + 55349, 56580, 55349, 56581, 55349, 56583, 55349, 56584, + 55349, 56585, 55349, 56586, 55349, 56589, 55349, 56590, + 55349, 56591, 55349, 56592, 55349, 56593, 55349, 56594, + 55349, 56595, 55349, 56596, 55349, 56598, 55349, 56599, + 55349, 56600, 55349, 56601, 55349, 56602, 55349, 56603, + 55349, 56604, 55349, 56606, 55349, 56607, 55349, 56608, + 55349, 56609, 55349, 56610, 55349, 56611, 55349, 56612, + 55349, 56613, 55349, 56614, 55349, 56615, 55349, 56616, + 55349, 56617, 55349, 56618, 55349, 56619, 55349, 56620, + 55349, 56621, 55349, 56622, 55349, 56623, 55349, 56624, + 55349, 56625, 55349, 56626, 55349, 56627, 55349, 56628, + 55349, 56629, 55349, 56630, 55349, 56631, 55349, 56632, + 55349, 56633, 55349, 56635, 55349, 56636, 55349, 56637, + 55349, 56638, 55349, 56640, 55349, 56641, 55349, 56642, + 55349, 56643, 55349, 56644, 55349, 56646, 55349, 56650, + 55349, 56651, 55349, 56652, 55349, 56653, 55349, 56654, + 55349, 56655, 55349, 56656, 55349, 56658, 55349, 56659, + 55349, 56660, 55349, 56661, 55349, 56662, 55349, 56663, + 55349, 56664, 55349, 56665, 55349, 56666, 55349, 56667, + 55349, 56668, 55349, 56669, 55349, 56670, 55349, 56671, + 55349, 56672, 55349, 56673, 55349, 56674, 55349, 56675, + 55349, 56676, 55349, 56677, 55349, 56678, 55349, 56679, + 55349, 56680, 55349, 56681, 55349, 56682, 55349, 56683, + 55349, 56684, 55349, 56685, 55349, 56686, 55349, 56687, + 55349, 56688, 55349, 56689, 55349, 56690, 55349, 56691, + 55349, 56692, 55349, 56693, 55349, 56694, 55349, 56695, + 55349, 56696, 55349, 56697, 55349, 56698, 55349, 56699, + 55349, 56700, 55349, 56701, 55349, 56702, 55349, 56703, + 55349, 56704, 55349, 56705, 55349, 56706, 55349, 56707, + 55349, 56708, 55349, 56709, 55349, 56710, 55349, 56711, + 55349, 56712, 55349, 56713, 55349, 56714, 55349, 56715, + 55349, 56716, 55349, 56717, 55349, 56718, 55349, 56719, + 55349, 56720, 55349, 56721, 55349, 56722, 55349, 56723, + 55349, 56724, 55349, 56725, 55349, 56726, 55349, 56727, + 55349, 56728, 55349, 56729, 55349, 56730, 55349, 56731, + 55349, 56732, 55349, 56733, 55349, 56734, 55349, 56735, + 55349, 56736, 55349, 56737, 55349, 56738, 55349, 56739, + 55349, 56740, 55349, 56741, 55349, 56742, 55349, 56743, + 55349, 56744, 55349, 56745, 55349, 56746, 55349, 56747, + 55349, 56748, 55349, 56749, 55349, 56750, 55349, 56751, + 55349, 56752, 55349, 56753, 55349, 56754, 55349, 56755, + 55349, 56756, 55349, 56757, 55349, 56758, 55349, 56759, + 55349, 56760, 55349, 56761, 55349, 56762, 55349, 56763, + 55349, 56764, 55349, 56765, 55349, 56766, 55349, 56767, + 55349, 56768, 55349, 56769, 55349, 56770, 55349, 56771, + 55349, 56772, 55349, 56773, 55349, 56774, 55349, 56775, + 55349, 56776, 55349, 56777, 55349, 56778, 55349, 56779, + 55349, 56780, 55349, 56781, 55349, 56782, 55349, 56783, + 55349, 56784, 55349, 56785, 55349, 56786, 55349, 56787, + 55349, 56788, 55349, 56789, 55349, 56790, 55349, 56791, + 55349, 56792, 55349, 56793, 55349, 56794, 55349, 56795, + 55349, 56796, 55349, 56797, 55349, 56798, 55349, 56799, + 55349, 56800, 55349, 56801, 55349, 56802, 55349, 56803, + 55349, 56804, 55349, 56805, 55349, 56806, 55349, 56807, + 55349, 56808, 55349, 56809, 55349, 56810, 55349, 56811, + 55349, 56812, 55349, 56813, 55349, 56814, 55349, 56815, + 55349, 56816, 55349, 56817, 55349, 56818, 55349, 56819, + 55349, 56820, 55349, 56821, 55349, 56822, 55349, 56823, + 55349, 56824, 55349, 56825, 55349, 56826, 55349, 56827, + 55349, 56828, 55349, 56829, 55349, 56830, 55349, 56831, + 55349, 56832, 55349, 56833, 55349, 56834, 55349, 56835, + 55349, 56836, 55349, 56837, 55349, 56838, 55349, 56839, + 55349, 56840, 55349, 56841, 55349, 56842, 55349, 56843, + 55349, 56844, 55349, 56845, 55349, 56846, 55349, 56847, + 55349, 56848, 55349, 56849, 55349, 56850, 55349, 56851, + 55349, 56852, 55349, 56853, 55349, 56854, 55349, 56855, + 55349, 56856, 55349, 56857, 55349, 56858, 55349, 56859, + 55349, 56860, 55349, 56861, 55349, 56862, 55349, 56863, + 55349, 56864, 55349, 56865, 55349, 56866, 55349, 56867, + 55349, 56868, 55349, 56869, 55349, 56870, 55349, 56871, + 55349, 56872, 55349, 56873, 55349, 56874, 55349, 56875, + 55349, 56876, 55349, 56877, 55349, 56878, 55349, 56879, + 55349, 56880, 55349, 56881, 55349, 56882, 55349, 56883, + 55349, 56884, 55349, 56885, 55349, 56886, 55349, 56887, + 55349, 56888, 55349, 56889, 55349, 56890, 55349, 56891, + 55349, 56892, 55349, 56893, 55349, 56894, 55349, 56895, + 55349, 56896, 55349, 56897, 55349, 56898, 55349, 56899, + 55349, 56900, 55349, 56901, 55349, 56902, 55349, 56903, + 55349, 56904, 55349, 56905, 55349, 56906, 55349, 56907, + 55349, 56908, 55349, 56909, 55349, 56910, 55349, 56911, + 55349, 56912, 55349, 56913, 55349, 56914, 55349, 56915, + 55349, 56916, 55349, 56917, 55349, 56918, 55349, 56919, + 55349, 56920, 55349, 56921, 55349, 56922, 55349, 56923, + 55349, 56924, 55349, 56925, 55349, 56926, 55349, 56927, + 55349, 56928, 55349, 56929, 55349, 56930, 55349, 56931, + 55349, 56932, 55349, 56933, 55349, 56934, 55349, 56935, + 55349, 56936, 55349, 56937, 55349, 56938, 55349, 56939, + 55349, 56940, 55349, 56941, 55349, 56942, 55349, 56943, + 55349, 56944, 55349, 56945, 55349, 56946, 55349, 56947, + 55349, 56948, 55349, 56949, 55349, 56950, 55349, 56951, + 55349, 56952, 55349, 56953, 55349, 56954, 55349, 56955, + 55349, 56956, 55349, 56957, 55349, 56958, 55349, 56959, + 55349, 56960, 55349, 56961, 55349, 56962, 55349, 56963, + 55349, 56964, 55349, 56965, 55349, 56966, 55349, 56967, + 55349, 56968, 55349, 56969, 55349, 56970, 55349, 56971, + 55349, 56972, 55349, 56973, 55349, 56974, 55349, 56975, + 55349, 56976, 55349, 56977, 55349, 56978, 55349, 56979, + 55349, 56980, 55349, 56981, 55349, 56982, 55349, 56983, + 55349, 56984, 55349, 56985, 55349, 56986, 55349, 56987, + 55349, 56988, 55349, 56989, 55349, 56990, 55349, 56991, + 55349, 56992, 55349, 56993, 55349, 56994, 55349, 56995, + 305, 55349, 56996, 55349, 56997, 55349, 57000, 55349, + 57001, 55349, 57002, 55349, 57003, 55349, 57004, 55349, + 57005, 55349, 57006, 55349, 57007, 55349, 57008, 55349, + 57009, 55349, 57010, 55349, 57011, 55349, 57012, 55349, + 57013, 55349, 57014, 55349, 57015, 55349, 57016, 1012, + 55349, 57017, 55349, 57018, 55349, 57019, 55349, 57020, + 55349, 57021, 55349, 57022, 55349, 57023, 55349, 57024, + 8711, 55349, 57026, 55349, 57027, 55349, 57028, 55349, + 57029, 55349, 57030, 55349, 57031, 55349, 57032, 55349, + 57033, 55349, 57034, 55349, 57035, 55349, 57036, 55349, + 57037, 55349, 57038, 55349, 57039, 55349, 57040, 55349, + 57041, 55349, 57042, 55349, 57043, 55349, 57044, 55349, + 57045, 55349, 57046, 55349, 57047, 55349, 57048, 55349, + 57049, 55349, 57050, 8706, 1013, 55349, 57052, 977, + 55349, 57053, 1008, 55349, 57054, 981, 55349, 57055, + 1009, 55349, 57056, 982, 55349, 57057, 55349, 57058, + 55349, 57059, 55349, 57060, 55349, 57061, 55349, 57062, + 55349, 57063, 55349, 57064, 55349, 57065, 55349, 57066, + 55349, 57067, 55349, 57068, 55349, 57069, 55349, 57070, + 55349, 57071, 55349, 57072, 55349, 57073, 55349, 57074, + 55349, 57075, 55349, 57076, 55349, 57077, 55349, 57078, + 55349, 57079, 55349, 57080, 55349, 57081, 55349, 57082, + 55349, 57084, 55349, 57085, 55349, 57086, 55349, 57087, + 55349, 57088, 55349, 57089, 55349, 57090, 55349, 57091, + 55349, 57092, 55349, 57093, 55349, 57094, 55349, 57095, + 55349, 57096, 55349, 57097, 55349, 57098, 55349, 57099, + 55349, 57100, 55349, 57101, 55349, 57102, 55349, 57103, + 55349, 57104, 55349, 57105, 55349, 57106, 55349, 57107, + 55349, 57108, 55349, 57110, 55349, 57111, 55349, 57112, + 55349, 57113, 55349, 57114, 55349, 57115, 55349, 57116, + 55349, 57117, 55349, 57118, 55349, 57119, 55349, 57120, + 55349, 57121, 55349, 57122, 55349, 57123, 55349, 57124, + 55349, 57125, 55349, 57126, 55349, 57127, 55349, 57128, + 55349, 57129, 55349, 57130, 55349, 57131, 55349, 57132, + 55349, 57133, 55349, 57134, 55349, 57135, 55349, 57136, + 55349, 57137, 55349, 57138, 55349, 57139, 55349, 57140, + 55349, 57142, 55349, 57143, 55349, 57144, 55349, 57145, + 55349, 57146, 55349, 57147, 55349, 57148, 55349, 57149, + 55349, 57150, 55349, 57151, 55349, 57152, 55349, 57153, + 55349, 57154, 55349, 57155, 55349, 57156, 55349, 57157, + 55349, 57158, 55349, 57159, 55349, 57160, 55349, 57161, + 55349, 57162, 55349, 57163, 55349, 57164, 55349, 57165, + 55349, 57166, 55349, 57168, 55349, 57169, 55349, 57170, + 55349, 57171, 55349, 57172, 55349, 57173, 55349, 57174, + 55349, 57175, 55349, 57176, 55349, 57177, 55349, 57178, + 55349, 57179, 55349, 57180, 55349, 57181, 55349, 57182, + 55349, 57183, 55349, 57184, 55349, 57185, 55349, 57186, + 55349, 57187, 55349, 57188, 55349, 57189, 55349, 57190, + 55349, 57191, 55349, 57192, 55349, 57193, 55349, 57194, + 55349, 57195, 55349, 57196, 55349, 57197, 55349, 57198, + 55349, 57200, 55349, 57201, 55349, 57202, 55349, 57203, + 55349, 57204, 55349, 57205, 55349, 57206, 55349, 57207, + 55349, 57208, 55349, 57209, 55349, 57210, 55349, 57211, + 55349, 57212, 55349, 57213, 55349, 57214, 55349, 57215, + 55349, 57216, 55349, 57217, 55349, 57218, 55349, 57219, + 55349, 57220, 55349, 57221, 55349, 57222, 55349, 57223, + 55349, 57224, 55349, 57226, 55349, 57227, 55349, 57228, + 55349, 57229, 55349, 57230, 55349, 57231, 55349, 57232, + 55349, 57233, 55349, 57234, 55349, 57235, 55349, 57236, + 55349, 57237, 55349, 57238, 55349, 57239, 55349, 57240, + 55349, 57241, 55349, 57242, 55349, 57243, 55349, 57244, + 55349, 57245, 55349, 57246, 55349, 57247, 55349, 57248, + 55349, 57249, 55349, 57250, 55349, 57251, 55349, 57252, + 55349, 57253, 55349, 57254, 55349, 57255, 55349, 57256, + 55349, 57258, 55349, 57259, 55349, 57260, 55349, 57261, + 55349, 57262, 55349, 57263, 55349, 57264, 55349, 57265, + 55349, 57266, 55349, 57267, 55349, 57268, 55349, 57269, + 55349, 57270, 55349, 57271, 55349, 57272, 55349, 57273, + 55349, 57274, 55349, 57275, 55349, 57276, 55349, 57277, + 55349, 57278, 55349, 57279, 55349, 57280, 55349, 57281, + 55349, 57282, 55349, 57284, 55349, 57285, 55349, 57286, + 55349, 57287, 55349, 57288, 55349, 57289, 55349, 57290, + 55349, 57291, 55351, 57088, 55351, 57089, 55351, 57090, + 55351, 57091, 55351, 57095, 55351, 57097, 55351, 57099, + 55351, 57100, 55351, 57101, 55351, 57102, 55351, 57103, + 55351, 57104, 55351, 57105, 55351, 57106, 55351, 57107, + 55351, 57108, 55351, 57109, 55351, 57110, 55351, 57111, + 55351, 57112, 55351, 57113, 55351, 57114, 55351, 57115, + 55351, 57116, 55351, 57117, 55351, 57125, 55351, 57126, + 55351, 57127, 55351, 57128, 55351, 57129, 55351, 57130, + 55352, 56368, 55352, 56369, 55352, 56370, 55352, 56371, + 55352, 56372, 55352, 56373, 55352, 56374, 55352, 56375, + 55352, 56376, 55352, 56377, 55352, 56378, 55352, 56379, + 55352, 56380, 55352, 56381, 55352, 56382, 55352, 56383, + 55352, 56384, 55352, 56385, 55352, 56386, 55352, 56387, + 55352, 56388, 55352, 56389, 55352, 56390, 55352, 56391, + 55352, 56392, 55352, 56393, 55352, 56394, 55352, 56395, + 55352, 56396, 55352, 56397, 55352, 56398, 55352, 56399, + 55352, 56400, 55352, 56401, 55352, 56402, 55352, 56403, + 55352, 56404, 55352, 56405, 55352, 56406, 55352, 56407, + 55352, 56408, 55352, 56409, 55352, 56410, 55352, 56411, + 55352, 56412, 55352, 56413, 55352, 56414, 55352, 56415, + 55352, 56416, 55352, 56417, 55352, 56418, 55352, 56419, + 55352, 56420, 55352, 56421, 55352, 56422, 55352, 56423, + 55352, 56424, 55352, 56425, 55352, 56426, 55352, 56427, + 55352, 56428, 55352, 56429, 55354, 56610, 55354, 56611, + 55354, 56612, 55354, 56613, 55354, 56614, 55354, 56615, + 55354, 56616, 55354, 56617, 55354, 56618, 55354, 56619, + 55354, 56620, 55354, 56621, 55354, 56622, 55354, 56623, + 55354, 56624, 55354, 56625, 55354, 56626, 55354, 56627, + 55354, 56628, 55354, 56629, 55354, 56630, 55354, 56631, + 55354, 56632, 55354, 56633, 55354, 56634, 55354, 56635, + 55354, 56636, 55354, 56637, 55354, 56638, 55354, 56639, + 55354, 56640, 55354, 56641, 55354, 56642, 55354, 56643, + 55354, 56576, 55354, 56577, 55354, 56578, 55354, 56579, + 55354, 56580, 55354, 56581, 55354, 56582, 55354, 56583, + 55354, 56584, 55354, 56585, 55354, 56586, 55354, 56587, + 55354, 56588, 55354, 56589, 55354, 56590, 55354, 56591, + 55354, 56592, 55354, 56593, 55354, 56594, 55354, 56595, + 55354, 56596, 55354, 56597, 55354, 56598, 55354, 56599, + 55354, 56600, 55354, 56601, 55354, 56602, 55354, 56603, + 55354, 56604, 55354, 56605, 55354, 56606, 55354, 56607, + 55354, 56608, 55354, 56609, 1646, 1697, 1647, 48, + 46, 48, 44, 49, 44, 50, 44, 51, + 44, 52, 44, 53, 44, 54, 44, 55, + 44, 56, 44, 57, 44, 40, 65, 41, + 40, 66, 41, 40, 67, 41, 40, 68, + 41, 40, 69, 41, 40, 70, 41, 40, + 71, 41, 40, 72, 41, 40, 73, 41, + 40, 74, 41, 40, 75, 41, 40, 76, + 41, 40, 77, 41, 40, 78, 41, 40, + 79, 41, 40, 80, 41, 40, 81, 41, + 40, 82, 41, 40, 83, 41, 40, 84, + 41, 40, 85, 41, 40, 86, 41, 40, + 87, 41, 40, 88, 41, 40, 89, 41, + 40, 90, 41, 12308, 83, 12309, 67, 68, + 87, 90, 55356, 56624, 55356, 56625, 55356, 56626, + 55356, 56627, 55356, 56628, 55356, 56629, 55356, 56630, + 55356, 56631, 55356, 56632, 55356, 56633, 55356, 56634, + 55356, 56635, 55356, 56636, 55356, 56637, 55356, 56638, + 55356, 56639, 55356, 56640, 55356, 56641, 55356, 56642, + 55356, 56643, 55356, 56644, 55356, 56645, 55356, 56646, + 55356, 56647, 55356, 56648, 55356, 56649, 72, 86, + 83, 68, 83, 83, 80, 80, 86, 87, + 67, 55356, 56656, 55356, 56657, 55356, 56658, 55356, + 56659, 55356, 56660, 55356, 56661, 55356, 56662, 55356, + 56663, 55356, 56664, 55356, 56665, 55356, 56666, 55356, + 56667, 55356, 56668, 55356, 56669, 55356, 56670, 55356, + 56671, 55356, 56672, 55356, 56673, 55356, 56674, 55356, + 56675, 55356, 56676, 55356, 56677, 55356, 56678, 55356, + 56679, 55356, 56680, 55356, 56681, 77, 67, 77, + 68, 77, 82, 55356, 56688, 55356, 56689, 55356, + 56690, 55356, 56691, 55356, 56692, 55356, 56693, 55356, + 56694, 55356, 56695, 55356, 56696, 55356, 56697, 55356, + 56698, 55356, 56699, 55356, 56700, 55356, 56701, 55356, + 56702, 55356, 56703, 55356, 56704, 55356, 56705, 55356, + 56706, 55356, 56707, 55356, 56708, 55356, 56709, 55356, + 56710, 55356, 56711, 55356, 56712, 55356, 56713, 68, + 74, 12411, 12363, 12467, 12467, 23383, 21452, 12487, + 22810, 35299, 20132, 26144, 28961, 21069, 24460, 20877, + 26032, 21021, 32066, 36009, 22768, 21561, 28436, 25237, + 25429, 36938, 25351, 25171, 31105, 31354, 21512, 28288, + 30003, 21106, 21942, 37197, 12308, 26412, 12309, 12308, + 19977, 12309, 12308, 20108, 12309, 12308, 23433, 12309, + 12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, + 12309, 12308, 21213, 12309, 12308, 25943, 12309, 24471, + 21487, 20029, 20024, 20033, 55360, 56610, 20320, 20411, + 20482, 20602, 20633, 20687, 13470, 55361, 56890, 20820, + 20836, 20855, 55361, 56604, 13497, 20839, 55361, 56651, + 20887, 20900, 20172, 20908, 55396, 56799, 20995, 13535, + 21051, 21062, 21111, 13589, 21253, 21254, 21321, 21338, + 21363, 21373, 21375, 55362, 56876, 28784, 21450, 21471, + 55362, 57187, 21483, 21489, 21510, 21662, 21560, 21576, + 21608, 21666, 21750, 21776, 21843, 21859, 21892, 21931, + 21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, + 22516, 22541, 22411, 22578, 22577, 22700, 55365, 56548, + 22770, 22775, 22790, 22818, 22882, 55365, 57000, 55365, + 57066, 23020, 23067, 23079, 23000, 23142, 14062, 14076, + 23304, 23358, 55366, 56776, 23491, 23512, 23539, 55366, + 57112, 23551, 23558, 24403, 14209, 23648, 23744, 23693, + 55367, 56804, 23875, 55367, 56806, 23918, 23915, 23932, + 24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, + 55368, 56707, 14460, 24240, 24243, 24246, 55400, 57234, + 55368, 57137, 33281, 24354, 14535, 55372, 57016, 55384, + 56794, 24418, 24427, 14563, 24474, 24525, 24535, 24569, + 24705, 14650, 14620, 55369, 57044, 24775, 24904, 24908, + 24954, 25010, 24996, 25007, 25054, 25104, 25115, 25181, + 25265, 25300, 25424, 55370, 57100, 25405, 25340, 25448, + 25475, 25572, 55370, 57329, 25634, 25541, 25513, 14894, + 25705, 25726, 25757, 25719, 14956, 25964, 55372, 56330, + 26083, 26360, 26185, 15129, 15112, 15076, 20882, 20885, + 26368, 26268, 32941, 17369, 26401, 26462, 26451, 55372, + 57283, 15177, 26618, 26501, 26706, 55373, 56429, 26766, + 26655, 26900, 26946, 27043, 27114, 27304, 55373, 56995, + 27355, 15384, 27425, 55374, 56487, 27476, 15438, 27506, + 27551, 27579, 55374, 56973, 55367, 56587, 55374, 57082, + 27726, 55375, 56508, 27839, 27853, 27751, 27926, 27966, + 28009, 28024, 28037, 55375, 56606, 27956, 28207, 28270, + 15667, 28359, 55375, 57041, 28153, 28526, 55375, 57182, + 55375, 57230, 28614, 28729, 28699, 15766, 28746, 28797, + 28791, 28845, 55361, 56613, 28997, 55376, 56931, 29084, + 55376, 57259, 29224, 29264, 55377, 56840, 29312, 29333, + 55377, 57141, 55378, 56340, 29562, 29579, 16044, 29605, + 16056, 29767, 29788, 29829, 29898, 16155, 29988, 55379, + 56374, 30014, 55379, 56466, 55368, 56735, 30224, 55379, + 57249, 55379, 57272, 55380, 56388, 16380, 16392, 55380, + 56563, 55380, 56562, 55380, 56601, 55380, 56627, 30494, + 30495, 30603, 16454, 16534, 55381, 56349, 30798, 16611, + 55381, 56870, 55381, 56986, 55381, 57029, 31211, 16687, + 31306, 31311, 55382, 56700, 55382, 56999, 31470, 16898, + 55382, 57259, 31686, 31689, 16935, 55383, 56448, 31954, + 17056, 31976, 31971, 32000, 55383, 57222, 32099, 17153, + 32199, 32258, 32325, 17204, 55384, 56872, 55384, 56903, + 17241, 55384, 57049, 32634, 55384, 57150, 32661, 32762, + 55385, 56538, 55385, 56611, 32864, 55385, 56744, 32880, + 55372, 57183, 17365, 32946, 33027, 17419, 33086, 23221, + 55385, 57255, 55385, 57269, 55372, 57235, 55372, 57244, + 33284, 36766, 17515, 33425, 33419, 33437, 21171, 33457, + 33459, 33469, 33510, 55386, 57148, 33565, 33635, 33709, + 33571, 33725, 33767, 33619, 33738, 33740, 33756, 55387, + 56374, 55387, 56683, 55387, 56533, 17707, 34033, 34035, + 34070, 55388, 57290, 34148, 55387, 57132, 17757, 17761, + 55387, 57265, 55388, 56530, 17771, 34384, 34407, 34409, + 34473, 34440, 34574, 34530, 34600, 34667, 34694, 17879, + 34785, 34817, 17913, 34912, 55389, 56935, 35031, 35038, + 17973, 35066, 13499, 55390, 56494, 55390, 56678, 18110, + 18119, 35488, 55391, 56488, 36011, 36033, 36123, 36215, + 55391, 57135, 55362, 56324, 36299, 36284, 36336, 55362, + 56542, 36564, 55393, 56786, 55393, 56813, 37012, 37105, + 37137, 55393, 57134, 37147, 37432, 37591, 37592, 37500, + 37881, 37909, 55394, 57338, 38283, 18837, 38327, 55395, + 56695, 18918, 38595, 23986, 38691, 55396, 56645, 55396, + 56858, 19054, 19062, 38880, 55397, 56330, 19122, 55397, + 56470, 38953, 55397, 56758, 39138, 19251, 39209, 39335, + 39362, 39422, 19406, 55398, 57136, 40000, 40189, 19662, + 19693, 40295, 55400, 56526, 19704, 55400, 56581, 55400, + 56846, 55400, 56977, 19798, 40702, 40709, 40719, 40726, + 55401, 56832, }; static const utf8proc_uint16_t utf8proc_stage1table[] = { 0, 256, 512, 768, 1024, 1280, 1536, @@ -1658,18 +1671,18 @@ static const utf8proc_uint16_t utf8proc_stage1table[] = { 31488, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, - 31744, 13312, 13312, 13312, 13312, 32000, 32256, 28928, + 13312, 13312, 13312, 13312, 13312, 31744, 32000, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, - 32512, 13312, 32768, 33024, 28928, 28928, 28928, 28928, - 28928, 28928, 28928, 28928, 28928, 33280, 28928, 28928, + 32256, 13312, 32512, 32768, 28928, 28928, 28928, 28928, + 28928, 28928, 28928, 28928, 28928, 33024, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, - 28928, 28928, 28928, 28928, 28928, 33536, 33792, 34048, - 34304, 34560, 34816, 35072, 35328, 35584, 35840, 36096, - 36352, 10240, 10240, 36608, 28928, 28928, 28928, 28928, - 36864, 37120, 37376, 37632, 28928, 37888, 38144, 28928, + 28928, 28928, 28928, 28928, 28928, 33280, 33536, 33792, + 34048, 34304, 34560, 34816, 35072, 35328, 35584, 35840, + 36096, 10240, 10240, 36352, 28928, 28928, 28928, 28928, + 36608, 36864, 37120, 37376, 28928, 37632, 37888, 38144, 38400, 38656, 38912, 28928, 28928, 39168, 39424, 39680, 28928, 39936, 40192, 40448, 40704, 40960, 41216, 41472, 41728, 41984, 42240, 42496, 42752, 28928, 28928, 28928, @@ -1696,22 +1709,22 @@ static const utf8proc_uint16_t utf8proc_stage1table[] = { 13312, 13312, 13312, 13312, 13312, 13312, 13312, 43008, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, - 43264, 43520, 13312, 13312, 13312, 13312, 13312, 13312, + 13312, 43264, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, - 13312, 13312, 13312, 13312, 13312, 13312, 13312, 43776, + 13312, 13312, 13312, 13312, 13312, 13312, 13312, 43520, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, - 13312, 13312, 13312, 13312, 44032, 13312, 13312, 44288, + 13312, 13312, 13312, 13312, 43776, 13312, 13312, 44032, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, - 28928, 44544, 44800, 45056, 28928, 28928, 28928, 28928, + 28928, 44288, 44544, 44800, 28928, 28928, 28928, 28928, 28928, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, - 13312, 13312, 13312, 13312, 45312, 13312, 13312, 13312, + 13312, 13312, 13312, 13312, 45056, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, - 13312, 13312, 13312, 13312, 45568, 28928, 28928, 28928, - 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, - 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, + 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, + 13312, 13312, 13312, 13312, 13312, 13312, 13312, 13312, + 13312, 13312, 13312, 13312, 13312, 45312, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, @@ -2057,7 +2070,7 @@ static const utf8proc_uint16_t utf8proc_stage1table[] = { 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, - 28928, 45824, 46080, 28928, 28928, 28928, 28928, 28928, + 28928, 45568, 45824, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, 28928, @@ -2121,7 +2134,7 @@ static const utf8proc_uint16_t utf8proc_stage1table[] = { 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, - 46336, 18176, 18176, 18176, 18176, 18176, 18176, 18176, + 46080, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, @@ -2153,7 +2166,7 @@ static const utf8proc_uint16_t utf8proc_stage1table[] = { 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, 18176, - 46336, }; + 46080, }; static const utf8proc_uint16_t utf8proc_stage2table[] = { 1, 1, 1, 1, 1, 1, 1, @@ -2238,357 +2251,357 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, - 557, 558, 559, 560, 561, 349, 562, 563, - 564, 565, 566, 567, 568, 569, 570, 571, - 572, 573, 574, 575, 576, 577, 578, 579, - 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 593, 594, 595, - 596, 597, 598, 598, 599, 599, 599, 599, - 599, 600, 601, 46, 46, 602, 46, 598, - 603, 598, 603, 603, 603, 598, 603, 598, - 598, 604, 599, 46, 46, 46, 46, 46, - 46, 605, 606, 607, 608, 609, 610, 46, - 602, 611, 612, 613, 614, 615, 46, 46, - 46, 46, 46, 46, 46, 598, 46, 599, + 557, 558, 559, 560, 561, 349, 349, 562, + 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 597, 598, 598, 598, 598, + 598, 599, 600, 46, 46, 601, 46, 597, + 602, 597, 602, 602, 602, 597, 602, 597, + 597, 603, 598, 46, 46, 46, 46, 46, + 46, 604, 605, 606, 607, 608, 609, 46, + 601, 610, 611, 612, 613, 614, 46, 46, + 46, 46, 46, 46, 46, 597, 46, 598, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 616, 616, 616, 616, 616, 617, 616, - 616, 616, 616, 616, 616, 616, 617, 617, - 616, 617, 616, 617, 616, 616, 618, 619, - 619, 619, 619, 618, 620, 619, 619, 619, - 619, 619, 621, 621, 622, 622, 622, 622, - 623, 623, 619, 619, 619, 619, 622, 622, - 619, 622, 622, 619, 619, 624, 624, 624, - 624, 625, 619, 619, 619, 619, 617, 617, - 617, 626, 627, 616, 628, 629, 630, 617, - 619, 619, 619, 617, 617, 617, 619, 619, - 631, 617, 617, 617, 619, 619, 619, 619, - 617, 618, 619, 619, 617, 632, 633, 633, - 632, 633, 633, 632, 617, 617, 617, 617, - 617, 617, 617, 617, 617, 617, 617, 617, - 617, 634, 635, 636, 637, 638, 46, 639, - 640, 0, 0, 641, 642, 643, 644, 645, - 646, 0, 0, 0, 0, 647, 648, 649, - 650, 651, 652, 653, 0, 654, 0, 655, - 656, 657, 658, 659, 660, 661, 662, 663, - 664, 665, 666, 667, 668, 669, 670, 671, - 672, 673, 674, 0, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, - 687, 688, 689, 690, 691, 692, 693, 694, - 695, 696, 697, 698, 699, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, - 735, 736, 737, 738, 739, 740, 741, 742, - 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 74, - 758, 759, 760, 761, 762, 763, 764, 765, - 766, 767, 768, 769, 770, 771, 772, 773, - 774, 775, 776, 777, 778, 779, 780, 781, - 782, 783, 784, 785, 786, 787, 788, 789, - 790, 791, 792, 793, 794, 795, 796, 797, - 798, 799, 800, 801, 802, 803, 804, 805, - 806, 807, 808, 809, 810, 811, 812, 813, - 814, 815, 816, 817, 818, 819, 820, 821, - 822, 823, 824, 825, 826, 827, 828, 829, - 830, 831, 832, 833, 834, 835, 836, 837, - 838, 839, 840, 841, 842, 843, 844, 845, - 846, 847, 848, 849, 850, 851, 852, 853, - 854, 855, 856, 857, 858, 859, 860, 861, - 862, 863, 864, 865, 866, 867, 868, 869, - 870, 871, 872, 873, 874, 875, 876, 877, - 878, 879, 880, 881, 882, 883, 884, 885, - 886, 887, 888, 889, 890, 891, 892, 893, - 894, 895, 896, 897, 898, 898, 898, 898, - 898, 899, 899, 900, 901, 902, 903, 904, - 905, 906, 907, 908, 909, 910, 911, 912, - 913, 914, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 924, 925, 926, 927, 928, - 929, 930, 931, 932, 933, 934, 935, 936, - 937, 938, 939, 940, 941, 942, 943, 944, - 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, - 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, - 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, - 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, - 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, - 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, - 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, - 1065, 0, 1066, 1067, 1068, 1069, 1070, 1071, - 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, - 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, - 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, - 0, 0, 599, 1104, 1104, 1104, 1104, 1104, - 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, - 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, - 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, - 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, - 1144, 1145, 1104, 1146, 0, 0, 78, 78, - 10, 0, 1147, 898, 898, 898, 898, 1147, - 898, 898, 898, 1148, 1147, 898, 898, 898, - 898, 898, 898, 1147, 1147, 1147, 1147, 1147, - 1147, 898, 898, 1147, 898, 898, 1148, 1149, - 898, 1150, 1151, 1152, 1153, 1154, 1155, 1156, - 1157, 1158, 1159, 1159, 1160, 1161, 1162, 1163, - 1164, 1165, 1166, 1167, 1165, 898, 1147, 1165, - 1158, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 0, 0, 0, 0, - 1168, 1168, 1168, 1168, 1165, 1165, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1169, 1169, 1169, 1169, 1169, 1169, 74, - 74, 1170, 9, 9, 1171, 14, 1172, 78, - 78, 898, 898, 898, 898, 898, 898, 898, - 898, 1173, 1174, 1175, 1172, 1176, 1172, 1172, - 1172, 1177, 1177, 1178, 1179, 1180, 1181, 1182, - 1183, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1184, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1185, 1177, 1186, 1187, 1188, 1189, 1173, - 1174, 1175, 1190, 1191, 1192, 1192, 1193, 1147, - 898, 898, 898, 898, 898, 1147, 898, 898, - 1147, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - 1194, 1194, 1194, 9, 1195, 1195, 1172, 1177, - 1177, 1196, 1177, 1177, 1177, 1177, 1197, 1198, - 1199, 1200, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1201, 1202, 1203, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1204, 1205, 1172, 1206, 898, - 898, 898, 898, 898, 898, 898, 1169, 78, - 898, 898, 898, 898, 1147, 898, 1184, 1184, - 898, 898, 78, 1147, 898, 898, 1147, 1177, - 1177, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 1177, 1177, 1177, 1207, 1207, - 1177, 1172, 1172, 1172, 1172, 1172, 1172, 1172, - 1172, 1172, 1172, 1172, 1172, 1172, 1172, 0, - 1208, 1177, 1209, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 898, 1147, 898, 898, 1147, 898, 898, - 1147, 1147, 1147, 898, 1147, 1147, 898, 1147, - 898, 898, 898, 1147, 898, 1147, 898, 1147, - 898, 1147, 898, 898, 0, 0, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1177, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1211, 1211, 1211, 1211, 1211, 1211, 1211, - 1211, 1211, 1211, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 898, 898, 898, 898, - 898, 898, 898, 1147, 898, 1212, 1212, 78, - 8, 8, 8, 1212, 0, 0, 1147, 1213, - 1213, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 898, - 898, 898, 898, 1212, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 1212, 898, 898, - 898, 1212, 898, 898, 898, 898, 898, 0, - 0, 1165, 1165, 1165, 1165, 1165, 1165, 1165, - 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1147, 1147, 1147, 0, 0, 1165, - 0, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 0, 0, 0, 0, - 0, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1214, 1177, 1177, 1177, 1177, 1177, 1177, - 0, 1169, 1169, 0, 0, 0, 0, 0, - 898, 898, 1147, 1147, 1147, 898, 898, 898, - 898, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1184, 898, 898, 898, 898, 898, - 1147, 1147, 1147, 1147, 1147, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 1169, 1147, 898, 898, 1147, - 898, 898, 1147, 898, 898, 898, 1147, 1147, - 1147, 1187, 1188, 1189, 898, 898, 898, 1147, - 898, 898, 1147, 1147, 898, 898, 898, 898, - 898, 1210, 1210, 1210, 1215, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1217, 1218, 1216, 1216, 1216, 1216, 1216, - 1216, 1219, 1220, 1216, 1221, 1222, 1216, 1216, - 1216, 1216, 1216, 1210, 1215, 1223, 349, 1215, - 1215, 1215, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1215, 1215, 1215, 1215, 1224, 1215, - 1215, 349, 898, 1147, 898, 898, 1210, 1210, - 1210, 1225, 1226, 1227, 1228, 1229, 1230, 1231, - 1232, 349, 349, 1210, 1210, 1104, 1104, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1104, 599, 349, 349, 349, 349, 349, - 349, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 349, 1210, 1215, 1215, 0, 349, 349, + 46, 615, 615, 615, 615, 615, 616, 615, + 615, 615, 615, 615, 615, 615, 616, 616, + 615, 616, 615, 616, 615, 615, 617, 618, + 618, 618, 618, 617, 619, 618, 618, 618, + 618, 618, 620, 620, 621, 621, 621, 621, + 622, 622, 618, 618, 618, 618, 621, 621, + 618, 621, 621, 618, 618, 623, 623, 623, + 623, 624, 618, 618, 618, 618, 616, 616, + 616, 625, 626, 615, 627, 628, 629, 616, + 618, 618, 618, 616, 616, 616, 618, 618, + 630, 616, 616, 616, 618, 618, 618, 618, + 616, 617, 618, 618, 616, 631, 632, 632, + 631, 632, 632, 631, 616, 616, 616, 616, + 616, 616, 616, 616, 616, 616, 616, 616, + 616, 633, 634, 635, 636, 637, 46, 638, + 639, 0, 0, 640, 641, 642, 643, 644, + 645, 0, 0, 0, 0, 646, 647, 648, + 649, 650, 651, 652, 0, 653, 0, 654, + 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 0, 674, 675, 676, 677, + 678, 679, 680, 681, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 755, 756, 74, + 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, + 781, 782, 783, 784, 785, 786, 787, 788, + 789, 790, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 804, + 805, 806, 807, 808, 809, 810, 811, 812, + 813, 814, 815, 816, 817, 818, 819, 820, + 821, 822, 823, 824, 825, 826, 827, 828, + 829, 830, 831, 832, 833, 834, 835, 836, + 837, 838, 839, 840, 841, 842, 843, 844, + 845, 846, 847, 848, 849, 850, 851, 852, + 853, 854, 855, 856, 857, 858, 859, 860, + 861, 862, 863, 864, 865, 866, 867, 868, + 869, 870, 871, 872, 873, 874, 875, 876, + 877, 878, 879, 880, 881, 882, 883, 884, + 885, 886, 887, 888, 889, 890, 891, 892, + 893, 894, 895, 896, 897, 897, 897, 897, + 897, 898, 898, 899, 900, 901, 902, 903, + 904, 905, 906, 907, 908, 909, 910, 911, + 912, 913, 914, 915, 916, 917, 918, 919, + 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 930, 931, 932, 933, 934, 935, + 936, 937, 938, 939, 940, 941, 942, 943, + 944, 945, 946, 947, 948, 949, 950, 951, + 952, 953, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 975, + 976, 977, 978, 979, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, + 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, + 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, + 1064, 0, 1065, 1066, 1067, 1068, 1069, 1070, + 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, + 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, + 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 0, 0, 598, 1103, 1103, 1103, 1103, 1103, + 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, + 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, + 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, + 1143, 1144, 1103, 1145, 0, 0, 78, 78, + 10, 0, 1146, 897, 897, 897, 897, 1146, + 897, 897, 897, 1147, 1146, 897, 897, 897, + 897, 897, 897, 1146, 1146, 1146, 1146, 1146, + 1146, 897, 897, 1146, 897, 897, 1147, 1148, + 897, 1149, 1150, 1151, 1152, 1153, 1154, 1155, + 1156, 1157, 1158, 1158, 1159, 1160, 1161, 1162, + 1163, 1164, 1165, 1166, 1164, 897, 1146, 1164, + 1157, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 0, 0, 0, 0, + 1167, 1167, 1167, 1167, 1164, 1164, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1168, 1168, 1168, 1168, 1168, 1168, 74, + 74, 1169, 9, 9, 1170, 14, 1171, 78, + 78, 897, 897, 897, 897, 897, 897, 897, + 897, 1172, 1173, 1174, 1171, 1175, 1171, 1171, + 1171, 1176, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1183, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1184, 1176, 1185, 1186, 1187, 1188, 1172, + 1173, 1174, 1189, 1190, 1191, 1191, 1192, 1146, + 897, 897, 897, 897, 897, 1146, 897, 897, + 1146, 1193, 1193, 1193, 1193, 1193, 1193, 1193, + 1193, 1193, 1193, 9, 1194, 1194, 1171, 1176, + 1176, 1195, 1176, 1176, 1176, 1176, 1196, 1197, + 1198, 1199, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1200, 1201, 1202, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1203, 1204, 1171, 1205, 897, + 897, 897, 897, 897, 897, 897, 1168, 78, + 897, 897, 897, 897, 1146, 897, 1183, 1183, + 897, 897, 78, 1146, 897, 897, 1146, 1176, + 1176, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 1176, 1176, 1176, 1206, 1206, + 1176, 1171, 1171, 1171, 1171, 1171, 1171, 1171, + 1171, 1171, 1171, 1171, 1171, 1171, 1171, 0, + 1207, 1176, 1208, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 897, 1146, 897, 897, 1146, 897, 897, + 1146, 1146, 1146, 897, 1146, 1146, 897, 1146, + 897, 897, 897, 1146, 897, 1146, 897, 1146, + 897, 1146, 897, 897, 0, 0, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1210, 1210, 1210, 1210, 1210, 1210, 1210, + 1210, 1210, 1210, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 897, 897, 897, 897, + 897, 897, 897, 1146, 897, 1211, 1211, 78, + 8, 8, 8, 1211, 0, 0, 1146, 1212, + 1212, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 897, + 897, 897, 897, 1211, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 1211, 897, 897, + 897, 1211, 897, 897, 897, 897, 897, 0, + 0, 1164, 1164, 1164, 1164, 1164, 1164, 1164, + 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1146, 1146, 1146, 0, 0, 1164, + 0, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 0, 0, 0, 0, + 0, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1213, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1168, 1168, 0, 0, 0, 0, 0, + 897, 897, 1146, 1146, 1146, 897, 897, 897, + 897, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1183, 897, 897, 897, 897, 897, + 1146, 1146, 1146, 1146, 1146, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 1168, 1146, 897, 897, 1146, + 897, 897, 1146, 897, 897, 897, 1146, 1146, + 1146, 1186, 1187, 1188, 897, 897, 897, 1146, + 897, 897, 1146, 1146, 897, 897, 897, 897, + 897, 1209, 1209, 1209, 1214, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1216, 1217, 1215, 1215, 1215, 1215, 1215, + 1215, 1218, 1219, 1215, 1220, 1221, 1215, 1215, + 1215, 1215, 1215, 1209, 1214, 1222, 349, 1214, + 1214, 1214, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1214, 1214, 1214, 1214, 1223, 1214, + 1214, 349, 897, 1146, 897, 897, 1209, 1209, + 1209, 1224, 1225, 1226, 1227, 1228, 1229, 1230, + 1231, 349, 349, 1209, 1209, 1103, 1103, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1103, 598, 349, 349, 349, 349, 349, + 349, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 349, 1209, 1214, 1214, 0, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, - 349, 349, 0, 0, 349, 349, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 0, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 0, 1216, 0, 0, 0, 1216, - 1216, 1216, 1216, 0, 0, 1234, 349, 1235, - 1215, 1215, 1210, 1210, 1210, 1210, 0, 0, - 1236, 1215, 0, 0, 1237, 1238, 1224, 349, - 0, 0, 0, 0, 0, 0, 0, 0, - 1235, 0, 0, 0, 0, 1239, 1240, 0, - 1241, 349, 349, 1210, 1210, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1216, 1216, 10, 10, 1242, 1242, 1242, - 1242, 1242, 1242, 897, 10, 349, 1104, 898, - 0, 0, 1210, 1210, 1215, 0, 349, 349, + 349, 349, 0, 0, 349, 349, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 0, 0, 0, 1215, + 1215, 1215, 1215, 0, 0, 1233, 349, 1234, + 1214, 1214, 1209, 1209, 1209, 1209, 0, 0, + 1235, 1214, 0, 0, 1236, 1237, 1223, 349, + 0, 0, 0, 0, 0, 0, 0, 0, + 1234, 0, 0, 0, 0, 1238, 1239, 0, + 1240, 349, 349, 1209, 1209, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1215, 1215, 10, 10, 1241, 1241, 1241, + 1241, 1241, 1241, 896, 10, 349, 1103, 897, + 0, 0, 1209, 1209, 1214, 0, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 349, 349, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, - 349, 349, 0, 349, 1243, 0, 349, 1244, - 0, 349, 349, 0, 0, 1234, 0, 1215, - 1215, 1215, 1210, 1210, 0, 0, 0, 0, - 1210, 1210, 0, 0, 1210, 1210, 1245, 0, - 0, 0, 1210, 0, 0, 0, 0, 0, - 0, 0, 1246, 1247, 1248, 349, 0, 1249, - 0, 0, 0, 0, 0, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1210, 1210, 349, 349, 349, 1210, 1104, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1210, 1210, 1215, 0, 349, 349, + 349, 349, 0, 349, 1242, 0, 349, 1243, + 0, 349, 349, 0, 0, 1233, 0, 1214, + 1214, 1214, 1209, 1209, 0, 0, 0, 0, + 1209, 1209, 0, 0, 1209, 1209, 1244, 0, + 0, 0, 1209, 0, 0, 0, 0, 0, + 0, 0, 1245, 1246, 1247, 349, 0, 1248, + 0, 0, 0, 0, 0, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1209, 1209, 349, 349, 349, 1209, 1103, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1209, 1209, 1214, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, - 349, 349, 349, 0, 349, 349, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 0, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 0, 1216, 1216, 0, 1216, 1216, - 1216, 1216, 1216, 0, 0, 1234, 349, 1215, - 1215, 1215, 1210, 1210, 1210, 1210, 1210, 0, - 1210, 1210, 1215, 0, 1215, 1215, 1224, 0, + 349, 349, 349, 0, 349, 349, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 1215, 0, 1215, 1215, + 1215, 1215, 1215, 0, 0, 1233, 349, 1214, + 1214, 1214, 1209, 1209, 1209, 1209, 1209, 0, + 1209, 1209, 1214, 0, 1214, 1214, 1223, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 349, 349, 1210, 1210, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1104, 10, 0, 0, 0, 0, 0, - 0, 0, 1216, 1210, 1210, 1210, 1210, 1210, - 1210, 0, 1210, 1215, 1215, 0, 349, 349, + 0, 349, 349, 1209, 1209, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1103, 10, 0, 0, 0, 0, 0, + 0, 0, 1215, 1209, 1209, 1209, 1209, 1209, + 1209, 0, 1209, 1214, 1214, 0, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, - 349, 349, 0, 0, 349, 349, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 0, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 0, 1216, 1216, 0, 1216, 1216, - 1216, 1216, 1216, 0, 0, 1234, 349, 1235, - 1210, 1215, 1210, 1210, 1210, 1210, 0, 0, - 1250, 1251, 0, 0, 1252, 1253, 1224, 0, - 0, 0, 0, 0, 0, 0, 1210, 1254, - 1235, 0, 0, 0, 0, 1255, 1256, 0, - 1216, 349, 349, 1210, 1210, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 897, 1216, 1242, 1242, 1242, 1242, 1242, - 1242, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1210, 349, 0, 349, 349, + 349, 349, 0, 0, 349, 349, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 1215, 0, 1215, 1215, + 1215, 1215, 1215, 0, 0, 1233, 349, 1234, + 1209, 1214, 1209, 1209, 1209, 1209, 0, 0, + 1249, 1250, 0, 0, 1251, 1252, 1223, 0, + 0, 0, 0, 0, 0, 0, 1209, 1253, + 1234, 0, 0, 0, 0, 1254, 1255, 0, + 1215, 349, 349, 1209, 1209, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 896, 1215, 1241, 1241, 1241, 1241, 1241, + 1241, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1209, 349, 0, 349, 349, 349, 349, 349, 349, 0, 0, 0, 349, - 349, 349, 0, 1257, 349, 1258, 349, 0, + 349, 349, 0, 1256, 349, 1257, 349, 0, 0, 0, 349, 349, 0, 349, 0, 349, 349, 0, 0, 0, 349, 349, 0, 0, 0, 349, 349, 349, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 0, 0, 0, 0, 1235, - 1215, 1210, 1215, 1215, 0, 0, 0, 1259, - 1260, 1215, 0, 1261, 1262, 1263, 1245, 0, + 349, 349, 349, 0, 0, 0, 0, 1234, + 1214, 1209, 1214, 1214, 0, 0, 0, 1258, + 1259, 1214, 0, 1260, 1261, 1262, 1244, 0, 0, 349, 0, 0, 0, 0, 0, 0, - 1235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1242, 1242, 1242, 78, 78, 78, 78, + 1234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1241, 1241, 1241, 78, 78, 78, 78, 78, 78, 10, 78, 0, 0, 0, 0, - 0, 1210, 1215, 1215, 1215, 1210, 349, 349, + 0, 1209, 1214, 1214, 1214, 1209, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, - 349, 349, 0, 349, 349, 349, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 0, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 0, 0, 1234, 349, 1210, - 1210, 1210, 1215, 1215, 1215, 1215, 0, 1264, - 1210, 1265, 0, 1210, 1210, 1210, 1224, 0, - 0, 0, 0, 0, 0, 0, 1266, 1267, - 0, 1216, 1216, 1216, 0, 0, 349, 0, - 0, 349, 349, 1210, 1210, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 0, 0, 0, 0, 0, 0, 0, - 1104, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 897, 349, 1210, 1215, 1215, 1104, 349, 349, + 349, 349, 0, 349, 349, 349, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 0, 0, 1233, 349, 1209, + 1209, 1209, 1214, 1214, 1214, 1214, 0, 1263, + 1209, 1264, 0, 1209, 1209, 1209, 1223, 0, + 0, 0, 0, 0, 0, 0, 1265, 1266, + 0, 1215, 1215, 1215, 0, 349, 349, 0, + 0, 349, 349, 1209, 1209, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 0, 0, 0, 0, 0, 0, 0, + 1103, 1267, 1267, 1267, 1267, 1267, 1267, 1267, + 896, 349, 1209, 1214, 1214, 1103, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, - 349, 349, 349, 0, 0, 1234, 349, 1215, - 1269, 1270, 1215, 1235, 1215, 1215, 0, 1271, - 1272, 1273, 0, 1274, 1275, 1210, 1245, 0, - 0, 0, 0, 0, 0, 0, 1235, 1235, - 0, 0, 0, 0, 0, 0, 349, 349, - 0, 349, 349, 1210, 1210, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 0, 349, 349, 1215, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1210, 1210, 1215, 1215, 349, 349, 349, + 349, 349, 349, 0, 0, 1233, 349, 1214, + 1268, 1269, 1214, 1234, 1214, 1214, 0, 1270, + 1271, 1272, 0, 1273, 1274, 1209, 1244, 0, + 0, 0, 0, 0, 0, 0, 1234, 1234, + 0, 0, 0, 0, 0, 349, 349, 349, + 0, 349, 349, 1209, 1209, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 0, 349, 349, 1214, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1209, 1209, 1214, 1214, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, - 349, 349, 0, 349, 349, 349, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, - 1216, 1216, 1216, 1216, 1245, 1245, 349, 1235, - 1215, 1215, 1210, 1210, 1210, 1210, 0, 1276, - 1277, 1215, 0, 1278, 1279, 1280, 1224, 1281, - 897, 0, 0, 0, 0, 349, 349, 349, - 1235, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 349, 349, 349, 1210, 1210, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 897, 349, 349, 349, 349, 349, - 349, 0, 1210, 1215, 1215, 0, 349, 349, + 349, 349, 0, 349, 349, 349, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1244, 1244, 349, 1234, + 1214, 1214, 1209, 1209, 1209, 1209, 0, 1275, + 1276, 1214, 0, 1277, 1278, 1279, 1223, 1280, + 896, 0, 0, 0, 0, 349, 349, 349, + 1234, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 349, 349, 349, 1209, 1209, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 896, 349, 349, 349, 349, 349, + 349, 0, 1209, 1214, 1214, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 349, 349, 349, 349, 349, @@ -2597,12 +2610,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 0, 0, 349, 349, 349, 349, 349, 349, 349, - 0, 0, 0, 1282, 0, 0, 0, 0, - 1235, 1215, 1215, 1210, 1210, 1210, 0, 1210, - 0, 1215, 1283, 1284, 1215, 1285, 1286, 1287, - 1235, 0, 0, 0, 0, 0, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 0, 0, 1215, 1215, 1104, 0, 0, + 0, 0, 0, 1281, 0, 0, 0, 0, + 1234, 1214, 1214, 1209, 1209, 1209, 0, 1209, + 0, 1214, 1282, 1283, 1214, 1284, 1285, 1286, + 1234, 0, 0, 0, 0, 0, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 0, 0, 1214, 1214, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -2610,12 +2623,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1210, 349, 1288, 1210, 1210, 1210, - 1210, 1289, 1289, 1245, 0, 0, 0, 0, - 10, 349, 349, 349, 349, 349, 349, 599, - 1210, 1290, 1290, 1290, 1290, 1210, 1210, 1210, - 1104, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1104, 1104, 0, 0, 0, + 349, 349, 1209, 349, 1287, 1209, 1209, 1209, + 1209, 1288, 1288, 1244, 0, 0, 0, 0, + 10, 349, 349, 349, 349, 349, 349, 598, + 1209, 1289, 1289, 1289, 1289, 1209, 1209, 1209, + 1103, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2626,93 +2639,102 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1210, 349, 1291, 1210, 1210, 1210, - 1210, 1292, 1292, 1245, 1210, 1210, 349, 0, - 0, 349, 349, 349, 349, 349, 0, 599, - 0, 1293, 1293, 1293, 1293, 1210, 1210, 1210, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 1294, 1295, 349, + 349, 349, 1209, 349, 1290, 1209, 1209, 1209, + 1209, 1291, 1291, 1244, 1209, 1209, 349, 0, + 0, 349, 349, 349, 349, 349, 0, 598, + 0, 1292, 1292, 1292, 1292, 1209, 1209, 1209, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 1293, 1294, 349, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 349, 897, 897, 897, 1104, 1104, 1104, - 1104, 1104, 1104, 1104, 1104, 1296, 1104, 1104, - 1104, 1104, 1104, 1104, 897, 1104, 897, 897, - 897, 1147, 1147, 897, 897, 897, 897, 897, - 897, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 897, 1147, 897, - 1147, 897, 1297, 11, 12, 11, 12, 1215, - 1215, 349, 349, 349, 1298, 349, 349, 349, - 349, 0, 349, 349, 349, 349, 1299, 349, - 349, 349, 349, 1300, 349, 349, 349, 349, - 1301, 349, 349, 349, 349, 1302, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1303, 349, 349, 349, 0, 0, - 0, 0, 1304, 1305, 1306, 1307, 1308, 1309, - 1310, 1311, 1312, 1305, 1305, 1305, 1305, 1210, - 1215, 1305, 1313, 898, 898, 1245, 1104, 898, - 898, 349, 349, 349, 349, 349, 1210, 1210, - 1210, 1210, 1210, 1210, 1314, 1210, 1210, 1210, - 1210, 0, 1210, 1210, 1210, 1210, 1315, 1210, - 1210, 1210, 1210, 1316, 1210, 1210, 1210, 1210, - 1317, 1210, 1210, 1210, 1210, 1318, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1319, 1210, 1210, 1210, 0, 897, - 897, 897, 897, 897, 897, 897, 897, 1147, - 897, 897, 897, 897, 897, 897, 0, 897, - 897, 1104, 1104, 1104, 1104, 1104, 897, 897, - 897, 897, 1104, 1104, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 1320, 1321, - 349, 349, 349, 349, 1322, 1322, 1210, 1254, - 1210, 1210, 1215, 1210, 1210, 1210, 1210, 1210, - 1234, 1322, 1245, 1245, 1215, 1215, 1210, 1210, - 349, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1104, 1104, 1104, 1104, 1104, - 1104, 349, 349, 349, 349, 349, 349, 1215, - 1215, 1210, 1210, 349, 349, 349, 349, 1210, - 1210, 1210, 349, 1322, 1322, 1322, 349, 349, - 1322, 1322, 1322, 1322, 1322, 1322, 1322, 349, - 349, 349, 1210, 1210, 1210, 1210, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 1210, 1322, 1215, 1210, 1210, - 1322, 1322, 1322, 1322, 1322, 1322, 1147, 349, - 1322, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1322, 1322, 1322, 1210, 897, - 897, 1323, 1324, 1325, 1326, 1327, 1328, 1329, - 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, - 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, - 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, - 1354, 1355, 1356, 1357, 1358, 1359, 1360, 0, - 1361, 0, 0, 0, 0, 0, 1362, 0, - 0, 1363, 1364, 1365, 1366, 1367, 1368, 1369, - 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, - 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, - 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, - 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, - 1402, 1403, 1404, 1405, 1104, 1406, 1407, 1408, - 1409, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1411, 1412, 1413, 1413, 1413, 1413, 1413, 1413, + 0, 349, 896, 896, 896, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1295, 1103, 1103, + 1103, 1103, 1103, 1103, 896, 1103, 896, 896, + 896, 1146, 1146, 896, 896, 896, 896, 896, + 896, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 896, 1146, 896, + 1146, 896, 1296, 11, 12, 11, 12, 1214, + 1214, 349, 349, 349, 1297, 349, 349, 349, + 349, 0, 349, 349, 349, 349, 1298, 349, + 349, 349, 349, 1299, 349, 349, 349, 349, + 1300, 349, 349, 349, 349, 1301, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 1302, 349, 349, 349, 0, 0, + 0, 0, 1303, 1304, 1305, 1306, 1307, 1308, + 1309, 1310, 1311, 1304, 1304, 1304, 1304, 1209, + 1214, 1304, 1312, 897, 897, 1244, 1103, 897, + 897, 349, 349, 349, 349, 349, 1209, 1209, + 1209, 1209, 1209, 1209, 1313, 1209, 1209, 1209, + 1209, 0, 1209, 1209, 1209, 1209, 1314, 1209, + 1209, 1209, 1209, 1315, 1209, 1209, 1209, 1209, + 1316, 1209, 1209, 1209, 1209, 1317, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1318, 1209, 1209, 1209, 0, 896, + 896, 896, 896, 896, 896, 896, 896, 1146, + 896, 896, 896, 896, 896, 896, 0, 896, + 896, 1103, 1103, 1103, 1103, 1103, 896, 896, + 896, 896, 1103, 1103, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1319, 1320, + 1215, 1215, 1215, 1215, 1321, 1321, 1209, 1253, + 1209, 1209, 1214, 1209, 1209, 1209, 1209, 1209, + 1233, 1321, 1223, 1244, 1214, 1214, 1209, 1209, + 1215, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1103, 1103, 1103, 1103, 1103, + 1103, 1215, 1215, 1215, 1215, 1215, 1215, 1214, + 1214, 1209, 1209, 1215, 1215, 1215, 1215, 1209, + 1209, 1209, 1215, 1321, 1321, 1321, 1215, 1215, + 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1215, + 1215, 1215, 1209, 1209, 1209, 1209, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1209, 1321, 1214, 1209, 1209, + 1321, 1321, 1321, 1321, 1321, 1321, 1146, 1215, + 1321, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1321, 1321, 1321, 1209, 896, + 896, 1322, 1323, 1324, 1325, 1326, 1327, 1328, + 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, + 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, + 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, + 1353, 1354, 1355, 1356, 1357, 1358, 1359, 0, + 1360, 0, 0, 0, 0, 0, 1361, 0, + 0, 1362, 1363, 1364, 1365, 1366, 1367, 1368, + 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, + 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, + 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, + 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, + 1401, 1402, 1403, 1404, 1103, 1405, 1406, 1407, + 1408, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1410, 1411, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, @@ -2721,18 +2743,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, - 1413, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 349, 349, 349, 349, 349, 349, 349, + 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 1413, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -2775,28 +2788,28 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 0, 0, 898, 898, - 898, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 1104, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 0, 0, + 349, 349, 349, 349, 0, 0, 897, 897, + 897, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 1103, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, - 0, 1415, 1416, 1417, 1418, 1419, 1420, 1421, - 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, - 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, - 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, - 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, - 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, - 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, - 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, - 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, - 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, - 1494, 1495, 1496, 1497, 1498, 1499, 1500, 0, - 0, 1501, 1502, 1503, 1504, 1505, 1506, 0, - 0, 1146, 349, 349, 349, 349, 349, 349, + 0, 1414, 1415, 1416, 1417, 1418, 1419, 1420, + 1421, 1422, 1423, 1424, 1425, 1426, 1427, 1428, + 1429, 1430, 1431, 1432, 1433, 1434, 1435, 1436, + 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, + 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, + 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, + 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, + 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1476, + 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, + 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, + 1493, 1494, 1495, 1496, 1497, 1498, 1499, 0, + 0, 1500, 1501, 1502, 1503, 1504, 1505, 0, + 0, 1145, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -2873,7 +2886,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 897, 1104, + 349, 349, 349, 349, 349, 349, 896, 1103, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 7, 349, 349, 349, 349, 349, 349, @@ -2889,50 +2902,50 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1104, 1104, 1104, 1507, - 1507, 1507, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 1103, 1103, 1103, 1506, + 1506, 1506, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 1210, 1210, 1245, 1508, 0, + 349, 349, 349, 1209, 1209, 1244, 1507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 1210, 1210, 1508, 1104, 1104, + 349, 349, 349, 1209, 1209, 1507, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 1210, 1210, 0, 0, 0, + 349, 349, 349, 1209, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, - 349, 349, 0, 1210, 1210, 0, 0, 0, + 349, 349, 0, 1209, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1508, 1508, 1214, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1209, + 1214, 1214, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1223, 1209, 1103, 1103, 1103, + 598, 1103, 1103, 1103, 10, 349, 897, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 1267, 1267, 1267, 1267, 1267, 1267, 1267, + 1267, 1267, 1267, 0, 0, 0, 0, 0, + 0, 8, 8, 8, 8, 8, 8, 1145, + 8, 8, 8, 8, 1508, 1508, 1508, 1509, + 1508, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1509, 1509, 1215, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1210, - 1215, 1215, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1245, 1210, 1104, 1104, 1104, - 599, 1104, 1104, 1104, 10, 349, 898, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 0, 0, 0, 0, 0, - 0, 8, 8, 8, 8, 8, 8, 1146, - 8, 8, 8, 8, 1509, 1509, 1509, 1510, - 1509, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 599, 349, 349, 349, + 349, 349, 349, 349, 598, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -2940,12 +2953,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, - 0, 349, 349, 349, 349, 349, 1210, 1210, + 0, 349, 349, 349, 349, 349, 1209, 1209, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1149, 349, 0, 0, 0, 0, + 349, 349, 1148, 349, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -2960,13 +2973,13 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 0, 1210, 1210, 1210, 1215, 1215, 1215, 1215, - 1210, 1210, 1215, 1215, 1215, 0, 0, 0, - 0, 1215, 1215, 1210, 1215, 1215, 1215, 1215, - 1215, 1215, 1148, 898, 1147, 0, 0, 0, - 0, 78, 0, 0, 0, 8, 8, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 349, 349, 349, 349, 349, 349, 349, + 0, 1209, 1209, 1209, 1214, 1214, 1214, 1214, + 1209, 1209, 1214, 1214, 1214, 0, 0, 0, + 0, 1214, 1214, 1209, 1214, 1214, 1214, 1214, + 1214, 1214, 1147, 897, 1146, 0, 0, 0, + 0, 78, 0, 0, 0, 8, 8, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, @@ -2982,8 +2995,8 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1242, 0, 0, 0, 78, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1241, 0, 0, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -2991,132 +3004,132 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 898, 1147, 1215, 1215, 1210, 0, 0, 1104, - 1104, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 1215, 1210, - 1215, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 0, 1245, 1322, 1210, 1322, 1322, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1215, 1215, - 1215, 1215, 1215, 1215, 1210, 1210, 898, 898, - 898, 898, 898, 898, 898, 898, 0, 0, - 1147, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 599, 1104, 1104, 1104, 1104, 1104, 1104, 0, - 0, 898, 898, 898, 898, 898, 1147, 1147, - 1147, 1147, 1147, 1147, 898, 898, 1147, 899, - 1147, 1147, 898, 898, 1147, 1147, 898, 898, - 898, 898, 898, 1147, 898, 898, 898, 898, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 897, 1146, 1214, 1214, 1209, 0, 0, 1103, + 1103, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1214, 1209, + 1214, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 0, 1223, 1321, 1209, 1321, 1321, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1214, 1214, + 1214, 1214, 1214, 1214, 1209, 1209, 897, 897, + 897, 897, 897, 897, 897, 897, 0, 0, + 1146, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 598, 1103, 1103, 1103, 1103, 1103, 1103, 0, + 0, 897, 897, 897, 897, 897, 1146, 1146, + 1146, 1146, 1146, 1146, 897, 897, 1146, 898, + 1146, 1146, 897, 897, 1146, 1146, 897, 897, + 897, 897, 897, 1146, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 1146, 0, + 0, 897, 897, 897, 897, 897, 897, 1146, + 897, 897, 897, 897, 1510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1210, 1210, 1210, 1210, 1215, 1511, 1512, + 0, 1209, 1209, 1209, 1209, 1214, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, - 349, 349, 1521, 1522, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1234, 1235, 1210, - 1210, 1210, 1210, 1523, 1524, 1525, 1526, 1527, - 1528, 1529, 1530, 1531, 1532, 1508, 349, 349, - 349, 349, 349, 349, 349, 349, 0, 1104, - 1104, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1104, 1104, 1104, 1104, 1104, - 1104, 1104, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 898, 1147, 898, 898, - 898, 898, 898, 898, 898, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 1104, 1104, - 1104, 1210, 1210, 1215, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1215, 1210, 1210, 1210, 1210, 1215, - 1215, 1210, 1210, 1508, 1245, 1210, 1210, 349, - 349, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 1234, - 1215, 1210, 1210, 1215, 1215, 1215, 1210, 1215, - 1210, 1210, 1210, 1508, 1508, 0, 0, 0, - 0, 0, 0, 0, 0, 1104, 1104, 1104, - 1104, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1215, 1215, 1210, - 1234, 0, 0, 0, 1104, 1104, 1104, 1104, - 1104, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 349, 349, - 349, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 599, 599, 599, 599, 599, 599, 1104, - 1104, 1533, 1534, 1535, 1536, 1537, 1537, 1538, - 1539, 1540, 1541, 1542, 0, 0, 0, 0, - 0, 1543, 1544, 1545, 1546, 1547, 1548, 1549, - 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, - 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, - 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, - 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, - 1582, 1583, 1584, 1585, 0, 0, 1586, 1587, - 1588, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 0, 0, 0, 0, 0, 0, 0, - 0, 898, 898, 898, 1104, 1589, 1147, 1147, - 1147, 1147, 1147, 898, 898, 1147, 1147, 1147, - 1147, 898, 1215, 1589, 1589, 1589, 1589, 1589, - 1589, 1589, 349, 349, 349, 349, 1147, 349, - 349, 349, 349, 349, 349, 898, 349, 349, - 1215, 898, 898, 349, 0, 0, 0, 0, - 0, 1590, 1591, 1592, 1593, 1594, 1595, 1596, - 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, - 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, - 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, - 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, - 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, - 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, - 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, - 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, - 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, - 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, - 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, - 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, - 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, - 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, - 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, - 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, - 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, - 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, - 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, - 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, - 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, - 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, - 1781, 898, 898, 1147, 898, 898, 898, 898, - 898, 898, 898, 1147, 898, 898, 1782, 1783, - 1147, 1784, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 1785, - 1149, 1149, 1147, 1786, 898, 1787, 1147, 898, - 1147, 1788, 1789, 1790, 1791, 1792, 1793, 1794, + 349, 349, 1521, 1522, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1233, 1234, 1209, + 1209, 1209, 1209, 1523, 1524, 1525, 1526, 1527, + 1528, 1529, 1530, 1531, 1532, 1533, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 0, 1103, + 1103, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1103, 1103, 1103, 1103, 1103, + 1103, 1103, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 897, 1146, 897, 897, + 897, 897, 897, 897, 897, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 1103, 1103, + 1103, 1209, 1209, 1214, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1214, 1209, 1209, 1209, 1209, 1214, + 1214, 1209, 1209, 1507, 1223, 1209, 1209, 1215, + 1215, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 349, 1215, 1215, 1215, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 1233, + 1214, 1209, 1209, 1214, 1214, 1214, 1209, 1214, + 1209, 1209, 1209, 1507, 1507, 0, 0, 0, + 0, 0, 0, 0, 0, 1103, 1103, 1103, + 1103, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1214, 1214, 1209, + 1233, 0, 0, 0, 1103, 1103, 1103, 1103, + 1103, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 349, 349, + 349, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 598, 598, 598, 598, 598, 598, 1103, + 1103, 1534, 1535, 1536, 1537, 1538, 1538, 1539, + 1540, 1541, 1542, 1543, 0, 0, 0, 0, + 0, 1544, 1545, 1546, 1547, 1548, 1549, 1550, + 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, + 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, + 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, + 1583, 1584, 1585, 1586, 0, 0, 1587, 1588, + 1589, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 0, 0, 0, 0, 0, 0, 0, + 0, 897, 897, 897, 1103, 1590, 1146, 1146, + 1146, 1146, 1146, 897, 897, 1146, 1146, 1146, + 1146, 897, 1214, 1590, 1590, 1590, 1590, 1590, + 1590, 1590, 349, 349, 349, 349, 1146, 349, + 349, 349, 349, 349, 349, 897, 349, 349, + 1214, 897, 897, 349, 0, 0, 0, 0, + 0, 1591, 1592, 1593, 1594, 1595, 1596, 1597, + 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, + 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, + 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, + 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, + 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, + 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, + 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, + 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, + 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, + 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, + 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, + 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, + 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, + 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, + 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, + 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, + 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, + 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, + 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, + 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, + 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, + 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, + 1782, 897, 897, 1146, 897, 897, 897, 897, + 897, 897, 897, 1146, 897, 897, 1510, 1783, + 1146, 1784, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 1785, + 1148, 1148, 1146, 1786, 897, 1787, 1146, 897, + 1146, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, @@ -3181,8 +3194,8 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2264, 0, 0, 2265, 2266, 2267, 0, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 0, 2277, 2278, 2279, 2279, 2279, 2279, 2279, - 2280, 2279, 2279, 2279, 1510, 2281, 2282, 2283, - 2284, 2285, 2286, 1146, 2285, 2285, 2285, 76, + 2280, 2279, 2279, 2279, 1509, 2281, 2282, 2283, + 2284, 2285, 2286, 1145, 2285, 2285, 2285, 76, 2287, 2288, 2289, 2290, 2291, 2288, 2289, 2290, 2291, 76, 76, 76, 8, 2292, 2293, 2294, 76, 2295, 2296, 2297, 2298, 2299, 2300, 2301, @@ -3192,9 +3205,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2310, 2311, 2312, 8, 8, 8, 8, 8, 8, 8, 8, 74, 8, 47, 8, 8, 2313, 8, 8, 8, 8, 8, 8, 8, - 2279, 1510, 1510, 1510, 1510, 1510, 0, 2314, - 2315, 2316, 2317, 1510, 1510, 1510, 1510, 1510, - 1510, 2318, 2319, 0, 0, 2320, 2321, 2322, + 2279, 1509, 1509, 1509, 1509, 1509, 0, 2314, + 2315, 2316, 2317, 1509, 1509, 1509, 1509, 1509, + 1509, 2318, 2319, 0, 0, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, @@ -3204,13 +3217,13 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 10, 2360, 10, 10, 10, 77, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 0, 0, 0, 0, 0, 0, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 898, 898, 1589, 1589, 898, 898, 898, - 898, 1589, 1589, 1589, 898, 898, 899, 899, - 899, 899, 898, 899, 899, 899, 1589, 1589, - 898, 1147, 898, 1589, 1589, 1147, 1147, 1147, - 1147, 898, 0, 0, 0, 0, 0, 0, + 0, 897, 897, 1590, 1590, 897, 897, 897, + 897, 1590, 1590, 1590, 897, 897, 898, 898, + 898, 898, 897, 898, 898, 898, 1590, 1590, + 897, 1146, 897, 1590, 1590, 1146, 1146, 1146, + 1146, 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2361, 2362, 2363, 2364, 78, 2365, 2366, 2367, 78, 2368, 2369, 2370, 2371, 2372, 2373, @@ -3222,14 +3235,14 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2405, 2406, 2407, 78, 2408, 2409, 2410, 2411, 2412, 2413, 74, 74, 74, 74, 2414, 2415, 2416, 2417, 2418, 78, 74, 78, 78, 2419, - 897, 2420, 2421, 2422, 2423, 2424, 2425, 2426, + 896, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, - 2467, 1507, 1507, 1507, 2468, 2469, 1507, 1507, - 1507, 1507, 2470, 78, 78, 0, 0, 0, + 2467, 1506, 1506, 1506, 2468, 2469, 1506, 1506, + 1506, 1506, 2470, 78, 78, 0, 0, 0, 0, 2471, 122, 2472, 122, 2473, 84, 84, 84, 84, 84, 2474, 2475, 78, 78, 78, 78, 74, 78, 78, 74, 78, 78, 74, @@ -3282,19 +3295,19 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 2564, 2564, 78, 78, 78, 78, 2484, 2484, 78, 78, 78, 78, 78, 78, 80, 2565, 2566, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 78, 74, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 78, 74, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 80, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 897, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 896, 78, 78, 78, 78, 78, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, @@ -3372,41 +3385,41 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 2477, 78, 78, 78, 78, 78, 78, 78, 78, 74, 74, 74, 2707, 2707, 2708, 2708, - 74, 80, 80, 80, 80, 80, 84, 2477, - 80, 80, 84, 80, 80, 80, 80, 84, - 84, 80, 80, 80, 78, 2564, 2564, 80, - 80, 80, 80, 80, 80, 84, 80, 84, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 80, 80, 80, 80, 80, 80, 80, - 80, 84, 80, 84, 80, 80, 80, 80, - 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 2564, 2564, 2564, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 84, 84, 80, 84, 84, 84, 80, - 84, 84, 84, 84, 80, 84, 84, 80, - 2709, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 2564, 80, 80, 80, 80, 80, 80, 78, - 78, 78, 78, 2710, 2710, 2710, 2710, 2710, - 2710, 80, 80, 80, 2564, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 84, - 84, 80, 2564, 80, 80, 80, 80, 80, - 80, 80, 80, 2564, 2564, 2711, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 2564, 2564, - 84, 80, 80, 80, 80, 2564, 2564, 84, - 84, 84, 84, 84, 84, 84, 84, 2564, - 84, 84, 84, 84, 84, 2564, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 80, 84, 80, 80, 80, - 80, 84, 84, 2564, 84, 84, 84, 84, - 84, 84, 84, 2564, 2564, 84, 2564, 84, - 84, 84, 84, 2564, 84, 84, 2564, 84, - 84, 80, 80, 80, 80, 80, 2564, 78, - 78, 80, 80, 2564, 2564, 80, 80, 80, - 80, 80, 80, 80, 78, 80, 78, 80, + 74, 80, 80, 80, 80, 80, 2477, 2477, + 78, 78, 2477, 78, 78, 78, 78, 84, + 2477, 78, 80, 78, 78, 2564, 2564, 78, + 78, 80, 78, 78, 78, 2477, 80, 2477, + 78, 80, 78, 80, 80, 78, 78, 80, + 78, 78, 78, 80, 78, 78, 78, 80, + 80, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 80, 80, 80, 78, 78, 78, 78, + 78, 84, 78, 84, 78, 78, 78, 78, + 78, 2564, 2564, 2564, 2564, 2564, 2564, 2564, + 2564, 2564, 2564, 2564, 2564, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 80, 84, 2477, 78, 84, 2477, 84, 80, + 2477, 84, 2477, 2477, 78, 2477, 2477, 78, + 122, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 80, 78, 78, 80, + 2564, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 2709, 2709, 2709, 2709, 2709, + 2709, 78, 78, 80, 2564, 80, 80, 80, + 80, 78, 80, 78, 80, 80, 78, 2477, + 2477, 80, 2564, 78, 78, 78, 78, 78, + 80, 78, 78, 2564, 2564, 896, 78, 78, + 78, 80, 80, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 2564, 2564, + 2477, 78, 78, 78, 78, 2564, 2564, 2477, + 2477, 84, 2477, 2477, 2477, 2477, 2477, 2564, + 84, 2477, 84, 2477, 84, 2564, 2477, 2477, + 2477, 2477, 2477, 2477, 2477, 2477, 2477, 2477, + 2477, 2477, 2477, 78, 2477, 78, 78, 78, + 78, 2477, 84, 2564, 2477, 2477, 2477, 2477, + 2477, 84, 84, 2564, 2564, 84, 2564, 2477, + 84, 84, 84, 2564, 2477, 2477, 2564, 2477, + 2477, 78, 78, 80, 78, 78, 2564, 78, + 78, 80, 80, 2564, 2564, 80, 80, 78, + 80, 78, 78, 80, 78, 80, 78, 80, 78, 78, 78, 78, 78, 78, 80, 78, 78, 78, 80, 78, 78, 78, 78, 78, 78, 2564, 78, 78, 78, 78, 78, 78, @@ -3416,13 +3429,13 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 80, 78, 78, 78, 78, 2564, 78, 2564, 78, 78, 78, 78, 2564, 2564, 2564, 78, 2564, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 80, 80, 80, 80, - 80, 11, 12, 11, 12, 11, 12, 11, + 78, 78, 78, 78, 80, 80, 78, 78, + 78, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 2706, 2706, 2706, 2706, 2706, 2706, 2706, 2706, 2706, - 2706, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 78, 2564, 2564, + 2706, 1267, 1267, 1267, 1267, 1267, 1267, 1267, + 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, + 1267, 1267, 1267, 1267, 1267, 78, 2564, 2564, 2564, 78, 78, 78, 78, 78, 78, 78, 78, 78, 80, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -3436,39 +3449,39 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 12, 11, 12, 11, 12, 11, 12, 11, 12, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 74, 74, 74, 74, 74, 74, 74, + 74, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, @@ -3501,7 +3514,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 74, 74, 74, 74, 74, 2484, 2484, 2484, 2484, 2484, 2484, 74, 74, 11, 12, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 2484, 2484, 2712, 2484, 2484, + 74, 74, 74, 2484, 2484, 2710, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 74, 2484, 2484, 2484, 2484, 74, 74, 2484, 74, 2484, @@ -3514,7 +3527,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2484, 2484, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2484, 2484, 74, 74, 74, 74, 2484, 2484, 2484, 2484, 74, - 2484, 2484, 74, 74, 2484, 2713, 2714, 2715, + 2484, 2484, 74, 74, 2484, 2711, 2712, 2713, 74, 74, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, @@ -3527,7 +3540,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, 2484, - 74, 74, 74, 74, 74, 2716, 74, 2484, + 74, 74, 74, 74, 74, 2714, 74, 2484, 74, 74, 74, 2484, 2484, 2484, 2484, 2484, 74, 74, 74, 74, 74, 2484, 2484, 2484, 74, 74, 74, 74, 2484, 74, 74, 74, @@ -3550,7 +3563,6 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -3563,45 +3575,46 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 2717, - 78, 2718, 2719, 2720, 2721, 2722, 2723, 2724, - 2725, 2726, 2727, 2728, 2729, 2730, 2731, 2732, - 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, - 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, - 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, - 2757, 2758, 2759, 2760, 2761, 2762, 2763, 2764, - 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, - 2773, 2774, 2775, 2776, 2777, 2778, 2779, 2780, - 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, - 2789, 2790, 2791, 2792, 2793, 2794, 2795, 2796, - 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, - 2805, 2806, 2807, 2808, 2809, 2810, 2811, 2812, - 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, - 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, - 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, - 2837, 2838, 2839, 2840, 2841, 2842, 2843, 2844, - 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, - 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, - 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, - 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, - 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, - 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, - 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, - 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, - 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, - 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, - 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, - 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, - 2941, 2942, 2943, 2944, 2945, 2946, 78, 78, - 78, 78, 78, 78, 2947, 2948, 2949, 2950, - 898, 898, 898, 2951, 2952, 0, 0, 0, - 0, 0, 8, 8, 8, 8, 1268, 8, - 8, 2953, 2954, 2955, 2956, 2957, 2958, 2959, - 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, - 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, - 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, - 2984, 2985, 2986, 2987, 2988, 2989, 2990, 0, - 2991, 0, 0, 0, 0, 0, 2992, 0, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 2715, + 78, 2716, 2717, 2718, 2719, 2720, 2721, 2722, + 2723, 2724, 2725, 2726, 2727, 2728, 2729, 2730, + 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, + 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, + 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, + 2755, 2756, 2757, 2758, 2759, 2760, 2761, 2762, + 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, + 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, + 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, + 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, + 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, + 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, + 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, + 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, + 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, + 2835, 2836, 2837, 2838, 2839, 2840, 2841, 2842, + 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, + 2851, 2852, 2853, 2854, 2855, 2856, 2857, 2858, + 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, + 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, + 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, + 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, + 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, + 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, + 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, + 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, + 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, + 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, + 2939, 2940, 2941, 2942, 2943, 2944, 78, 78, + 78, 78, 78, 78, 2945, 2946, 2947, 2948, + 897, 897, 897, 2949, 2950, 0, 0, 0, + 0, 0, 8, 8, 8, 8, 1267, 8, + 8, 2951, 2952, 2953, 2954, 2955, 2956, 2957, + 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, + 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, + 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, + 2982, 2983, 2984, 2985, 2986, 2987, 2988, 0, + 2989, 0, 0, 0, 0, 0, 2990, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -3610,9 +3623,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, - 2993, 1104, 0, 0, 0, 0, 0, 0, + 2991, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1245, 349, 349, 349, 349, 349, 349, 349, + 1244, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3624,351 +3637,351 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, - 0, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 8, 8, 82, 95, 82, 95, 8, + 0, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 8, 8, 82, 95, 82, 95, 8, 8, 8, 82, 95, 8, 82, 95, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 1146, 8, 8, 1146, 8, 82, 95, 8, + 1145, 8, 8, 1145, 8, 82, 95, 8, 8, 82, 95, 11, 12, 11, 12, 11, 12, 11, 12, 8, 8, 8, 8, 8, - 598, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 1146, 1146, 8, 8, 8, - 8, 1146, 8, 2290, 8, 8, 8, 8, + 597, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 1145, 1145, 8, 8, 8, + 8, 1145, 8, 2290, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 78, 78, 8, 8, 8, 11, 12, - 11, 12, 11, 12, 11, 12, 1146, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 0, 2710, 2710, 2710, 2710, - 2994, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2995, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2996, 2997, 2998, 2999, 3000, 3001, 3002, - 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, - 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, - 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, - 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, - 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, - 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, - 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, - 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, - 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074, - 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, - 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, - 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, - 3099, 3100, 3101, 3102, 3103, 3104, 3105, 3106, - 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, - 3115, 3116, 3117, 3118, 3119, 3120, 3121, 3122, - 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, - 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, - 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, - 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, - 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, - 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, - 3171, 3172, 3173, 3174, 3175, 3176, 3177, 3178, - 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, - 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, - 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, - 3203, 3204, 3205, 3206, 3207, 3208, 3209, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 3210, 3211, 3211, 3211, 2710, 3212, 3213, - 3214, 3215, 3216, 3215, 3216, 3215, 3216, 3215, - 3216, 3215, 3216, 2710, 2710, 3215, 3216, 3215, - 3216, 3215, 3216, 3215, 3216, 3217, 3218, 3219, - 3219, 2710, 3214, 3214, 3214, 3214, 3214, 3214, - 3214, 3214, 3214, 1786, 1149, 1785, 1148, 3220, - 3220, 3221, 3212, 3212, 3212, 3212, 3212, 3222, - 2710, 3223, 3224, 3225, 3212, 3213, 3226, 2710, - 78, 0, 3213, 3213, 3213, 3213, 3213, 3227, - 3213, 3213, 3213, 3213, 3228, 3229, 3230, 3231, - 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, - 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, - 3248, 3249, 3250, 3251, 3213, 3252, 3253, 3254, - 3255, 3256, 3257, 3213, 3213, 3213, 3213, 3213, - 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, - 3266, 3267, 3268, 3269, 3270, 3271, 3272, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3273, 3213, 3213, - 0, 0, 3274, 3274, 3275, 3276, 3277, 3278, - 3279, 3217, 3213, 3213, 3213, 3213, 3213, 3280, - 3213, 3213, 3213, 3213, 3281, 3282, 3283, 3284, - 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, - 3293, 3294, 3295, 3296, 3297, 3298, 3299, 3300, - 3301, 3302, 3303, 3304, 3213, 3305, 3306, 3307, - 3308, 3309, 3310, 3213, 3213, 3213, 3213, 3213, - 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, - 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3326, 3327, 3328, 3329, 3213, 3330, 3213, 3213, - 3331, 3332, 3333, 3334, 3211, 3212, 3335, 3336, - 3337, 0, 0, 0, 0, 0, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 0, 3338, 3339, 3340, 3341, 3342, 3343, - 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, - 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, - 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, - 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, - 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, - 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, - 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, - 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, - 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, - 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, - 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, - 0, 3432, 3432, 3433, 3434, 3435, 3436, 3437, - 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, - 3446, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 2710, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3447, 3448, 3449, 3450, 3451, 3452, 3453, - 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, - 3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, - 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, - 0, 3478, 3479, 3480, 3481, 3482, 3483, 3484, - 3485, 3486, 3487, 3488, 3489, 3490, 3491, 3492, - 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, - 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, - 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, - 3517, 3518, 3518, 3518, 3518, 3518, 3518, 3518, - 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, - 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, - 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, - 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, - 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, - 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, - 3432, 3566, 3567, 3568, 3569, 3570, 3571, 3572, - 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, - 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588, - 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, - 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, - 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, - 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, - 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, - 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, - 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, - 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, - 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, - 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, - 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, - 3677, 3678, 3679, 3680, 3681, 3682, 3683, 3684, - 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, - 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, - 3701, 3702, 3703, 3704, 3705, 3706, 3707, 3708, - 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, - 3717, 3718, 3719, 3720, 3721, 3722, 3723, 3724, - 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, - 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, - 3741, 3742, 3743, 3744, 3745, 3746, 3747, 3748, - 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, - 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, - 3765, 3766, 3767, 3768, 3769, 3770, 3771, 3772, - 3773, 3774, 3775, 3776, 3777, 3778, 3779, 3780, - 3781, 3782, 3783, 3784, 3785, 3786, 3787, 3788, - 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, - 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3804, - 3805, 3806, 3807, 3808, 3809, 3810, 3811, 3812, - 3813, 3814, 3815, 3816, 3817, 3818, 3819, 3820, - 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, - 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, - 3837, 3838, 3839, 3840, 3841, 3842, 3843, 3844, - 3845, 3846, 3847, 3848, 3849, 3850, 3851, 3852, - 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, - 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, - 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, - 3877, 3878, 3879, 3880, 3881, 3882, 3883, 3884, - 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, - 3893, 3894, 3895, 3896, 3897, 3898, 3899, 3900, - 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, - 3909, 3910, 3911, 3912, 3913, 3914, 3915, 3916, - 3917, 3918, 3919, 3920, 3921, 3922, 3923, 3924, - 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, - 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, - 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, - 3949, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3212, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 0, 0, - 0, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, + 11, 12, 11, 12, 11, 12, 1145, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 0, 2709, 2709, 2709, 2709, + 2992, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2993, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2994, 2995, 2996, 2997, 2998, 2999, 3000, + 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, + 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, + 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, + 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, + 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, + 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, + 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, + 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, + 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, + 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, + 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, + 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, + 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, + 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, + 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, + 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, + 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, + 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, + 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, + 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, + 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, + 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, + 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, + 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, + 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, + 3201, 3202, 3203, 3204, 3205, 3206, 3207, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 3208, 3209, 3209, 3209, 2709, 3210, 3211, + 3212, 3213, 3214, 3213, 3214, 3213, 3214, 3213, + 3214, 3213, 3214, 2709, 2709, 3213, 3214, 3213, + 3214, 3213, 3214, 3213, 3214, 3215, 3216, 3217, + 3217, 2709, 3212, 3212, 3212, 3212, 3212, 3212, + 3212, 3212, 3212, 1786, 1148, 1785, 1147, 3218, + 3218, 3219, 3210, 3210, 3210, 3210, 3210, 3220, + 2709, 3221, 3222, 3223, 3210, 3211, 3224, 2709, + 78, 0, 3211, 3211, 3211, 3211, 3211, 3225, + 3211, 3211, 3211, 3211, 3226, 3227, 3228, 3229, + 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, + 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, + 3246, 3247, 3248, 3249, 3211, 3250, 3251, 3252, + 3253, 3254, 3255, 3211, 3211, 3211, 3211, 3211, + 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, + 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3271, 3211, 3211, + 0, 0, 3272, 3272, 3273, 3274, 3275, 3276, + 3277, 3215, 3211, 3211, 3211, 3211, 3211, 3278, + 3211, 3211, 3211, 3211, 3279, 3280, 3281, 3282, + 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, + 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, + 3299, 3300, 3301, 3302, 3211, 3303, 3304, 3305, + 3306, 3307, 3308, 3211, 3211, 3211, 3211, 3211, + 3309, 3310, 3311, 3312, 3313, 3314, 3315, 3316, + 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3324, 3325, 3326, 3327, 3211, 3328, 3211, 3211, + 3329, 3330, 3331, 3332, 3209, 3210, 3333, 3334, + 3335, 0, 0, 0, 0, 0, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 0, 3336, 3337, 3338, 3339, 3340, 3341, + 3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, + 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, + 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, + 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, + 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, + 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, + 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, + 3398, 3399, 3400, 3401, 3402, 3403, 3404, 3405, + 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, + 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3421, + 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, + 0, 3430, 3430, 3431, 3432, 3433, 3434, 3435, + 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, + 3444, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2709, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3445, 3446, 3447, 3448, 3449, 3450, 3451, + 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, + 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, + 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, + 0, 3476, 3477, 3478, 3479, 3480, 3481, 3482, + 3483, 3484, 3485, 3486, 3487, 3488, 3489, 3490, + 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, + 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, + 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, + 3515, 3516, 3516, 3516, 3516, 3516, 3516, 3516, + 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, + 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, + 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, + 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, + 3548, 3549, 3550, 3551, 3552, 3553, 3554, 3555, + 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, + 3430, 3564, 3565, 3566, 3567, 3568, 3569, 3570, + 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, + 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, + 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, + 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, + 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, + 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, + 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, + 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, + 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, + 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, + 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, + 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, + 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, + 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, + 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, + 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, + 3699, 3700, 3701, 3702, 3703, 3704, 3705, 3706, + 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3714, + 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, + 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, + 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, + 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, + 3747, 3748, 3749, 3750, 3751, 3752, 3753, 3754, + 3755, 3756, 3757, 3758, 3759, 3760, 3761, 3762, + 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, + 3771, 3772, 3773, 3774, 3775, 3776, 3777, 3778, + 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, + 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, + 3795, 3796, 3797, 3798, 3799, 3800, 3801, 3802, + 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, + 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, + 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, + 3827, 3828, 3829, 3830, 3831, 3832, 3833, 3834, + 3835, 3836, 3837, 3838, 3839, 3840, 3841, 3842, + 3843, 3844, 3845, 3846, 3847, 3848, 3849, 3850, + 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, + 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, + 3867, 3868, 3869, 3870, 3871, 3872, 3873, 3874, + 3875, 3876, 3877, 3878, 3879, 3880, 3881, 3882, + 3883, 3884, 3885, 3886, 3887, 3888, 3889, 3890, + 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, + 3899, 3900, 3901, 3902, 3903, 3904, 3905, 3906, + 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, + 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, + 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, + 3931, 3932, 3933, 3934, 3935, 3936, 3937, 3938, + 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, + 3947, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3210, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 0, 0, + 0, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 599, 599, 599, 599, 599, 599, 1104, - 1104, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 599, 8, 8, + 349, 598, 598, 598, 598, 598, 598, 1103, + 1103, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 598, 8, 8, 8, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 349, 349, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3950, 3951, 3952, 3953, 3954, 3955, 3956, - 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3964, - 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, - 3973, 3974, 3975, 3976, 3977, 3978, 3979, 3980, - 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, - 3989, 3990, 3991, 3992, 3993, 3994, 3995, 349, - 898, 899, 899, 899, 8, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 8, - 598, 3996, 3997, 3998, 3999, 4000, 4001, 4002, - 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, - 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, - 4019, 4020, 4021, 4022, 4023, 4024, 4025, 898, - 898, 349, 349, 349, 349, 349, 349, 349, + 349, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 349, 349, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3948, 3949, 3950, 3951, 3952, 3953, 3954, + 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, + 3963, 3964, 3965, 3966, 3967, 3968, 3969, 3970, + 3971, 3972, 3973, 3974, 3975, 3976, 3977, 3978, + 3979, 3980, 3981, 3982, 3983, 3984, 3985, 3986, + 3987, 3988, 3989, 3990, 3991, 3992, 3993, 349, + 897, 898, 898, 898, 8, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 8, + 597, 3994, 3995, 3996, 3997, 3998, 3999, 4000, + 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, + 4009, 4010, 4011, 4012, 4013, 4014, 4015, 4016, + 4017, 4018, 4019, 4020, 4021, 4022, 4023, 897, + 897, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -3976,50 +3989,50 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 898, 898, 1104, 1104, 1104, 1104, 1104, - 1104, 0, 0, 0, 0, 0, 0, 0, + 349, 349, 349, 349, 349, 349, 349, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 897, 897, 1103, 1103, 1103, 1103, 1103, + 1103, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 598, 598, 598, 598, 598, 598, 598, 598, - 598, 46, 46, 4026, 4027, 4028, 4029, 4030, - 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, - 4039, 4040, 4041, 4042, 4043, 4044, 4045, 4046, - 4047, 4048, 4049, 4050, 4051, 4052, 4053, 4054, - 4055, 4056, 4057, 4058, 4059, 4060, 4061, 4062, - 4063, 4064, 4065, 4066, 4067, 4068, 4069, 4070, - 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, - 4079, 4080, 4081, 4082, 4083, 4084, 4085, 4086, - 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, - 4095, 4096, 4097, 4098, 4099, 4100, 4101, 4102, - 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, - 4111, 4112, 4113, 4114, 4115, 4116, 4117, 4118, - 4119, 4120, 4121, 4122, 4123, 4124, 4125, 4126, - 4127, 598, 4128, 4128, 4129, 4130, 4131, 4132, - 349, 4133, 4134, 4135, 4136, 4137, 4138, 4139, - 4140, 4141, 4142, 4143, 4144, 4145, 4146, 4147, - 4148, 4149, 4150, 4151, 4152, 4153, 4154, 4155, - 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, - 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, - 4172, 4173, 4174, 4175, 4176, 4177, 4178, 4179, - 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, - 4188, 4189, 4190, 4191, 4192, 4193, 4194, 0, - 0, 4195, 4196, 0, 4197, 0, 4198, 4199, - 4200, 4201, 4202, 4203, 4204, 4205, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4206, 4207, 4208, 4209, 4210, - 349, 4211, 4212, 4213, 349, 349, 349, 349, - 349, 349, 349, 1210, 349, 349, 349, 1245, - 349, 349, 349, 349, 1210, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1215, 1215, 1210, 1210, - 1215, 78, 78, 78, 78, 1245, 0, 0, - 0, 1242, 1242, 1242, 1242, 1242, 1242, 897, - 897, 10, 2396, 0, 0, 0, 0, 0, + 597, 597, 597, 597, 597, 597, 597, 597, + 597, 46, 46, 4024, 4025, 4026, 4027, 4028, + 4029, 4030, 4031, 4032, 4033, 4034, 4035, 4036, + 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, + 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, + 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, + 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, + 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, + 4077, 4078, 4079, 4080, 4081, 4082, 4083, 4084, + 4085, 4086, 4087, 4088, 4089, 4090, 4091, 4092, + 4093, 4094, 4095, 4096, 4097, 4098, 4099, 4100, + 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, + 4109, 4110, 4111, 4112, 4113, 4114, 4115, 4116, + 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, + 4125, 597, 4126, 4126, 4127, 4128, 4129, 4130, + 349, 4131, 4132, 4133, 4134, 4135, 4136, 4137, + 4138, 4139, 4140, 4141, 4142, 4143, 4144, 4145, + 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, + 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, + 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, + 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4177, + 4178, 4179, 4180, 4181, 4182, 4183, 4184, 4185, + 4186, 4187, 4188, 4189, 4190, 4191, 4192, 4193, + 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, + 4202, 4203, 4204, 4205, 4206, 4207, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4208, 4209, 4210, 4211, 4212, 4213, + 349, 4214, 4215, 4216, 349, 349, 349, 349, + 349, 349, 349, 1209, 349, 349, 349, 1244, + 349, 349, 349, 349, 1209, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 1214, 1214, 1209, 1209, + 1214, 78, 78, 78, 78, 1244, 0, 0, + 0, 1241, 1241, 1241, 1241, 1241, 1241, 896, + 896, 10, 2396, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -4028,85 +4041,85 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 1215, 1215, 349, 349, 349, 349, 349, + 0, 1214, 1214, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1245, 1210, 0, - 0, 0, 0, 0, 0, 0, 0, 1104, - 1104, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 349, 349, 349, 349, 349, - 349, 1104, 1104, 1104, 349, 1104, 349, 349, - 1210, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1244, 1209, 0, + 0, 0, 0, 0, 0, 0, 0, 1103, + 1103, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 349, 349, 349, 349, 349, + 349, 1103, 1103, 1103, 349, 1103, 349, 349, + 1209, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 1210, - 1210, 1210, 1210, 1210, 1147, 1147, 1147, 1104, - 1104, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 1209, + 1209, 1209, 1209, 1209, 1146, 1146, 1146, 1103, + 1103, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1215, 1508, 0, 0, 0, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1214, 1507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1104, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, - 1410, 1410, 1410, 1410, 1410, 1410, 0, 0, - 0, 1210, 1210, 1210, 1215, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1234, 1215, 1215, 1210, - 1210, 1210, 1210, 1215, 1215, 1210, 1210, 1215, - 1215, 1508, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 1104, 1104, 1104, 1104, 1104, 1104, 0, - 599, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 1104, - 1104, 349, 349, 349, 349, 349, 1210, 599, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 349, 349, 349, 349, 349, + 1103, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 0, 0, + 0, 1209, 1209, 1209, 1214, 349, 349, 349, + 349, 349, 1215, 1215, 1215, 349, 349, 349, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1233, 1214, 1214, 1209, + 1209, 1209, 1209, 1214, 1214, 1209, 1209, 1214, + 1214, 1533, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 0, + 598, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 1103, + 1103, 1215, 1215, 1215, 1215, 1215, 1209, 598, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1215, 1215, 1215, 1215, 1215, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1210, 1210, 1210, 1210, 1210, 1210, - 1215, 1215, 1210, 1210, 1215, 1215, 1210, 1210, + 349, 349, 1209, 1209, 1209, 1209, 1209, 1209, + 1214, 1214, 1209, 1209, 1214, 1214, 1209, 1209, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 349, 349, 349, 1210, 349, 349, 349, - 349, 349, 349, 349, 349, 1210, 1215, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 1104, 1104, 1104, - 1104, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 599, 349, 349, 349, 349, 349, 349, - 897, 897, 897, 349, 1322, 1210, 1322, 349, - 349, 349, 349, 349, 349, 349, 349, 349, + 0, 349, 349, 349, 1209, 349, 349, 349, + 349, 349, 349, 349, 349, 1209, 1214, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 1103, 1103, 1103, + 1103, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 598, 1215, 1215, 1215, 349, 349, 349, + 896, 896, 896, 1215, 1321, 1209, 1321, 1215, + 1215, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 898, 349, 898, 898, 1147, 349, 349, - 898, 898, 349, 349, 349, 349, 349, 898, - 898, 349, 898, 349, 0, 0, 0, 0, + 349, 897, 349, 897, 897, 1146, 349, 349, + 897, 897, 349, 349, 349, 349, 349, 897, + 897, 349, 897, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 349, 349, 599, 1104, - 1104, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1215, 1210, 1210, 1215, - 1215, 1104, 1104, 349, 599, 599, 1215, 1245, + 0, 0, 0, 0, 349, 349, 598, 1103, + 1103, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1214, 1209, 1209, 1214, + 1214, 1103, 1103, 349, 598, 598, 1214, 1223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 0, 0, 349, 349, 349, 349, 349, 349, @@ -4114,576 +4127,576 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, - 0, 4214, 4215, 4216, 4217, 4218, 4219, 4220, - 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, - 4229, 4230, 4231, 4232, 4233, 4234, 4235, 4236, - 4237, 4238, 4239, 4240, 4241, 4242, 4243, 4244, - 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, - 4253, 4254, 4255, 4256, 4128, 4257, 4258, 4259, - 4260, 4261, 4262, 4263, 4264, 4265, 4266, 4267, - 4268, 4269, 4270, 46, 46, 0, 0, 0, - 0, 4271, 4272, 4273, 4274, 4275, 4276, 4277, - 4278, 4279, 4280, 4281, 4282, 4283, 4284, 4285, - 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, - 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, - 4302, 4303, 4304, 4305, 4306, 4307, 4308, 4309, - 4310, 4311, 4312, 4313, 4314, 4315, 4316, 4317, - 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, - 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, - 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, - 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, - 4350, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1215, 1215, 1210, 1215, - 1215, 1210, 1215, 1215, 1104, 1215, 1245, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4351, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4351, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, - 4352, 4352, 4352, 4352, 4352, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 0, 4217, 4218, 4219, 4220, 4221, 4222, 4223, + 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, + 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, + 4240, 4241, 4242, 4243, 4244, 4245, 4246, 4247, + 4248, 4249, 4250, 4251, 4252, 4253, 4254, 4255, + 4256, 4257, 4258, 4259, 4126, 4260, 4261, 4262, + 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, + 4271, 4272, 4273, 46, 46, 0, 0, 0, + 0, 4274, 4275, 4276, 4277, 4278, 4279, 4280, + 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, + 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4296, + 4297, 4298, 4299, 4300, 4301, 4302, 4303, 4304, + 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, + 4313, 4314, 4315, 4316, 4317, 4318, 4319, 4320, + 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, + 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, + 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, + 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, + 4353, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 349, 349, 349, 349, + 349, 349, 349, 349, 1214, 1214, 1209, 1214, + 1214, 1209, 1214, 1214, 1103, 1214, 1244, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4354, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4354, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, + 0, 0, 0, 0, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, - 0, 0, 0, 0, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, - 1414, 1414, 1414, 1414, 1414, 0, 0, 0, - 0, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, - 4353, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, - 4362, 4362, 4363, 4364, 4365, 4366, 4367, 4368, - 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, - 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, - 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, - 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, - 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, - 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, - 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, - 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, - 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, - 4441, 4442, 4443, 4444, 4445, 4374, 4446, 4447, - 4448, 4449, 4450, 4451, 4452, 4453, 4454, 4455, - 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, - 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, - 4472, 4473, 4474, 4475, 4476, 4477, 4478, 4479, - 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, - 4488, 4489, 4490, 4491, 4492, 4493, 4494, 4495, - 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4464, 4514, 4515, 4516, 4517, 4518, - 4519, 4520, 4521, 4448, 4522, 4523, 4524, 4525, - 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, - 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, - 4374, 4542, 4543, 4544, 4545, 4546, 4547, 4548, - 4549, 4550, 4551, 4552, 4553, 4554, 4555, 4556, - 4557, 4558, 4559, 4560, 4561, 4562, 4563, 4564, - 4565, 4566, 4567, 4568, 4450, 4569, 4570, 4571, - 4572, 4573, 4574, 4575, 4576, 4577, 4578, 4579, - 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, - 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, - 4596, 4597, 4598, 4599, 4600, 4601, 4602, 4603, - 4604, 4605, 4606, 4607, 4608, 4609, 4610, 4611, - 4612, 4613, 4614, 4615, 4616, 4617, 4618, 3213, - 3213, 4619, 3213, 4620, 3213, 3213, 4621, 4622, - 4623, 4624, 4625, 4626, 4627, 4628, 4629, 4630, - 3213, 4631, 3213, 4632, 3213, 3213, 4633, 4634, - 3213, 3213, 3213, 4635, 4636, 4637, 4638, 4639, - 4640, 4641, 4642, 4643, 4644, 4645, 4646, 4647, - 4648, 4649, 4650, 4651, 4652, 4653, 4654, 4655, - 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, - 4664, 4665, 4666, 4667, 4668, 4669, 4670, 4671, - 4672, 4673, 4674, 4675, 4676, 4677, 4678, 4679, - 4503, 4680, 4681, 4682, 4683, 4684, 4685, 4685, - 4686, 4687, 4688, 4689, 4690, 4691, 4692, 4693, - 4633, 4694, 4695, 4696, 4697, 4698, 4699, 0, - 0, 4700, 4701, 4702, 4703, 4704, 4705, 4706, - 4707, 4647, 4708, 4709, 4710, 4619, 4711, 4712, - 4713, 4714, 4715, 4716, 4717, 4718, 4719, 4720, - 4721, 4722, 4656, 4723, 4657, 4724, 4725, 4726, - 4727, 4728, 4620, 4395, 4729, 4730, 4731, 4465, - 4552, 4732, 4733, 4664, 4734, 4665, 4735, 4736, - 4737, 4622, 4738, 4739, 4740, 4741, 4742, 4623, - 4743, 4744, 4745, 4746, 4747, 4748, 4679, 4749, - 4750, 4503, 4751, 4683, 4752, 4753, 4754, 4755, - 4756, 4688, 4757, 4632, 4758, 4689, 4446, 4759, - 4690, 4760, 4692, 4761, 4762, 4763, 4764, 4765, - 4694, 4628, 4766, 4695, 4767, 4696, 4768, 4362, - 4769, 4770, 4771, 4772, 4773, 4774, 4775, 4776, - 4777, 4778, 4779, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4780, 4781, 4782, 4783, 4784, 4785, 4786, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4787, 4788, 4789, 4790, - 4791, 0, 0, 0, 0, 0, 4792, 4793, - 4794, 4795, 4796, 4797, 4798, 4799, 4800, 4801, - 4802, 4803, 4804, 4805, 4806, 4807, 4808, 4809, - 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, - 0, 4818, 4819, 4820, 4821, 4822, 0, 4823, - 0, 4824, 4825, 0, 4826, 4827, 0, 4828, - 4829, 4830, 4831, 4832, 4833, 4834, 4835, 4836, - 4837, 4838, 4839, 4840, 4841, 4842, 4843, 4844, - 4845, 4846, 4847, 4848, 4849, 4850, 4851, 4852, - 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, - 4861, 4862, 4863, 4864, 4865, 4866, 4867, 4868, - 4869, 4870, 4871, 4872, 4873, 4874, 4875, 4876, - 4877, 4878, 4879, 4880, 4881, 4882, 4883, 4884, - 4885, 4886, 4887, 4888, 4889, 4890, 4891, 4892, - 4893, 4894, 4895, 4896, 4897, 4898, 4899, 4900, - 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, - 4909, 4910, 4911, 4912, 4913, 4914, 4915, 4916, - 4917, 4918, 4919, 4920, 4921, 4922, 4923, 4924, - 4925, 4926, 4927, 4928, 4929, 4930, 4931, 4932, - 4933, 4934, 4935, 1214, 1214, 1214, 1214, 1214, - 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, - 1214, 1214, 1214, 1214, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4936, 4937, 4938, 4939, - 4940, 4941, 4942, 4943, 4944, 4945, 4946, 4947, - 4948, 4949, 4950, 4951, 4952, 4953, 4954, 4955, - 4956, 4957, 4958, 4959, 4960, 4961, 4962, 4963, - 4964, 4965, 4966, 4967, 4968, 4969, 4970, 4971, - 4972, 4973, 4974, 4975, 4976, 4977, 4978, 4979, - 4980, 4981, 4982, 4983, 4974, 4984, 4985, 4986, - 4987, 4988, 4989, 4990, 4991, 4992, 4993, 4994, - 4995, 4996, 4997, 4998, 4999, 5000, 5001, 5002, - 5003, 5004, 5005, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5020, 5021, 5022, 5023, 5024, 5025, 5026, - 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034, - 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, - 5043, 5044, 5045, 5046, 5047, 5048, 5049, 5050, - 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, - 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, - 5083, 4975, 5084, 5085, 5086, 5087, 5088, 5089, - 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, - 5098, 5099, 5100, 5101, 5102, 5103, 5104, 5105, - 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, - 5114, 5115, 5116, 5117, 5118, 5119, 5120, 5121, - 5122, 5123, 5124, 5125, 5126, 5127, 5128, 5129, - 5130, 5131, 5132, 5133, 5134, 5135, 5136, 5137, - 5138, 5139, 5140, 5141, 5142, 5143, 5144, 5145, - 5146, 5147, 5148, 5149, 5150, 5151, 5152, 5153, - 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, - 5162, 5163, 5164, 5165, 5166, 5167, 5168, 5169, - 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5177, - 5178, 5179, 5180, 5181, 5182, 5183, 5184, 5185, - 5186, 5187, 5188, 5189, 5190, 5191, 5192, 5193, - 5194, 5195, 5196, 5197, 5198, 5199, 5200, 5201, - 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209, - 5210, 5211, 5212, 5213, 5214, 5215, 5216, 5217, - 5218, 5219, 5220, 5221, 5222, 5223, 5224, 5225, - 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, - 5234, 5235, 5236, 5237, 5238, 5239, 5240, 5241, - 5242, 5243, 5244, 5245, 5246, 5247, 5248, 5249, - 5250, 5251, 5252, 5253, 5254, 5255, 5256, 5257, - 5258, 5259, 5260, 5261, 5262, 5263, 5264, 5265, - 5266, 5267, 5268, 5269, 5270, 5271, 5272, 5273, - 5274, 5275, 5276, 5277, 5278, 5279, 5280, 5281, - 5282, 5283, 5284, 5285, 5286, 5287, 5288, 5289, - 5290, 5291, 5292, 5293, 5294, 5295, 5296, 5297, + 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 1413, 1413, 1413, 1413, 1413, 0, 0, 0, + 0, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, + 4365, 4365, 4366, 4367, 4368, 4369, 4370, 4371, + 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, + 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, + 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, + 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, + 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, + 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, + 4420, 4421, 4422, 4423, 4424, 4425, 4426, 4427, + 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, + 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, + 4444, 4445, 4446, 4447, 4448, 4377, 4449, 4450, + 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, + 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, + 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, + 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, + 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, + 4491, 4492, 4493, 4494, 4495, 4496, 4497, 4498, + 4499, 4500, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4467, 4517, 4518, 4519, 4520, 4521, + 4522, 4523, 4524, 4451, 4525, 4526, 4527, 4528, + 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, + 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, + 4377, 4545, 4546, 4547, 4548, 4549, 4550, 4551, + 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, + 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, + 4568, 4569, 4570, 4571, 4453, 4572, 4573, 4574, + 4575, 4576, 4577, 4578, 4579, 4580, 4581, 4582, + 4583, 4584, 4585, 4586, 4587, 4588, 4589, 4590, + 4591, 4592, 4593, 4594, 4595, 4596, 4597, 4598, + 4599, 4600, 4601, 4602, 4603, 4604, 4605, 4606, + 4607, 4608, 4609, 4610, 4611, 4612, 4613, 4614, + 4615, 4616, 4617, 4618, 4619, 4620, 4621, 3211, + 3211, 4622, 3211, 4623, 3211, 3211, 4624, 4625, + 4626, 4627, 4628, 4629, 4630, 4631, 4632, 4633, + 3211, 4634, 3211, 4635, 3211, 3211, 4636, 4637, + 3211, 3211, 3211, 4638, 4639, 4640, 4641, 4642, + 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, + 4651, 4652, 4653, 4654, 4655, 4656, 4657, 4658, + 4659, 4660, 4661, 4662, 4663, 4664, 4665, 4666, + 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, + 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, + 4506, 4683, 4684, 4685, 4686, 4687, 4688, 4688, + 4689, 4690, 4691, 4692, 4693, 4694, 4695, 4696, + 4636, 4697, 4698, 4699, 4700, 4701, 4702, 0, + 0, 4703, 4704, 4705, 4706, 4707, 4708, 4709, + 4710, 4650, 4711, 4712, 4713, 4622, 4714, 4715, + 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, + 4724, 4725, 4659, 4726, 4660, 4727, 4728, 4729, + 4730, 4731, 4623, 4398, 4732, 4733, 4734, 4468, + 4555, 4735, 4736, 4667, 4737, 4668, 4738, 4739, + 4740, 4625, 4741, 4742, 4743, 4744, 4745, 4626, + 4746, 4747, 4748, 4749, 4750, 4751, 4682, 4752, + 4753, 4506, 4754, 4686, 4755, 4756, 4757, 4758, + 4759, 4691, 4760, 4635, 4761, 4692, 4449, 4762, + 4693, 4763, 4695, 4764, 4765, 4766, 4767, 4768, + 4697, 4631, 4769, 4698, 4770, 4699, 4771, 4365, + 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, + 4780, 4781, 4782, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4783, 4784, 4785, 4786, 4787, 4788, 4789, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4790, 4791, 4792, 4793, + 4794, 0, 0, 0, 0, 0, 4795, 4796, + 4797, 4798, 4799, 4800, 4801, 4802, 4803, 4804, + 4805, 4806, 4807, 4808, 4809, 4810, 4811, 4812, + 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, + 0, 4821, 4822, 4823, 4824, 4825, 0, 4826, + 0, 4827, 4828, 0, 4829, 4830, 0, 4831, + 4832, 4833, 4834, 4835, 4836, 4837, 4838, 4839, + 4840, 4841, 4842, 4843, 4844, 4845, 4846, 4847, + 4848, 4849, 4850, 4851, 4852, 4853, 4854, 4855, + 4856, 4857, 4858, 4859, 4860, 4861, 4862, 4863, + 4864, 4865, 4866, 4867, 4868, 4869, 4870, 4871, + 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879, + 4880, 4881, 4882, 4883, 4884, 4885, 4886, 4887, + 4888, 4889, 4890, 4891, 4892, 4893, 4894, 4895, + 4896, 4897, 4898, 4899, 4900, 4901, 4902, 4903, + 4904, 4905, 4906, 4907, 4908, 4909, 4910, 4911, + 4912, 4913, 4914, 4915, 4916, 4917, 4918, 4919, + 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, + 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, + 4936, 4937, 4938, 1213, 1213, 1213, 1213, 1213, + 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, + 1213, 1213, 1213, 1213, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 4939, 4940, 4941, 4942, + 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, + 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, + 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, + 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, + 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, + 4983, 4984, 4985, 4986, 4977, 4987, 4988, 4989, + 4990, 4991, 4992, 4993, 4994, 4995, 4996, 4997, + 4998, 4999, 5000, 5001, 5002, 5003, 5004, 5005, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5020, 5021, + 5022, 5023, 5024, 5025, 5026, 5027, 5028, 5029, + 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, + 5038, 5039, 5040, 5041, 5042, 5043, 5044, 5045, + 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, + 5054, 5055, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, + 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, + 5086, 4978, 5087, 5088, 5089, 5090, 5091, 5092, + 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, + 5101, 5102, 5103, 5104, 5105, 5106, 5107, 5108, + 5109, 5110, 5111, 5112, 5113, 5114, 5115, 5116, + 5117, 5118, 5119, 5120, 5121, 5122, 5123, 5124, + 5125, 5126, 5127, 5128, 5129, 5130, 5131, 5132, + 5133, 5134, 5135, 5136, 5137, 5138, 5139, 5140, + 5141, 5142, 5143, 5144, 5145, 5146, 5147, 5148, + 5149, 5150, 5151, 5152, 5153, 5154, 5155, 5156, + 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164, + 5165, 5166, 5167, 5168, 5169, 5170, 5171, 5172, + 5173, 5174, 5175, 5176, 5177, 5178, 5179, 5180, + 5181, 5182, 5183, 5184, 5185, 5186, 5187, 5188, + 5189, 5190, 5191, 5192, 5193, 5194, 5195, 5196, + 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, + 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, + 5213, 5214, 5215, 5216, 5217, 5218, 5219, 5220, + 5221, 5222, 5223, 5224, 5225, 5226, 5227, 5228, + 5229, 5230, 5231, 5232, 5233, 5234, 5235, 5236, + 5237, 5238, 5239, 5240, 5241, 5242, 5243, 5244, + 5245, 5246, 5247, 5248, 5249, 5250, 5251, 5252, + 5253, 5254, 5255, 5256, 5257, 5258, 5259, 5260, + 5261, 5262, 5263, 5264, 5265, 5266, 5267, 5268, + 5269, 5270, 5271, 5272, 5273, 5274, 5275, 5276, + 5277, 5278, 5279, 5280, 5281, 5282, 5283, 5284, + 5285, 5286, 5287, 5288, 5289, 5290, 5291, 5292, + 5293, 5294, 5295, 5296, 5297, 5298, 5299, 5300, 2290, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 5298, 5299, 5300, 5301, 5302, 5303, 5304, - 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, - 5313, 5314, 5315, 5316, 5317, 5318, 5319, 5320, - 5321, 5322, 5323, 5324, 5325, 5326, 5327, 5328, - 5329, 5330, 5331, 5332, 5333, 5334, 5335, 5336, - 5337, 5338, 5339, 5340, 5341, 5342, 5343, 5344, - 5345, 5346, 5347, 5348, 5349, 5350, 5351, 5352, - 5353, 5354, 5355, 5356, 5357, 5358, 5359, 5360, - 5361, 0, 0, 5362, 5363, 5364, 5365, 5366, - 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374, - 5375, 5376, 5377, 5378, 5379, 5380, 5381, 5382, - 5383, 5384, 5385, 5386, 5387, 5388, 5389, 5390, - 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, - 5399, 5400, 5401, 5402, 5403, 5404, 5405, 5406, - 5407, 5408, 5409, 5410, 5411, 5412, 5413, 5414, - 5415, 0, 0, 0, 0, 0, 0, 0, + 78, 5301, 5302, 5303, 5304, 5305, 5306, 5307, + 5308, 5309, 5310, 5311, 5312, 5313, 5314, 5315, + 5316, 5317, 5318, 5319, 5320, 5321, 5322, 5323, + 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, + 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, + 5340, 5341, 5342, 5343, 5344, 5345, 5346, 5347, + 5348, 5349, 5350, 5351, 5352, 5353, 5354, 5355, + 5356, 5357, 5358, 5359, 5360, 5361, 5362, 5363, + 5364, 78, 78, 5365, 5366, 5367, 5368, 5369, + 5370, 5371, 5372, 5373, 5374, 5375, 5376, 5377, + 5378, 5379, 5380, 5381, 5382, 5383, 5384, 5385, + 5386, 5387, 5388, 5389, 5390, 5391, 5392, 5393, + 5394, 5395, 5396, 5397, 5398, 5399, 5400, 5401, + 5402, 5403, 5404, 5405, 5406, 5407, 5408, 5409, + 5410, 5411, 5412, 5413, 5414, 5415, 5416, 5417, + 5418, 78, 78, 78, 78, 78, 78, 78, 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, 5416, 5417, 5418, 5419, 5420, 5421, 5422, - 5423, 5424, 5425, 5426, 5427, 5428, 78, 78, - 78, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 5429, 5430, 5431, 5432, 5433, 5434, 5435, - 5436, 5437, 5438, 0, 0, 0, 0, 0, - 0, 898, 898, 898, 898, 898, 898, 898, - 1147, 1147, 1147, 1147, 1147, 1147, 1147, 898, - 898, 5439, 5440, 5441, 5442, 5442, 5443, 5444, - 5445, 5446, 5447, 5448, 5449, 5450, 5451, 5452, - 5453, 5454, 5455, 5456, 5457, 5458, 3211, 3211, - 5459, 5460, 5461, 5461, 5461, 5461, 5462, 5462, - 5462, 5463, 5464, 5465, 0, 5466, 5467, 5468, - 5469, 5470, 5471, 5472, 5473, 5474, 5475, 5476, - 5477, 5478, 5479, 5480, 5481, 5482, 5483, 5484, - 0, 5485, 5486, 5487, 5488, 0, 0, 0, - 0, 5489, 5490, 5491, 1177, 5492, 0, 5493, - 5494, 5495, 5496, 5497, 5498, 5499, 5500, 5501, - 5502, 5503, 5504, 5505, 5506, 5507, 5508, 5509, - 5510, 5511, 5512, 5513, 5514, 5515, 5516, 5517, - 5518, 5519, 5520, 5521, 5522, 5523, 5524, 5525, - 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, - 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, - 5542, 5543, 5544, 5545, 5546, 5547, 5548, 5549, - 5550, 5551, 5552, 5553, 5554, 5555, 5556, 5557, - 5558, 5559, 5560, 5561, 5562, 5563, 5564, 5565, - 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, - 5574, 5575, 5576, 5577, 5578, 5579, 5580, 5581, - 5582, 5583, 5584, 5585, 5586, 5587, 5588, 5589, - 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, - 5598, 5599, 5600, 5601, 5602, 5603, 5604, 5605, - 5606, 5607, 5608, 5609, 5610, 5611, 5612, 5613, - 5614, 5615, 5616, 5617, 5618, 5619, 5620, 5621, - 5622, 5623, 5624, 5625, 5626, 5627, 0, 0, - 1510, 0, 5628, 5629, 5630, 5631, 5632, 5633, - 5634, 5635, 5636, 5637, 5638, 5639, 5640, 5641, - 5642, 5643, 5644, 5645, 5646, 5647, 5648, 5649, - 5650, 5651, 5652, 5653, 5654, 5655, 5656, 5657, - 5658, 5659, 5660, 5661, 5662, 5663, 5664, 5665, - 5666, 5667, 5668, 5669, 5670, 5671, 5672, 5673, - 5674, 5675, 5676, 5677, 5678, 5679, 5680, 5681, - 5682, 5683, 5684, 5685, 5686, 5687, 5688, 5689, - 5690, 5691, 5692, 5693, 5694, 5695, 5696, 5697, - 5698, 5699, 5700, 5701, 5702, 5703, 5704, 5705, - 5706, 5707, 5708, 5709, 5710, 5711, 5712, 5713, - 5714, 5715, 5716, 5717, 5718, 5719, 5720, 5721, - 5722, 5723, 5724, 5725, 5726, 5727, 5728, 5729, - 5730, 5731, 5732, 5733, 5734, 5735, 5736, 5737, - 5738, 5739, 5740, 5741, 5742, 5743, 5744, 5745, - 5746, 5747, 5748, 5749, 5750, 5751, 5752, 5753, - 5754, 5755, 5756, 5757, 5758, 5759, 5760, 5761, - 5762, 5763, 5764, 5765, 5766, 5767, 5768, 5769, - 5770, 5771, 5772, 5773, 5774, 5775, 5776, 5777, - 5778, 5779, 5780, 5781, 5782, 5783, 5784, 5785, - 5786, 5787, 5788, 5789, 5790, 5791, 5792, 5793, - 5794, 5795, 5796, 5797, 5798, 5799, 5800, 5801, - 5802, 5803, 5804, 5805, 5806, 5807, 5808, 5809, - 5810, 5811, 5812, 5813, 5814, 5815, 5816, 5817, - 0, 0, 0, 5818, 5819, 5820, 5821, 5822, - 5823, 0, 0, 5824, 5825, 5826, 5827, 5828, - 5829, 0, 0, 5830, 5831, 5832, 5833, 5834, - 5835, 0, 0, 5836, 5837, 5838, 0, 0, - 0, 5839, 5840, 5841, 5842, 5843, 5844, 5845, - 0, 5846, 5847, 5848, 5849, 5850, 5851, 5852, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5853, 5853, 5853, 78, 2477, 0, + 0, 5419, 5420, 5421, 5422, 5423, 5424, 5425, + 5426, 5427, 5428, 5429, 5430, 5431, 78, 78, + 78, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 5432, 5433, 5434, 5435, 5436, 5437, 5438, + 5439, 5440, 5441, 0, 0, 0, 0, 0, + 0, 897, 897, 897, 897, 897, 897, 897, + 1146, 1146, 1146, 1146, 1146, 1146, 1146, 897, + 897, 5442, 5443, 5444, 5445, 5445, 5446, 5447, + 5448, 5449, 5450, 5451, 5452, 5453, 5454, 5455, + 5456, 5457, 5458, 5459, 5460, 5461, 3209, 3209, + 5462, 5463, 5464, 5464, 5464, 5464, 5465, 5465, + 5465, 5466, 5467, 5468, 0, 5469, 5470, 5471, + 5472, 5473, 5474, 5475, 5476, 5477, 5478, 5479, + 5480, 5481, 5482, 5483, 5484, 5485, 5486, 5487, + 0, 5488, 5489, 5490, 5491, 0, 0, 0, + 0, 5492, 5493, 5494, 1176, 5495, 0, 5496, + 5497, 5498, 5499, 5500, 5501, 5502, 5503, 5504, + 5505, 5506, 5507, 5508, 5509, 5510, 5511, 5512, + 5513, 5514, 5515, 5516, 5517, 5518, 5519, 5520, + 5521, 5522, 5523, 5524, 5525, 5526, 5527, 5528, + 5529, 5530, 5531, 5532, 5533, 5534, 5535, 5536, + 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, + 5545, 5546, 5547, 5548, 5549, 5550, 5551, 5552, + 5553, 5554, 5555, 5556, 5557, 5558, 5559, 5560, + 5561, 5562, 5563, 5564, 5565, 5566, 5567, 5568, + 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, + 5577, 5578, 5579, 5580, 5581, 5582, 5583, 5584, + 5585, 5586, 5587, 5588, 5589, 5590, 5591, 5592, + 5593, 5594, 5595, 5596, 5597, 5598, 5599, 5600, + 5601, 5602, 5603, 5604, 5605, 5606, 5607, 5608, + 5609, 5610, 5611, 5612, 5613, 5614, 5615, 5616, + 5617, 5618, 5619, 5620, 5621, 5622, 5623, 5624, + 5625, 5626, 5627, 5628, 5629, 5630, 0, 0, + 1509, 0, 5631, 5632, 5633, 5634, 5635, 5636, + 5637, 5638, 5639, 5640, 5641, 5642, 5643, 5644, + 5645, 5646, 5647, 5648, 5649, 5650, 5651, 5652, + 5653, 5654, 5655, 5656, 5657, 5658, 5659, 5660, + 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, + 5669, 5670, 5671, 5672, 5673, 5674, 5675, 5676, + 5677, 5678, 5679, 5680, 5681, 5682, 5683, 5684, + 5685, 5686, 5687, 5688, 5689, 5690, 5691, 5692, + 5693, 5694, 5695, 5696, 5697, 5698, 5699, 5700, + 5701, 5702, 5703, 5704, 5705, 5706, 5707, 5708, + 5709, 5710, 5711, 5712, 5713, 5714, 5715, 5716, + 5717, 5718, 5719, 5720, 5721, 5722, 5723, 5724, + 5725, 5726, 5727, 5728, 5729, 5730, 5731, 5732, + 5733, 5734, 5735, 5736, 5737, 5738, 5739, 5740, + 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, + 5749, 5750, 5751, 5752, 5753, 5754, 5755, 5756, + 5757, 5758, 5759, 5760, 5761, 5762, 5763, 5764, + 5765, 5766, 5767, 5768, 5769, 5770, 5771, 5772, + 5773, 5774, 5775, 5776, 5777, 5778, 5779, 5780, + 5781, 5782, 5783, 5784, 5785, 5786, 5787, 5788, + 5789, 5790, 5791, 5792, 5793, 5794, 5795, 5796, + 5797, 5798, 5799, 5800, 5801, 5802, 5803, 5804, + 5805, 5806, 5807, 5808, 5809, 5810, 5811, 5812, + 5813, 5814, 5815, 5816, 5817, 5818, 5819, 5820, + 0, 0, 0, 5821, 5822, 5823, 5824, 5825, + 5826, 0, 0, 5827, 5828, 5829, 5830, 5831, + 5832, 0, 0, 5833, 5834, 5835, 5836, 5837, + 5838, 0, 0, 5839, 5840, 5841, 0, 0, + 0, 5842, 5843, 5844, 5845, 5846, 5847, 5848, + 0, 5849, 5850, 5851, 5852, 5853, 5854, 5855, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5856, 5856, 5856, 78, 2477, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -4716,24 +4729,24 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, - 0, 1104, 8, 1104, 0, 0, 0, 0, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 0, 0, 0, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 5854, 5854, 5854, 5854, 5854, 5854, 5854, - 5854, 5854, 5854, 5854, 5854, 5854, 5854, 5854, - 5854, 5854, 5854, 5854, 5854, 5854, 5854, 5854, - 5854, 5854, 5854, 5854, 5854, 5854, 5854, 5854, - 5854, 5854, 5854, 5854, 5854, 5854, 5854, 5854, - 5854, 5854, 5854, 5854, 5854, 5854, 5854, 5854, - 5854, 5854, 5854, 5854, 5854, 5854, 1268, 1268, - 1268, 1268, 78, 78, 78, 78, 78, 78, + 0, 1103, 8, 1103, 0, 0, 0, 0, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 0, 0, 0, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 5857, 5857, 5857, 5857, 5857, 5857, 5857, + 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, + 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, + 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, + 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, + 5857, 5857, 5857, 5857, 5857, 5857, 5857, 5857, + 5857, 5857, 5857, 5857, 5857, 5857, 1267, 1267, + 1267, 1267, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 1268, 1268, 78, 897, 897, + 78, 78, 78, 1267, 1267, 78, 896, 896, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, @@ -4742,12 +4755,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 1147, 0, + 0, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 1146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4776,53 +4789,53 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1147, 5855, 5855, 5855, 5855, 5855, 5855, - 5855, 5855, 5855, 5855, 5855, 5855, 5855, 5855, - 5855, 5855, 5855, 5855, 5855, 5855, 5855, 5855, - 5855, 5855, 5855, 5855, 5855, 0, 0, 0, + 0, 1146, 5858, 5858, 5858, 5858, 5858, 5858, + 5858, 5858, 5858, 5858, 5858, 5858, 5858, 5858, + 5858, 5858, 5858, 5858, 5858, 5858, 5858, 5858, + 5858, 5858, 5858, 5858, 5858, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 1242, 1242, 1242, 1242, 0, 0, 0, + 349, 1241, 1241, 1241, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1507, 349, 349, 349, 349, 349, - 349, 349, 349, 1507, 0, 0, 0, 0, + 349, 349, 1506, 349, 349, 349, 349, 349, + 349, 349, 349, 1506, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 898, - 898, 898, 898, 898, 0, 0, 0, 0, + 349, 349, 349, 349, 349, 349, 349, 897, + 897, 897, 897, 897, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, - 1104, 349, 349, 349, 349, 349, 349, 349, + 1103, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, - 349, 1104, 1507, 1507, 1507, 1507, 1507, 0, + 349, 1103, 1506, 1506, 1506, 1506, 1506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5856, 5857, 5858, 5859, 5860, 5861, 5862, - 5863, 5864, 5865, 5866, 5867, 5868, 5869, 5870, - 5871, 5872, 5873, 5874, 5875, 5876, 5877, 5878, - 5879, 5880, 5881, 5882, 5883, 5884, 5885, 5886, - 5887, 5888, 5889, 5890, 5891, 5892, 5893, 5894, - 5895, 5896, 5897, 5898, 5899, 5900, 5901, 5902, - 5903, 5904, 5905, 5906, 5907, 5908, 5909, 5910, - 5911, 5912, 5913, 5914, 5915, 5916, 5917, 5918, - 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, - 5927, 5928, 5929, 5930, 5931, 5932, 5933, 5934, - 5935, 349, 349, 349, 349, 349, 349, 349, + 0, 5859, 5860, 5861, 5862, 5863, 5864, 5865, + 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, + 5874, 5875, 5876, 5877, 5878, 5879, 5880, 5881, + 5882, 5883, 5884, 5885, 5886, 5887, 5888, 5889, + 5890, 5891, 5892, 5893, 5894, 5895, 5896, 5897, + 5898, 5899, 5900, 5901, 5902, 5903, 5904, 5905, + 5906, 5907, 5908, 5909, 5910, 5911, 5912, 5913, + 5914, 5915, 5916, 5917, 5918, 5919, 5920, 5921, + 5922, 5923, 5924, 5925, 5926, 5927, 5928, 5929, + 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5937, + 5938, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -4832,18 +4845,18 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 5936, 5937, 5938, 5939, 5940, 5941, 5942, - 5943, 5944, 5945, 5946, 5947, 5948, 5949, 5950, - 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, - 5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966, - 5967, 5968, 5969, 5970, 5971, 0, 0, 0, - 0, 5972, 5973, 5974, 5975, 5976, 5977, 5978, - 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986, - 5987, 5988, 5989, 5990, 5991, 5992, 5993, 5994, - 5995, 5996, 5997, 5998, 5999, 6000, 6001, 6002, - 6003, 6004, 6005, 6006, 6007, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 5939, 5940, 5941, 5942, 5943, 5944, 5945, + 5946, 5947, 5948, 5949, 5950, 5951, 5952, 5953, + 5954, 5955, 5956, 5957, 5958, 5959, 5960, 5961, + 5962, 5963, 5964, 5965, 5966, 5967, 5968, 5969, + 5970, 5971, 5972, 5973, 5974, 0, 0, 0, + 0, 5975, 5976, 5977, 5978, 5979, 5980, 5981, + 5982, 5983, 5984, 5985, 5986, 5987, 5988, 5989, + 5990, 5991, 5992, 5993, 5994, 5995, 5996, 5997, + 5998, 5999, 6000, 6001, 6002, 6003, 6004, 6005, + 6006, 6007, 6008, 6009, 6010, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -4858,21 +4871,21 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1104, 6008, 6009, 6010, 6011, 6012, 6013, 6014, - 6015, 6016, 6017, 6018, 0, 6019, 6020, 6021, - 6022, 6023, 6024, 6025, 6026, 6027, 6028, 6029, - 6030, 6031, 6032, 6033, 0, 6034, 6035, 6036, - 6037, 6038, 6039, 6040, 0, 6041, 6042, 0, - 6043, 6044, 6045, 6046, 6047, 6048, 6049, 6050, - 6051, 6052, 6053, 0, 6054, 6055, 6056, 6057, - 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, - 6066, 6067, 6068, 0, 6069, 6070, 6071, 6072, - 6073, 6074, 6075, 0, 6076, 6077, 0, 0, + 1103, 6011, 6012, 6013, 6014, 6015, 6016, 6017, + 6018, 6019, 6020, 6021, 0, 6022, 6023, 6024, + 6025, 6026, 6027, 6028, 6029, 6030, 6031, 6032, + 6033, 6034, 6035, 6036, 0, 6037, 6038, 6039, + 6040, 6041, 6042, 6043, 0, 6044, 6045, 0, + 6046, 6047, 6048, 6049, 6050, 6051, 6052, 6053, + 6054, 6055, 6056, 0, 6057, 6058, 6059, 6060, + 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068, + 6069, 6070, 6071, 0, 6072, 6073, 6074, 6075, + 6076, 6077, 6078, 0, 6079, 6080, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 6078, 349, 349, 349, 349, 349, - 349, 349, 349, 6079, 349, 349, 349, 349, - 349, 349, 349, 6080, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 6081, 349, 349, + 349, 349, 6081, 349, 349, 349, 349, 349, + 349, 349, 349, 6082, 349, 349, 349, 349, + 349, 349, 349, 6083, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 6084, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4892,143 +4905,141 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6082, 6083, 6084, 6085, 6086, 6087, 0, - 6088, 6089, 6090, 6091, 6092, 6093, 6094, 6095, - 6096, 6097, 6098, 6099, 6100, 6101, 6102, 6103, - 6104, 6105, 6106, 6107, 6108, 6109, 6110, 6111, - 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, - 6120, 6121, 6122, 6123, 6124, 6125, 6126, 6127, - 6128, 6129, 0, 6130, 6131, 6132, 6133, 6134, - 6135, 6136, 6137, 6138, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 0, - 0, 1168, 0, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 0, - 1168, 1168, 0, 0, 0, 1168, 0, 0, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 0, - 1165, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 6140, 6140, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 0, 0, 0, 0, 0, 0, 0, 0, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 0, 1168, 1168, 0, - 0, 0, 0, 0, 6139, 6139, 6139, 6139, - 6139, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 6139, - 6139, 6139, 6139, 6139, 6139, 0, 0, 0, - 8, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 0, 0, 0, 0, 0, - 1165, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 0, 0, 0, 0, 6139, 6139, 1168, - 1168, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 0, 0, 6139, 6139, 6139, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 1168, 1210, 1210, 1210, 0, 1210, 1210, - 0, 0, 0, 0, 0, 1210, 1147, 1210, - 898, 1168, 1168, 1168, 1168, 0, 1168, 1168, - 1168, 0, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 0, - 0, 898, 1589, 1147, 0, 0, 0, 0, - 1245, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 6139, 0, 0, 0, 0, 0, 0, - 0, 1165, 1165, 1165, 1165, 1165, 1165, 1165, - 1165, 1165, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 6139, 6139, - 1165, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 6139, 6139, - 6139, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 6140, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 898, 1147, - 0, 0, 0, 0, 6139, 6139, 6139, 6139, - 6139, 1165, 1165, 1165, 1165, 1165, 1165, 1165, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 0, + 0, 6085, 6086, 6087, 6088, 6089, 6090, 0, + 6091, 6092, 6093, 6094, 6095, 6096, 6097, 6098, + 6099, 6100, 6101, 6102, 6103, 6104, 6105, 6106, + 6107, 6108, 6109, 6110, 6111, 6112, 6113, 6114, + 6115, 6116, 6117, 6118, 6119, 6120, 6121, 6122, + 6123, 6124, 6125, 6126, 6127, 6128, 6129, 6130, + 6131, 6132, 0, 6133, 6134, 6135, 6136, 6137, + 6138, 6139, 6140, 6141, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 0, + 0, 1167, 0, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 0, + 1167, 1167, 0, 0, 0, 1167, 0, 0, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 0, + 1164, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 6143, 6143, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 0, 0, 0, 0, 0, 0, 0, 0, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 0, 1167, 1167, 0, + 0, 0, 0, 0, 6142, 6142, 6142, 6142, + 6142, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 6142, + 6142, 6142, 6142, 6142, 6142, 0, 0, 0, + 8, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 0, 0, 0, 0, 0, + 1164, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 0, 0, 0, 0, 6142, 6142, 1167, + 1167, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 0, 0, 6142, 6142, 6142, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 6144, 1209, 1209, 1209, 0, 1209, 1209, + 0, 0, 0, 0, 0, 1209, 1146, 1209, + 897, 6144, 6144, 6144, 6144, 0, 6144, 6144, + 6144, 0, 6144, 6144, 6144, 6144, 6144, 6144, + 6144, 6144, 6144, 6144, 6144, 6144, 6144, 6144, + 6144, 6144, 6144, 6144, 6144, 6144, 6144, 6144, + 6144, 6144, 6144, 6144, 6144, 6144, 6144, 0, + 0, 897, 1590, 1146, 0, 0, 0, 0, + 1223, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 6142, 0, 0, 0, 0, 0, 0, + 0, 1164, 1164, 1164, 1164, 1164, 1164, 1164, + 1164, 1164, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 6142, 6142, + 1164, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 6142, 6142, + 6142, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 6143, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 897, 1146, + 0, 0, 0, 0, 6142, 6142, 6142, 6142, + 6142, 1164, 1164, 1164, 1164, 1164, 1164, 1164, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 0, 0, 0, 8, 8, 8, 8, 8, 8, - 8, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 0, - 0, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 0, 0, 0, 0, - 0, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 0, 0, 0, 0, 0, - 0, 0, 1165, 1165, 1165, 1165, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 8, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 0, + 0, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 0, 0, 0, 0, + 0, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 0, 0, 0, 0, 0, + 0, 0, 1164, 1164, 1164, 1164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5036,60 +5047,59 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6141, 6142, 6143, 6144, 6145, 6146, 6147, - 6148, 6149, 6150, 6151, 6152, 6153, 6154, 6155, - 6156, 6157, 6158, 6159, 6160, 6161, 6162, 6163, - 6164, 6165, 6166, 6167, 6168, 6169, 6170, 6171, - 6172, 6173, 6174, 6175, 6176, 6177, 6178, 6179, - 6180, 6181, 6182, 6183, 6184, 6185, 6186, 6187, - 6188, 6189, 6190, 6191, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6192, 6193, 6194, 6195, 6196, 6197, 6198, - 6199, 6200, 6201, 6202, 6203, 6204, 6205, 6206, - 6207, 6208, 6209, 6210, 6211, 6212, 6213, 6214, - 6215, 6216, 6217, 6218, 6219, 6220, 6221, 6222, - 6223, 6224, 6225, 6226, 6227, 6228, 6229, 6230, - 6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, - 6239, 6240, 6241, 6242, 0, 0, 0, 0, - 0, 0, 0, 6139, 6139, 6139, 6139, 6139, - 6139, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 898, 898, 898, - 898, 0, 0, 0, 0, 0, 0, 0, - 0, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - 1194, 1194, 1194, 0, 0, 0, 0, 0, - 0, 1194, 1194, 1194, 1194, 1194, 1194, 1194, - 1194, 1194, 1194, 1168, 1168, 1168, 1168, 1212, - 1168, 6243, 6244, 6245, 6246, 6247, 6248, 6249, - 6250, 6251, 6252, 6253, 6254, 6255, 6256, 6257, - 6258, 6259, 6260, 6261, 6262, 6263, 6264, 0, - 0, 0, 898, 898, 898, 898, 898, 1146, - 1212, 6265, 6266, 6267, 6268, 6269, 6270, 6271, - 6272, 6273, 6274, 6275, 6276, 6277, 6278, 6279, - 6280, 6281, 6282, 6283, 6284, 6285, 6286, 0, - 0, 0, 0, 0, 0, 0, 0, 6287, - 6287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6145, 6146, 6147, 6148, 6149, 6150, 6151, + 6152, 6153, 6154, 6155, 6156, 6157, 6158, 6159, + 6160, 6161, 6162, 6163, 6164, 6165, 6166, 6167, + 6168, 6169, 6170, 6171, 6172, 6173, 6174, 6175, + 6176, 6177, 6178, 6179, 6180, 6181, 6182, 6183, + 6184, 6185, 6186, 6187, 6188, 6189, 6190, 6191, + 6192, 6193, 6194, 6195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6196, 6197, 6198, 6199, 6200, 6201, 6202, + 6203, 6204, 6205, 6206, 6207, 6208, 6209, 6210, + 6211, 6212, 6213, 6214, 6215, 6216, 6217, 6218, + 6219, 6220, 6221, 6222, 6223, 6224, 6225, 6226, + 6227, 6228, 6229, 6230, 6231, 6232, 6233, 6234, + 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, + 6243, 6244, 6245, 6246, 0, 0, 0, 0, + 0, 0, 0, 6142, 6142, 6142, 6142, 6142, + 6142, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 897, 897, 897, + 897, 0, 0, 0, 0, 0, 0, 0, + 0, 1193, 1193, 1193, 1193, 1193, 1193, 1193, + 1193, 1193, 1193, 0, 0, 0, 0, 0, + 0, 1193, 1193, 1193, 1193, 1193, 1193, 1193, + 1193, 1193, 1193, 1167, 1167, 1167, 1167, 1211, + 1167, 6247, 6248, 6249, 6250, 6251, 6252, 6253, + 6254, 6255, 6256, 6257, 6258, 6259, 6260, 6261, + 6262, 6263, 6264, 6265, 6266, 6267, 6268, 0, + 0, 0, 897, 897, 897, 897, 897, 1145, + 1211, 6269, 6270, 6271, 6272, 6273, 6274, 6275, + 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283, + 6284, 6285, 6286, 6287, 6288, 6289, 6290, 0, + 0, 0, 0, 0, 0, 0, 0, 6291, + 6291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5112,131 +5122,134 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6288, 6288, 6288, 6288, 6288, 6288, 6288, - 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288, - 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288, - 6288, 6288, 6288, 6288, 6288, 6288, 6288, 6288, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 0, 898, 898, 1163, 0, - 0, 1168, 1168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1177, 1177, 1177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6292, 6292, 6292, 6292, 6292, 6292, 6292, + 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6292, + 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6292, + 6292, 6292, 6292, 6292, 6292, 6292, 6292, 6292, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 0, 897, 897, 1162, 0, + 0, 1167, 1167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1176, 1176, 1176, 1183, 1176, + 1176, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 78, 78, 78, 78, 78, 78, + 78, 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, 1210, 1147, 1147, - 1147, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 1168, 0, 0, 0, 0, 0, 0, 0, - 0, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, - 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1147, - 1147, 898, 898, 898, 1147, 898, 1147, 1147, - 1147, 1147, 6289, 6289, 6289, 6289, 1172, 1172, - 1172, 1172, 1172, 0, 0, 0, 0, 0, + 0, 0, 0, 1146, 1146, 1209, 1146, 1146, + 1146, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 1167, 0, 0, 0, 0, 0, 0, 0, + 0, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, + 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1146, + 1146, 897, 897, 897, 1146, 897, 1146, 1146, + 1146, 1146, 6293, 6293, 6293, 6293, 1171, 1171, + 1171, 1171, 1171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 898, 1147, 898, 1147, 1165, - 1165, 1165, 1165, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 897, 1146, 897, 1146, 1164, + 1164, 1164, 1164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 6139, 6139, - 6139, 6139, 6139, 6139, 6139, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 6142, 6142, + 6142, 6142, 6142, 6142, 6142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1215, 1210, 1215, 349, 349, 349, 349, + 0, 1214, 1209, 1214, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1245, - 1104, 1104, 1104, 1104, 1104, 1104, 1104, 0, - 0, 0, 0, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1245, 349, 349, 1210, 1210, 349, 0, + 349, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1244, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 0, + 0, 0, 0, 1267, 1267, 1267, 1267, 1267, + 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, + 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1244, 349, 349, 1209, 1209, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1245, 1210, 1210, 1215, 349, 349, 349, 349, + 1244, 1209, 1209, 1214, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 6290, 6291, 6292, 6293, 349, 349, - 349, 349, 349, 349, 349, 349, 6294, 349, - 349, 349, 349, 349, 6295, 349, 349, 349, - 349, 1215, 1215, 1215, 1210, 1210, 1210, 1210, - 1215, 1215, 1245, 1223, 1104, 1104, 6296, 1104, - 1104, 1104, 1104, 1210, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6296, 0, + 349, 349, 6294, 6295, 6296, 6297, 349, 349, + 349, 349, 349, 349, 349, 349, 6298, 349, + 349, 349, 349, 349, 6299, 349, 349, 349, + 349, 1214, 1214, 1214, 1209, 1209, 1209, 1209, + 1214, 1214, 1244, 1222, 1103, 1103, 6300, 1103, + 1103, 1103, 1103, 1209, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6300, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 898, 898, 898, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 1254, 1210, 1210, 1210, 1210, 1215, 1210, 6297, - 6298, 1210, 6299, 6300, 1245, 1245, 0, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1104, 1104, 1104, 1104, 349, 1215, 1215, - 349, 0, 0, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 897, 897, 897, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1253, 1209, 1209, 1209, 1209, 1214, 1209, 6301, + 6302, 1209, 6303, 6304, 1223, 1244, 0, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1103, 1103, 1103, 1103, 1215, 1214, 1214, + 1215, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1234, 1104, 1104, 349, + 349, 349, 349, 349, 1233, 1103, 1103, 349, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1210, 1210, 1215, 349, 349, 349, 349, + 0, 1209, 1209, 1214, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1215, 1215, 1215, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1215, 1508, 349, 1281, 1281, 349, 1104, 1104, - 1104, 1104, 1210, 1234, 1210, 1210, 1104, 1215, - 1210, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 349, 1104, 349, 1104, 1104, - 1104, 0, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 0, 0, + 349, 349, 349, 349, 1214, 1214, 1214, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1214, 1507, 349, 1280, 1280, 349, 1103, 1103, + 1103, 1103, 1209, 1233, 1209, 1209, 1103, 1214, + 1209, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 349, 1103, 349, 1103, 1103, + 1103, 0, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1215, 1215, 1215, - 1210, 1210, 1210, 1215, 1215, 1210, 1508, 1234, - 1210, 1104, 1104, 1104, 1104, 1104, 1104, 1210, - 349, 349, 1210, 0, 0, 0, 0, 0, + 349, 349, 349, 349, 349, 1214, 1214, 1214, + 1209, 1209, 1209, 1214, 1214, 1209, 1507, 1233, + 1209, 1103, 1103, 1103, 1103, 1103, 1103, 1209, + 349, 349, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5249,46 +5262,46 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1104, 0, 0, 0, 0, 0, + 349, 349, 1103, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 1210, 1215, 1215, 1215, 1210, 1210, 1210, 1210, - 1210, 1210, 1234, 1245, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 1210, 1210, 1215, 1215, 0, 349, 349, + 1209, 1214, 1214, 1214, 1209, 1209, 1209, 1209, + 1209, 1209, 1233, 1244, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 1209, 1209, 1214, 1214, 0, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 349, 349, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 0, 349, 349, - 349, 349, 349, 0, 1234, 1234, 349, 1235, - 1215, 1210, 1215, 1215, 1215, 1215, 0, 0, - 6301, 1215, 0, 0, 6302, 6303, 1508, 0, + 349, 349, 349, 0, 1233, 1233, 349, 1234, + 1214, 1209, 1214, 1214, 1214, 1214, 0, 0, + 6305, 1214, 0, 0, 6306, 6307, 1507, 0, 0, 349, 0, 0, 0, 0, 0, 0, - 1235, 0, 0, 0, 0, 0, 349, 349, - 349, 349, 349, 1215, 1215, 0, 0, 898, - 898, 898, 898, 898, 898, 898, 0, 0, - 0, 898, 898, 898, 898, 898, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 349, 349, 6304, 6305, 6306, 6307, 349, - 349, 349, 349, 0, 6308, 0, 0, 6309, - 0, 6310, 6311, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 0, - 349, 1235, 1215, 1215, 1254, 1210, 1210, 1210, - 1210, 1210, 0, 6312, 0, 0, 6313, 0, - 6314, 6315, 1235, 1215, 0, 1215, 1215, 1245, - 1508, 1245, 1281, 1210, 349, 1104, 1104, 0, - 1104, 1104, 0, 0, 0, 0, 0, 0, - 0, 0, 1210, 1210, 0, 0, 0, 0, + 1234, 0, 0, 0, 0, 0, 349, 349, + 349, 349, 349, 1214, 1214, 0, 0, 897, + 897, 897, 897, 897, 897, 897, 0, 0, + 0, 897, 897, 897, 897, 897, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1215, 1215, 6308, 6309, 6310, 6311, 1215, + 1215, 1215, 1215, 0, 6312, 0, 0, 6313, + 0, 6314, 6315, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 0, + 349, 1234, 1214, 1214, 1253, 1209, 1209, 1209, + 1209, 1209, 0, 6316, 0, 0, 6317, 0, + 6318, 6319, 1234, 1214, 0, 1214, 1214, 1244, + 1507, 1223, 1280, 1209, 349, 1103, 1103, 0, + 1103, 1103, 0, 0, 0, 0, 0, 0, + 0, 0, 1209, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5298,12 +5311,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 1215, 1215, - 1215, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1215, 1215, 1245, 1210, 1210, 1215, 1234, - 349, 349, 349, 349, 1104, 1104, 1104, 1104, - 1104, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1104, 1104, 0, 1104, 898, + 349, 349, 349, 349, 349, 349, 1214, 1214, + 1214, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1214, 1214, 1244, 1209, 1209, 1214, 1233, + 349, 349, 349, 349, 1103, 1103, 1103, 1103, + 1103, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1103, 1103, 0, 1103, 897, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5314,12 +5327,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 1235, 1215, 1215, 1210, 1210, 1210, 1210, - 1210, 1210, 6316, 1254, 6317, 6318, 1235, 6319, - 1210, 1210, 1215, 1245, 1234, 349, 349, 1104, + 349, 1234, 1214, 1214, 1209, 1209, 1209, 1209, + 1209, 1209, 6320, 1253, 6321, 6322, 1234, 6323, + 1209, 1209, 1214, 1244, 1233, 349, 349, 1103, 349, 0, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5346,12 +5359,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 1235, 1215, 1215, 1210, 1210, 1210, 1210, 0, - 0, 6320, 6321, 6322, 6323, 1210, 1210, 1215, - 1245, 1234, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 349, 349, 349, 349, 1210, 1210, 0, + 1234, 1214, 1214, 1209, 1209, 1209, 1209, 0, + 0, 6324, 6325, 6326, 6327, 1209, 1209, 1214, + 1244, 1233, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 349, 349, 349, 349, 1209, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5362,12 +5375,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 1215, 1215, 1215, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1215, 1215, 1210, 1215, - 1245, 1210, 1104, 1104, 1104, 349, 0, 0, + 349, 1214, 1214, 1214, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1214, 1214, 1209, 1214, + 1244, 1209, 1103, 1103, 1103, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5377,26 +5390,26 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1210, 1215, 1210, 1215, - 1215, 1210, 1210, 1210, 1210, 1210, 1210, 1508, - 1234, 349, 1104, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1233, 1233, 0, 0, 0, + 349, 349, 349, 349, 1209, 1214, 1209, 1214, + 1214, 1209, 1209, 1209, 1209, 1209, 1209, 1507, + 1233, 349, 1103, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 0, 0, 1210, 1215, - 1210, 1322, 1322, 1210, 1210, 1210, 1210, 1215, - 1210, 1210, 1210, 1210, 1245, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1242, 1242, 1104, 1104, 1104, - 897, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 0, 0, 1209, 1214, + 1209, 1321, 1321, 1209, 1209, 1209, 1209, 1214, + 1209, 1209, 1209, 1209, 1244, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1241, 1241, 1103, 1103, 1103, + 896, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5425,9 +5438,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1215, 1215, 1215, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1215, 1245, 1234, 1104, 0, 0, 0, + 349, 349, 349, 349, 349, 1214, 1214, 1214, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1214, 1244, 1233, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5440,30 +5453,30 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6324, 6325, 6326, 6327, 6328, 6329, 6330, - 6331, 6332, 6333, 6334, 6335, 6336, 6337, 6338, - 6339, 6340, 6341, 6342, 6343, 6344, 6345, 6346, - 6347, 6348, 6349, 6350, 6351, 6352, 6353, 6354, - 6355, 6356, 6357, 6358, 6359, 6360, 6361, 6362, - 6363, 6364, 6365, 6366, 6367, 6368, 6369, 6370, - 6371, 6372, 6373, 6374, 6375, 6376, 6377, 6378, - 6379, 6380, 6381, 6382, 6383, 6384, 6385, 6386, - 6387, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 0, 0, 0, 0, + 0, 6328, 6329, 6330, 6331, 6332, 6333, 6334, + 6335, 6336, 6337, 6338, 6339, 6340, 6341, 6342, + 6343, 6344, 6345, 6346, 6347, 6348, 6349, 6350, + 6351, 6352, 6353, 6354, 6355, 6356, 6357, 6358, + 6359, 6360, 6361, 6362, 6363, 6364, 6365, 6366, + 6367, 6368, 6369, 6370, 6371, 6372, 6373, 6374, + 6375, 6376, 6377, 6378, 6379, 6380, 6381, 6382, + 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, + 6391, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 349, 349, 349, 349, 349, 349, 349, 349, - 0, 0, 349, 0, 0, 349, 349, 349, - 349, 349, 349, 349, 349, 0, 349, 349, - 0, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 1235, 1215, 1215, 1215, 1215, 6388, 0, - 1215, 6389, 0, 0, 1210, 1210, 1508, 1245, - 1281, 1215, 1281, 1215, 1234, 1104, 1104, 1104, + 349, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 0, 0, 1215, 0, 0, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 0, 1215, 1215, + 0, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1234, 1214, 1214, 1214, 1214, 6392, 0, + 1214, 6393, 0, 0, 1209, 1209, 1507, 1223, + 1280, 1214, 1280, 1214, 1233, 1103, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5478,33 +5491,33 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1215, 1215, 1215, 1210, 1210, 1210, - 1210, 0, 0, 1210, 1210, 1215, 1215, 1215, - 1215, 1245, 349, 1104, 349, 1215, 0, 0, + 349, 349, 1214, 1214, 1214, 1209, 1209, 1209, + 1209, 0, 0, 1209, 1209, 1214, 1214, 1214, + 1214, 1244, 349, 1103, 349, 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 349, 1210, 1210, 1210, 1210, 1210, 1210, - 6390, 6390, 1210, 1210, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1210, 1245, 1210, 1210, - 1210, 1210, 1215, 1281, 1210, 1210, 1210, 1210, - 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 1245, 0, 0, 0, 0, 0, 0, 0, - 0, 349, 1210, 1210, 1210, 1210, 1210, 1210, - 1215, 1215, 1210, 1210, 1210, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1281, 1281, 1281, - 1281, 1281, 1281, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1215, 1210, 1245, 1104, 1104, 1104, 349, 1104, - 1104, 1104, 1104, 1104, 0, 0, 0, 0, + 0, 1215, 1209, 1209, 1209, 1209, 1209, 1209, + 6394, 6394, 1209, 1209, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1209, 1244, 1209, 1209, + 1209, 1209, 1214, 349, 1209, 1209, 1209, 1209, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1223, 0, 0, 0, 0, 0, 0, 0, + 0, 1215, 1209, 1209, 1209, 1209, 1209, 1209, + 1214, 1214, 1209, 1209, 1209, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1280, 1280, 1280, + 1280, 1280, 1280, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1214, 1209, 1223, 1103, 1103, 1103, 349, 1103, + 1103, 1103, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -5516,10 +5529,8 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, - 0, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 1104, 1104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5530,6 +5541,8 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1209, 1214, 1209, 1209, 1209, 1214, 1209, + 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5544,33 +5557,33 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1104, 0, 0, 0, 0, 0, + 349, 349, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 1215, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 0, 1210, 1210, 1210, 1210, 1210, 1210, 1215, - 6391, 349, 1104, 1104, 1104, 1104, 1104, 0, + 1214, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 0, 1209, 1209, 1209, 1209, 1209, 1209, 1214, + 6395, 349, 1103, 1103, 1103, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 0, 0, - 0, 1104, 1104, 349, 349, 349, 349, 349, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 0, 0, + 0, 1103, 1103, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 0, 0, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 0, 1215, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1215, 1210, 1210, 1215, 1210, 1210, + 349, 0, 0, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 0, 1214, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1214, 1209, 1209, 1214, 1209, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5586,30 +5599,30 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1210, 1210, 1210, 1210, 1210, 1210, - 0, 0, 0, 1210, 0, 1210, 1210, 0, - 1210, 1210, 1210, 1234, 1210, 1245, 1245, 1281, - 1210, 0, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 349, 349, 1209, 1209, 1209, 1209, 1209, 1209, + 0, 0, 0, 1209, 0, 1209, 1209, 0, + 1209, 1209, 1209, 1233, 1209, 1244, 1244, 1280, + 1209, 0, 0, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 0, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 1215, 1215, 1215, 1215, 1215, - 0, 1210, 1210, 0, 1215, 1215, 1210, 1215, - 1245, 349, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 349, 349, 349, 1214, 1214, 1214, 1214, 1214, + 0, 1209, 1209, 0, 1214, 1214, 1209, 1214, + 1244, 349, 0, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, + 0, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 598, 349, 349, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5642,20 +5655,20 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 1210, 1210, 1215, 1215, - 1104, 1104, 0, 0, 0, 0, 0, 0, - 0, 1210, 1210, 1281, 1215, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 0, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 1215, 1215, 1210, - 1210, 1210, 1210, 1210, 0, 0, 0, 1215, - 1215, 1210, 1508, 1245, 1104, 1104, 1104, 1104, - 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, - 1104, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1210, 0, 0, 0, 0, + 349, 349, 349, 349, 1209, 1209, 1214, 1214, + 1103, 1103, 0, 0, 0, 0, 0, 0, + 0, 1209, 1209, 1280, 1214, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 0, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, + 1215, 1215, 1215, 1215, 1215, 1214, 1214, 1209, + 1209, 1209, 1209, 1209, 0, 0, 0, 1214, + 1214, 1209, 1507, 1223, 1103, 1103, 1103, 1103, + 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, + 1103, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5668,15 +5681,15 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 78, 78, + 0, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 78, 78, 78, 78, 78, 78, 78, 78, 10, 10, 10, 10, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1104, 349, 349, 349, 349, 349, 349, 349, + 1103, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -5708,21 +5721,21 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, - 0, 1104, 1104, 1104, 1104, 1104, 0, 0, + 0, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, + 0, 1103, 1103, 1103, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -5834,7 +5847,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 1104, 1104, 0, 0, 0, 0, + 349, 349, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -5842,11 +5855,11 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 6392, 6392, 6392, 6392, 6392, 6392, 6392, - 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, - 6392, 1210, 349, 349, 349, 349, 349, 349, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 0, + 349, 6396, 6396, 6396, 6396, 6396, 6396, 6396, + 6396, 6396, 6396, 6396, 6396, 6396, 6396, 6396, + 6396, 1209, 349, 349, 349, 349, 349, 349, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -5935,11 +5948,11 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 6393, - 1254, 1254, 6394, 6395, 6396, 6397, 6398, 6399, - 6400, 6401, 6402, 1215, 1215, 1215, 1210, 1210, - 1245, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 349, 349, 349, 349, 349, 349, 349, 6397, + 1253, 1253, 6398, 6399, 6400, 6401, 6402, 6403, + 6404, 6405, 6406, 1214, 1214, 1214, 1209, 1209, + 1244, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5976,9 +5989,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 1104, - 1104, 349, 349, 349, 349, 349, 349, 349, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 1103, + 1103, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -5988,13 +6001,13 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, - 0, 1589, 1589, 1589, 1589, 1589, 1104, 0, + 0, 1590, 1590, 1590, 1590, 1590, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -6002,13 +6015,13 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 898, 898, 898, 898, 898, 898, 898, - 1104, 1104, 1104, 1104, 1104, 897, 897, 897, - 897, 599, 599, 599, 599, 1104, 897, 0, + 349, 897, 897, 897, 897, 897, 897, 897, + 1103, 1103, 1103, 1103, 1103, 896, 896, 896, + 896, 598, 598, 598, 598, 1103, 896, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 0, 349, 349, 349, 349, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 349, 349, @@ -6036,19 +6049,14 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 599, 599, 599, 349, 349, 349, 349, + 0, 598, 598, 598, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 6403, 349, 349, 349, - 6404, 6405, 6406, 6407, 599, 599, 1104, 1104, - 1104, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 349, 349, 349, 349, 6407, 349, 349, 349, + 6408, 6409, 6410, 6411, 598, 598, 1103, 1103, + 1103, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6068,25 +6076,30 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6408, 6409, 6410, 6411, 6412, 6413, 6414, - 6415, 6416, 6417, 6418, 6419, 6420, 6421, 6422, - 6423, 6424, 6425, 6426, 6427, 6428, 6429, 6430, - 6431, 6432, 6433, 6434, 6435, 6436, 6437, 6438, - 6439, 6440, 6441, 6442, 6443, 6444, 6445, 6446, - 6447, 6448, 6449, 6450, 6451, 6452, 6453, 6454, - 6455, 6456, 6457, 6458, 6459, 6460, 6461, 6462, - 6463, 6464, 6465, 6466, 6467, 6468, 6469, 6470, - 6471, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1104, 1104, 1104, 1104, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6412, 6413, 6414, 6415, 6416, 6417, 6418, + 6419, 6420, 6421, 6422, 6423, 6424, 6425, 6426, + 6427, 6428, 6429, 6430, 6431, 6432, 6433, 6434, + 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, + 6443, 6444, 6445, 6446, 6447, 6448, 6449, 6450, + 6451, 6452, 6453, 6454, 6455, 6456, 6457, 6458, + 6459, 6460, 6461, 6462, 6463, 6464, 6465, 6466, + 6467, 6468, 6469, 6470, 6471, 6472, 6473, 6474, + 6475, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1103, 1103, 1103, 1103, 0, 0, 0, 0, + 0, 6476, 6477, 6478, 6479, 6480, 6481, 6482, + 6483, 6484, 6485, 6486, 6487, 6488, 6489, 6490, + 6491, 6492, 6493, 6494, 6495, 6496, 6497, 6498, + 6499, 6500, 0, 0, 6501, 6502, 6503, 6504, + 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, + 6513, 6514, 6515, 6516, 6517, 6518, 6519, 6520, + 6521, 6522, 6523, 6524, 6525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6102,97 +6115,17 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, - 1210, 349, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, - 1215, 0, 0, 0, 0, 0, 0, 0, - 1210, 1210, 1210, 1210, 599, 599, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 599, - 599, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3212, 3212, 3211, 3212, 1210, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6472, 6472, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 1209, 349, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1214, 0, 0, 0, 0, 0, 0, 0, + 1209, 1209, 1209, 1209, 598, 598, 598, 598, + 598, 598, 598, 598, 598, 598, 598, 598, + 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6200,13 +6133,46 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3210, 3210, 3209, 3210, 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6526, 6526, 3210, 3210, 3212, 3212, 3212, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6219,6 +6185,21 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6250,72 +6231,72 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3212, 3212, 3212, 3212, 0, 3212, 3212, - 3212, 3212, 3212, 3212, 3212, 0, 3212, 3212, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 0, 0, 0, 0, + 0, 3210, 3210, 3210, 3210, 0, 3210, 3210, + 3210, 3210, 3210, 3210, 3210, 0, 3210, 3210, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3213, 0, 0, 0, 0, + 0, 0, 0, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 0, 0, 3213, 0, + 0, 3211, 3211, 3211, 0, 0, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3213, 3213, 3213, - 3213, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 0, 0, 0, + 0, 0, 0, 0, 0, 3211, 3211, 3211, + 3211, 0, 0, 0, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, @@ -6335,8 +6316,8 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 0, 0, 897, 1210, 1589, - 1104, 1510, 1510, 1510, 1510, 0, 0, 0, + 349, 349, 349, 0, 0, 896, 1209, 1590, + 1103, 1509, 1509, 1509, 1509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6374,12 +6355,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 6473, - 6474, 6475, 6476, 6477, 6478, 6479, 6480, 6481, - 6482, 6483, 6484, 6485, 6486, 6487, 6488, 6489, - 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497, - 6498, 6499, 6500, 6501, 6502, 6503, 6504, 6505, - 6506, 6507, 6508, 0, 0, 0, 0, 0, + 78, 78, 78, 78, 78, 78, 78, 6527, + 6528, 6529, 6530, 6531, 6532, 6533, 6534, 6535, + 6536, 6537, 6538, 6539, 6540, 6541, 6542, 6543, + 6544, 6545, 6546, 6547, 6548, 6549, 6550, 6551, + 6552, 6553, 6554, 6555, 6556, 6557, 6558, 6559, + 6560, 6561, 6562, 78, 78, 78, 0, 0, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -6435,40 +6416,126 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, 0, 0, + 0, 0, 0, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 0, + 0, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 0, 0, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 6563, + 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6570, + 1590, 1590, 1590, 896, 896, 896, 6571, 6570, + 6570, 6570, 6570, 6570, 1509, 1509, 1509, 1509, + 1509, 1509, 1509, 1509, 1146, 1146, 1146, 1146, + 1146, 1146, 1146, 1146, 896, 896, 897, 897, + 897, 897, 897, 1146, 1146, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 897, 897, 897, 897, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 6572, 6573, 6574, 6575, + 6576, 6577, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 897, 897, 897, 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, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 0, - 0, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6476,81 +6543,32 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 0, 0, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 6509, - 6510, 6511, 6512, 6513, 6514, 6515, 6516, 6516, - 1589, 1589, 1589, 897, 897, 897, 6517, 6516, - 6516, 6516, 6516, 6516, 1510, 1510, 1510, 1510, - 1510, 1510, 1510, 1510, 1147, 1147, 1147, 1147, - 1147, 1147, 1147, 1147, 897, 897, 898, 898, - 898, 898, 898, 1147, 1147, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 898, 898, 898, 898, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 6518, 6519, 6520, 6521, - 6522, 6523, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 898, 898, 898, 78, 0, + 0, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, + 1241, 1241, 1241, 1241, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2709, 2709, 2709, 2709, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6578, 6578, 6578, 6578, 6578, 6578, 6578, + 6578, 6578, 6578, 6578, 6578, 6578, 6578, 6578, + 6578, 6578, 6578, 6578, 6578, 6578, 6578, 6578, + 1241, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6564,197 +6582,160 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - 1242, 1242, 1242, 1242, 1242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, - 2710, 2710, 2710, 2710, 2710, 2710, 2710, 2710, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6524, 6524, 6524, 6524, 6524, 6524, 6524, - 6524, 6524, 6524, 6524, 6524, 6524, 6524, 6524, - 6524, 6524, 6524, 6524, 6524, 6524, 6524, 6524, - 1242, 1242, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6525, 6526, 6527, 6528, 6529, 6530, 6531, - 6532, 6533, 6534, 6535, 6536, 6537, 6538, 6539, - 6540, 6541, 6542, 6543, 6544, 6545, 6546, 6547, - 6548, 6549, 6550, 6551, 6552, 6553, 6554, 6555, - 6556, 6557, 6558, 6559, 6560, 6561, 6562, 6563, - 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6571, - 6572, 6573, 6574, 6575, 6576, 6577, 6578, 6579, - 6580, 6581, 6582, 6583, 6584, 6585, 6586, 6587, - 6588, 6589, 6590, 6591, 6592, 6593, 6594, 6595, - 6596, 6597, 6598, 6599, 6600, 6601, 6602, 6603, - 6604, 6605, 6606, 6607, 6608, 6609, 0, 6610, - 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, - 6619, 6620, 6621, 6622, 6623, 6624, 6625, 6626, - 6627, 6628, 6629, 6630, 6631, 6632, 6633, 6634, - 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, - 6643, 6644, 6645, 6646, 6647, 6648, 6649, 6650, - 6651, 6652, 6653, 6654, 6655, 6656, 6657, 6658, - 6659, 6660, 6661, 6662, 6663, 6664, 6665, 6666, - 6667, 6668, 6669, 6670, 6671, 6672, 6673, 6674, - 6675, 6676, 6677, 6678, 6679, 6680, 0, 6681, - 6682, 0, 0, 6683, 0, 0, 6684, 6685, - 0, 0, 6686, 6687, 6688, 6689, 0, 6690, - 6691, 6692, 6693, 6694, 6695, 6696, 6697, 6698, - 6699, 6700, 6701, 0, 6702, 0, 6703, 6704, - 6705, 6706, 6707, 6708, 6709, 0, 6710, 6711, - 6712, 6713, 6714, 6715, 6716, 6717, 6718, 6719, - 6720, 6721, 6722, 6723, 6724, 6725, 6726, 6727, - 6728, 6729, 6730, 6731, 6732, 6733, 6734, 6735, - 6736, 6737, 6738, 6739, 6740, 6741, 6742, 6743, - 6744, 6745, 6746, 6747, 6748, 6749, 6750, 6751, - 6752, 6753, 6754, 6755, 6756, 6757, 6758, 6759, - 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, - 6768, 6769, 6770, 6771, 6772, 6773, 6774, 0, - 6775, 6776, 6777, 6778, 0, 0, 6779, 6780, - 6781, 6782, 6783, 6784, 6785, 6786, 0, 6787, - 6788, 6789, 6790, 6791, 6792, 6793, 0, 6794, - 6795, 6796, 6797, 6798, 6799, 6800, 6801, 6802, - 6803, 6804, 6805, 6806, 6807, 6808, 6809, 6810, - 6811, 6812, 6813, 6814, 6815, 6816, 6817, 6818, - 6819, 6820, 6821, 0, 6822, 6823, 6824, 6825, - 0, 6826, 6827, 6828, 6829, 6830, 0, 6831, - 0, 0, 0, 6832, 6833, 6834, 6835, 6836, - 6837, 6838, 0, 6839, 6840, 6841, 6842, 6843, - 6844, 6845, 6846, 6847, 6848, 6849, 6850, 6851, - 6852, 6853, 6854, 6855, 6856, 6857, 6858, 6859, - 6860, 6861, 6862, 6863, 6864, 6865, 6866, 6867, - 6868, 6869, 6870, 6871, 6872, 6873, 6874, 6875, - 6876, 6877, 6878, 6879, 6880, 6881, 6882, 6883, - 6884, 6885, 6886, 6887, 6888, 6889, 6890, 6891, - 6892, 6893, 6894, 6895, 6896, 6897, 6898, 6899, - 6900, 6901, 6902, 6903, 6904, 6905, 6906, 6907, - 6908, 6909, 6910, 6911, 6912, 6913, 6914, 6915, - 6916, 6917, 6918, 6919, 6920, 6921, 6922, 6923, - 6924, 6925, 6926, 6927, 6928, 6929, 6930, 6931, - 6932, 6933, 6934, 6935, 6936, 6937, 6938, 6939, - 6940, 6941, 6942, 6943, 6944, 6945, 6946, 6947, - 6948, 6949, 6950, 6951, 6952, 6953, 6954, 6955, - 6956, 6957, 6958, 6959, 6960, 6961, 6962, 6963, - 6964, 6965, 6966, 6967, 6968, 6969, 6970, 6971, - 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979, - 6980, 6981, 6982, 6983, 6984, 6985, 6986, 6987, - 6988, 6989, 6990, 6991, 6992, 6993, 6994, 6995, - 6996, 6997, 6998, 6999, 7000, 7001, 7002, 7003, - 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, - 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, - 7020, 7021, 7022, 7023, 7024, 7025, 7026, 7027, - 7028, 7029, 7030, 7031, 7032, 7033, 7034, 7035, - 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, - 7044, 7045, 7046, 7047, 7048, 7049, 7050, 7051, - 7052, 7053, 7054, 7055, 7056, 7057, 7058, 7059, - 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, - 7068, 7069, 7070, 7071, 7072, 7073, 7074, 7075, - 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, - 7084, 7085, 7086, 7087, 7088, 7089, 7090, 7091, - 7092, 7093, 7094, 7095, 7096, 7097, 7098, 7099, - 7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, - 7108, 7109, 7110, 7111, 7112, 7113, 7114, 7115, - 7116, 7117, 7118, 7119, 7120, 7121, 7122, 7123, - 7124, 7125, 7126, 7127, 7128, 7129, 7130, 7131, - 7132, 7133, 7134, 7135, 7136, 7137, 7138, 7139, - 7140, 7141, 7142, 7143, 7144, 7145, 7146, 7147, - 7148, 7149, 7150, 7151, 7152, 7153, 7154, 7155, - 7156, 7157, 7158, 7159, 7160, 7161, 7162, 7163, - 7164, 7165, 7166, 7167, 7168, 7169, 7170, 7171, - 7172, 7173, 7174, 7175, 7176, 7177, 7178, 0, - 0, 7179, 7180, 7181, 7182, 7183, 7184, 7185, + 0, 6579, 6580, 6581, 6582, 6583, 6584, 6585, + 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593, + 6594, 6595, 6596, 6597, 6598, 6599, 6600, 6601, + 6602, 6603, 6604, 6605, 6606, 6607, 6608, 6609, + 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, + 6618, 6619, 6620, 6621, 6622, 6623, 6624, 6625, + 6626, 6627, 6628, 6629, 6630, 6631, 6632, 6633, + 6634, 6635, 6636, 6637, 6638, 6639, 6640, 6641, + 6642, 6643, 6644, 6645, 6646, 6647, 6648, 6649, + 6650, 6651, 6652, 6653, 6654, 6655, 6656, 6657, + 6658, 6659, 6660, 6661, 6662, 6663, 0, 6664, + 6665, 6666, 6667, 6668, 6669, 6670, 6671, 6672, + 6673, 6674, 6675, 6676, 6677, 6678, 6679, 6680, + 6681, 6682, 6683, 6684, 6685, 6686, 6687, 6688, + 6689, 6690, 6691, 6692, 6693, 6694, 6695, 6696, + 6697, 6698, 6699, 6700, 6701, 6702, 6703, 6704, + 6705, 6706, 6707, 6708, 6709, 6710, 6711, 6712, + 6713, 6714, 6715, 6716, 6717, 6718, 6719, 6720, + 6721, 6722, 6723, 6724, 6725, 6726, 6727, 6728, + 6729, 6730, 6731, 6732, 6733, 6734, 0, 6735, + 6736, 0, 0, 6737, 0, 0, 6738, 6739, + 0, 0, 6740, 6741, 6742, 6743, 0, 6744, + 6745, 6746, 6747, 6748, 6749, 6750, 6751, 6752, + 6753, 6754, 6755, 0, 6756, 0, 6757, 6758, + 6759, 6760, 6761, 6762, 6763, 0, 6764, 6765, + 6766, 6767, 6768, 6769, 6770, 6771, 6772, 6773, + 6774, 6775, 6776, 6777, 6778, 6779, 6780, 6781, + 6782, 6783, 6784, 6785, 6786, 6787, 6788, 6789, + 6790, 6791, 6792, 6793, 6794, 6795, 6796, 6797, + 6798, 6799, 6800, 6801, 6802, 6803, 6804, 6805, + 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, + 6814, 6815, 6816, 6817, 6818, 6819, 6820, 6821, + 6822, 6823, 6824, 6825, 6826, 6827, 6828, 0, + 6829, 6830, 6831, 6832, 0, 0, 6833, 6834, + 6835, 6836, 6837, 6838, 6839, 6840, 0, 6841, + 6842, 6843, 6844, 6845, 6846, 6847, 0, 6848, + 6849, 6850, 6851, 6852, 6853, 6854, 6855, 6856, + 6857, 6858, 6859, 6860, 6861, 6862, 6863, 6864, + 6865, 6866, 6867, 6868, 6869, 6870, 6871, 6872, + 6873, 6874, 6875, 0, 6876, 6877, 6878, 6879, + 0, 6880, 6881, 6882, 6883, 6884, 0, 6885, + 0, 0, 0, 6886, 6887, 6888, 6889, 6890, + 6891, 6892, 0, 6893, 6894, 6895, 6896, 6897, + 6898, 6899, 6900, 6901, 6902, 6903, 6904, 6905, + 6906, 6907, 6908, 6909, 6910, 6911, 6912, 6913, + 6914, 6915, 6916, 6917, 6918, 6919, 6920, 6921, + 6922, 6923, 6924, 6925, 6926, 6927, 6928, 6929, + 6930, 6931, 6932, 6933, 6934, 6935, 6936, 6937, + 6938, 6939, 6940, 6941, 6942, 6943, 6944, 6945, + 6946, 6947, 6948, 6949, 6950, 6951, 6952, 6953, + 6954, 6955, 6956, 6957, 6958, 6959, 6960, 6961, + 6962, 6963, 6964, 6965, 6966, 6967, 6968, 6969, + 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, + 6978, 6979, 6980, 6981, 6982, 6983, 6984, 6985, + 6986, 6987, 6988, 6989, 6990, 6991, 6992, 6993, + 6994, 6995, 6996, 6997, 6998, 6999, 7000, 7001, + 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, + 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, + 7018, 7019, 7020, 7021, 7022, 7023, 7024, 7025, + 7026, 7027, 7028, 7029, 7030, 7031, 7032, 7033, + 7034, 7035, 7036, 7037, 7038, 7039, 7040, 7041, + 7042, 7043, 7044, 7045, 7046, 7047, 7048, 7049, + 7050, 7051, 7052, 7053, 7054, 7055, 7056, 7057, + 7058, 7059, 7060, 7061, 7062, 7063, 7064, 7065, + 7066, 7067, 7068, 7069, 7070, 7071, 7072, 7073, + 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, + 7082, 7083, 7084, 7085, 7086, 7087, 7088, 7089, + 7090, 7091, 7092, 7093, 7094, 7095, 7096, 7097, + 7098, 7099, 7100, 7101, 7102, 7103, 7104, 7105, + 7106, 7107, 7108, 7109, 7110, 7111, 7112, 7113, + 7114, 7115, 7116, 7117, 7118, 7119, 7120, 7121, + 7122, 7123, 7124, 7125, 7126, 7127, 7128, 7129, + 7130, 7131, 7132, 7133, 7134, 7135, 7136, 7137, + 7138, 7139, 7140, 7141, 7142, 7143, 7144, 7145, + 7146, 7147, 7148, 7149, 7150, 7151, 7152, 7153, + 7154, 7155, 7156, 7157, 7158, 7159, 7160, 7161, + 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, + 7170, 7171, 7172, 7173, 7174, 7175, 7176, 7177, + 7178, 7179, 7180, 7181, 7182, 7183, 7184, 7185, 7186, 7187, 7188, 7189, 7190, 7191, 7192, 7193, 7194, 7195, 7196, 7197, 7198, 7199, 7200, 7201, 7202, 7203, 7204, 7205, 7206, 7207, 7208, 7209, 7210, 7211, 7212, 7213, 7214, 7215, 7216, 7217, 7218, 7219, 7220, 7221, 7222, 7223, 7224, 7225, - 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, - 7234, 7235, 7236, 7237, 7238, 7239, 7240, 7241, - 7242, 7243, 7244, 7245, 7246, 7247, 7248, 7249, - 7250, 7251, 7252, 7253, 7254, 7255, 7256, 7257, - 7258, 7259, 7260, 7261, 7204, 7262, 7263, 7264, - 7265, 7266, 7267, 7268, 7269, 7270, 7271, 7272, - 7273, 7274, 7275, 7276, 7277, 7278, 7279, 7280, - 7281, 7282, 7283, 7284, 7285, 7286, 7230, 7287, + 7226, 7227, 7228, 7229, 7230, 7231, 7232, 0, + 0, 7233, 7234, 7235, 7236, 7237, 7238, 7239, + 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7247, + 7248, 7249, 7250, 7251, 7252, 7253, 7254, 7255, + 7256, 7257, 7258, 7259, 7260, 7261, 7262, 7263, + 7264, 7265, 7266, 7267, 7268, 7269, 7270, 7271, + 7272, 7273, 7274, 7275, 7276, 7277, 7278, 7279, + 7280, 7281, 7282, 7283, 7284, 7285, 7286, 7287, 7288, 7289, 7290, 7291, 7292, 7293, 7294, 7295, 7296, 7297, 7298, 7299, 7300, 7301, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309, 7310, 7311, - 7312, 7313, 7314, 7315, 7316, 7317, 7204, 7318, + 7312, 7313, 7314, 7315, 7258, 7316, 7317, 7318, 7319, 7320, 7321, 7322, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, - 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, - 7230, 7343, 7344, 7345, 7346, 7347, 7348, 7349, + 7335, 7336, 7337, 7338, 7339, 7340, 7284, 7341, + 7342, 7343, 7344, 7345, 7346, 7347, 7348, 7349, 7350, 7351, 7352, 7353, 7354, 7355, 7356, 7357, 7358, 7359, 7360, 7361, 7362, 7363, 7364, 7365, - 7366, 7367, 7368, 7369, 7370, 7371, 7372, 7373, - 7204, 7374, 7375, 7376, 7377, 7378, 7379, 7380, + 7366, 7367, 7368, 7369, 7370, 7371, 7258, 7372, + 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384, 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, - 7397, 7398, 7230, 7399, 7400, 7401, 7402, 7403, + 7284, 7397, 7398, 7399, 7400, 7401, 7402, 7403, 7404, 7405, 7406, 7407, 7408, 7409, 7410, 7411, 7412, 7413, 7414, 7415, 7416, 7417, 7418, 7419, 7420, 7421, 7422, 7423, 7424, 7425, 7426, 7427, - 7428, 7429, 7204, 7430, 7431, 7432, 7433, 7434, + 7258, 7428, 7429, 7430, 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, 7443, 7444, 7445, 7446, 7447, 7448, 7449, 7450, - 7451, 7452, 7453, 7454, 7230, 7455, 7456, 7457, - 7458, 7459, 7460, 7461, 7462, 0, 0, 6499, - 6500, 6501, 6502, 6503, 6504, 6505, 6506, 6507, - 6508, 6499, 6500, 6501, 6502, 6503, 6504, 6505, - 6506, 6507, 6508, 6499, 6500, 6501, 6502, 6503, - 6504, 6505, 6506, 6507, 6508, 6499, 6500, 6501, - 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6499, - 6500, 6501, 6502, 6503, 6504, 6505, 6506, 6507, - 6508, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 897, 897, 897, 897, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 897, 897, - 897, 897, 897, 897, 897, 897, 1210, 897, - 897, 897, 897, 897, 897, 897, 897, 897, - 897, 897, 897, 897, 897, 1210, 897, 897, - 1104, 1104, 1104, 1104, 1104, 0, 0, 0, + 7451, 7452, 7284, 7453, 7454, 7455, 7456, 7457, + 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7465, + 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, + 7474, 7475, 7476, 7477, 7478, 7479, 7480, 7481, + 7482, 7483, 7258, 7484, 7485, 7486, 7487, 7488, + 7489, 7490, 7491, 7492, 7493, 7494, 7495, 7496, + 7497, 7498, 7499, 7500, 7501, 7502, 7503, 7504, + 7505, 7506, 7507, 7508, 7284, 7509, 7510, 7511, + 7512, 7513, 7514, 7515, 7516, 0, 0, 6553, + 6554, 6555, 6556, 6557, 6558, 6559, 6560, 6561, + 6562, 6553, 6554, 6555, 6556, 6557, 6558, 6559, + 6560, 6561, 6562, 6553, 6554, 6555, 6556, 6557, + 6558, 6559, 6560, 6561, 6562, 6553, 6554, 6555, + 6556, 6557, 6558, 6559, 6560, 6561, 6562, 6553, + 6554, 6555, 6556, 6557, 6558, 6559, 6560, 6561, + 6562, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 896, 896, 896, 896, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 896, 896, + 896, 896, 896, 896, 896, 896, 1209, 896, + 896, 896, 896, 896, 896, 896, 896, 896, + 896, 896, 896, 896, 896, 1209, 896, 896, + 1103, 1103, 1103, 1103, 1103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1210, 1210, 1210, 1210, - 1210, 0, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1209, 1209, 1209, 1209, + 1209, 0, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, + 1209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6764,12 +6745,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7463, 7464, 7465, 7466, 7467, 7468, 7469, - 7470, 7471, 7472, 349, 7473, 7474, 7475, 7476, - 7477, 7478, 7479, 7480, 7481, 7482, 7483, 7484, - 7485, 7486, 7487, 7488, 7489, 7490, 7491, 7492, - 0, 0, 0, 0, 0, 0, 7493, 7494, - 7495, 7496, 7497, 7498, 0, 0, 0, 0, + 0, 7517, 7518, 7519, 7520, 7521, 7522, 7523, + 7524, 7525, 7526, 349, 7527, 7528, 7529, 7530, + 7531, 7532, 7533, 7534, 7535, 7536, 7537, 7538, + 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, + 0, 0, 0, 0, 0, 0, 7547, 7548, + 7549, 7550, 7551, 7552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6796,25 +6777,25 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 898, 898, 898, 898, 898, 898, 898, - 0, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 898, 898, 898, 898, 898, 898, - 898, 898, 0, 0, 898, 898, 898, 898, - 898, 898, 898, 0, 898, 898, 0, 898, - 898, 898, 898, 898, 0, 0, 0, 0, - 0, 7499, 7500, 7501, 7502, 7503, 7504, 7505, - 7506, 7507, 7508, 7509, 7510, 7511, 7512, 7513, - 7514, 7515, 7516, 7517, 7518, 7519, 7520, 7521, - 7522, 7523, 7524, 7525, 7526, 7527, 7528, 7529, - 7530, 7531, 7532, 7533, 7534, 7535, 7536, 7537, - 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, - 7546, 7547, 7548, 7549, 7550, 7551, 7552, 7553, - 7554, 7555, 7556, 7557, 7558, 7559, 7560, 0, + 0, 897, 897, 897, 897, 897, 897, 897, + 0, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 0, 0, 897, 897, 897, 897, + 897, 897, 897, 0, 897, 897, 0, 897, + 897, 897, 897, 897, 0, 0, 0, 0, + 0, 7553, 7554, 7555, 7556, 7557, 7558, 7559, + 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, + 7568, 7569, 7570, 7571, 7572, 7573, 7574, 7575, + 7576, 7577, 7578, 7579, 7580, 7581, 7582, 7583, + 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, + 7592, 7593, 7594, 7595, 7596, 7597, 7598, 7599, + 7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, + 7608, 7609, 7610, 7611, 7612, 7613, 7614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 898, 0, 0, 0, 0, 0, 0, 0, + 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6834,11 +6815,11 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 0, 0, - 0, 898, 898, 898, 898, 898, 898, 898, - 599, 599, 599, 599, 599, 599, 599, 0, - 0, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 349, - 897, 0, 0, 0, 0, 0, 0, 0, + 0, 897, 897, 897, 897, 897, 897, 897, + 598, 598, 598, 598, 598, 598, 598, 0, + 0, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 349, + 896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6881,7 +6862,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 898, + 349, 349, 349, 349, 349, 349, 349, 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 349, 349, 349, 349, 349, 349, @@ -6889,9 +6870,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 898, 898, 898, - 898, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 349, 349, 349, 349, 349, 897, 897, 897, + 897, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6921,9 +6902,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 599, 1785, 1785, 1147, - 898, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 0, 0, 0, 0, 0, + 349, 349, 349, 349, 598, 1785, 1785, 1146, + 897, 1232, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6953,10 +6934,42 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 898, - 1147, 349, 1233, 1233, 1233, 1233, 1233, 1233, - 1233, 1233, 1233, 1233, 0, 0, 0, 0, - 1104, 0, 0, 0, 0, 0, 0, 0, + 349, 349, 349, 349, 349, 349, 349, 897, + 1146, 349, 1232, 1232, 1232, 1232, 1232, 1232, + 1232, 1232, 1232, 1232, 0, 0, 0, 0, + 1103, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 0, 349, 349, 349, 897, 349, 349, 897, + 349, 349, 349, 349, 349, 349, 349, 897, + 897, 349, 349, 349, 349, 349, 897, 0, + 0, 0, 0, 0, 0, 0, 0, 349, + 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6988,51 +7001,51 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 349, 349, 349, 349, 0, 349, 349, 0, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, - 0, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, - 1168, 1168, 1168, 1168, 1168, 1168, 0, 0, - 6139, 6139, 6139, 6139, 6139, 6139, 6139, 6139, - 6139, 1147, 1147, 1147, 1147, 1147, 1147, 1147, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7561, 7562, 7563, 7564, 7565, 7566, 7567, - 7568, 7569, 7570, 7571, 7572, 7573, 7574, 7575, - 7576, 7577, 7578, 7579, 7580, 7581, 7582, 7583, - 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, - 7592, 7593, 7594, 7595, 7596, 7597, 7598, 7599, - 7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, - 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, - 7616, 7617, 7618, 7619, 7620, 7621, 7622, 7623, - 7624, 7625, 7626, 7627, 7628, 898, 898, 898, - 898, 898, 898, 1234, 1212, 0, 0, 0, - 0, 1211, 1211, 1211, 1211, 1211, 1211, 1211, - 1211, 1211, 1211, 0, 0, 0, 0, 1165, - 1165, 0, 0, 0, 0, 0, 0, 0, + 0, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 0, 0, + 6142, 6142, 6142, 6142, 6142, 6142, 6142, 6142, + 6142, 1146, 1146, 1146, 1146, 1146, 1146, 1146, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7615, 7616, 7617, 7618, 7619, 7620, 7621, + 7622, 7623, 7624, 7625, 7626, 7627, 7628, 7629, + 7630, 7631, 7632, 7633, 7634, 7635, 7636, 7637, + 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7645, + 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, + 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, + 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, + 7670, 7671, 7672, 7673, 7674, 7675, 7676, 7677, + 7678, 7679, 7680, 7681, 7682, 897, 897, 897, + 897, 897, 897, 1233, 1211, 0, 0, 0, + 0, 1210, 1210, 1210, 1210, 1210, 1210, 1210, + 1210, 1210, 1210, 0, 0, 0, 0, 1164, + 1164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7066,15 +7079,15 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 1207, 6289, 6289, - 6289, 1171, 6289, 6289, 6289, 6289, 0, 0, + 0, 0, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 1206, 6293, 6293, + 6293, 1170, 6293, 6293, 6293, 6293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7084,14 +7097,14 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 1207, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 6289, - 6289, 6289, 6289, 6289, 6289, 6289, 6289, 0, + 0, 0, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 1206, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 6293, + 6293, 6293, 6293, 6293, 6293, 6293, 6293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7116,30 +7129,30 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7629, 7630, 7631, 7632, 0, 7633, 7634, - 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, - 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, - 7651, 7652, 7653, 7654, 7655, 7656, 7657, 7658, - 7659, 0, 7630, 7631, 0, 7660, 0, 0, - 7635, 0, 7637, 7638, 7639, 7640, 7641, 7642, - 7643, 7644, 7645, 7646, 0, 7648, 7649, 7650, - 7651, 0, 7653, 0, 7655, 0, 0, 0, - 0, 0, 0, 7631, 0, 0, 0, 0, - 7635, 0, 7637, 0, 7639, 0, 7641, 7642, - 7643, 0, 7645, 7646, 0, 7648, 0, 0, - 7651, 0, 7653, 0, 7655, 0, 7657, 0, - 7659, 0, 7630, 7631, 0, 7660, 0, 0, - 7635, 7636, 7637, 7638, 0, 7640, 7641, 7642, - 7643, 7644, 7645, 7646, 0, 7648, 7649, 7650, - 7651, 0, 7653, 7654, 7655, 7656, 0, 7658, - 0, 7629, 7630, 7631, 7632, 7660, 7633, 7634, - 7635, 7636, 7637, 0, 7639, 7640, 7641, 7642, - 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, - 7651, 7652, 7653, 7654, 7655, 0, 0, 0, - 0, 0, 7630, 7631, 7632, 0, 7633, 7634, - 7635, 7636, 7637, 0, 7639, 7640, 7641, 7642, - 7643, 7644, 7645, 7646, 7647, 7648, 7649, 7650, - 7651, 7652, 7653, 7654, 7655, 0, 0, 0, + 0, 7683, 7684, 7685, 7686, 0, 7687, 7688, + 7689, 7690, 7691, 7692, 7693, 7694, 7695, 7696, + 7697, 7698, 7699, 7700, 7701, 7702, 7703, 7704, + 7705, 7706, 7707, 7708, 7709, 7710, 7711, 7712, + 7713, 0, 7684, 7685, 0, 7714, 0, 0, + 7689, 0, 7691, 7692, 7693, 7694, 7695, 7696, + 7697, 7698, 7699, 7700, 0, 7702, 7703, 7704, + 7705, 0, 7707, 0, 7709, 0, 0, 0, + 0, 0, 0, 7685, 0, 0, 0, 0, + 7689, 0, 7691, 0, 7693, 0, 7695, 7696, + 7697, 0, 7699, 7700, 0, 7702, 0, 0, + 7705, 0, 7707, 0, 7709, 0, 7711, 0, + 7713, 0, 7684, 7685, 0, 7714, 0, 0, + 7689, 7690, 7691, 7692, 0, 7694, 7695, 7696, + 7697, 7698, 7699, 7700, 0, 7702, 7703, 7704, + 7705, 0, 7707, 7708, 7709, 7710, 0, 7712, + 0, 7683, 7684, 7685, 7686, 7714, 7687, 7688, + 7689, 7690, 7691, 0, 7693, 7694, 7695, 7696, + 7697, 7698, 7699, 7700, 7701, 7702, 7703, 7704, + 7705, 7706, 7707, 7708, 7709, 0, 0, 0, + 0, 0, 7684, 7685, 7686, 0, 7687, 7688, + 7689, 7690, 7691, 0, 7693, 7694, 7695, 7696, + 7697, 7698, 7699, 7700, 7701, 7702, 7703, 7704, + 7705, 7706, 7707, 7708, 7709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7148,83 +7161,83 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 80, 80, 80, 80, 2564, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, - 0, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, + 0, 78, 78, 78, 78, 2564, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 0, 0, 0, + 0, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 0, 0, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 0, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 2564, 0, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7661, 7662, 7663, 7664, 7665, 7666, 7667, - 7668, 7669, 7670, 7671, 1268, 1268, 80, 80, - 80, 7672, 7673, 7674, 7675, 7676, 7677, 7678, - 7679, 7680, 7681, 7682, 7683, 7684, 7685, 7686, - 7687, 7688, 7689, 7690, 7691, 7692, 7693, 7694, - 7695, 7696, 7697, 7698, 7699, 7700, 7701, 7702, - 80, 7703, 7704, 7705, 7706, 7707, 7708, 7709, - 7710, 7711, 7712, 7713, 7714, 7715, 7716, 7717, - 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, - 7726, 7727, 7728, 7729, 7730, 7731, 7732, 7733, - 7734, 7735, 7736, 7737, 7738, 7739, 7740, 7741, - 7742, 7743, 7744, 7745, 7746, 7747, 7748, 7749, - 7750, 7751, 7752, 7753, 7754, 7755, 7756, 7757, - 7758, 7759, 7760, 7761, 7762, 7763, 80, 80, - 80, 7764, 7765, 7766, 7767, 7768, 7769, 7770, - 7771, 7772, 7773, 7774, 7775, 7776, 7777, 7778, - 7779, 7780, 7781, 7782, 7783, 7784, 7785, 7786, - 7787, 7788, 7789, 7790, 7790, 7790, 7790, 7791, - 7790, 7792, 7791, 7791, 7791, 7791, 7791, 7791, - 7791, 7791, 7791, 7791, 7790, 7790, 7790, 7790, - 7790, 7790, 7790, 7790, 7790, 7790, 7790, 7790, - 7790, 7790, 7790, 7790, 7790, 7790, 80, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7793, - 7793, 7793, 7793, 7793, 7793, 7793, 7793, 7793, - 7793, 7793, 7793, 7793, 7793, 7793, 7793, 7793, - 7793, 7793, 7793, 7793, 7793, 7793, 7793, 7793, - 7793, 7794, 7795, 7796, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7797, 7798, 7799, 7800, 7801, 7802, 7803, + 0, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 0, 0, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 0, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 2564, 0, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7715, 7716, 7717, 7718, 7719, 7720, 7721, + 7722, 7723, 7724, 7725, 1267, 1267, 78, 78, + 78, 7726, 7727, 7728, 7729, 7730, 7731, 7732, + 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7740, + 7741, 7742, 7743, 7744, 7745, 7746, 7747, 7748, + 7749, 7750, 7751, 7752, 7753, 7754, 7755, 7756, + 78, 7757, 7758, 7759, 7760, 7761, 7762, 7763, + 7764, 7765, 7766, 7767, 7768, 7769, 7770, 7771, + 7772, 7773, 7774, 7775, 7776, 7777, 7778, 7779, + 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787, + 7788, 7789, 7790, 7791, 7792, 7793, 7794, 7795, + 7796, 7797, 7798, 7799, 7800, 7801, 7802, 7803, 7804, 7805, 7806, 7807, 7808, 7809, 7810, 7811, - 7812, 7813, 7814, 7815, 7816, 7817, 7818, 7819, - 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827, - 7828, 7829, 7830, 7831, 7832, 7833, 7834, 7835, - 7836, 7837, 7838, 7839, 7840, 0, 0, 0, - 0, 7841, 7842, 7843, 7844, 7845, 7846, 7847, - 7848, 7849, 0, 0, 0, 0, 0, 0, - 0, 7850, 7851, 0, 0, 0, 0, 0, + 7812, 7813, 7814, 7815, 7816, 7817, 78, 78, + 78, 7818, 7819, 7820, 7821, 7822, 7823, 7824, + 7825, 7826, 7827, 7828, 7829, 7830, 7831, 7832, + 7833, 7834, 7835, 7836, 7837, 7838, 7839, 7840, + 7841, 7842, 7843, 7844, 7844, 7844, 7844, 7845, + 7844, 7846, 7845, 7845, 7845, 7845, 7845, 7845, + 7845, 7845, 7845, 7845, 7844, 7844, 7844, 7844, + 7844, 7844, 7844, 7844, 7844, 7844, 7844, 7844, + 7844, 7844, 7844, 7844, 7844, 7844, 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, 2564, 2564, 2564, 2564, 2564, 2564, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7847, + 7847, 7847, 7847, 7847, 7847, 7847, 7847, 7847, + 7847, 7847, 7847, 7847, 7847, 7847, 7847, 7847, + 7847, 7847, 7847, 7847, 7847, 7847, 7847, 7847, + 7847, 7848, 7849, 7850, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7851, 7852, 7853, 7854, 7855, 7856, 7857, + 7858, 7859, 7860, 7861, 7862, 7863, 7864, 7865, + 7866, 7867, 7868, 7869, 7870, 7871, 7872, 7873, + 7874, 7875, 7876, 7877, 7878, 7879, 7880, 7881, + 7882, 7883, 7884, 7885, 7886, 7887, 7888, 7889, + 7890, 7891, 7892, 7893, 7894, 0, 0, 0, + 0, 7895, 7896, 7897, 7898, 7899, 7900, 7901, + 7902, 7903, 0, 0, 0, 0, 0, 0, + 0, 7904, 7905, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2709, 2709, 2709, 2709, 2709, 2709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7248,7 +7261,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 80, 80, 80, 80, 80, 80, + 2564, 2564, 80, 78, 78, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, @@ -7262,8 +7275,8 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2564, 2564, 2564, 2564, 2564, 2564, 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 2564, 2564, 2564, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, + 2564, 2564, 2564, 2564, 2564, 78, 78, 80, + 80, 78, 80, 80, 80, 78, 78, 80, 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, @@ -7274,9 +7287,9 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 80, 80, 80, 80, 80, 80, 80, 80, 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 80, 80, 80, 2564, 80, 80, - 80, 2564, 2564, 2564, 7852, 7852, 7852, 7852, - 7852, 2564, 2564, 2564, 2564, 2564, 2564, 2564, + 2564, 2564, 78, 78, 80, 2564, 80, 78, + 80, 2564, 2564, 2564, 7906, 7906, 7906, 7906, + 7906, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, @@ -7307,7 +7320,7 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 2564, 2564, 2564, 2564, 80, 80, + 2564, 2564, 2564, 2564, 2564, 2564, 80, 78, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, @@ -7316,30 +7329,30 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 78, - 78, 78, 78, 78, 78, 78, 78, 80, - 80, 80, 80, 80, 2564, 2564, 2564, 2564, - 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 80, 80, 2564, 2564, 2564, 2564, + 78, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 2564, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 2564, 2564, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 2564, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 2564, 2564, 2564, 2564, + 2564, 78, 78, 78, 78, 78, 78, 78, + 80, 80, 78, 78, 80, 80, 80, 80, + 80, 80, 80, 2564, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 80, 78, 78, 80, 80, 80, 80, 78, + 78, 80, 78, 78, 78, 78, 2564, 2564, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 2564, 80, 78, + 78, 80, 78, 78, 78, 78, 78, 78, + 78, 78, 80, 80, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 80, 78, 78, + 78, 78, 78, 80, 80, 80, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 80, 80, 80, 78, 78, 78, + 78, 78, 78, 78, 78, 80, 80, 80, + 78, 78, 80, 78, 80, 78, 78, 78, + 78, 80, 78, 78, 78, 78, 78, 78, + 80, 78, 78, 78, 80, 78, 78, 78, + 78, 78, 78, 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, @@ -7364,13 +7377,13 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 2564, 2564, 2564, 2564, 2564, 80, - 80, 80, 80, 80, 80, 2564, 80, 80, - 80, 2564, 2564, 2564, 80, 80, 2564, 2564, - 2564, 0, 0, 0, 0, 2564, 2564, 2564, - 2564, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 2564, 2564, 0, 0, - 0, 80, 80, 80, 80, 2564, 2564, 2564, + 2564, 2564, 2564, 2564, 2564, 2564, 2564, 78, + 78, 78, 78, 78, 80, 2564, 80, 80, + 80, 2564, 2564, 2564, 78, 78, 2564, 2564, + 2564, 2564, 0, 0, 0, 2564, 2564, 2564, + 2564, 80, 80, 80, 80, 80, 80, 78, + 78, 78, 80, 78, 2564, 2564, 0, 0, + 0, 80, 78, 78, 80, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 0, 0, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -7386,9 +7399,6 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 80, 80, 80, - 0, 0, 0, 0, 80, 80, 80, 80, - 80, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -7398,8 +7408,11 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 80, 80, - 80, 80, 80, 0, 0, 0, 0, 0, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 0, 0, 0, 0, 0, 0, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 0, 0, 0, 0, 2564, 0, 0, 0, 0, 0, 0, @@ -7426,12 +7439,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 0, - 0, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, - 0, 80, 80, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 0, 0, 0, + 0, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7468,24 +7481,24 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 0, + 2564, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 0, 0, 0, 0, 0, 0, 0, + 0, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 0, 0, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 0, 0, 0, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 2564, 0, 0, 0, 0, 0, + 2564, 2564, 2564, 2564, 0, 0, 0, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, @@ -7493,12 +7506,12 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 0, 0, 0, 0, 0, 0, 0, 2564, + 0, 2564, 0, 0, 0, 0, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 0, 0, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, - 2564, 2564, 2564, 0, 0, 0, 0, 0, - 0, 2564, 2564, 2564, 2564, 2564, 2564, 2564, + 2564, 2564, 2564, 2564, 0, 0, 0, 0, + 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -7530,268 +7543,246 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 6499, 6500, 6501, 6502, 6503, 6504, 6505, - 6506, 6507, 6508, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 78, 6553, 6554, 6555, 6556, 6557, 6558, 6559, + 6560, 6561, 6562, 78, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7907, 7908, 7909, 7910, 7911, 4644, 7912, + 7913, 7914, 7915, 4645, 7916, 7917, 7918, 4646, + 7919, 7920, 7921, 7922, 7923, 7924, 7925, 7926, + 7927, 7928, 7929, 7930, 4704, 7931, 7932, 7933, + 7934, 7935, 7936, 7937, 7938, 7939, 4709, 4647, + 4648, 4710, 7940, 7941, 4455, 7942, 4649, 7943, + 7944, 7945, 7946, 7946, 7946, 7947, 7948, 7949, + 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, + 7958, 7959, 7960, 7961, 7962, 7963, 7964, 7964, + 4712, 7965, 7966, 7967, 7968, 4651, 7969, 7970, + 7971, 4608, 7972, 7973, 7974, 7975, 7976, 7977, + 7978, 7979, 7980, 7981, 7982, 7983, 7984, 7985, + 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7993, + 7994, 7995, 7996, 7997, 7997, 7998, 7999, 8000, + 4451, 8001, 8002, 8003, 8004, 8005, 8006, 8007, + 8008, 4656, 8009, 8010, 8011, 8012, 8013, 8014, + 8015, 8016, 8017, 8018, 8019, 8020, 8021, 8022, + 8023, 8024, 8025, 8026, 8027, 8028, 8029, 4397, + 8030, 8031, 8032, 8032, 8033, 8034, 8034, 8035, + 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, + 8044, 8045, 8046, 8047, 4657, 8048, 8049, 8050, + 8051, 4724, 8051, 8052, 4659, 8053, 8054, 8055, + 8056, 4660, 4370, 8057, 8058, 8059, 8060, 8061, + 8062, 8063, 8064, 8065, 8066, 8067, 8068, 8069, + 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, + 8078, 4661, 8079, 8080, 8081, 8082, 8083, 8084, + 4663, 8085, 8086, 8087, 8088, 8089, 8090, 8091, + 8092, 4398, 4732, 8093, 8094, 8095, 8096, 8097, + 8098, 8099, 8100, 4664, 8101, 8102, 8103, 8104, + 4775, 8105, 8106, 8107, 8108, 8109, 8110, 8111, + 8112, 8113, 8114, 8115, 8116, 8117, 4468, 8118, + 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, + 8127, 8128, 4665, 4555, 8129, 8130, 8131, 8132, + 8133, 8134, 8135, 8136, 4736, 8137, 8138, 8139, + 8140, 8141, 8142, 8143, 8144, 4737, 8145, 8146, + 8147, 8148, 8149, 8150, 8151, 8152, 8153, 8154, + 8155, 8156, 4739, 8157, 8158, 8159, 8160, 8161, + 8162, 8163, 8164, 8165, 8166, 8167, 8167, 8168, + 8169, 4741, 8170, 8171, 8172, 8173, 8174, 8175, + 8176, 4454, 8177, 8178, 8179, 8180, 8181, 8182, + 8183, 4747, 8184, 8185, 8186, 8187, 8188, 8189, + 8189, 4748, 4777, 8190, 8191, 8192, 8193, 8194, + 4416, 4750, 8195, 8196, 4676, 8197, 8198, 4630, + 8199, 8200, 4680, 8201, 8202, 8203, 8204, 8204, + 8205, 8206, 8207, 8208, 8209, 8210, 8211, 8212, + 8213, 8214, 8215, 8216, 8217, 8218, 8219, 8220, + 8221, 8222, 8223, 8224, 8225, 8226, 8227, 8228, + 8229, 8230, 8231, 4686, 8232, 8233, 8234, 8235, + 8236, 8237, 8238, 8239, 8240, 8241, 8242, 8243, + 8244, 8245, 8246, 8247, 8033, 8248, 8249, 8250, + 8251, 8252, 8253, 8254, 8255, 8256, 8257, 8258, + 8259, 4472, 8260, 8261, 8262, 8263, 8264, 8265, + 4689, 8266, 8267, 8268, 8269, 8270, 8271, 8272, + 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, + 8281, 8282, 8283, 8284, 8285, 4411, 8286, 8287, + 8288, 8289, 8290, 8291, 4757, 8292, 8293, 8294, + 8295, 8296, 8297, 8298, 8299, 8300, 8301, 8302, + 8303, 8304, 8305, 8306, 8307, 8308, 8309, 8310, + 8311, 4762, 4763, 8312, 8313, 8314, 8315, 8316, + 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, + 4764, 8325, 8326, 8327, 8328, 8329, 8330, 8331, + 8332, 8333, 8334, 8335, 8336, 8337, 8338, 8339, + 8340, 8341, 8342, 8343, 8344, 8345, 8346, 8347, + 8348, 8349, 8350, 8351, 8352, 8353, 8354, 4770, + 4770, 8355, 8356, 8357, 8358, 8359, 8360, 8361, + 8362, 8363, 8364, 4771, 8365, 8366, 8367, 8368, + 8369, 8370, 8371, 8372, 8373, 8374, 8375, 8376, + 8377, 8378, 8379, 8380, 8381, 8382, 8383, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7853, 7854, 7855, 7856, 7857, 4641, 7858, - 7859, 7860, 7861, 4642, 7862, 7863, 7864, 4643, - 7865, 7866, 7867, 7868, 7869, 7870, 7871, 7872, - 7873, 7874, 7875, 7876, 4701, 7877, 7878, 7879, - 7880, 7881, 7882, 7883, 7884, 7885, 4706, 4644, - 4645, 4707, 7886, 7887, 4452, 7888, 4646, 7889, - 7890, 7891, 7892, 7892, 7892, 7893, 7894, 7895, - 7896, 7897, 7898, 7899, 7900, 7901, 7902, 7903, - 7904, 7905, 7906, 7907, 7908, 7909, 7910, 7910, - 4709, 7911, 7912, 7913, 7914, 4648, 7915, 7916, - 7917, 4605, 7918, 7919, 7920, 7921, 7922, 7923, - 7924, 7925, 7926, 7927, 7928, 7929, 7930, 7931, - 7932, 7933, 7934, 7935, 7936, 7937, 7938, 7939, - 7940, 7941, 7942, 7943, 7943, 7944, 7945, 7946, - 4448, 7947, 7948, 7949, 7950, 7951, 7952, 7953, - 7954, 4653, 7955, 7956, 7957, 7958, 7959, 7960, - 7961, 7962, 7963, 7964, 7965, 7966, 7967, 7968, - 7969, 7970, 7971, 7972, 7973, 7974, 7975, 4394, - 7976, 7977, 7978, 7978, 7979, 7980, 7980, 7981, - 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, - 7990, 7991, 7992, 7993, 4654, 7994, 7995, 7996, - 7997, 4721, 7997, 7998, 4656, 7999, 8000, 8001, - 8002, 4657, 4367, 8003, 8004, 8005, 8006, 8007, - 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, - 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023, - 8024, 4658, 8025, 8026, 8027, 8028, 8029, 8030, - 4660, 8031, 8032, 8033, 8034, 8035, 8036, 8037, - 8038, 4395, 4729, 8039, 8040, 8041, 8042, 8043, - 8044, 8045, 8046, 4661, 8047, 8048, 8049, 8050, - 4772, 8051, 8052, 8053, 8054, 8055, 8056, 8057, - 8058, 8059, 8060, 8061, 8062, 8063, 4465, 8064, - 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, - 8073, 8074, 4662, 4552, 8075, 8076, 8077, 8078, - 8079, 8080, 8081, 8082, 4733, 8083, 8084, 8085, - 8086, 8087, 8088, 8089, 8090, 4734, 8091, 8092, - 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, - 8101, 8102, 4736, 8103, 8104, 8105, 8106, 8107, - 8108, 8109, 8110, 8111, 8112, 8113, 8113, 8114, - 8115, 4738, 8116, 8117, 8118, 8119, 8120, 8121, - 8122, 4451, 8123, 8124, 8125, 8126, 8127, 8128, - 8129, 4744, 8130, 8131, 8132, 8133, 8134, 8135, - 8135, 4745, 4774, 8136, 8137, 8138, 8139, 8140, - 4413, 4747, 8141, 8142, 4673, 8143, 8144, 4627, - 8145, 8146, 4677, 8147, 8148, 8149, 8150, 8150, - 8151, 8152, 8153, 8154, 8155, 8156, 8157, 8158, - 8159, 8160, 8161, 8162, 8163, 8164, 8165, 8166, - 8167, 8168, 8169, 8170, 8171, 8172, 8173, 8174, - 8175, 8176, 8177, 4683, 8178, 8179, 8180, 8181, - 8182, 8183, 8184, 8185, 8186, 8187, 8188, 8189, - 8190, 8191, 8192, 8193, 7979, 8194, 8195, 8196, - 8197, 8198, 8199, 8200, 8201, 8202, 8203, 8204, - 8205, 4469, 8206, 8207, 8208, 8209, 8210, 8211, - 4686, 8212, 8213, 8214, 8215, 8216, 8217, 8218, - 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8226, - 8227, 8228, 8229, 8230, 8231, 4408, 8232, 8233, - 8234, 8235, 8236, 8237, 4754, 8238, 8239, 8240, - 8241, 8242, 8243, 8244, 8245, 8246, 8247, 8248, - 8249, 8250, 8251, 8252, 8253, 8254, 8255, 8256, - 8257, 4759, 4760, 8258, 8259, 8260, 8261, 8262, - 8263, 8264, 8265, 8266, 8267, 8268, 8269, 8270, - 4761, 8271, 8272, 8273, 8274, 8275, 8276, 8277, - 8278, 8279, 8280, 8281, 8282, 8283, 8284, 8285, - 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, - 8294, 8295, 8296, 8297, 8298, 8299, 8300, 4767, - 4767, 8301, 8302, 8303, 8304, 8305, 8306, 8307, - 8308, 8309, 8310, 4768, 8311, 8312, 8313, 8314, - 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, - 8323, 8324, 8325, 8326, 8327, 8328, 8329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7810,6 +7801,54 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 0, 0, 0, 0, + 0, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 3211, 3211, 3211, 3211, 3211, + 3211, 3211, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7820,166 +7859,108 @@ static const utf8proc_uint16_t utf8proc_stage2table[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 0, 0, 0, 0, - 0, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 3213, 3213, 3213, 3213, 3213, 3213, 3213, - 3213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1510, 0, 0, 0, 0, 0, + 0, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 8384, 8384, 8384, 8384, 8384, 8384, 8384, + 8384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 8330, 8330, 8330, 8330, 8330, 8330, 8330, - 8330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 4354, - 4354, 4354, 4354, 4354, 4354, 4354, 4354, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, + 630, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 0, 0, }; static const utf8proc_property_t utf8proc_properties[] = { @@ -8552,9 +8533,9 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1081, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1082, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1083, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1084, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1084, UINT16_MAX, 1084, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1085, UINT16_MAX, 1085, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1086, UINT16_MAX, 1086, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1086, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1087, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1088, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1089, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -8571,34 +8552,33 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1100, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1101, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1102, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1103, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 7, UINT16_MAX, 1104, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1105, UINT16_MAX, 1106, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9, UINT16_MAX, 1107, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 17, UINT16_MAX, 1108, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1050, UINT16_MAX, 1109, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1052, UINT16_MAX, 1110, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1058, UINT16_MAX, 1111, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 22, UINT16_MAX, 1112, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 24, UINT16_MAX, 1113, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 7, UINT16_MAX, 1103, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1104, UINT16_MAX, 1105, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9, UINT16_MAX, 1106, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 17, UINT16_MAX, 1107, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1050, UINT16_MAX, 1108, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1052, UINT16_MAX, 1109, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1058, UINT16_MAX, 1110, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 22, UINT16_MAX, 1111, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 24, UINT16_MAX, 1112, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1113, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1114, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 1115, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17502, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17504, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17506, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17508, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 620, UINT16_MAX, 1128, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 11, UINT16_MAX, 1129, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 18, UINT16_MAX, 1130, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 23, UINT16_MAX, 1131, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1077, UINT16_MAX, 1132, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 17509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 620, UINT16_MAX, 1127, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 11, UINT16_MAX, 1128, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 18, UINT16_MAX, 1129, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 23, UINT16_MAX, 1130, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1131, UINT16_MAX, 1132, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, true, false, false, false, false, 0, true, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 230, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, true, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, true, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, @@ -9303,8 +9283,8 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 18331, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 18333, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 18335, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 670, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18337, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 670, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18337, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1955, UINT16_MAX, 1955, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1956, UINT16_MAX, 1956, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -9494,14 +9474,15 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, true, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, true, true, 0, false, 0, UTF8PROC_BOUNDCLASS_CONTROL, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 671, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 672, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 673, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 674, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 674, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 675, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 18572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 676, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -9516,6 +9497,7 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 18582, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 681, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 18584, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MC, 9, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_LINKER}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1345, 1379, UINT16_MAX, 1379, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1347, 1381, UINT16_MAX, 1381, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1359, 1393, UINT16_MAX, 1393, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -9744,7 +9726,7 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 2381, UINT16_MAX, 2382, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1038, UINT16_MAX, 2383, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 2342, UINT16_MAX, 2384, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1087, UINT16_MAX, 2385, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1086, UINT16_MAX, 2385, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 2386, UINT16_MAX, 2387, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1041, UINT16_MAX, 2388, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 629, UINT16_MAX, 2389, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -9765,7 +9747,6 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1074, UINT16_MAX, 2405, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 663, UINT16_MAX, 2406, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1192, UINT16_MAX, 2407, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MN, 234, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 214, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 202, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 232, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, @@ -10692,9 +10673,7 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 53703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 37324, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 20943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12142,7 +12121,7 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6718, UINT16_MAX, 6718, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6719, UINT16_MAX, 6719, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6720, UINT16_MAX, 6720, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1105, UINT16_MAX, 1105, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 1104, UINT16_MAX, 1104, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2284, UINT16_MAX, 2284, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 2372, UINT16_MAX, 2372, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6721, UINT16_MAX, 6721, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12180,8 +12159,8 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6750, UINT16_MAX, 6750, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6751, UINT16_MAX, 6751, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6752, UINT16_MAX, 6752, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6753, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6754, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6753, UINT16_MAX, 6753, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6754, UINT16_MAX, 6754, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6755, UINT16_MAX, 6755, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6756, UINT16_MAX, 6756, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6757, UINT16_MAX, 6757, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12189,18 +12168,18 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6759, UINT16_MAX, 6759, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6760, UINT16_MAX, 6760, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6761, UINT16_MAX, 6761, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 28, UINT16_MAX, 6762, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 31, UINT16_MAX, 6763, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 42, UINT16_MAX, 6764, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6762, UINT16_MAX, 6762, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6763, UINT16_MAX, 6763, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6764, UINT16_MAX, 6764, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6765, UINT16_MAX, 6765, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6766, UINT16_MAX, 6766, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 358, UINT16_MAX, 6767, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 473, UINT16_MAX, 6768, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6769, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6770, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6771, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6772, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6773, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 44, UINT16_MAX, 6766, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 28, UINT16_MAX, 6767, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 31, UINT16_MAX, 6768, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 42, UINT16_MAX, 6769, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6770, UINT16_MAX, 6770, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6771, UINT16_MAX, 6771, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 358, UINT16_MAX, 6772, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 473, UINT16_MAX, 6773, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6774, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6775, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6776, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12232,33 +12211,33 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6802, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6803, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6804, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6805, UINT16_MAX, 6805, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6805, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6806, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6807, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6808, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6809, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6810, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6810, UINT16_MAX, 6810, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6811, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6812, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6594, UINT16_MAX, 6813, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6777, UINT16_MAX, 6814, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 4664, UINT16_MAX, 6815, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6804, UINT16_MAX, 6816, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6813, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6814, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6815, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6816, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6817, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6818, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6819, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6820, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6821, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6594, UINT16_MAX, 6818, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6782, UINT16_MAX, 6819, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 4664, UINT16_MAX, 6820, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6809, UINT16_MAX, 6821, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6822, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6823, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6824, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6825, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1070, UINT16_MAX, 6826, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6827, 6827, UINT16_MAX, 6827, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6828, 6828, UINT16_MAX, 6828, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6829, 6829, UINT16_MAX, 6829, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6830, 6830, UINT16_MAX, 6830, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6831, 6831, UINT16_MAX, 6831, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6826, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6827, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6828, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6829, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 6830, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1070, UINT16_MAX, 6831, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6832, 6832, UINT16_MAX, 6832, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6833, 6833, UINT16_MAX, 6833, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6834, 6834, UINT16_MAX, 6834, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12334,25 +12313,25 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6904, 6904, UINT16_MAX, 6904, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6905, 6905, UINT16_MAX, 6905, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6906, 6906, UINT16_MAX, 6906, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6907, 6907, UINT16_MAX, 6907, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6908, 6908, UINT16_MAX, 6908, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6909, 6909, UINT16_MAX, 6909, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6910, 6910, UINT16_MAX, 6910, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 6911, 6911, UINT16_MAX, 6911, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_LV, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_LVT, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_CS, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_CO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6908, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4998, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6912, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5052, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6913, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4998, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5052, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6918, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6919, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6920, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12389,24 +12368,24 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6952, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6953, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6954, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4964, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6955, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6956, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6958, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4964, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6960, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6961, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6962, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6963, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6964, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6965, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5037, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6966, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6967, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6968, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6969, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6970, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5037, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6971, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6972, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 6973, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12449,12 +12428,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7010, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7011, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7012, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7013, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7014, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7015, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7016, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7017, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7018, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7019, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7020, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12465,21 +12444,21 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7025, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7026, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7027, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7028, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7029, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7031, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7032, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7033, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7034, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7035, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4858, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7036, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7037, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7038, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7039, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7040, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4858, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7041, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7042, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7043, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12529,12 +12508,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7087, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7088, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7089, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5051, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7091, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7092, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7093, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5051, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7095, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7096, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7097, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12542,12 +12521,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7099, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7100, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7101, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5603, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7103, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7105, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7106, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5603, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7107, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7108, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7109, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12565,12 +12544,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7121, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7123, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5005, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7124, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7125, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7126, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7127, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5005, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7129, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7130, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7131, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12579,12 +12558,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7135, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7136, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4956, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7137, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7139, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7141, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4956, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7143, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7144, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12596,14 +12575,14 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7150, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7151, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7152, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4986, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7154, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7155, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7156, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7157, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7158, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4986, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7159, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7161, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12613,12 +12592,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7165, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7166, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7167, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4963, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7168, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7169, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7171, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7172, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4963, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7173, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7175, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12636,12 +12615,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12652,17 +12631,17 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7207, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7209, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7211, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7213, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7214, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7215, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7216, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12682,11 +12661,11 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7230, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7231, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7232, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7233, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7234, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7235, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7236, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7237, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7238, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7239, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7240, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7241, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12714,12 +12693,12 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12753,96 +12732,81 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7301, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7302, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7304, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7305, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7306, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7309, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7310, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7311, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7312, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7314, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7315, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7316, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7318, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7317, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7319, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23704, 23704, 7322, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23707, 23707, 7325, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23710, 23710, 7328, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 40097, 40097, 7332, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 40101, 40101, 7336, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23721, 23723, 7341, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23723, 23723, 7342, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23727, 23727, 7345, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23730, 23730, 7348, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23733, 23733, 7351, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23736, 23736, 7354, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23739, 23739, 7357, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7321, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7323, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 7324, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23709, 23709, 7327, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23712, 23712, 7330, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23715, 23715, 7333, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 40102, 40102, 7337, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 40106, 40106, 7341, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23726, 23728, 7346, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23728, 23728, 7347, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23732, 23732, 7350, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23735, 23735, 7353, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23738, 23738, 7356, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23741, 23741, 7359, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 23744, 23744, 7362, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MN, 26, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23744, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7362, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 4013, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 4016, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7363, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7365, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7366, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7368, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7369, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7371, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7372, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_FONT, 7373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_FONT, 3939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23753, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23765, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23771, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23783, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23789, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23791, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23797, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23799, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23801, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23803, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23805, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23807, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23811, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23813, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23815, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, 23817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23762, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23768, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23774, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23788, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23792, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23794, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23798, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23800, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23802, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23804, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23806, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23808, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23810, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23812, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23816, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, 23820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, UTF8PROC_DECOMP_TYPE_COMPAT, 23822, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12873,32 +12837,34 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7447, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7453, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12907,6 +12873,8 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -12919,642 +12887,638 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23867, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23867, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23873, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23873, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23873, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7476, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7476, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7477, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7477, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23868, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23868, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23870, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23870, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23872, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23872, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23874, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23874, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23876, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23880, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23882, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23886, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23888, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23890, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23892, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23894, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23896, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23898, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23904, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23906, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23908, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23912, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23918, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23920, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23922, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23924, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23926, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23928, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23930, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23932, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23936, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23940, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23942, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23944, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23946, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23948, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23950, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23952, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23954, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23956, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23958, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23960, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23962, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23964, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23966, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23968, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23970, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23972, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23974, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23976, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23978, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23980, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23982, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23984, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23986, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23988, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23990, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23992, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23994, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23996, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23998, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24002, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24004, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24008, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24010, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24012, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24014, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24016, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24018, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24020, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24022, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24024, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24026, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24028, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24032, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24034, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24036, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24038, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24040, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24042, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24044, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24046, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24048, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24052, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24054, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24056, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24058, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24060, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40449, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40452, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24080, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24082, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23880, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24084, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23882, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24086, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24088, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23890, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23892, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23894, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24092, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24096, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23904, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23906, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24098, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24100, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23912, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23972, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23974, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23980, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23982, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23984, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23992, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23994, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23996, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23998, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24008, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24010, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24104, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24018, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24106, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24108, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24110, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24032, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24034, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24060, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24112, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24114, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24116, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24052, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24054, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23876, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23876, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24118, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23880, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24120, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23886, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23888, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23890, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23896, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23898, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24124, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23918, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23920, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23922, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23924, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23928, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23930, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23932, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23936, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24126, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23940, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23942, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23944, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23946, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23948, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23950, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23954, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23956, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23958, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23960, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23962, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23964, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23966, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23968, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23970, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23976, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23978, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23986, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23988, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23990, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23992, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23994, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24002, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24004, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24128, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24012, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24014, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24016, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24018, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24024, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24026, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24028, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24130, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24036, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24038, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24132, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24044, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24046, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24048, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23880, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24120, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23890, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24122, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24124, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24136, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23936, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23992, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23994, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24006, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24030, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24130, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 40528, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 40531, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 40534, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24155, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24157, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24159, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24161, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24163, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24165, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24167, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24169, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24171, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24173, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24175, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24177, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24181, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24183, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24201, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24155, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24157, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24159, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24161, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24163, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24165, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24167, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24169, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24171, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24173, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24175, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24177, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24181, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24183, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24201, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24138, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24142, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23952, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23930, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23932, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23952, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23954, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24207, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24207, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 7496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 7496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23881, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23883, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23887, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23889, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23901, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23905, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23913, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23919, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23923, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23925, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23927, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23929, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23931, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23933, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23945, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23947, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23949, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23951, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23953, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23955, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23961, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23963, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23965, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23967, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23969, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23971, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23973, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23975, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23977, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23979, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23981, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23985, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23987, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23989, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23991, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23993, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23995, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23997, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 23999, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24001, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24003, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24005, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24007, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24009, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24011, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24013, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24015, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24017, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24019, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24021, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24023, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24025, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24027, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24029, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24031, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24033, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24035, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24037, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24039, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24041, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24043, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24045, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24047, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24049, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24051, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24053, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24055, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24057, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24059, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24061, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24063, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24065, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40451, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40454, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24085, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24087, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24089, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23887, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24091, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24093, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24095, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23897, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24097, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24099, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24101, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24103, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24105, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24107, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23917, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23919, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23977, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23979, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23985, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23987, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23989, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23997, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 23999, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24001, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24003, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24011, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24013, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24015, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24109, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24023, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24111, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24113, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24035, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24115, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24037, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24039, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24065, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24117, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24119, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24055, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24121, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24057, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24059, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23881, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23883, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24123, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24125, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23889, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24127, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23901, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23905, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24129, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23923, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23925, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23927, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23929, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23933, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24131, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23945, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23947, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23949, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23951, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23953, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23955, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23961, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23963, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23965, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23967, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23969, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23971, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23973, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23975, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23981, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23983, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23991, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23993, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23995, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23997, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23999, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24005, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24007, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24009, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24011, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24133, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24017, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24019, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24021, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24023, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24029, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24031, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24033, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24035, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24135, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24041, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24043, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24137, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24049, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24051, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24053, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24055, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24139, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24125, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24127, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24129, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24141, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24143, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24147, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23997, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23999, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24011, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24035, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24135, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24055, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24139, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 40533, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 40536, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 40539, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24158, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24162, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24164, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24166, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24168, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24172, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24176, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24178, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24180, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24182, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24184, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24186, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24158, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24160, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24162, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24164, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24166, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24168, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24170, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24172, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24174, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24176, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24178, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24180, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24182, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24184, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24186, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24143, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 24147, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 23957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 23959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40593, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40596, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40596, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40599, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40602, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40605, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40611, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40614, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40614, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40620, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40635, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40641, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40641, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40644, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40647, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40647, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40650, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40653, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40653, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40656, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40656, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40659, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40662, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40662, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40665, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40665, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40668, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40671, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40680, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40683, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40686, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40689, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40692, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40692, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40695, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40698, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40701, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40704, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40707, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40710, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40710, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40713, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40713, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40716, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40716, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40719, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40722, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40725, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40728, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40731, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40734, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40737, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40752, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40788, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40791, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40794, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40797, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40800, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40803, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40806, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40812, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40815, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40821, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40824, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40827, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40830, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40833, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40695, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40701, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40836, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40839, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40842, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40842, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40860, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40644, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40872, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40875, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40598, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40601, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40601, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40604, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40622, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40640, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40643, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40643, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40646, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40646, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40649, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40652, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40652, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40655, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40658, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40658, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40661, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40661, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40664, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40667, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40667, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40670, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40670, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40676, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40679, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40682, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40682, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40685, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40688, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40691, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40694, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40697, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40697, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40700, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40706, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40709, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40712, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40715, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40715, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40721, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40721, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40724, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40727, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40730, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40733, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40736, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40748, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40751, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40754, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40769, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40799, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40802, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40805, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40808, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40811, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40823, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40826, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40829, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40832, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40835, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40838, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40700, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40706, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40841, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40844, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40850, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40862, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40868, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40679, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 40649, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40874, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 40877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40880, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40883, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57280, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57290, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57322, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57331, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8184, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8186, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 1153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57300, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 40921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57327, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 57336, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 1153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8201, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 3942, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 3943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8201, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8207, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8209, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 4264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 4265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8207, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8208, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8209, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8211, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 8184, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8211, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8213, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8214, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_VERTICAL, 8215, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8216, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_COMPAT, 8201, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 8189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 3900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 1153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 8187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_SMALL, 8192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 3942, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 3943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8200, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 8212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8213, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8214, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8204, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 8217, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8218, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, 3939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, 8215, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8216, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8217, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_SMALL, 8220, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8221, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8222, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 3941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8218, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 8219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 8220, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8221, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24606, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24614, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24618, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24620, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24622, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24630, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8251, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8251, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8252, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8252, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8253, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8253, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8254, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8254, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8223, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 8224, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_SMALL, 8225, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SMALL, 8226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24611, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24615, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24619, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24621, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24627, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24633, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24635, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 24637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8256, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8256, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8258, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8258, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8260, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8260, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8260, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8260, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8262, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8262, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8262, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8262, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -13597,35 +13561,55 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8282, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24669, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24669, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24671, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24671, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24675, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24675, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8188, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8293, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8212, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8220, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8213, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8294, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 7479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 7479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 8289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 8289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_INITIAL, 8289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_MEDIAL, 8289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24676, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24676, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24678, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24678, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_ISOLATED, 24680, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FINAL, 24680, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8193, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8298, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8217, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8224, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8225, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8218, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 3942, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 3943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8214, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, 3939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 8184, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, 8215, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 8189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PD, 0, UTF8PROC_BIDI_CLASS_ES, UTF8PROC_DECOMP_TYPE_WIDE, 8220, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 3900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 8295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 8300, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 3931, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 66, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 58, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -13636,93 +13620,93 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 3936, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 3937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_WIDE, 3938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 8187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_CS, UTF8PROC_DECOMP_TYPE_WIDE, 8192, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 1153, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8216, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8221, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 3941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8217, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8189, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8221, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 26, 8296, UINT16_MAX, 8296, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 27, 8297, UINT16_MAX, 8297, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 28, 8298, UINT16_MAX, 8298, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 29, 8299, UINT16_MAX, 8299, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 30, 8300, UINT16_MAX, 8300, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 31, 8301, UINT16_MAX, 8301, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 32, 8302, UINT16_MAX, 8302, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 33, 8303, UINT16_MAX, 8303, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 34, 8304, UINT16_MAX, 8304, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 35, 8305, UINT16_MAX, 8305, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 36, 8306, UINT16_MAX, 8306, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 37, 8307, UINT16_MAX, 8307, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 38, 8308, UINT16_MAX, 8308, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 39, 8309, UINT16_MAX, 8309, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 40, 8310, UINT16_MAX, 8310, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 41, 8311, UINT16_MAX, 8311, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 42, 8312, UINT16_MAX, 8312, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 43, 8313, UINT16_MAX, 8313, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 44, 8314, UINT16_MAX, 8314, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 45, 8315, UINT16_MAX, 8315, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 46, 8316, UINT16_MAX, 8316, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 47, 8317, UINT16_MAX, 8317, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 48, 8318, UINT16_MAX, 8318, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 49, 8319, UINT16_MAX, 8319, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 50, 8320, UINT16_MAX, 8320, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 51, 8321, UINT16_MAX, 8321, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8209, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8218, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8322, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8196, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8222, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8194, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8226, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 26, 8301, UINT16_MAX, 8301, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 27, 8302, UINT16_MAX, 8302, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 28, 8303, UINT16_MAX, 8303, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 29, 8304, UINT16_MAX, 8304, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 30, 8305, UINT16_MAX, 8305, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 31, 8306, UINT16_MAX, 8306, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 32, 8307, UINT16_MAX, 8307, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 33, 8308, UINT16_MAX, 8308, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 34, 8309, UINT16_MAX, 8309, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 35, 8310, UINT16_MAX, 8310, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 36, 8311, UINT16_MAX, 8311, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 37, 8312, UINT16_MAX, 8312, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 38, 8313, UINT16_MAX, 8313, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 39, 8314, UINT16_MAX, 8314, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 40, 8315, UINT16_MAX, 8315, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 41, 8316, UINT16_MAX, 8316, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 42, 8317, UINT16_MAX, 8317, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 43, 8318, UINT16_MAX, 8318, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 44, 8319, UINT16_MAX, 8319, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 45, 8320, UINT16_MAX, 8320, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 46, 8321, UINT16_MAX, 8321, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 47, 8322, UINT16_MAX, 8322, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 48, 8323, UINT16_MAX, 8323, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 49, 8324, UINT16_MAX, 8324, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 50, 8325, UINT16_MAX, 8325, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 51, 8326, UINT16_MAX, 8326, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8214, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8223, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8215, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8327, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PC, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8201, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 3856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 0, UINT16_MAX, 8323, UINT16_MAX, 8323, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1, UINT16_MAX, 8324, UINT16_MAX, 8324, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2, UINT16_MAX, 8325, UINT16_MAX, 8325, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 3, UINT16_MAX, 8326, UINT16_MAX, 8326, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 4, UINT16_MAX, 8327, UINT16_MAX, 8327, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 5, UINT16_MAX, 8328, UINT16_MAX, 8328, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 6, UINT16_MAX, 8329, UINT16_MAX, 8329, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 7, UINT16_MAX, 8330, UINT16_MAX, 8330, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 8, UINT16_MAX, 8331, UINT16_MAX, 8331, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 9, UINT16_MAX, 8332, UINT16_MAX, 8332, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 10, UINT16_MAX, 8333, UINT16_MAX, 8333, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 11, UINT16_MAX, 8334, UINT16_MAX, 8334, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 12, UINT16_MAX, 8335, UINT16_MAX, 8335, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 13, UINT16_MAX, 8336, UINT16_MAX, 8336, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 14, UINT16_MAX, 8337, UINT16_MAX, 8337, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 15, UINT16_MAX, 8338, UINT16_MAX, 8338, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 16, UINT16_MAX, 8339, UINT16_MAX, 8339, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 17, UINT16_MAX, 8340, UINT16_MAX, 8340, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 18, UINT16_MAX, 8341, UINT16_MAX, 8341, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 19, UINT16_MAX, 8342, UINT16_MAX, 8342, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 20, UINT16_MAX, 8343, UINT16_MAX, 8343, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 21, UINT16_MAX, 8344, UINT16_MAX, 8344, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 22, UINT16_MAX, 8345, UINT16_MAX, 8345, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 23, UINT16_MAX, 8346, UINT16_MAX, 8346, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 24, UINT16_MAX, 8347, UINT16_MAX, 8347, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 25, UINT16_MAX, 8348, UINT16_MAX, 8348, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8197, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8349, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8198, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8350, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8351, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8352, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8186, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8205, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8206, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8185, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8353, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 0, UINT16_MAX, 8328, UINT16_MAX, 8328, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 1, UINT16_MAX, 8329, UINT16_MAX, 8329, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 2, UINT16_MAX, 8330, UINT16_MAX, 8330, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 3, UINT16_MAX, 8331, UINT16_MAX, 8331, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 4, UINT16_MAX, 8332, UINT16_MAX, 8332, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 5, UINT16_MAX, 8333, UINT16_MAX, 8333, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 6, UINT16_MAX, 8334, UINT16_MAX, 8334, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 7, UINT16_MAX, 8335, UINT16_MAX, 8335, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 8, UINT16_MAX, 8336, UINT16_MAX, 8336, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 9, UINT16_MAX, 8337, UINT16_MAX, 8337, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 10, UINT16_MAX, 8338, UINT16_MAX, 8338, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 11, UINT16_MAX, 8339, UINT16_MAX, 8339, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 12, UINT16_MAX, 8340, UINT16_MAX, 8340, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 13, UINT16_MAX, 8341, UINT16_MAX, 8341, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 14, UINT16_MAX, 8342, UINT16_MAX, 8342, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 15, UINT16_MAX, 8343, UINT16_MAX, 8343, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 16, UINT16_MAX, 8344, UINT16_MAX, 8344, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 17, UINT16_MAX, 8345, UINT16_MAX, 8345, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 18, UINT16_MAX, 8346, UINT16_MAX, 8346, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 19, UINT16_MAX, 8347, UINT16_MAX, 8347, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 20, UINT16_MAX, 8348, UINT16_MAX, 8348, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 21, UINT16_MAX, 8349, UINT16_MAX, 8349, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 22, UINT16_MAX, 8350, UINT16_MAX, 8350, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 23, UINT16_MAX, 8351, UINT16_MAX, 8351, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 24, UINT16_MAX, 8352, UINT16_MAX, 8352, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_WIDE, 25, UINT16_MAX, 8353, UINT16_MAX, 8353, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8202, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8354, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8356, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8357, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PS, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8210, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PE, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8211, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8190, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_PO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 5747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8354, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8356, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8357, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8359, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8360, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8361, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8362, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8363, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8363, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8365, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8366, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8368, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 5701, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 5702, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 5703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -13767,15 +13751,10 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 5742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 5743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 5744, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8365, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8366, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, true, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8368, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8369, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8371, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8372, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8371, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8372, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, true, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8374, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8375, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -13822,639 +13801,695 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8416, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8417, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8418, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8419, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8420, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8421, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8422, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8419, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8420, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8421, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8422, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_NARROW, 8423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8424, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8425, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_WIDE, 8428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SC, 0, UTF8PROC_BIDI_CLASS_ET, UTF8PROC_DECOMP_TYPE_WIDE, 8430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8431, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8434, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_NARROW, 8437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, true, 0, false, 0, UTF8PROC_BOUNDCLASS_CONTROL, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_NL, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8433, UINT16_MAX, 8433, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8435, UINT16_MAX, 8435, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8437, UINT16_MAX, 8437, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8439, UINT16_MAX, 8439, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8441, UINT16_MAX, 8441, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8443, UINT16_MAX, 8443, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8445, UINT16_MAX, 8445, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8447, UINT16_MAX, 8447, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8449, UINT16_MAX, 8449, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8451, UINT16_MAX, 8451, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8453, UINT16_MAX, 8453, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8455, UINT16_MAX, 8455, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8457, UINT16_MAX, 8457, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8459, UINT16_MAX, 8459, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8461, UINT16_MAX, 8461, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8463, UINT16_MAX, 8463, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8465, UINT16_MAX, 8465, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8467, UINT16_MAX, 8467, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8469, UINT16_MAX, 8469, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8471, UINT16_MAX, 8471, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8473, UINT16_MAX, 8473, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8475, UINT16_MAX, 8475, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8477, UINT16_MAX, 8477, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8479, UINT16_MAX, 8479, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8481, UINT16_MAX, 8481, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8483, UINT16_MAX, 8483, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8485, UINT16_MAX, 8485, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8487, UINT16_MAX, 8487, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8489, UINT16_MAX, 8489, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8491, UINT16_MAX, 8491, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8493, UINT16_MAX, 8493, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8495, UINT16_MAX, 8495, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8497, UINT16_MAX, 8497, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8499, UINT16_MAX, 8499, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8501, UINT16_MAX, 8501, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8503, UINT16_MAX, 8503, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8505, UINT16_MAX, 8505, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8507, UINT16_MAX, 8507, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8509, UINT16_MAX, 8509, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8511, UINT16_MAX, 8511, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8513, UINT16_MAX, 8513, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8515, UINT16_MAX, 8515, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8517, UINT16_MAX, 8517, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8519, UINT16_MAX, 8519, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8521, UINT16_MAX, 8521, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8523, UINT16_MAX, 8523, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8525, UINT16_MAX, 8525, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8527, UINT16_MAX, 8527, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8529, UINT16_MAX, 8529, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8531, UINT16_MAX, 8531, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8533, UINT16_MAX, 8533, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8535, UINT16_MAX, 8535, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8537, UINT16_MAX, 8537, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8539, UINT16_MAX, 8539, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8541, UINT16_MAX, 8541, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8543, UINT16_MAX, 8543, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8545, UINT16_MAX, 8545, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8547, UINT16_MAX, 8547, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8549, UINT16_MAX, 8549, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8551, UINT16_MAX, 8551, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8553, UINT16_MAX, 8553, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8555, UINT16_MAX, 8555, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8557, UINT16_MAX, 8557, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8559, UINT16_MAX, 8559, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8561, UINT16_MAX, 8561, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8563, UINT16_MAX, 8563, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8565, UINT16_MAX, 8565, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8567, UINT16_MAX, 8567, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8569, UINT16_MAX, 8569, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8571, UINT16_MAX, 8571, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8573, UINT16_MAX, 8573, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8575, UINT16_MAX, 8575, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8577, UINT16_MAX, 8577, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8579, UINT16_MAX, 8579, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8581, UINT16_MAX, 8581, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8583, UINT16_MAX, 8583, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8585, UINT16_MAX, 8585, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8587, UINT16_MAX, 8587, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8589, UINT16_MAX, 8589, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8591, UINT16_MAX, 8591, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8593, UINT16_MAX, 8593, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8595, UINT16_MAX, 8595, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8597, UINT16_MAX, 8597, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8599, UINT16_MAX, 8599, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8601, UINT16_MAX, 8601, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8603, UINT16_MAX, 8603, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8605, UINT16_MAX, 8605, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8607, UINT16_MAX, 8607, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8609, UINT16_MAX, 8609, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8611, UINT16_MAX, 8611, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8613, UINT16_MAX, 8613, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8615, UINT16_MAX, 8615, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8617, UINT16_MAX, 8617, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8619, UINT16_MAX, 8619, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8621, UINT16_MAX, 8621, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8623, UINT16_MAX, 8623, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8625, UINT16_MAX, 8625, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8627, UINT16_MAX, 8627, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8629, UINT16_MAX, 8629, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8631, UINT16_MAX, 8631, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8633, UINT16_MAX, 8633, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8635, UINT16_MAX, 8635, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8637, UINT16_MAX, 8637, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8639, UINT16_MAX, 8639, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8641, UINT16_MAX, 8641, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8643, UINT16_MAX, 8643, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8645, UINT16_MAX, 8645, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8647, UINT16_MAX, 8647, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8649, UINT16_MAX, 8649, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8651, UINT16_MAX, 8651, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8653, UINT16_MAX, 8653, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8655, UINT16_MAX, 8655, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8657, UINT16_MAX, 8657, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8659, UINT16_MAX, 8659, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8661, UINT16_MAX, 8661, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8663, UINT16_MAX, 8663, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8665, UINT16_MAX, 8665, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8667, UINT16_MAX, 8667, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8669, UINT16_MAX, 8669, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8671, UINT16_MAX, 8671, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8673, UINT16_MAX, 8673, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8675, UINT16_MAX, 8675, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8677, UINT16_MAX, 8677, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8679, UINT16_MAX, 8679, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8681, UINT16_MAX, 8681, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8683, UINT16_MAX, 8683, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8685, UINT16_MAX, 8685, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8687, UINT16_MAX, 8687, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8689, UINT16_MAX, 8689, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8691, UINT16_MAX, 8691, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8693, UINT16_MAX, 8693, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8695, UINT16_MAX, 8695, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8697, UINT16_MAX, 8697, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8699, UINT16_MAX, 8699, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8701, UINT16_MAX, 8701, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8703, UINT16_MAX, 8703, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8705, UINT16_MAX, 8705, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8707, UINT16_MAX, 8707, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8709, UINT16_MAX, 8709, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8711, UINT16_MAX, 8711, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8713, UINT16_MAX, 8713, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8715, UINT16_MAX, 8715, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8717, UINT16_MAX, 8717, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8719, UINT16_MAX, 8719, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8721, UINT16_MAX, 8721, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8723, UINT16_MAX, 8723, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8725, UINT16_MAX, 8725, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8727, UINT16_MAX, 8727, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8729, UINT16_MAX, 8729, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8731, UINT16_MAX, 8731, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8733, UINT16_MAX, 8733, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8735, UINT16_MAX, 8735, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8737, UINT16_MAX, 8737, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8739, UINT16_MAX, 8739, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8741, UINT16_MAX, 8741, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8743, UINT16_MAX, 8743, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8745, UINT16_MAX, 8745, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8747, UINT16_MAX, 8747, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8749, UINT16_MAX, 8749, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8751, UINT16_MAX, 8751, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8753, UINT16_MAX, 8753, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8755, UINT16_MAX, 8755, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8757, UINT16_MAX, 8757, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8759, UINT16_MAX, 8759, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8761, UINT16_MAX, 8761, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8763, UINT16_MAX, 8763, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8765, UINT16_MAX, 8765, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8767, UINT16_MAX, 8767, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8769, UINT16_MAX, 8769, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8771, UINT16_MAX, 8771, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8773, UINT16_MAX, 8773, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8775, UINT16_MAX, 8775, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8777, UINT16_MAX, 8777, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8779, UINT16_MAX, 8779, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8781, UINT16_MAX, 8781, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8783, UINT16_MAX, 8783, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8785, UINT16_MAX, 8785, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8787, UINT16_MAX, 8787, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8789, UINT16_MAX, 8789, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8791, UINT16_MAX, 8791, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8793, UINT16_MAX, 8793, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8795, UINT16_MAX, 8795, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8797, UINT16_MAX, 8797, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8799, UINT16_MAX, 8799, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8801, UINT16_MAX, 8801, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8803, UINT16_MAX, 8803, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8805, UINT16_MAX, 8805, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8807, UINT16_MAX, 8807, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8809, UINT16_MAX, 8809, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8811, UINT16_MAX, 8811, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8813, UINT16_MAX, 8813, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8815, UINT16_MAX, 8815, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8817, UINT16_MAX, 8817, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8819, UINT16_MAX, 8819, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8821, UINT16_MAX, 8821, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8823, UINT16_MAX, 8823, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8825, UINT16_MAX, 8825, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8827, UINT16_MAX, 8827, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8829, UINT16_MAX, 8829, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8831, UINT16_MAX, 8831, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8833, UINT16_MAX, 8833, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8835, UINT16_MAX, 8835, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8837, UINT16_MAX, 8837, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8839, UINT16_MAX, 8839, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8841, UINT16_MAX, 8841, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8843, UINT16_MAX, 8843, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8845, UINT16_MAX, 8845, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8847, UINT16_MAX, 8847, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8849, UINT16_MAX, 8849, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8851, UINT16_MAX, 8851, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8853, UINT16_MAX, 8853, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8855, UINT16_MAX, 8855, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8857, UINT16_MAX, 8857, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8859, UINT16_MAX, 8859, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8861, UINT16_MAX, 8861, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8863, UINT16_MAX, 8863, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8865, UINT16_MAX, 8865, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8867, UINT16_MAX, 8867, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8869, UINT16_MAX, 8869, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8871, UINT16_MAX, 8871, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8873, UINT16_MAX, 8873, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8875, UINT16_MAX, 8875, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8438, UINT16_MAX, 8438, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8440, UINT16_MAX, 8440, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8442, UINT16_MAX, 8442, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8444, UINT16_MAX, 8444, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8446, UINT16_MAX, 8446, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8448, UINT16_MAX, 8448, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8450, UINT16_MAX, 8450, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8452, UINT16_MAX, 8452, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8454, UINT16_MAX, 8454, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8456, UINT16_MAX, 8456, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8458, UINT16_MAX, 8458, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8460, UINT16_MAX, 8460, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8462, UINT16_MAX, 8462, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8464, UINT16_MAX, 8464, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8466, UINT16_MAX, 8466, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8468, UINT16_MAX, 8468, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8470, UINT16_MAX, 8470, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8472, UINT16_MAX, 8472, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8474, UINT16_MAX, 8474, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8476, UINT16_MAX, 8476, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8478, UINT16_MAX, 8478, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8480, UINT16_MAX, 8480, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8482, UINT16_MAX, 8482, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8484, UINT16_MAX, 8484, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8486, UINT16_MAX, 8486, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8488, UINT16_MAX, 8488, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8490, UINT16_MAX, 8490, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8492, UINT16_MAX, 8492, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8494, UINT16_MAX, 8494, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8496, UINT16_MAX, 8496, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8498, UINT16_MAX, 8498, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8500, UINT16_MAX, 8500, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8502, UINT16_MAX, 8502, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8504, UINT16_MAX, 8504, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8506, UINT16_MAX, 8506, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8508, UINT16_MAX, 8508, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8510, UINT16_MAX, 8510, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8512, UINT16_MAX, 8512, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8514, UINT16_MAX, 8514, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8516, UINT16_MAX, 8516, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8518, UINT16_MAX, 8518, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8520, UINT16_MAX, 8520, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8522, UINT16_MAX, 8522, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8524, UINT16_MAX, 8524, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8526, UINT16_MAX, 8526, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8528, UINT16_MAX, 8528, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8530, UINT16_MAX, 8530, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8532, UINT16_MAX, 8532, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8534, UINT16_MAX, 8534, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8536, UINT16_MAX, 8536, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8538, UINT16_MAX, 8538, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8540, UINT16_MAX, 8540, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8542, UINT16_MAX, 8542, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8544, UINT16_MAX, 8544, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8546, UINT16_MAX, 8546, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8548, UINT16_MAX, 8548, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8550, UINT16_MAX, 8550, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8552, UINT16_MAX, 8552, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8554, UINT16_MAX, 8554, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8556, UINT16_MAX, 8556, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8558, UINT16_MAX, 8558, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8560, UINT16_MAX, 8560, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8562, UINT16_MAX, 8562, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8564, UINT16_MAX, 8564, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8566, UINT16_MAX, 8566, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8568, UINT16_MAX, 8568, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8570, UINT16_MAX, 8570, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8572, UINT16_MAX, 8572, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8574, UINT16_MAX, 8574, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8576, UINT16_MAX, 8576, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8578, UINT16_MAX, 8578, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8580, UINT16_MAX, 8580, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8582, UINT16_MAX, 8582, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8584, UINT16_MAX, 8584, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8586, UINT16_MAX, 8586, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8588, UINT16_MAX, 8588, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8590, UINT16_MAX, 8590, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8592, UINT16_MAX, 8592, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8594, UINT16_MAX, 8594, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8596, UINT16_MAX, 8596, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8598, UINT16_MAX, 8598, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8600, UINT16_MAX, 8600, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8602, UINT16_MAX, 8602, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8604, UINT16_MAX, 8604, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8606, UINT16_MAX, 8606, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8608, UINT16_MAX, 8608, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8610, UINT16_MAX, 8610, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8612, UINT16_MAX, 8612, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8614, UINT16_MAX, 8614, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8616, UINT16_MAX, 8616, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8618, UINT16_MAX, 8618, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8620, UINT16_MAX, 8620, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8622, UINT16_MAX, 8622, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8624, UINT16_MAX, 8624, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8626, UINT16_MAX, 8626, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8628, UINT16_MAX, 8628, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8630, UINT16_MAX, 8630, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8632, UINT16_MAX, 8632, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8634, UINT16_MAX, 8634, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8636, UINT16_MAX, 8636, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8638, UINT16_MAX, 8638, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8640, UINT16_MAX, 8640, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8642, UINT16_MAX, 8642, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8644, UINT16_MAX, 8644, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8646, UINT16_MAX, 8646, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8648, UINT16_MAX, 8648, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8650, UINT16_MAX, 8650, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8652, UINT16_MAX, 8652, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8654, UINT16_MAX, 8654, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8656, UINT16_MAX, 8656, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8658, UINT16_MAX, 8658, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8660, UINT16_MAX, 8660, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8662, UINT16_MAX, 8662, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8664, UINT16_MAX, 8664, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8666, UINT16_MAX, 8666, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8668, UINT16_MAX, 8668, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8670, UINT16_MAX, 8670, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8672, UINT16_MAX, 8672, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8674, UINT16_MAX, 8674, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8676, UINT16_MAX, 8676, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8678, UINT16_MAX, 8678, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8680, UINT16_MAX, 8680, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8682, UINT16_MAX, 8682, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8684, UINT16_MAX, 8684, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8686, UINT16_MAX, 8686, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8688, UINT16_MAX, 8688, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8690, UINT16_MAX, 8690, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8692, UINT16_MAX, 8692, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8694, UINT16_MAX, 8694, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8696, UINT16_MAX, 8696, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8698, UINT16_MAX, 8698, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8700, UINT16_MAX, 8700, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8702, UINT16_MAX, 8702, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8704, UINT16_MAX, 8704, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8706, UINT16_MAX, 8706, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8708, UINT16_MAX, 8708, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8710, UINT16_MAX, 8710, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8712, UINT16_MAX, 8712, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8714, UINT16_MAX, 8714, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8716, UINT16_MAX, 8716, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8718, UINT16_MAX, 8718, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8720, UINT16_MAX, 8720, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8722, UINT16_MAX, 8722, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8724, UINT16_MAX, 8724, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8726, UINT16_MAX, 8726, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8728, UINT16_MAX, 8728, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8730, UINT16_MAX, 8730, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8732, UINT16_MAX, 8732, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8734, UINT16_MAX, 8734, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8736, UINT16_MAX, 8736, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8738, UINT16_MAX, 8738, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8740, UINT16_MAX, 8740, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8742, UINT16_MAX, 8742, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8744, UINT16_MAX, 8744, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8746, UINT16_MAX, 8746, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8748, UINT16_MAX, 8748, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8750, UINT16_MAX, 8750, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8752, UINT16_MAX, 8752, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8754, UINT16_MAX, 8754, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8756, UINT16_MAX, 8756, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8758, UINT16_MAX, 8758, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8760, UINT16_MAX, 8760, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8762, UINT16_MAX, 8762, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8764, UINT16_MAX, 8764, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8766, UINT16_MAX, 8766, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8768, UINT16_MAX, 8768, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8770, UINT16_MAX, 8770, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8772, UINT16_MAX, 8772, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8774, UINT16_MAX, 8774, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8776, UINT16_MAX, 8776, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8778, UINT16_MAX, 8778, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8780, UINT16_MAX, 8780, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8782, UINT16_MAX, 8782, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8784, UINT16_MAX, 8784, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8786, UINT16_MAX, 8786, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8788, UINT16_MAX, 8788, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8790, UINT16_MAX, 8790, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8792, UINT16_MAX, 8792, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8794, UINT16_MAX, 8794, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8796, UINT16_MAX, 8796, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8798, UINT16_MAX, 8798, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8800, UINT16_MAX, 8800, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8802, UINT16_MAX, 8802, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8804, UINT16_MAX, 8804, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8806, UINT16_MAX, 8806, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8808, UINT16_MAX, 8808, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 8810, UINT16_MAX, 8810, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8812, UINT16_MAX, 8812, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8814, UINT16_MAX, 8814, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8816, UINT16_MAX, 8816, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8818, UINT16_MAX, 8818, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8820, UINT16_MAX, 8820, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8822, UINT16_MAX, 8822, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8824, UINT16_MAX, 8824, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8826, UINT16_MAX, 8826, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8828, UINT16_MAX, 8828, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8830, UINT16_MAX, 8830, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8832, UINT16_MAX, 8832, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8834, UINT16_MAX, 8834, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8836, UINT16_MAX, 8836, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8838, UINT16_MAX, 8838, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8840, UINT16_MAX, 8840, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8842, UINT16_MAX, 8842, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8844, UINT16_MAX, 8844, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8846, UINT16_MAX, 8846, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8848, UINT16_MAX, 8848, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8850, UINT16_MAX, 8850, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8852, UINT16_MAX, 8852, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8854, UINT16_MAX, 8854, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8856, UINT16_MAX, 8856, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8858, UINT16_MAX, 8858, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8860, UINT16_MAX, 8860, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8862, UINT16_MAX, 8862, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8864, UINT16_MAX, 8864, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8866, UINT16_MAX, 8866, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8868, UINT16_MAX, 8868, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8870, UINT16_MAX, 8870, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8872, UINT16_MAX, 8872, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8874, UINT16_MAX, 8874, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8876, UINT16_MAX, 8876, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8878, UINT16_MAX, 8878, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8880, UINT16_MAX, 8880, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 928, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 929, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8883, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8886, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 95, UINT16_MAX, 8887, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1081, UINT16_MAX, 8889, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 601, UINT16_MAX, 8891, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1091, UINT16_MAX, 8893, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6823, UINT16_MAX, 8895, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1093, UINT16_MAX, 8897, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1092, UINT16_MAX, 8899, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 609, UINT16_MAX, 8901, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 610, UINT16_MAX, 8903, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 2354, UINT16_MAX, 8905, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1017, UINT16_MAX, 8907, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1023, UINT16_MAX, 8909, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1097, UINT16_MAX, 8911, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6748, UINT16_MAX, 8913, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1027, UINT16_MAX, 8915, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 619, UINT16_MAX, 8917, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1083, UINT16_MAX, 8919, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 357, UINT16_MAX, 8921, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1084, UINT16_MAX, 8923, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1032, UINT16_MAX, 8925, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1061, UINT16_MAX, 8927, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1098, UINT16_MAX, 8929, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1099, UINT16_MAX, 8931, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6721, UINT16_MAX, 8933, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8935, UINT16_MAX, 8937, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6694, UINT16_MAX, 8939, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1039, UINT16_MAX, 8941, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8943, UINT16_MAX, 8945, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1071, UINT16_MAX, 8947, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8949, UINT16_MAX, 8951, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 142, UINT16_MAX, 8953, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1047, UINT16_MAX, 8955, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1048, UINT16_MAX, 8957, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 16, UINT16_MAX, 8959, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1051, UINT16_MAX, 8961, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8963, UINT16_MAX, 8965, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 4666, UINT16_MAX, 8967, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1055, UINT16_MAX, 8969, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 642, UINT16_MAX, 8971, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1096, UINT16_MAX, 8973, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1094, UINT16_MAX, 8975, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6824, UINT16_MAX, 8977, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1095, UINT16_MAX, 8979, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 650, UINT16_MAX, 8981, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 4675, UINT16_MAX, 8983, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1072, UINT16_MAX, 8985, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1089, UINT16_MAX, 8987, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1090, UINT16_MAX, 8989, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1080, UINT16_MAX, 8991, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8993, UINT16_MAX, 8994, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8996, UINT16_MAX, 8997, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8999, UINT16_MAX, 9000, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9002, UINT16_MAX, 9004, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9006, UINT16_MAX, 9008, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8888, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8890, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 95, UINT16_MAX, 8892, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1080, UINT16_MAX, 8894, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 601, UINT16_MAX, 8896, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1090, UINT16_MAX, 8898, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6828, UINT16_MAX, 8900, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1092, UINT16_MAX, 8902, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1091, UINT16_MAX, 8904, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 609, UINT16_MAX, 8906, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 610, UINT16_MAX, 8908, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 2354, UINT16_MAX, 8910, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1017, UINT16_MAX, 8912, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1023, UINT16_MAX, 8914, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1096, UINT16_MAX, 8916, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6748, UINT16_MAX, 8918, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1027, UINT16_MAX, 8920, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 619, UINT16_MAX, 8922, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1082, UINT16_MAX, 8924, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 357, UINT16_MAX, 8926, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1083, UINT16_MAX, 8928, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1032, UINT16_MAX, 8930, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1061, UINT16_MAX, 8932, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1097, UINT16_MAX, 8934, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1098, UINT16_MAX, 8936, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6721, UINT16_MAX, 8938, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8940, UINT16_MAX, 8942, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6694, UINT16_MAX, 8944, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1039, UINT16_MAX, 8946, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8948, UINT16_MAX, 8950, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1071, UINT16_MAX, 8952, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8954, UINT16_MAX, 8956, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 142, UINT16_MAX, 8958, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1047, UINT16_MAX, 8960, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1048, UINT16_MAX, 8962, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 16, UINT16_MAX, 8964, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1051, UINT16_MAX, 8966, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8968, UINT16_MAX, 8970, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 4666, UINT16_MAX, 8972, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1055, UINT16_MAX, 8974, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 642, UINT16_MAX, 8976, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1095, UINT16_MAX, 8978, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1093, UINT16_MAX, 8980, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6829, UINT16_MAX, 8982, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1094, UINT16_MAX, 8984, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 650, UINT16_MAX, 8986, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 4675, UINT16_MAX, 8988, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1072, UINT16_MAX, 8990, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1088, UINT16_MAX, 8992, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1089, UINT16_MAX, 8994, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1079, UINT16_MAX, 8996, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 8998, UINT16_MAX, 8999, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9001, UINT16_MAX, 9002, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9004, UINT16_MAX, 9005, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9007, UINT16_MAX, 9009, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 9011, UINT16_MAX, 9013, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9010, UINT16_MAX, 9010, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9012, UINT16_MAX, 9012, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9014, UINT16_MAX, 9014, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9016, UINT16_MAX, 9016, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9018, UINT16_MAX, 9018, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9020, UINT16_MAX, 9020, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9022, UINT16_MAX, 9022, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9024, UINT16_MAX, 9024, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9026, UINT16_MAX, 9026, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9028, UINT16_MAX, 9028, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9030, UINT16_MAX, 9030, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9032, UINT16_MAX, 9032, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9034, UINT16_MAX, 9034, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9036, UINT16_MAX, 9036, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9038, UINT16_MAX, 9038, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9040, UINT16_MAX, 9040, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9042, UINT16_MAX, 9042, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9044, UINT16_MAX, 9044, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9046, UINT16_MAX, 9046, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9048, UINT16_MAX, 9048, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9050, UINT16_MAX, 9050, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9052, UINT16_MAX, 9052, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9054, UINT16_MAX, 9054, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9056, UINT16_MAX, 9056, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9058, UINT16_MAX, 9058, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9060, UINT16_MAX, 9060, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9062, UINT16_MAX, 9062, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9064, UINT16_MAX, 9064, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9066, UINT16_MAX, 9066, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9068, UINT16_MAX, 9068, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9070, UINT16_MAX, 9070, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9072, UINT16_MAX, 9072, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9074, UINT16_MAX, 9074, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9076, UINT16_MAX, 9076, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9078, UINT16_MAX, 9078, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9080, UINT16_MAX, 9080, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9082, UINT16_MAX, 9082, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9084, UINT16_MAX, 9084, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9086, UINT16_MAX, 9086, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9088, UINT16_MAX, 9088, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9090, UINT16_MAX, 9090, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9092, UINT16_MAX, 9092, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9094, UINT16_MAX, 9094, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9096, UINT16_MAX, 9096, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9098, UINT16_MAX, 9098, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9100, UINT16_MAX, 9100, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9102, UINT16_MAX, 9102, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9104, UINT16_MAX, 9104, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9106, UINT16_MAX, 9106, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9108, UINT16_MAX, 9108, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9110, UINT16_MAX, 9110, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9112, UINT16_MAX, 9112, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9114, UINT16_MAX, 9114, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9116, UINT16_MAX, 9116, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9118, UINT16_MAX, 9118, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9120, UINT16_MAX, 9120, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9122, UINT16_MAX, 9122, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9124, UINT16_MAX, 9124, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9126, UINT16_MAX, 9126, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9128, UINT16_MAX, 9128, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9130, UINT16_MAX, 9130, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9132, UINT16_MAX, 9132, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9134, UINT16_MAX, 9134, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9136, UINT16_MAX, 9136, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9138, UINT16_MAX, 9138, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9140, UINT16_MAX, 9140, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9142, UINT16_MAX, 9142, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9144, UINT16_MAX, 9144, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9146, UINT16_MAX, 9146, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9148, UINT16_MAX, 9148, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9150, UINT16_MAX, 9150, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9152, UINT16_MAX, 9152, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9154, UINT16_MAX, 9154, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9156, UINT16_MAX, 9156, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9158, UINT16_MAX, 9158, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9160, UINT16_MAX, 9160, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9162, UINT16_MAX, 9162, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9164, UINT16_MAX, 9164, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9166, UINT16_MAX, 9166, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9168, UINT16_MAX, 9168, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9170, UINT16_MAX, 9170, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9172, UINT16_MAX, 9172, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9174, UINT16_MAX, 9174, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9176, UINT16_MAX, 9176, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9178, UINT16_MAX, 9178, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9180, UINT16_MAX, 9180, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9182, UINT16_MAX, 9182, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9184, UINT16_MAX, 9184, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9186, UINT16_MAX, 9186, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9188, UINT16_MAX, 9188, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9190, UINT16_MAX, 9190, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9192, UINT16_MAX, 9192, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9194, UINT16_MAX, 9194, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9196, UINT16_MAX, 9196, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9198, UINT16_MAX, 9198, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9200, UINT16_MAX, 9200, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9202, UINT16_MAX, 9202, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9204, UINT16_MAX, 9204, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9206, UINT16_MAX, 9206, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9208, UINT16_MAX, 9208, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9210, UINT16_MAX, 9210, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9212, UINT16_MAX, 9212, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9214, UINT16_MAX, 9214, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9216, UINT16_MAX, 9216, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9218, UINT16_MAX, 9218, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9220, UINT16_MAX, 9220, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9222, UINT16_MAX, 9222, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9224, UINT16_MAX, 9224, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9226, UINT16_MAX, 9226, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9228, UINT16_MAX, 9228, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9230, UINT16_MAX, 9230, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9232, UINT16_MAX, 9232, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9234, UINT16_MAX, 9234, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9236, UINT16_MAX, 9236, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9238, UINT16_MAX, 9238, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9240, UINT16_MAX, 9240, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9242, UINT16_MAX, 9242, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9244, UINT16_MAX, 9244, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9246, UINT16_MAX, 9246, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9248, UINT16_MAX, 9248, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9250, UINT16_MAX, 9250, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9252, UINT16_MAX, 9252, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9254, UINT16_MAX, 9254, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9256, UINT16_MAX, 9256, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9258, UINT16_MAX, 9258, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9260, UINT16_MAX, 9260, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9262, UINT16_MAX, 9262, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9264, UINT16_MAX, 9264, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9266, UINT16_MAX, 9266, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9268, UINT16_MAX, 9268, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9270, UINT16_MAX, 9270, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9272, UINT16_MAX, 9272, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9274, UINT16_MAX, 9274, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9276, UINT16_MAX, 9276, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9278, UINT16_MAX, 9278, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9280, UINT16_MAX, 9280, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9282, UINT16_MAX, 9282, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9284, UINT16_MAX, 9284, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9286, UINT16_MAX, 9286, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9288, UINT16_MAX, 9288, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9290, UINT16_MAX, 9290, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9292, UINT16_MAX, 9292, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9294, UINT16_MAX, 9294, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9296, UINT16_MAX, 9296, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9298, UINT16_MAX, 9298, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9300, UINT16_MAX, 9300, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9015, UINT16_MAX, 9015, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9017, UINT16_MAX, 9017, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9019, UINT16_MAX, 9019, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9021, UINT16_MAX, 9021, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9023, UINT16_MAX, 9023, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9025, UINT16_MAX, 9025, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9027, UINT16_MAX, 9027, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9029, UINT16_MAX, 9029, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9031, UINT16_MAX, 9031, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9033, UINT16_MAX, 9033, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9035, UINT16_MAX, 9035, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9037, UINT16_MAX, 9037, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9039, UINT16_MAX, 9039, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9041, UINT16_MAX, 9041, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9043, UINT16_MAX, 9043, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9045, UINT16_MAX, 9045, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9047, UINT16_MAX, 9047, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9049, UINT16_MAX, 9049, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9051, UINT16_MAX, 9051, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9053, UINT16_MAX, 9053, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9055, UINT16_MAX, 9055, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9057, UINT16_MAX, 9057, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9059, UINT16_MAX, 9059, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9061, UINT16_MAX, 9061, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9063, UINT16_MAX, 9063, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9065, UINT16_MAX, 9065, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9067, UINT16_MAX, 9067, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9069, UINT16_MAX, 9069, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9071, UINT16_MAX, 9071, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9073, UINT16_MAX, 9073, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9075, UINT16_MAX, 9075, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9077, UINT16_MAX, 9077, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9079, UINT16_MAX, 9079, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9081, UINT16_MAX, 9081, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9083, UINT16_MAX, 9083, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9085, UINT16_MAX, 9085, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9087, UINT16_MAX, 9087, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9089, UINT16_MAX, 9089, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9091, UINT16_MAX, 9091, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9093, UINT16_MAX, 9093, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9095, UINT16_MAX, 9095, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9097, UINT16_MAX, 9097, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9099, UINT16_MAX, 9099, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9101, UINT16_MAX, 9101, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9103, UINT16_MAX, 9103, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9105, UINT16_MAX, 9105, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9107, UINT16_MAX, 9107, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9109, UINT16_MAX, 9109, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9111, UINT16_MAX, 9111, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9113, UINT16_MAX, 9113, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9115, UINT16_MAX, 9115, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9117, UINT16_MAX, 9117, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9119, UINT16_MAX, 9119, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9121, UINT16_MAX, 9121, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9123, UINT16_MAX, 9123, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9125, UINT16_MAX, 9125, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9127, UINT16_MAX, 9127, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9129, UINT16_MAX, 9129, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9131, UINT16_MAX, 9131, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9133, UINT16_MAX, 9133, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9135, UINT16_MAX, 9135, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9137, UINT16_MAX, 9137, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9139, UINT16_MAX, 9139, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9141, UINT16_MAX, 9141, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9143, UINT16_MAX, 9143, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9145, UINT16_MAX, 9145, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9147, UINT16_MAX, 9147, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9149, UINT16_MAX, 9149, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9151, UINT16_MAX, 9151, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9153, UINT16_MAX, 9153, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9155, UINT16_MAX, 9155, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9157, UINT16_MAX, 9157, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9159, UINT16_MAX, 9159, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9161, UINT16_MAX, 9161, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9163, UINT16_MAX, 9163, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9165, UINT16_MAX, 9165, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9167, UINT16_MAX, 9167, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9169, UINT16_MAX, 9169, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9171, UINT16_MAX, 9171, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9173, UINT16_MAX, 9173, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9175, UINT16_MAX, 9175, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9177, UINT16_MAX, 9177, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9179, UINT16_MAX, 9179, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9181, UINT16_MAX, 9181, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9183, UINT16_MAX, 9183, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9185, UINT16_MAX, 9185, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9187, UINT16_MAX, 9187, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9189, UINT16_MAX, 9189, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9191, UINT16_MAX, 9191, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9193, UINT16_MAX, 9193, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9195, UINT16_MAX, 9195, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9197, UINT16_MAX, 9197, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9199, UINT16_MAX, 9199, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9201, UINT16_MAX, 9201, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9203, UINT16_MAX, 9203, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9205, UINT16_MAX, 9205, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9207, UINT16_MAX, 9207, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9209, UINT16_MAX, 9209, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9211, UINT16_MAX, 9211, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9213, UINT16_MAX, 9213, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9215, UINT16_MAX, 9215, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9217, UINT16_MAX, 9217, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9219, UINT16_MAX, 9219, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9221, UINT16_MAX, 9221, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9223, UINT16_MAX, 9223, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9225, UINT16_MAX, 9225, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9227, UINT16_MAX, 9227, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9229, UINT16_MAX, 9229, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9231, UINT16_MAX, 9231, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9233, UINT16_MAX, 9233, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9235, UINT16_MAX, 9235, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9237, UINT16_MAX, 9237, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9239, UINT16_MAX, 9239, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9241, UINT16_MAX, 9241, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9243, UINT16_MAX, 9243, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9245, UINT16_MAX, 9245, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9247, UINT16_MAX, 9247, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9249, UINT16_MAX, 9249, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9251, UINT16_MAX, 9251, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9253, UINT16_MAX, 9253, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9255, UINT16_MAX, 9255, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9257, UINT16_MAX, 9257, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9259, UINT16_MAX, 9259, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 9261, UINT16_MAX, 9261, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9263, UINT16_MAX, 9263, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9265, UINT16_MAX, 9265, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9267, UINT16_MAX, 9267, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9269, UINT16_MAX, 9269, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9271, UINT16_MAX, 9271, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9273, UINT16_MAX, 9273, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9275, UINT16_MAX, 9275, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9277, UINT16_MAX, 9277, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9279, UINT16_MAX, 9279, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9281, UINT16_MAX, 9281, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9283, UINT16_MAX, 9283, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9285, UINT16_MAX, 9285, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9287, UINT16_MAX, 9287, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9289, UINT16_MAX, 9289, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9291, UINT16_MAX, 9291, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9293, UINT16_MAX, 9293, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9295, UINT16_MAX, 9295, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9297, UINT16_MAX, 9297, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9299, UINT16_MAX, 9299, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9301, UINT16_MAX, 9301, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9303, UINT16_MAX, 9303, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 9305, UINT16_MAX, 9305, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_AN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_AL, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 930, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25686, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25691, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 931, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25690, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25695, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 932, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25694, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25699, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, true, 0, false, 0, UTF8PROC_BOUNDCLASS_PREPEND, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25698, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25702, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25707, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 933, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 934, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 935, 2, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25706, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25710, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 937, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25714, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 938, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 939, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25722, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 940, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25726, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25711, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25715, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 937, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25719, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 938, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25723, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 939, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25727, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 940, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25731, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_CONSONANT}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 941, 3, true, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25730, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25734, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25738, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25735, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 944, 3, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25750, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25751, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 947, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 948, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25754, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9378, UINT16_MAX, 9378, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9380, UINT16_MAX, 9380, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9382, UINT16_MAX, 9382, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9384, UINT16_MAX, 9384, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9386, UINT16_MAX, 9386, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9388, UINT16_MAX, 9388, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9390, UINT16_MAX, 9390, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9392, UINT16_MAX, 9392, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9394, UINT16_MAX, 9394, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9396, UINT16_MAX, 9396, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9398, UINT16_MAX, 9398, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9400, UINT16_MAX, 9400, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9402, UINT16_MAX, 9402, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9404, UINT16_MAX, 9404, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9406, UINT16_MAX, 9406, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9408, UINT16_MAX, 9408, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9410, UINT16_MAX, 9410, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9412, UINT16_MAX, 9412, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9414, UINT16_MAX, 9414, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9416, UINT16_MAX, 9416, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9418, UINT16_MAX, 9418, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9420, UINT16_MAX, 9420, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9422, UINT16_MAX, 9422, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9424, UINT16_MAX, 9424, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9426, UINT16_MAX, 9426, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9428, UINT16_MAX, 9428, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9430, UINT16_MAX, 9430, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9432, UINT16_MAX, 9432, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9434, UINT16_MAX, 9434, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9436, UINT16_MAX, 9436, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9438, UINT16_MAX, 9438, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9440, UINT16_MAX, 9440, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9442, UINT16_MAX, 9442, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9444, UINT16_MAX, 9444, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9446, UINT16_MAX, 9446, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9448, UINT16_MAX, 9448, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9450, UINT16_MAX, 9450, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9452, UINT16_MAX, 9452, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9454, UINT16_MAX, 9454, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9456, UINT16_MAX, 9456, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9458, UINT16_MAX, 9458, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9460, UINT16_MAX, 9460, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9462, UINT16_MAX, 9462, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9464, UINT16_MAX, 9464, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9466, UINT16_MAX, 9466, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9468, UINT16_MAX, 9468, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9470, UINT16_MAX, 9470, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9472, UINT16_MAX, 9472, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9474, UINT16_MAX, 9474, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9476, UINT16_MAX, 9476, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9478, UINT16_MAX, 9478, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9480, UINT16_MAX, 9480, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9482, UINT16_MAX, 9482, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9484, UINT16_MAX, 9484, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9486, UINT16_MAX, 9486, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9488, UINT16_MAX, 9488, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9490, UINT16_MAX, 9490, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9492, UINT16_MAX, 9492, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9494, UINT16_MAX, 9494, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9496, UINT16_MAX, 9496, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9498, UINT16_MAX, 9498, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9500, UINT16_MAX, 9500, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9502, UINT16_MAX, 9502, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9504, UINT16_MAX, 9504, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9383, UINT16_MAX, 9383, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9385, UINT16_MAX, 9385, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9387, UINT16_MAX, 9387, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9389, UINT16_MAX, 9389, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9391, UINT16_MAX, 9391, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9393, UINT16_MAX, 9393, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9395, UINT16_MAX, 9395, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9397, UINT16_MAX, 9397, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9399, UINT16_MAX, 9399, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9401, UINT16_MAX, 9401, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9403, UINT16_MAX, 9403, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9405, UINT16_MAX, 9405, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9407, UINT16_MAX, 9407, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9409, UINT16_MAX, 9409, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9411, UINT16_MAX, 9411, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9413, UINT16_MAX, 9413, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9415, UINT16_MAX, 9415, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9417, UINT16_MAX, 9417, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9419, UINT16_MAX, 9419, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9421, UINT16_MAX, 9421, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9423, UINT16_MAX, 9423, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9425, UINT16_MAX, 9425, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9427, UINT16_MAX, 9427, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9429, UINT16_MAX, 9429, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9431, UINT16_MAX, 9431, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9433, UINT16_MAX, 9433, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9435, UINT16_MAX, 9435, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9437, UINT16_MAX, 9437, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9439, UINT16_MAX, 9439, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9441, UINT16_MAX, 9441, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9443, UINT16_MAX, 9443, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9445, UINT16_MAX, 9445, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9447, UINT16_MAX, 9447, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9449, UINT16_MAX, 9449, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9451, UINT16_MAX, 9451, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9453, UINT16_MAX, 9453, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9455, UINT16_MAX, 9455, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9457, UINT16_MAX, 9457, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9459, UINT16_MAX, 9459, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9461, UINT16_MAX, 9461, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9463, UINT16_MAX, 9463, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9465, UINT16_MAX, 9465, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9467, UINT16_MAX, 9467, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9469, UINT16_MAX, 9469, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9471, UINT16_MAX, 9471, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9473, UINT16_MAX, 9473, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9475, UINT16_MAX, 9475, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9477, UINT16_MAX, 9477, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9479, UINT16_MAX, 9479, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9481, UINT16_MAX, 9481, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9483, UINT16_MAX, 9483, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9485, UINT16_MAX, 9485, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9487, UINT16_MAX, 9487, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9489, UINT16_MAX, 9489, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9491, UINT16_MAX, 9491, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9493, UINT16_MAX, 9493, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9495, UINT16_MAX, 9495, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9497, UINT16_MAX, 9497, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9499, UINT16_MAX, 9499, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9501, UINT16_MAX, 9501, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9503, UINT16_MAX, 9503, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9505, UINT16_MAX, 9505, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9507, UINT16_MAX, 9507, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9509, UINT16_MAX, 9509, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 949, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25890, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_MC, 0, UTF8PROC_BIDI_CLASS_L, 0, 25895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_SPACINGMARK, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 9, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, true, 0, false, 0, UTF8PROC_BOUNDCLASS_CONTROL, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 950, 4, true, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25894, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 954, 2, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25898, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 956, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25906, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25918, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25922, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 954, 2, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 956, 1, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25919, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25923, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, + {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, 25927, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MN, 0, UTF8PROC_BIDI_CLASS_NSM, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 957, 1, true, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 958, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 959, 1, true, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25926, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25930, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 960, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9554, UINT16_MAX, 9554, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9556, UINT16_MAX, 9556, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9558, UINT16_MAX, 9558, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9560, UINT16_MAX, 9560, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9562, UINT16_MAX, 9562, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9564, UINT16_MAX, 9564, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9566, UINT16_MAX, 9566, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9568, UINT16_MAX, 9568, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9570, UINT16_MAX, 9570, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9572, UINT16_MAX, 9572, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9574, UINT16_MAX, 9574, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9576, UINT16_MAX, 9576, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9578, UINT16_MAX, 9578, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9580, UINT16_MAX, 9580, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9582, UINT16_MAX, 9582, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9584, UINT16_MAX, 9584, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9586, UINT16_MAX, 9586, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9588, UINT16_MAX, 9588, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9590, UINT16_MAX, 9590, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9592, UINT16_MAX, 9592, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9594, UINT16_MAX, 9594, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9596, UINT16_MAX, 9596, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9598, UINT16_MAX, 9598, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9600, UINT16_MAX, 9600, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9602, UINT16_MAX, 9602, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9604, UINT16_MAX, 9604, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9606, UINT16_MAX, 9606, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9608, UINT16_MAX, 9608, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9610, UINT16_MAX, 9610, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9612, UINT16_MAX, 9612, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9614, UINT16_MAX, 9614, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9616, UINT16_MAX, 9616, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9618, UINT16_MAX, 9618, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9620, UINT16_MAX, 9620, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9622, UINT16_MAX, 9622, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9624, UINT16_MAX, 9624, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9626, UINT16_MAX, 9626, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9628, UINT16_MAX, 9628, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9630, UINT16_MAX, 9630, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9632, UINT16_MAX, 9632, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9634, UINT16_MAX, 9634, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9636, UINT16_MAX, 9636, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9638, UINT16_MAX, 9638, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9640, UINT16_MAX, 9640, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9642, UINT16_MAX, 9642, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9644, UINT16_MAX, 9644, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9646, UINT16_MAX, 9646, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9648, UINT16_MAX, 9648, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9650, UINT16_MAX, 9650, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9652, UINT16_MAX, 9652, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9654, UINT16_MAX, 9654, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9656, UINT16_MAX, 9656, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9658, UINT16_MAX, 9658, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9660, UINT16_MAX, 9660, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9662, UINT16_MAX, 9662, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9664, UINT16_MAX, 9664, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9666, UINT16_MAX, 9666, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9668, UINT16_MAX, 9668, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9670, UINT16_MAX, 9670, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9672, UINT16_MAX, 9672, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9674, UINT16_MAX, 9674, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9676, UINT16_MAX, 9676, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9678, UINT16_MAX, 9678, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9680, UINT16_MAX, 9680, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25931, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 960, 1, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 25939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_V, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9559, UINT16_MAX, 9559, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9561, UINT16_MAX, 9561, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9563, UINT16_MAX, 9563, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9565, UINT16_MAX, 9565, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9567, UINT16_MAX, 9567, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9569, UINT16_MAX, 9569, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9571, UINT16_MAX, 9571, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9573, UINT16_MAX, 9573, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9575, UINT16_MAX, 9575, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9577, UINT16_MAX, 9577, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9579, UINT16_MAX, 9579, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9581, UINT16_MAX, 9581, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9583, UINT16_MAX, 9583, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9585, UINT16_MAX, 9585, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9587, UINT16_MAX, 9587, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9589, UINT16_MAX, 9589, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9591, UINT16_MAX, 9591, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9593, UINT16_MAX, 9593, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9595, UINT16_MAX, 9595, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9597, UINT16_MAX, 9597, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9599, UINT16_MAX, 9599, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9601, UINT16_MAX, 9601, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9603, UINT16_MAX, 9603, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9605, UINT16_MAX, 9605, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9607, UINT16_MAX, 9607, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9609, UINT16_MAX, 9609, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9611, UINT16_MAX, 9611, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9613, UINT16_MAX, 9613, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9615, UINT16_MAX, 9615, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9617, UINT16_MAX, 9617, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9619, UINT16_MAX, 9619, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9621, UINT16_MAX, 9621, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9623, UINT16_MAX, 9623, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9625, UINT16_MAX, 9625, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9627, UINT16_MAX, 9627, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9629, UINT16_MAX, 9629, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9631, UINT16_MAX, 9631, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9633, UINT16_MAX, 9633, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9635, UINT16_MAX, 9635, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9637, UINT16_MAX, 9637, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9639, UINT16_MAX, 9639, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9641, UINT16_MAX, 9641, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9643, UINT16_MAX, 9643, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9645, UINT16_MAX, 9645, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9647, UINT16_MAX, 9647, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9649, UINT16_MAX, 9649, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9651, UINT16_MAX, 9651, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9653, UINT16_MAX, 9653, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9655, UINT16_MAX, 9655, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9657, UINT16_MAX, 9657, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9659, UINT16_MAX, 9659, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9661, UINT16_MAX, 9661, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9663, UINT16_MAX, 9663, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9665, UINT16_MAX, 9665, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9667, UINT16_MAX, 9667, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9669, UINT16_MAX, 9669, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9671, UINT16_MAX, 9671, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9673, UINT16_MAX, 9673, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9675, UINT16_MAX, 9675, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9677, UINT16_MAX, 9677, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9679, UINT16_MAX, 9679, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9681, UINT16_MAX, 9681, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9683, UINT16_MAX, 9683, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9685, UINT16_MAX, 9685, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9687, UINT16_MAX, 9687, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9689, UINT16_MAX, 9689, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9691, UINT16_MAX, 9691, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9693, UINT16_MAX, 9693, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9695, UINT16_MAX, 9695, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9697, UINT16_MAX, 9697, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9699, UINT16_MAX, 9699, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9701, UINT16_MAX, 9701, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9703, UINT16_MAX, 9703, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9705, UINT16_MAX, 9705, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9707, UINT16_MAX, 9707, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9709, UINT16_MAX, 9709, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9711, UINT16_MAX, 9711, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9713, UINT16_MAX, 9713, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9715, UINT16_MAX, 9715, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9717, UINT16_MAX, 9717, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9719, UINT16_MAX, 9719, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9721, UINT16_MAX, 9721, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9723, UINT16_MAX, 9723, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9725, UINT16_MAX, 9725, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9727, UINT16_MAX, 9727, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9729, UINT16_MAX, 9729, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9731, UINT16_MAX, 9731, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9733, UINT16_MAX, 9733, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, 9735, UINT16_MAX, 9735, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9737, UINT16_MAX, 9737, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9739, UINT16_MAX, 9739, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9741, UINT16_MAX, 9741, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9743, UINT16_MAX, 9743, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9745, UINT16_MAX, 9745, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9747, UINT16_MAX, 9747, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9749, UINT16_MAX, 9749, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9751, UINT16_MAX, 9751, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9753, UINT16_MAX, 9753, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9755, UINT16_MAX, 9755, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9757, UINT16_MAX, 9757, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9759, UINT16_MAX, 9759, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9761, UINT16_MAX, 9761, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9763, UINT16_MAX, 9763, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9765, UINT16_MAX, 9765, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9767, UINT16_MAX, 9767, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9769, UINT16_MAX, 9769, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9771, UINT16_MAX, 9771, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9773, UINT16_MAX, 9773, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9775, UINT16_MAX, 9775, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9777, UINT16_MAX, 9777, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9779, UINT16_MAX, 9779, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9781, UINT16_MAX, 9781, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9783, UINT16_MAX, 9783, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9785, UINT16_MAX, 9785, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MC, 6, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -14492,1492 +14527,1397 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 3936, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 3937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_ND, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_FONT, 3938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26066, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26070, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26074, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26078, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26082, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26086, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26171, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26175, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26179, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26183, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26187, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26191, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26195, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_MC, 216, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, {UTF8PROC_CATEGORY_MC, 226, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26098, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26102, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26106, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26110, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26114, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26203, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26207, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26211, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26215, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, 26219, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, true, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 9734, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 9736, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 9738, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 9740, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 9742, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 9744, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 9746, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 9748, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 9750, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 9752, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 9754, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 9756, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 9758, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 9760, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 9762, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 9764, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 9766, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 9768, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 9770, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 9772, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 9774, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 9776, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 9778, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 9780, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 9782, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 9784, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 9786, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 9788, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 9790, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 9792, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 9794, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 9796, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 9798, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 9800, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 9802, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 9804, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 9806, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 9808, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 9810, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 9812, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 9814, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 9816, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 9818, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 9820, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 9822, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 9824, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 9826, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 9828, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 9830, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 9832, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 9834, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 9836, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 9838, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 9840, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 9842, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 9844, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 9846, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 9848, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 9850, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 9852, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 9854, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 9856, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 9858, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 9860, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 9862, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 9864, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 9866, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 9868, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 9870, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 9872, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 9874, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 9876, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 9878, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 9880, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 9882, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 9884, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 9886, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 9888, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 9890, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 9892, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 9894, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 9896, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 9898, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 9900, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 9902, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 9904, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 9906, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 9908, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 9910, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 9912, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 9914, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 9916, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 9918, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 9920, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 9922, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 9924, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 9926, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 9928, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 9930, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 9932, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 9934, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 9936, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 9938, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 9940, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 9942, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 9944, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 9946, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 9948, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 9950, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 9952, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 9954, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 9956, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 9958, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 9960, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 9962, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 9964, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 9966, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 9968, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 9970, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 9972, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 9974, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 9976, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 9978, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 9980, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 9982, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 9984, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 9986, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 9988, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 9990, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 9992, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 9994, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 9996, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 9998, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10000, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10002, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10004, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10006, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10008, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10010, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10012, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10014, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10016, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10018, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10020, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10022, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10024, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10026, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10028, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10030, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10032, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10034, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10036, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10038, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10040, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10042, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10044, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10046, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10048, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10050, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10052, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10054, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10056, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10058, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10060, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10062, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10064, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10066, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10068, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10070, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10072, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10074, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10076, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10078, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10080, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10082, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10084, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10086, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10088, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10090, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10092, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10094, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10096, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10098, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10100, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10102, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10104, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10106, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10108, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10110, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10112, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10114, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10116, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10118, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10120, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10122, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10124, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10126, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10128, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10130, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10132, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10134, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10136, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10138, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10140, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10142, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10144, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10146, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10148, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10150, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10152, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10154, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10156, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10158, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10160, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10162, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10164, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10166, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10168, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10170, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10172, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10174, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10176, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10178, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10180, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10182, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10184, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10186, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10188, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10190, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10192, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10194, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10196, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10198, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10200, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10202, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10204, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10206, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10208, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10210, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10212, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10214, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10216, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10218, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10220, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10222, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10224, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10226, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10228, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10230, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10232, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10234, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10236, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10238, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10240, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10242, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10244, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10246, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10248, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10250, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10252, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10254, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10256, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10258, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10260, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10262, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10264, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10266, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10268, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10270, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10272, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10274, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10276, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10278, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10280, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10282, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10284, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10286, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10288, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10290, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10292, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10294, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10296, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10298, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10300, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10302, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10304, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10306, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10308, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10310, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10312, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10314, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10316, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10318, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10320, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10322, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10324, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10326, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10328, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10330, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10332, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10334, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10336, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10338, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10340, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10342, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10344, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10346, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10348, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10350, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10352, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10354, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10356, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10358, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10360, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10362, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10364, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10366, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10368, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10370, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10372, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10374, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10376, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10378, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10380, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10382, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10384, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10386, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10388, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10390, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10392, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10394, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10396, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10398, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10400, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10402, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10404, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10406, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10408, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10410, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10412, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10414, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10416, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10418, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10420, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10422, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10424, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10426, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10428, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10430, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10432, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10434, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10436, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10438, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10440, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10442, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10444, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10446, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10448, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10450, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10452, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10454, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10456, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10458, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10460, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10462, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10464, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10466, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10468, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10470, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10472, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10474, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10476, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10478, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10480, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10482, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10484, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10486, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10488, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10490, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10492, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10494, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10496, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10498, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10500, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10502, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10504, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10506, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10508, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10510, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10512, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10514, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10516, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10518, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10520, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10522, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10524, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10526, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10528, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10530, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10532, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10534, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10536, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10538, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10540, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10542, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10544, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10546, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10548, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10550, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10552, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10554, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10556, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10558, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10560, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10562, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10564, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10566, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10568, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10570, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10572, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10574, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10576, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10578, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10580, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10582, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10584, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10586, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10588, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10590, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10592, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10594, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10596, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10598, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10600, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10602, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10604, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10606, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10608, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10610, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10612, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10614, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10616, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10618, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10620, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10622, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10624, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10626, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10628, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10630, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10632, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10634, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10636, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10638, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10640, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10642, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10644, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10646, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10648, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10650, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10652, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10654, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10656, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10658, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10660, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10662, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10664, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10666, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10668, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10670, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10672, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10674, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10676, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10678, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10680, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10682, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10684, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10686, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10688, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10690, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10692, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10694, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10696, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10698, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10700, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10702, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10704, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10706, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10708, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10710, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10712, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10714, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10716, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10718, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10720, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10722, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10724, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10726, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10728, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10730, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10732, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10734, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10736, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10738, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10740, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10742, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10744, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10746, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10748, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10750, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10752, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10754, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10756, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10758, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10760, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10762, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10764, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10766, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10768, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10770, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10772, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10774, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10776, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10778, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10780, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10782, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10784, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10786, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10788, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10790, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10792, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10794, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10796, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10798, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10800, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10802, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10804, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10806, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10808, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10810, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10812, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10814, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10816, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10818, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10820, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10822, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10824, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10826, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10828, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10830, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10832, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10834, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10836, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10838, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10840, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10842, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10844, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10846, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10848, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10850, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10852, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10854, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10856, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10858, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10860, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10862, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10864, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10866, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10868, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10870, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10872, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10874, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10876, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10878, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10880, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10882, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10884, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10886, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10888, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10890, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10892, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10894, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10896, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10898, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10900, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10902, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10904, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10906, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10908, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10910, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10912, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10914, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10916, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10918, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10920, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10922, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10924, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10926, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10928, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10930, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10932, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10934, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10936, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10938, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10940, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10942, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10944, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10946, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10948, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10950, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10952, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10954, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10956, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10958, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10960, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10962, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10964, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10966, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10968, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10970, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10972, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10974, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10976, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10978, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10980, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10982, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10984, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10986, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10988, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10990, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10992, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10994, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10996, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10998, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 11000, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 11002, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 11004, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 11006, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 11008, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 11010, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 11012, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 11014, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 11016, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 11018, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 11020, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 11022, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 11024, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 11026, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 11028, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 11030, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 11032, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 11034, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 11036, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11038, UINT16_MAX, 11039, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 984, UINT16_MAX, 11041, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11043, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11045, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11047, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11049, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11051, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11053, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11055, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11057, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11059, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11061, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11063, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11065, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11067, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11069, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11071, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11073, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11075, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11077, UINT16_MAX, UINT16_MAX, 11078, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11080, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11082, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11084, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11086, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11088, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11090, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11092, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, 11094, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11095, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11097, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11099, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11101, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11103, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11105, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11107, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11109, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11111, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11113, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11115, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11117, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11119, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11121, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11123, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11125, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11127, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11129, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11131, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11133, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11135, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11137, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11139, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11141, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11143, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, 11145, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11146, UINT16_MAX, 11147, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11149, UINT16_MAX, 11150, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11152, UINT16_MAX, 11153, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11155, UINT16_MAX, 11156, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11158, UINT16_MAX, 11159, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11161, UINT16_MAX, 11162, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11164, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11166, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11168, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11170, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11172, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11174, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11176, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11178, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11180, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11182, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11184, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11186, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11188, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11190, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11192, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11194, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11196, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11077, UINT16_MAX, UINT16_MAX, 11198, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11200, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11202, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11204, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11206, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11208, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11210, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11212, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11214, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11216, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11218, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11220, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11222, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11224, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11226, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11228, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11230, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11232, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11234, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11236, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11238, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11240, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11242, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11244, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11246, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11248, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11250, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11252, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11254, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11256, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11258, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11260, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11262, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11146, UINT16_MAX, 11264, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11149, UINT16_MAX, 11266, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11152, UINT16_MAX, 11268, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11155, UINT16_MAX, 11270, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11158, UINT16_MAX, 11272, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11161, UINT16_MAX, 11274, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11276, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11278, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11280, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11282, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11284, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11286, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11288, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11290, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11292, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11294, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11296, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11298, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11300, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11302, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11304, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11306, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11308, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11077, UINT16_MAX, UINT16_MAX, 11310, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11312, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11314, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11316, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11318, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11320, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11322, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11324, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11326, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11328, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11330, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11332, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11334, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11336, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11338, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11340, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11342, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11344, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11346, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11348, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11350, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11352, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11354, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11356, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11358, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11360, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11362, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11364, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11366, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11368, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11370, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11372, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11374, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11146, UINT16_MAX, 11376, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11149, UINT16_MAX, 11378, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11152, UINT16_MAX, 11380, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11155, UINT16_MAX, 11382, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11158, UINT16_MAX, 11384, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11161, UINT16_MAX, 11386, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11388, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11390, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11392, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11394, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11396, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11398, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11400, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11402, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11404, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11406, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11408, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11410, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11412, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11414, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11416, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11418, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11420, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11077, UINT16_MAX, UINT16_MAX, 11422, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11424, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11426, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11428, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11430, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11432, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11434, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11436, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11438, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11440, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11442, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11444, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11446, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11448, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11450, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11452, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11454, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11456, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11458, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11460, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11462, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11464, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11466, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11468, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11470, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11472, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11474, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11476, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11478, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11480, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11482, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11484, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11486, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11146, UINT16_MAX, 11488, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11149, UINT16_MAX, 11490, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11152, UINT16_MAX, 11492, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11155, UINT16_MAX, 11494, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11158, UINT16_MAX, 11496, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11161, UINT16_MAX, 11498, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11500, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11502, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11504, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11506, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11508, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11510, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11512, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11514, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11516, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11518, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11520, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11522, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11524, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11526, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11528, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11530, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11532, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11077, UINT16_MAX, UINT16_MAX, 11534, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11536, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11538, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11540, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11542, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11544, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11546, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11548, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11550, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11552, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11554, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11556, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11558, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11560, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11562, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11564, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11566, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11568, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11570, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11572, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11574, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11576, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11578, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11580, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11582, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11584, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11586, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11588, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11590, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11592, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11594, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11596, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11598, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11146, UINT16_MAX, 11600, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11149, UINT16_MAX, 11602, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11152, UINT16_MAX, 11604, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11155, UINT16_MAX, 11606, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11158, UINT16_MAX, 11608, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11161, UINT16_MAX, 11610, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1282, UINT16_MAX, UINT16_MAX, 11612, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1281, UINT16_MAX, 11614, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11616, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11618, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11620, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11622, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8935, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8943, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8949, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11624, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8963, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11626, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11628, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11630, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11632, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11634, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11636, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11638, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11640, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11642, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11644, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11646, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11648, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11650, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11652, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11654, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11656, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11658, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11660, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11662, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11664, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9006, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11666, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11668, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11670, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11672, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11674, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11676, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1343, UINT16_MAX, 11678, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1344, UINT16_MAX, 11680, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1345, UINT16_MAX, 11682, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1346, UINT16_MAX, 11684, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1347, UINT16_MAX, 11686, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1348, UINT16_MAX, 11688, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1349, UINT16_MAX, 11690, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1350, UINT16_MAX, 11692, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1351, UINT16_MAX, 11694, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1355, UINT16_MAX, 11696, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1356, UINT16_MAX, 11698, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1357, UINT16_MAX, 11700, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1359, UINT16_MAX, 11702, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1360, UINT16_MAX, 11704, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1361, UINT16_MAX, 11706, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1362, UINT16_MAX, 11708, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1363, UINT16_MAX, 11710, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1364, UINT16_MAX, 11712, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1365, UINT16_MAX, 11714, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1366, UINT16_MAX, 11716, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1367, UINT16_MAX, 11718, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1368, UINT16_MAX, 11720, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1369, UINT16_MAX, 11722, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1372, UINT16_MAX, 11724, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1374, UINT16_MAX, 11726, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1375, UINT16_MAX, 11728, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6568, UINT16_MAX, 11730, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1573, UINT16_MAX, 11732, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1325, UINT16_MAX, 11734, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1329, UINT16_MAX, 11736, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1613, UINT16_MAX, 11738, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1515, UINT16_MAX, 11740, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1533, UINT16_MAX, 11742, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1343, UINT16_MAX, 11744, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1344, UINT16_MAX, 11746, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1345, UINT16_MAX, 11748, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1346, UINT16_MAX, 11750, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1347, UINT16_MAX, 11752, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1348, UINT16_MAX, 11754, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1349, UINT16_MAX, 11756, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1350, UINT16_MAX, 11758, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1351, UINT16_MAX, 11760, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1355, UINT16_MAX, 11762, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1356, UINT16_MAX, 11764, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1359, UINT16_MAX, 11766, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1360, UINT16_MAX, 11768, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1362, UINT16_MAX, 11770, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1364, UINT16_MAX, 11772, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1365, UINT16_MAX, 11774, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1366, UINT16_MAX, 11776, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1367, UINT16_MAX, 11778, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1368, UINT16_MAX, 11780, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1369, UINT16_MAX, 11782, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1371, UINT16_MAX, 11784, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1372, UINT16_MAX, 11786, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1485, UINT16_MAX, 11788, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1325, UINT16_MAX, 11790, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1324, UINT16_MAX, 11792, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1342, UINT16_MAX, 11794, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1511, UINT16_MAX, 11796, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6530, UINT16_MAX, 11798, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1517, UINT16_MAX, 11800, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11802, UINT16_MAX, 11802, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11804, UINT16_MAX, 11804, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11806, UINT16_MAX, 11806, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11808, UINT16_MAX, 11808, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11810, UINT16_MAX, 11810, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11812, UINT16_MAX, 11812, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11814, UINT16_MAX, 11814, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11816, UINT16_MAX, 11816, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11818, UINT16_MAX, 11818, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11820, UINT16_MAX, 11820, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11822, UINT16_MAX, 11822, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11824, UINT16_MAX, 11824, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11826, UINT16_MAX, 11826, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11828, UINT16_MAX, 11828, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11830, UINT16_MAX, 11830, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11832, UINT16_MAX, 11832, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11834, UINT16_MAX, 11834, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11836, UINT16_MAX, 11836, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11838, UINT16_MAX, 11838, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11840, UINT16_MAX, 11840, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11842, UINT16_MAX, 11842, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11844, UINT16_MAX, 11844, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11846, UINT16_MAX, 11846, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11848, UINT16_MAX, 11848, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11850, UINT16_MAX, 11850, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11852, UINT16_MAX, 11852, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11854, UINT16_MAX, 11854, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11856, UINT16_MAX, 11856, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11858, UINT16_MAX, 11858, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11860, UINT16_MAX, 11860, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11862, UINT16_MAX, 11862, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11864, UINT16_MAX, 11864, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11866, UINT16_MAX, 11866, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11868, UINT16_MAX, 11868, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11870, UINT16_MAX, 11870, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11872, UINT16_MAX, 11872, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11874, UINT16_MAX, 11874, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11876, UINT16_MAX, 11876, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11878, UINT16_MAX, 11878, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11880, UINT16_MAX, 11880, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11882, UINT16_MAX, 11882, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11884, UINT16_MAX, 11884, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11886, UINT16_MAX, 11886, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11888, UINT16_MAX, 11888, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11890, UINT16_MAX, 11890, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11892, UINT16_MAX, 11892, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11894, UINT16_MAX, 11894, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11896, UINT16_MAX, 11896, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11898, UINT16_MAX, 11898, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11900, UINT16_MAX, 11900, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11902, UINT16_MAX, 11902, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11904, UINT16_MAX, 11904, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11906, UINT16_MAX, 11906, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11908, UINT16_MAX, 11908, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11910, UINT16_MAX, 11910, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11912, UINT16_MAX, 11912, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11914, UINT16_MAX, 11914, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11916, UINT16_MAX, 11916, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11918, UINT16_MAX, 11918, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11920, UINT16_MAX, 11920, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11922, UINT16_MAX, 11922, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11924, UINT16_MAX, 11924, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11926, UINT16_MAX, 11926, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11928, UINT16_MAX, 11928, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11930, UINT16_MAX, 11930, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11932, UINT16_MAX, 11932, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11934, UINT16_MAX, 11934, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11936, UINT16_MAX, 11936, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8256, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 9839, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 9841, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 9843, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 9845, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 9847, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 9849, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 9851, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 9853, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 9855, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 9857, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 9859, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 9861, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 9863, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 9865, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 9867, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 9869, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 9871, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 9873, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 9875, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 9877, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 9879, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 9881, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 9883, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 9885, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 9887, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 9889, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 9891, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 9893, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 9895, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 9897, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 9899, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 9901, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 9903, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 9905, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 9907, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 9909, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 9911, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 9913, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 9915, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 9917, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 9919, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 9921, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 9923, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 9925, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 9927, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 9929, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 9931, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 9933, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 9935, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 9937, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 9939, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 9941, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 9943, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 9945, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 9947, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 9949, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 9951, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 9953, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 9955, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 9957, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 9959, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 9961, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 9963, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 9965, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 9967, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 9969, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 9971, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 9973, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 9975, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 9977, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 9979, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 9981, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 9983, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 9985, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 9987, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 9989, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 9991, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 9993, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 9995, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 9997, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 9999, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10001, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10003, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10005, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10007, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10009, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10011, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10013, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10015, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10017, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10019, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10021, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10023, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10025, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10027, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10029, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10031, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10033, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10035, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10037, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10039, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10041, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10043, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10045, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10047, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10049, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10051, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10053, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10055, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10057, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10059, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10061, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10063, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10065, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10067, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10069, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10071, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10073, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10075, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10077, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10079, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10081, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10083, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10085, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10087, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10089, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10091, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10093, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10095, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10097, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10099, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10101, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10103, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10105, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10107, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10109, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10111, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10113, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10115, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10117, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10119, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10121, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10123, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10125, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10127, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10129, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10131, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10133, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10135, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10137, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10139, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10141, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10143, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10145, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10147, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10149, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10151, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10153, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10155, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10157, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10159, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10161, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10163, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10165, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10167, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10169, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10171, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10173, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10175, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10177, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10179, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10181, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10183, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10185, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10187, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10189, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10191, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10193, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10195, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10197, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10199, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10201, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10203, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10205, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10207, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10209, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10211, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10213, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10215, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10217, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10219, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10221, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10223, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10225, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10227, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10229, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10231, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10233, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10235, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10237, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10239, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10241, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10243, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10245, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10247, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10249, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10251, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10253, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10255, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10257, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10259, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10261, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10263, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10265, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10267, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10269, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10271, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10273, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10275, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10277, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10279, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10281, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10283, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10285, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10287, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10289, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10291, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10293, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10295, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10297, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10299, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10301, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10303, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10305, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10307, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10309, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10311, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10313, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10315, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10317, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10319, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10321, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10323, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10325, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10327, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10329, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10331, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10333, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10335, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10337, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10339, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10341, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10343, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10345, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10347, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10349, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10351, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10353, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10355, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10357, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10359, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10361, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10363, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10365, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10367, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10369, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10371, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10373, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10375, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10377, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10379, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10381, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10383, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10385, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10387, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10389, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10391, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10393, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10395, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10397, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10399, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10401, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10403, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10405, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10407, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10409, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10411, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10413, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10415, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10417, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10419, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10421, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10423, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10425, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10427, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10429, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10431, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10433, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10435, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10437, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10439, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10441, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10443, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10445, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10447, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10449, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10451, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10453, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10455, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10457, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10459, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10461, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10463, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10465, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10467, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10469, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10471, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10473, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10475, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10477, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10479, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10481, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10483, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10485, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10487, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10489, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10491, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10493, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10495, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10497, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10499, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10501, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10503, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10505, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10507, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10509, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10511, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10513, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10515, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10517, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10519, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10521, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10523, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10525, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10527, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10529, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10531, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10533, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10535, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10537, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10539, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10541, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10543, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10545, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10547, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10549, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10551, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10553, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10555, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10557, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10559, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10561, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10563, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10565, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10567, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10569, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10571, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10573, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10575, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10577, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10579, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10581, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10583, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10585, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10587, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10589, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10591, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10593, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10595, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10597, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10599, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10601, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10603, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10605, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10607, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10609, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10611, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10613, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10615, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10617, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10619, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10621, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10623, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10625, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10627, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10629, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10631, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10633, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10635, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10637, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10639, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10641, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10643, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10645, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10647, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10649, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10651, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10653, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10655, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10657, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10659, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10661, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10663, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10665, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10667, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10669, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10671, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10673, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10675, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10677, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10679, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10681, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10683, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10685, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10687, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10689, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10691, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10693, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10695, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10697, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10699, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10701, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10703, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10705, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10707, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10709, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10711, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10713, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10715, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10717, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10719, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10721, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10723, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10725, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10727, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10729, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10731, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10733, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10735, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10737, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10739, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10741, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10743, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10745, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10747, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10749, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10751, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10753, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10755, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10757, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10759, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10761, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10763, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10765, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10767, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10769, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10771, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10773, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10775, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10777, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10779, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10781, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10783, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10785, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10787, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10789, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10791, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10793, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10795, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10797, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10799, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10801, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10803, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10805, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10807, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10809, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10811, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10813, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10815, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10817, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10819, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10821, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10823, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10825, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10827, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10829, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10831, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10833, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10835, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10837, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10839, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10841, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10843, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10845, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10847, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10849, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10851, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10853, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10855, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10857, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10859, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10861, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10863, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10865, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10867, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10869, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10871, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10873, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10875, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10877, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10879, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10881, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10883, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10885, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10887, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10889, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10891, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10893, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10895, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 10897, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 10899, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 10901, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 10903, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 10905, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 10907, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 10909, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 10911, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 10913, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 10915, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 10917, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 10919, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 10921, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 10923, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 10925, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 10927, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 10929, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 10931, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 10933, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 10935, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 10937, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 10939, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 10941, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 10943, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 10945, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 10947, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 10949, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 10951, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 10953, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 10955, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 10957, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 10959, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 10961, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 10963, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 10965, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 10967, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 10969, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 10971, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 10973, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 10975, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 10977, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 10979, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 10981, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 10983, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 10985, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 10987, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 10989, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 10991, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 10993, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 10995, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 10997, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 10999, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 11001, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 11003, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 11005, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 11007, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 11009, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 11011, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 11013, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 11015, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 11017, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 11019, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 11021, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 11023, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 11025, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 11027, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 11029, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 11031, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 11033, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 11035, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 11037, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 26, UINT16_MAX, UINT16_MAX, 11039, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 27, UINT16_MAX, UINT16_MAX, 11041, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 28, UINT16_MAX, UINT16_MAX, 11043, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 29, UINT16_MAX, UINT16_MAX, 11045, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 30, UINT16_MAX, UINT16_MAX, 11047, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 31, UINT16_MAX, UINT16_MAX, 11049, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 32, UINT16_MAX, UINT16_MAX, 11051, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 33, UINT16_MAX, UINT16_MAX, 11053, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 34, UINT16_MAX, UINT16_MAX, 11055, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 35, UINT16_MAX, UINT16_MAX, 11057, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 36, UINT16_MAX, UINT16_MAX, 11059, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 37, UINT16_MAX, UINT16_MAX, 11061, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 38, UINT16_MAX, UINT16_MAX, 11063, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 39, UINT16_MAX, UINT16_MAX, 11065, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 40, UINT16_MAX, UINT16_MAX, 11067, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 41, UINT16_MAX, UINT16_MAX, 11069, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 42, UINT16_MAX, UINT16_MAX, 11071, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 43, UINT16_MAX, UINT16_MAX, 11073, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 44, UINT16_MAX, UINT16_MAX, 11075, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 45, UINT16_MAX, UINT16_MAX, 11077, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 46, UINT16_MAX, UINT16_MAX, 11079, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 47, UINT16_MAX, UINT16_MAX, 11081, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 48, UINT16_MAX, UINT16_MAX, 11083, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 49, UINT16_MAX, UINT16_MAX, 11085, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 50, UINT16_MAX, UINT16_MAX, 11087, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 51, UINT16_MAX, UINT16_MAX, 11089, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 0, UINT16_MAX, 11091, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1, UINT16_MAX, 11093, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 2, UINT16_MAX, 11095, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 3, UINT16_MAX, 11097, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 4, UINT16_MAX, 11099, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 5, UINT16_MAX, 11101, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 6, UINT16_MAX, 11103, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 7, UINT16_MAX, 11105, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 8, UINT16_MAX, 11107, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 9, UINT16_MAX, 11109, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 10, UINT16_MAX, 11111, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11, UINT16_MAX, 11113, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 12, UINT16_MAX, 11115, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 13, UINT16_MAX, 11117, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 14, UINT16_MAX, 11119, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 15, UINT16_MAX, 11121, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 16, UINT16_MAX, 11123, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 17, UINT16_MAX, 11125, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 18, UINT16_MAX, 11127, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 19, UINT16_MAX, 11129, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 20, UINT16_MAX, 11131, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 21, UINT16_MAX, 11133, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 22, UINT16_MAX, 11135, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 23, UINT16_MAX, 11137, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 24, UINT16_MAX, 11139, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 25, UINT16_MAX, 11141, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11143, UINT16_MAX, 11144, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 984, UINT16_MAX, 11146, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11148, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11150, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11152, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11154, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11156, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11158, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11160, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11162, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11164, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11166, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11168, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11170, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11172, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11174, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11176, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11178, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11180, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11182, UINT16_MAX, UINT16_MAX, 11183, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11185, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11187, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11189, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11191, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11193, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11195, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11197, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, 11199, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11200, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11202, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11204, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11206, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11208, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11210, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11212, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11214, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11216, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11218, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11220, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11222, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11224, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11226, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11228, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11230, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11232, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11234, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11236, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11238, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11240, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11242, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11244, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11246, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11248, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SM, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_FONT, 11250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, true, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11251, UINT16_MAX, 11252, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11254, UINT16_MAX, 11255, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11257, UINT16_MAX, 11258, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11260, UINT16_MAX, 11261, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11263, UINT16_MAX, 11264, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11266, UINT16_MAX, 11267, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11269, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11271, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11273, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11275, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11277, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11279, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11281, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11283, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11285, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11287, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11289, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11291, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11293, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11295, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11297, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11299, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11301, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11182, UINT16_MAX, UINT16_MAX, 11303, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11305, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11307, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11309, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11311, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11313, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11315, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11317, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11319, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11321, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11323, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11325, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11327, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11329, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11331, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11333, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11335, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11337, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11339, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11341, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11343, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11345, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11347, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11349, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11351, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11353, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11355, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11357, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11359, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11361, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11363, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11365, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11367, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11251, UINT16_MAX, 11369, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11254, UINT16_MAX, 11371, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11257, UINT16_MAX, 11373, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11260, UINT16_MAX, 11375, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11263, UINT16_MAX, 11377, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11266, UINT16_MAX, 11379, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11381, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11383, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11385, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11387, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11389, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11391, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11393, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11395, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11397, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11399, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11401, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11403, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11405, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11407, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11409, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11411, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11413, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11182, UINT16_MAX, UINT16_MAX, 11415, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11417, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11419, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11421, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11423, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11425, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11427, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11429, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11431, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11433, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11435, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11437, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11439, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11441, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11443, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11445, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11447, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11449, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11451, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11453, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11455, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11457, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11459, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11461, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11463, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11465, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11467, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11469, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11471, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11473, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11475, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11477, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11479, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11251, UINT16_MAX, 11481, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11254, UINT16_MAX, 11483, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11257, UINT16_MAX, 11485, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11260, UINT16_MAX, 11487, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11263, UINT16_MAX, 11489, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11266, UINT16_MAX, 11491, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11493, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11495, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11497, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11499, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11501, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11503, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11505, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11507, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11509, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11511, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11513, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11515, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11517, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11519, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11521, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11523, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11525, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11182, UINT16_MAX, UINT16_MAX, 11527, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11529, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11531, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11533, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11535, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11537, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11539, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11541, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11543, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11545, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11547, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11549, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11551, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11553, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11555, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11557, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11559, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11561, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11563, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11565, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11567, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11569, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11571, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11573, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11575, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11577, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11579, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11581, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11583, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11585, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11587, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11589, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11591, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11251, UINT16_MAX, 11593, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11254, UINT16_MAX, 11595, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11257, UINT16_MAX, 11597, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11260, UINT16_MAX, 11599, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11263, UINT16_MAX, 11601, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11266, UINT16_MAX, 11603, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1231, UINT16_MAX, UINT16_MAX, 11605, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1232, UINT16_MAX, UINT16_MAX, 11607, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1233, UINT16_MAX, UINT16_MAX, 11609, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1234, UINT16_MAX, UINT16_MAX, 11611, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1235, UINT16_MAX, UINT16_MAX, 11613, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1236, UINT16_MAX, UINT16_MAX, 11615, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1237, UINT16_MAX, UINT16_MAX, 11617, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1238, UINT16_MAX, UINT16_MAX, 11619, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1139, UINT16_MAX, UINT16_MAX, 11621, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1239, UINT16_MAX, UINT16_MAX, 11623, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1240, UINT16_MAX, UINT16_MAX, 11625, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 63, UINT16_MAX, UINT16_MAX, 11627, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1241, UINT16_MAX, UINT16_MAX, 11629, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1242, UINT16_MAX, UINT16_MAX, 11631, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1243, UINT16_MAX, UINT16_MAX, 11633, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1244, UINT16_MAX, UINT16_MAX, 11635, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1245, UINT16_MAX, UINT16_MAX, 11637, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11182, UINT16_MAX, UINT16_MAX, 11639, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1246, UINT16_MAX, UINT16_MAX, 11641, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1247, UINT16_MAX, UINT16_MAX, 11643, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1248, UINT16_MAX, UINT16_MAX, 11645, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1249, UINT16_MAX, UINT16_MAX, 11647, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1250, UINT16_MAX, UINT16_MAX, 11649, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1251, UINT16_MAX, UINT16_MAX, 11651, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1252, UINT16_MAX, UINT16_MAX, 11653, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1185, UINT16_MAX, 11655, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1186, UINT16_MAX, 11657, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1187, UINT16_MAX, 11659, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1188, UINT16_MAX, 11661, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1189, UINT16_MAX, 11663, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1190, UINT16_MAX, 11665, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1191, UINT16_MAX, 11667, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1192, UINT16_MAX, 11669, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1138, UINT16_MAX, 11671, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1193, UINT16_MAX, 11673, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1194, UINT16_MAX, 11675, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 62, UINT16_MAX, 11677, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1195, UINT16_MAX, 11679, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1196, UINT16_MAX, 11681, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1197, UINT16_MAX, 11683, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1198, UINT16_MAX, 11685, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1199, UINT16_MAX, 11687, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1301, UINT16_MAX, 11689, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1200, UINT16_MAX, 11691, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1201, UINT16_MAX, 11693, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1202, UINT16_MAX, 11695, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1203, UINT16_MAX, 11697, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1204, UINT16_MAX, 11699, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1205, UINT16_MAX, 11701, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1206, UINT16_MAX, 11703, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11251, UINT16_MAX, 11705, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11254, UINT16_MAX, 11707, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11257, UINT16_MAX, 11709, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11260, UINT16_MAX, 11711, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11263, UINT16_MAX, 11713, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 11266, UINT16_MAX, 11715, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1282, UINT16_MAX, UINT16_MAX, 11717, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_FONT, 1281, UINT16_MAX, 11719, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11721, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11723, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11725, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11727, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8940, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8948, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8954, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11729, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 8968, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11731, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11733, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11735, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11737, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11739, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11741, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11743, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11745, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11747, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11749, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11751, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11753, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11755, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11757, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11759, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11761, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11763, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11765, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11767, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11769, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 9011, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11771, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11773, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11775, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11777, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11779, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, 11781, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1343, UINT16_MAX, 11783, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1344, UINT16_MAX, 11785, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1345, UINT16_MAX, 11787, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1346, UINT16_MAX, 11789, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1347, UINT16_MAX, 11791, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1348, UINT16_MAX, 11793, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1349, UINT16_MAX, 11795, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1350, UINT16_MAX, 11797, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1351, UINT16_MAX, 11799, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1355, UINT16_MAX, 11801, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1356, UINT16_MAX, 11803, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1357, UINT16_MAX, 11805, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1359, UINT16_MAX, 11807, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1360, UINT16_MAX, 11809, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1361, UINT16_MAX, 11811, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1362, UINT16_MAX, 11813, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1363, UINT16_MAX, 11815, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1364, UINT16_MAX, 11817, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1365, UINT16_MAX, 11819, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1366, UINT16_MAX, 11821, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1367, UINT16_MAX, 11823, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1368, UINT16_MAX, 11825, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1369, UINT16_MAX, 11827, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1372, UINT16_MAX, 11829, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1374, UINT16_MAX, 11831, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1375, UINT16_MAX, 11833, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6568, UINT16_MAX, 11835, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1573, UINT16_MAX, 11837, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1325, UINT16_MAX, 11839, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1329, UINT16_MAX, 11841, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1613, UINT16_MAX, 11843, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1515, UINT16_MAX, 11845, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1533, UINT16_MAX, 11847, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1343, UINT16_MAX, 11849, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1344, UINT16_MAX, 11851, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1345, UINT16_MAX, 11853, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1346, UINT16_MAX, 11855, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1347, UINT16_MAX, 11857, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1348, UINT16_MAX, 11859, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1349, UINT16_MAX, 11861, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1350, UINT16_MAX, 11863, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1351, UINT16_MAX, 11865, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1355, UINT16_MAX, 11867, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1356, UINT16_MAX, 11869, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1359, UINT16_MAX, 11871, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1360, UINT16_MAX, 11873, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1362, UINT16_MAX, 11875, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1364, UINT16_MAX, 11877, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1365, UINT16_MAX, 11879, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1366, UINT16_MAX, 11881, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1367, UINT16_MAX, 11883, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1368, UINT16_MAX, 11885, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1369, UINT16_MAX, 11887, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1371, UINT16_MAX, 11889, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1372, UINT16_MAX, 11891, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1485, UINT16_MAX, 11893, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1325, UINT16_MAX, 11895, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1324, UINT16_MAX, 11897, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUB, 1342, UINT16_MAX, 11899, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1511, UINT16_MAX, 11901, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 6530, UINT16_MAX, 11903, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LM, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SUPER, 1517, UINT16_MAX, 11905, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11907, UINT16_MAX, 11907, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11909, UINT16_MAX, 11909, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11911, UINT16_MAX, 11911, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11913, UINT16_MAX, 11913, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11915, UINT16_MAX, 11915, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11917, UINT16_MAX, 11917, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11919, UINT16_MAX, 11919, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11921, UINT16_MAX, 11921, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11923, UINT16_MAX, 11923, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11925, UINT16_MAX, 11925, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11927, UINT16_MAX, 11927, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11929, UINT16_MAX, 11929, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11931, UINT16_MAX, 11931, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11933, UINT16_MAX, 11933, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11935, UINT16_MAX, 11935, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11937, UINT16_MAX, 11937, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11939, UINT16_MAX, 11939, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11941, UINT16_MAX, 11941, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11943, UINT16_MAX, 11943, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11945, UINT16_MAX, 11945, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11947, UINT16_MAX, 11947, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11949, UINT16_MAX, 11949, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11951, UINT16_MAX, 11951, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11953, UINT16_MAX, 11953, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11955, UINT16_MAX, 11955, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11957, UINT16_MAX, 11957, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11959, UINT16_MAX, 11959, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11961, UINT16_MAX, 11961, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11963, UINT16_MAX, 11963, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11965, UINT16_MAX, 11965, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11967, UINT16_MAX, 11967, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11969, UINT16_MAX, 11969, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11971, UINT16_MAX, 11971, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LU, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, 11973, UINT16_MAX, 11973, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11975, UINT16_MAX, 11975, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11977, UINT16_MAX, 11977, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11979, UINT16_MAX, 11979, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11981, UINT16_MAX, 11981, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11983, UINT16_MAX, 11983, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11985, UINT16_MAX, 11985, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11987, UINT16_MAX, 11987, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11989, UINT16_MAX, 11989, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11991, UINT16_MAX, 11991, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11993, UINT16_MAX, 11993, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11995, UINT16_MAX, 11995, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11997, UINT16_MAX, 11997, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 11999, UINT16_MAX, 11999, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12001, UINT16_MAX, 12001, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12003, UINT16_MAX, 12003, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12005, UINT16_MAX, 12005, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12007, UINT16_MAX, 12007, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12009, UINT16_MAX, 12009, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12011, UINT16_MAX, 12011, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12013, UINT16_MAX, 12013, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12015, UINT16_MAX, 12015, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12017, UINT16_MAX, 12017, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12019, UINT16_MAX, 12019, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12021, UINT16_MAX, 12021, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12023, UINT16_MAX, 12023, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12025, UINT16_MAX, 12025, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12027, UINT16_MAX, 12027, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12029, UINT16_MAX, 12029, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12031, UINT16_MAX, 12031, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12033, UINT16_MAX, 12033, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12035, UINT16_MAX, 12035, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12037, UINT16_MAX, 12037, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12039, UINT16_MAX, 12039, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LL, 0, UTF8PROC_BIDI_CLASS_R, 0, UINT16_MAX, UINT16_MAX, 12041, UINT16_MAX, 12041, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8261, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8262, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8272, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8267, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8284, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8278, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8279, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8280, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8281, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8274, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8276, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8277, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8266, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8269, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8259, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8260, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8263, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8273, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 11938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 7458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 11939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 11940, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8282, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28325, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28327, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28329, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28331, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28333, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28335, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28337, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28339, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28341, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28343, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28345, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44731, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44734, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44737, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44752, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44764, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44788, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44791, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44794, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44797, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44800, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44803, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44806, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8271, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8274, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8264, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8265, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8268, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8270, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8276, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8278, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8280, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 12043, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 7463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 12044, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 12045, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_AL, UTF8PROC_DECOMP_TYPE_FONT, 8287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28434, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28442, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28444, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28446, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28448, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_NO, 0, UTF8PROC_BIDI_CLASS_EN, UTF8PROC_DECOMP_TYPE_COMPAT, 28450, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44836, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44839, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44842, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44860, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44869, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44872, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44875, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44881, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44887, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44890, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44896, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44905, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44908, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44911, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 44914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 28, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 43, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 28428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 28430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 26, UINT16_MAX, UINT16_MAX, 12048, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 27, UINT16_MAX, UINT16_MAX, 12050, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28, UINT16_MAX, UINT16_MAX, 12052, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29, UINT16_MAX, UINT16_MAX, 12054, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 30, UINT16_MAX, UINT16_MAX, 12056, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 31, UINT16_MAX, UINT16_MAX, 12058, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 32, UINT16_MAX, UINT16_MAX, 12060, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 33, UINT16_MAX, UINT16_MAX, 12062, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 34, UINT16_MAX, UINT16_MAX, 12064, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 35, UINT16_MAX, UINT16_MAX, 12066, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 36, UINT16_MAX, UINT16_MAX, 12068, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37, UINT16_MAX, UINT16_MAX, 12070, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 38, UINT16_MAX, UINT16_MAX, 12072, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 39, UINT16_MAX, UINT16_MAX, 12074, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 40, UINT16_MAX, UINT16_MAX, 12076, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 41, UINT16_MAX, UINT16_MAX, 12078, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 42, UINT16_MAX, UINT16_MAX, 12080, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 43, UINT16_MAX, UINT16_MAX, 12082, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 44, UINT16_MAX, UINT16_MAX, 12084, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 45, UINT16_MAX, UINT16_MAX, 12086, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 46, UINT16_MAX, UINT16_MAX, 12088, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 47, UINT16_MAX, UINT16_MAX, 12090, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 48, UINT16_MAX, UINT16_MAX, 12092, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 49, UINT16_MAX, UINT16_MAX, 12094, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 50, UINT16_MAX, UINT16_MAX, 12096, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 51, UINT16_MAX, UINT16_MAX, 12098, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28484, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 28533, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 28535, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 26, UINT16_MAX, UINT16_MAX, 12153, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 27, UINT16_MAX, UINT16_MAX, 12155, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28, UINT16_MAX, UINT16_MAX, 12157, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 29, UINT16_MAX, UINT16_MAX, 12159, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 30, UINT16_MAX, UINT16_MAX, 12161, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 31, UINT16_MAX, UINT16_MAX, 12163, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 32, UINT16_MAX, UINT16_MAX, 12165, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 33, UINT16_MAX, UINT16_MAX, 12167, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 34, UINT16_MAX, UINT16_MAX, 12169, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 35, UINT16_MAX, UINT16_MAX, 12171, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 36, UINT16_MAX, UINT16_MAX, 12173, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 37, UINT16_MAX, UINT16_MAX, 12175, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 38, UINT16_MAX, UINT16_MAX, 12177, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 39, UINT16_MAX, UINT16_MAX, 12179, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 40, UINT16_MAX, UINT16_MAX, 12181, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 41, UINT16_MAX, UINT16_MAX, 12183, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 42, UINT16_MAX, UINT16_MAX, 12185, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 43, UINT16_MAX, UINT16_MAX, 12187, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 44, UINT16_MAX, UINT16_MAX, 12189, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 45, UINT16_MAX, UINT16_MAX, 12191, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 46, UINT16_MAX, UINT16_MAX, 12193, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 47, UINT16_MAX, UINT16_MAX, 12195, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 48, UINT16_MAX, UINT16_MAX, 12197, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 49, UINT16_MAX, UINT16_MAX, 12199, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 50, UINT16_MAX, UINT16_MAX, 12201, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 51, UINT16_MAX, UINT16_MAX, 12203, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28589, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 22719, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28486, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 44874, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12111, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12113, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12115, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12117, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12119, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12121, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12123, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12125, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12127, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12129, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12131, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12133, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12135, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12137, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12139, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12141, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12143, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12145, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12147, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12149, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12151, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12153, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12155, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12157, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12159, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12161, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 28547, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 28549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 28551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12169, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12171, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12173, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12175, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12177, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12179, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12181, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12183, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12185, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12187, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12189, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12191, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12193, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12195, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12197, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12199, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12201, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12203, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12205, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12207, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12209, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12211, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12213, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12215, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12217, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12219, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28591, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28593, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 44979, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28598, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12216, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12218, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12220, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12222, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12224, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12226, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12228, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12230, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12232, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12234, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12236, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12238, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12240, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12242, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12244, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12246, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12248, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12250, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12252, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12254, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12256, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12258, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12260, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12262, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12264, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12266, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 28652, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 28654, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_ON, UTF8PROC_DECOMP_TYPE_SUPER, 28656, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12274, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12276, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12278, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12280, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12282, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12284, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12286, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12288, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12290, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12292, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12294, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12296, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12298, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12300, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12302, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12304, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12306, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12308, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12310, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12312, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12314, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12316, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12318, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12320, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12322, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, 12324, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28605, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28710, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, true, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 1, false, 0, UTF8PROC_BOUNDCLASS_REGIONAL_INDICATOR, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28609, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28712, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 28714, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5711, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12227, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12228, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12229, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12332, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12333, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12334, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12230, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12231, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12335, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12336, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5283, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12232, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12233, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12234, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7085, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12235, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12236, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12237, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12238, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12239, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12240, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12337, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12338, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12339, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 7090, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12340, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12341, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12342, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12343, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12344, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12345, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4939, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12241, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12242, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12243, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12244, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12245, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12246, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12346, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12347, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12348, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12349, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12350, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12351, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4840, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5275, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12247, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12352, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5278, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12248, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12353, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4995, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12249, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12250, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12251, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12252, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12253, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12354, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12356, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12357, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 5607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 4913, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12254, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12256, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12257, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45026, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45029, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45032, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45035, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45038, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45041, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45044, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45047, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45050, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12285, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12286, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12359, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12360, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12361, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_SQUARE, 12362, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45131, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45134, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45137, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45140, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45143, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45146, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45149, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45152, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_COMPAT, 45155, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12390, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_SO, 0, UTF8PROC_BIDI_CLASS_L, UTF8PROC_DECOMP_TYPE_CIRCLE, 12391, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTENDED_PICTOGRAPHIC, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_SK, 0, UTF8PROC_BIDI_CLASS_ON, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12287, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12288, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12289, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12290, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12292, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12293, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12294, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12295, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12296, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12297, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12298, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12299, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12301, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12302, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12303, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12304, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12306, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12307, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12237, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12308, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12310, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12311, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12312, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12313, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12314, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12316, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12317, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12318, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12319, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12255, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12320, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12321, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12322, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12323, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12324, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12325, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12326, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12327, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12328, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12329, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12331, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12332, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12333, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12334, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12336, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12337, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12338, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12339, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12340, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12341, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12342, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12343, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12344, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12345, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12346, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12347, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12348, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12349, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12350, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12351, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12352, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12353, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12354, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12355, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12356, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12357, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12358, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12359, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12360, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12361, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12362, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12363, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12364, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12366, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12367, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12368, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12230, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12369, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12370, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12371, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12373, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12375, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12376, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12377, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12378, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12379, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12380, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12381, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12382, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12383, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12384, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12386, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12387, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12388, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12389, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12391, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12392, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12393, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4882, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12394, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12395, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12396, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12397, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12398, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12399, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12400, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12401, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12402, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12403, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12404, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12405, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12406, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12407, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12408, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12409, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12410, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12411, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12412, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12342, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12413, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12414, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12415, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12416, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12417, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12418, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12419, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12420, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4894, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12421, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12422, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12423, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12424, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12360, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12425, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12426, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12427, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12428, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12429, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12430, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12431, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12432, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12433, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12434, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12435, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12436, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12437, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12438, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12439, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12440, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12441, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12442, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12443, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12444, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12445, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -15993,25 +15933,26 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12455, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12456, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12457, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12458, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12459, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12460, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12461, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12462, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12463, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12464, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12465, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12466, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12467, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12468, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12469, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12470, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12471, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12472, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12473, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12335, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12474, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12475, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12476, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12478, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12479, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12480, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12481, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12482, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -16022,56 +15963,60 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12487, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12488, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12489, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12490, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12491, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12492, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12493, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12495, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12494, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12496, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12497, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12498, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4882, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12499, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12500, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12501, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12502, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12503, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12504, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12505, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12506, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12507, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12508, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12509, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12510, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12511, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12512, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12513, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12514, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12515, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12516, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12517, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12518, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12519, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12520, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12521, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12522, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12523, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12524, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12526, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12525, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4894, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12527, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12529, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12530, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12531, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12532, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12533, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12534, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12535, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12536, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12537, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12538, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12539, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12540, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12541, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12542, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12543, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12544, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12545, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12546, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12547, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12548, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12549, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12550, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12551, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12552, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12553, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12554, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -16081,22 +16026,25 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12558, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12559, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12560, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12561, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12562, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12563, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12564, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12565, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12566, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12567, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12568, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12569, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12570, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12571, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12572, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12573, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12574, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12575, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12576, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12577, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12578, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12579, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12580, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12581, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12582, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12583, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12584, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12585, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -16104,21 +16052,28 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12587, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12588, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12589, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12590, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12591, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12592, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12593, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12594, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12595, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12596, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12597, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12599, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12598, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12600, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12601, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12602, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12603, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12604, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12605, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12606, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12607, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12608, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12609, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12610, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12611, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12612, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12613, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12614, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12615, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12616, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12617, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, @@ -16126,193 +16081,273 @@ static const utf8proc_property_t utf8proc_properties[] = { {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12620, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12621, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12622, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12623, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12624, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12626, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12628, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12625, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12627, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12629, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12630, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12631, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12632, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12634, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12635, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12636, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12637, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12638, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12639, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12640, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12641, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12642, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12643, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12644, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12645, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12646, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12647, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12648, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12649, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12650, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12651, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12652, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12653, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12654, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12655, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12656, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12657, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12658, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12659, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12660, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12661, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12662, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12663, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12664, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12665, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12666, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12667, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12668, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12669, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12670, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12672, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12671, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12673, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12674, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12675, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12677, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12678, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12680, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12679, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12681, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12682, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12683, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12684, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12685, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12686, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12687, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12688, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12689, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12690, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12691, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12692, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12693, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12694, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12695, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12696, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12697, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12698, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12699, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12700, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12701, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12702, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12703, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12704, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12705, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12707, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12706, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12708, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12709, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12710, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12711, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12712, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12713, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12714, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12715, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12716, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12717, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12718, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12719, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12720, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12721, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12722, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12723, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12724, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12725, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12726, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12727, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12729, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12730, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12732, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12731, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12733, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12734, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12735, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12736, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12738, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12737, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12739, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12740, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12741, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12742, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12743, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12744, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12745, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12746, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12747, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12748, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12749, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12750, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12751, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12752, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12753, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4984, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12754, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12756, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12755, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12757, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12758, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12759, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12760, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12761, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12762, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12763, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12765, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12766, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12767, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4991, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12768, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12770, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12771, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12772, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12773, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12774, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12776, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12778, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12775, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12777, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12779, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12780, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12781, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12782, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12783, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12784, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12785, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12786, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12787, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12788, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12789, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12790, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12791, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12793, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12794, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12795, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12796, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12797, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12798, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12799, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12800, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12801, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12802, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12803, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12804, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12805, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12806, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12807, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12808, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12809, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12810, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12811, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12812, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12813, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12814, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12815, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12816, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12817, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12818, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12819, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12820, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12821, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12823, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12822, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12824, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12826, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12827, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12828, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12829, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12830, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12831, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12832, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12833, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12834, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12835, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12836, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12837, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12838, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12839, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12840, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12842, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12841, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12843, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12844, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12845, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12846, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12847, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5039, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12848, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12849, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5043, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12850, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12851, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12852, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12853, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, - {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5048, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12854, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12855, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12856, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12857, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12858, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4984, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12859, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12861, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12862, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12863, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12864, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12865, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12866, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12868, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12870, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12871, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12872, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 4991, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12873, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12875, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12876, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12877, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12878, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12879, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12881, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12883, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12884, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12885, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12886, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12888, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12889, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12891, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12893, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12894, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12895, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12896, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12898, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12899, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12900, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12901, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12902, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12903, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12904, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12905, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12907, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12908, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12909, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12910, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12912, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12913, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12914, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12915, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12916, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12918, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12920, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12921, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12922, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12923, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12925, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12926, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12928, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12929, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12931, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12932, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12933, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12934, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12935, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12936, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12937, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12938, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12940, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12941, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12942, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12943, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12944, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12945, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12947, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12948, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12950, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12952, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5039, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12954, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5043, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12955, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12956, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12957, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12958, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 5048, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, + {UTF8PROC_CATEGORY_LO, 0, UTF8PROC_BIDI_CLASS_L, 0, 12959, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, false, false, 2, false, 0, UTF8PROC_BOUNDCLASS_OTHER, UTF8PROC_INDIC_CONJUNCT_BREAK_NONE}, {UTF8PROC_CATEGORY_CF, 0, UTF8PROC_BIDI_CLASS_BN, 0, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, 1023, 0, false, false, false, true, true, 0, false, 0, UTF8PROC_BOUNDCLASS_EXTEND, UTF8PROC_INDIC_CONJUNCT_BREAK_EXTEND}, }; diff --git a/contrib/libs/utf8proc/ya.make b/contrib/libs/utf8proc/ya.make index 1ba0c6e8689..8dfae3aacb4 100644 --- a/contrib/libs/utf8proc/ya.make +++ b/contrib/libs/utf8proc/ya.make @@ -9,9 +9,9 @@ LICENSE( LICENSE_TEXTS(.yandex_meta/licenses.list.txt) -VERSION(2.10.0) +VERSION(2.11.0) -ORIGINAL_SOURCE(https://github.com/JuliaStrings/utf8proc/archive/v2.10.0.tar.gz) +ORIGINAL_SOURCE(https://github.com/JuliaStrings/utf8proc/archive/v2.11.0.tar.gz) NO_COMPILER_WARNINGS() |